Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Программирование Уфа 2012 Составитель-

Работа добавлена на сайт samzan.net: 2015-12-27

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 14.5.2024

PAGE  4

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО

ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра экономической информатики

ИЗУЧЕНИЕ ИНТЕГРИРОВАННОЙ СРЕДЫ BORLAND C++.

ХРАНЕНИЕ СТРУКТУР В ФАЙЛАХ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к лабораторным работам по курсу «Программирование»

Уфа 2012

Составитель: Е.И. Филосова

ББК

УДК 519.682

Методические указания к лабораторным работам по курсу «Программирование» для студентов специальности 080500 «БИЗНЕС ИНФОРМАТИКА » / Уфимский государственный авиационный технический университет; Составитель Е.И. Филосова, Уфа, 2012 - 15с.

В методических указаниях представлена лабораторная работа по изучению раздела «Изучение интегрированной среды Borland C++. Хранение структур в файлах» дисциплины «Программирование». Представлены примеры, контрольные вопросы и задания для самостоятельной работы. Методические указания могут быть так же использованы в курсовом и дипломном проектировании.

Ил. 1, табл. 0

Рецензенты: доц.

 доц.

© Уфимский государственный авиационный технический университет, 2012

Содержание

[1]
Цель работы 

[2] 1. Общие положения

[3] 1.1 Работа с файлами средствами C++

[4] 1.2 Организация работы с бинарными файлами средствами C++

[5] 1.3 Неформатированный файловый ввод-вывод

[6] 2 Задание

[6.1] 2.1 Организация массива структур

[6.2] 2.2 Индивидуальное задание

[7] 3. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ ОТЧЕТА


Цель работы 

Получение практических навыков в работе с хранящимися в файле интегрированными типами данных -  структурами и массивами структур языка C++.

1. Общие положения

1.1 Работа с файлами средствами C++

В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.

Текстовый поток — это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).

Двоичный поток — это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.

Работа с файлами складывается из трех шагов.

1. Файл открывается. Это означает, что программа "захватывает" заданный по имени файл, сообщает Windows, что далее она будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда несколько программ одновременно хотят записывать информацию в один и тот же файл. Правда, считывать данные из файла, очевидно, допустимо одновременно множеством программ, поэтому в операции открытия файла обычно уточняется, что файл открывается "на чтение" (считывание информации, которая не меняется) либо "на запись" (данные в файле модифицируются).
Операция открытия файла возвращает некий идентификатор (как правило, целое число), которое идентифицирует в программе в дальнейшем нужный открытый файл. Этот идентификатор запоминается в переменной; обычно такая переменная называется файловой переменной.

2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются.

3. Файл закрывается. После этой операции он снова доступен другим программам для обработки.

Стандартные операции работы с файлами, существующие практически во всех реализациях С, хранятся в библиотеке stdio.h. 

1.2 Организация работы с бинарными файлами средствами C++

1) Объявление файла

FILE *идентификатор;

Пример

FILE *f;

2) Открытие файла:

 Функция открытия файла называется fopen(). Она возвращает указатель на объект стандартного (определенного в данной библиотеке) типа FILE.
Параметров у функции fopen() два. Первый – это путь к файлу (строка), второй – параметры открытия файла.

fopen(имя физического файла, режим доступа)

Режим доступа — строка, указывающая режим открытия файла и тип файла

Типы файла: бинарный (b); текстовый (t)

Допустим, мы хотим создать в текущем каталоге проекта новый текстовый файл и записать в него два числа и строку. Пусть этот файл будет называться test.txt. Параметр открытия файла на запись в текстовом виде записывается строкой "wt". Буква w означает write (писать), буква t – text (текст). Если такой файл в каталоге существует, он перезаписывается (все старое содержимое в нем уничтожается), если он не существует, то создается исходно пустым.

Тогда команда открытия (создания пустого) файла запишется так:

   FILE * fo; 

  fo = fopen("test.txt","wt"); 

Можно задать и полный путь к файлу, например:

   fo = fopen("c:\\tmp\\test.txt","wt"); 

Не забываем, что одиночный символ \ внутри строки С++ задается двумя наклонными слэшами \\. Это частая ошибка.

После открытия файла в файловую переменную fo занесется некоторое число. Если таким числом будет ноль, считается, что файл открыть не удалось. В С++ нередки записи вида

  if( (fo=fopen("c:\\tmp\\test.txt","wt")) == 0 ) {

    // ошибка! 

   } 

где одновременно открывается файл и проверяется, успешно ли это сделано.

В таблице 1 приведены различные режимы открытия файла.

Таблица 1.

Режимы открытия файла

Значение

Описание

r

Файл открывается только для чтения

w

Файл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан

a

Файл открывается для записи в конец (для дозаписи) или создается, если не существует

r+

Файл открывается для чтения и записи.

w+

Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан

a+

Файл открывается для записи в конец (для дозаписи) или создается, если не существует

Например:

f = fopen(s, "wb");

k = fopen("h:\ex.dat", "rb");

1.3 Неформатированный файловый ввод-вывод

1) Запись в файл

fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);

Например,

fwrite(&dat, sizeof(int), 1, f);

2) Чтение из файла

fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);

Например,

fread(&dat, sizeof(int), 1, f);

3) Закрытие файла

fclose(имя логического файла);

Пример 1. Заполнить файл некоторым количеством целых случайных чисел.

#include <cstdlib>

#include <iostream>

#include <conio.h>

int main() {

FILE *f;

int dat;

int n=rand()%30 + 1;

 cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "wb");

for (int i=1; i<=n; i++) {

  dat = rand()%101 - 50;

  cout << dat << " ";

  fwrite(&dat, sizeof(int), 1, f);

}

cout << “\n”;

fclose(f);

 getch();

}

Пример 2. Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/w), возраст (в мес.), масса.

#include <cstdlib>

#include <iostream>

#include <conio.h>

struct krolik {

   char pol;

   int vozrast;

   double massa;};

int main() {

FILE *f;

krolik dat;

int n;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "wb");

cout << "How many rabbits? "; cin >> n;

for (int i=1; i<=n; i++) {

 cout << "What sex " << i << "th rabbit? "; cin >> dat.pol;

  cout << "How old " << i << "th rabbit? "; cin >> dat.vozrast;

  cout << "What is the mass of the " << i << "th rabbit? "; cin >> dat.massa;

  fwrite(&dat, sizeof(krolik), 1, f);

}

fclose(f);

getch();

}

Пример 3 (продолжение). В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/w), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше.

#include <cstdlib>

#include <iostream>

#include <conio.h>

struct krolik {

   char pol;

   int vozrast;

   double massa;};

int main() {

FILE *f;

krolik dat, max;

int n;

cout << "File name? ";

char s[20];

cin.getline(s, 20);

f=fopen(s, "rb");

fread(&dat, sizeof(krolik), 1, f);

max=dat;

while (fread(&dat, sizeof(krolik), 1, f))

{if (dat.vozrast>max.vozrast) max=dat;

 else if (dat.vozrast==max.vozrast&&dat.massa>max.massa) max=dat;}

cout << "The oldest rabbit has a sex " << max.pol << ", age " << max.vozrast << " and mass " << max.massa << endl;

getch();

}

2 Задание

2.1 Организация массива структур

В файле должна храниться база монастырей Японии периода Нара. Каждая строка файла содержит запись об одном монастыре. Формат записи: название монастыря (15 поз.), школа, количество монахов, площадь земли(га). Написать программу, которая сортирует записи, выводит на экран сведения о монастырях.

Исходные данные. База монастырей находится в файле. Максимальное количество строк файла по условию задачи не ограничено, поэтому будем выделять для их хранения массив динамически. Каждый элемент массива будет содержать сведения об одном монастыре. Поскольку эти сведения разнородные, удобно организовать их в виде структуры.

Полный текст программы приведен ниже.

#include <iostream.h>

#include <conio.h>

#include <string.h>

#include <stdio.h>

#include <fstream.h>

# include <iomanip.h>

            /* Описание структуры, которая представляет монастырь */

struct mon {

 char name[15];   /* название */

 char sc;                /* школа */

 int cnt;                 /* количество монахов */

 float sq;                /* площадь */

 };            /* определение массива монастырей */

int main(void) {

struct mon x;       /* рабочая переменная */

int n,v;                     /* количество элементов в массиве */

 int i, j;                  /* текущие индексы в массиве */

 int m;                   /* индекс минимального элемента */

 char y_n;

FILE *m_file;

char filename[] = "monastir.bin";

while (true){

cout <<"Vibirite deistvie:"<<"\n";

cout <<"1: sozdat fail"<<"\n";

cout <<"2: dobavit dannie:"<<"\n";

cout <<"3: vivesti dannie:"<<"\n";

cout <<"4: sortirovka"<<"\n";

cout <<"5: vixod"<<"\n";

cin>>v;

if (v==1) {

  m_file = fopen(filename, "w+");

  if ( m_file==0 ) {

    cout << "Sozdat file ne udalos!\n";

    getch();

    return(1);

  }

  fclose(m_file);

}

if (v==2) {

  m_file = fopen(filename, "ab");

  if ( m_file==0 ) {

    cout << "otkrit file ne udalos!\n";

    getch();

    return(1);

  }

  int tt;

  do {

    tt=0;

    // Ввод данных

    cout << "Vvedite: nazvanie, shkolu, kol-vo, ploshad monastiria " << "\n";

    cin>> x.name;

    cin>> x.sc;

    cin>> x.cnt;

    cin>> x.sq;

    fwrite((char *) &x, sizeof(mon),1,m_file);

    cout<<"continue(y/n)?\n";

    cin>>y_n;

    if (y_n=='y'||y_n=='Y') tt=1;

  } while(tt==1);

  fclose(m_file);

}

if (v==3) {

  m_file = fopen(filename, "r");

  cout <<"------------------------------------------------------------\n";

  cout <<"|                     monastiri                            |\n";

  cout <<"|----------------------------------------------------------|\n";

  cout <<"|   nazvanie    |  shkola  | Kolichestvo  |      Ploshad   |\n";

  cout <<"|               |          |   monahov    |       zemel    |\n";

  cout <<"|---------------|----------|--------------|----------------|\n";

  fseek(m_file, 0, SEEK_END);

  n = ftell(m_file) / sizeof(mon);

  mon *mm = new mon[n];

  fseek(m_file, 0, SEEK_SET);

  // Функция fread позволяет считать весь файл за одно обращение

  fread(mm, sizeof(mon), n, m_file);

  fclose(m_file);

  for(i=0;i<n;i++)

      cout<<"|"<<setw(15)<<mm[i].name<<"|"<<setw(10)<<mm[i].sc<<"|"<<setw(14)<<mm[i].cnt<<"|"<<setw(16)<<mm[i].sq<<"|"<<"\n";

  cout<<"------------------------------------------------------------\n";

}

if (v==4) {

   m_file = fopen(filename, "r");

   fseek(m_file, 0, SEEK_END);

  n = ftell(m_file) / sizeof(mon);

  mon *mm = new mon[n];

  fseek(m_file, 0, SEEK_SET);

  fread(mm, sizeof(mon), n, m_file);

  fclose(m_file);

  for (i=0; i<n-1; i++) {

   m=i;

   for (j=i+1; j<n; j++)

    if (strcmp(mm[m].name, mm[j].name)>0) m=j;

   if (m>i) {

     strcpy(x.name,mm[i].name);

     x.sc=mm[i].sc;

     x.cnt=mm[i].cnt;

     x.sq=mm[i].sq;

     strcpy(mm[i].name,mm[m].name);

     mm[i].sc=mm[m].sc;

     mm[i].cnt=mm[m].cnt;

     mm[i].sq=mm[m].sq;

     strcpy(mm[m].name,x.name);

     mm[m].sc=x.sc;

     mm[m].cnt=x.cnt;

     mm[m].sq=x.sq;

     }

   }

   fopen(filename,  "w");

   fwrite(mm, sizeof(mon), n, m_file);

   fclose(m_file);

}

if (v==5) {

getch() ;

return 1;

}

}

Добавить к программе пункт меню, который обеспечивает подсчет среднего количества монахов во всех монастырях.

2.2 Индивидуальное задание 

Составить файл, содержащий список со сведениями об N студентах (по варианту предыдущего задания). Для каждого учащегося указать фамилию,  дату рождения, оценки сессии по трем предметам. Информацию о каждом студенте оформить в виде структуры. Совокупность структур объединить в массив. Составить программу, которая с помощью меню обеспечивает ввод исходных данных, сортировку, обработку и вывод на экран информации в соответствии с вариантом задания, приведенного в таблице 2.

Таблица 2.

Варианты индивидуального задания

Вариант

Условие задачи

1

Отсортировать студентов по фамилии в алфавитном порядке. Вывести на экран анкетные данные студентов-отличников. Если таких нет, то выдать соответствующий текст.  N = 5.

2

Отсортировать студентов по году рождения. Вывести на экран анкетные данные студентов, успевающих на 4 и 5. Если таких нет, то выдать соответствующий текст. N = 6.

3

Отсортировать студентов по месяцу рождения. Вывести на экран анкетные данные студентов, получивших одну оценку 3 за все время обучения. N = 5.

4

Отсортировать студентов по дню рождения. Вывести на экран анкетные данные студентов, фамилии которых начинаются с буквы А и их оценки. N = 6.

5

Отсортировать студентов по оценке по первому предмету. Вывести на экран анкетные данные студентов, получивших за второй экзамен оценку 5. N = 7.

6

Отсортировать студентов по оценке по второму предмету. Вывести на экран анкетные данные студентов, чьи фамилии начинаются на букву Б и их даты рождения. N = 6.

7

Отсортировать студентов по оценке по третьему предмету. Вывести на экран анкетные данные студентов, которые родились в октябре. Если таких нет, то выдать соответствующий текст. N = 5.

8

Отсортировать студентов по оценке по третьему предмету. Вывести на экран оценки всех студентов, фамилии которых начинаются на буквы Б, В, Г. N = 7.

9

Отсортировать студентов по оценке по первому предмету. Вывести на экран фамилии и даты рождения студентов, не получивших за все время обучения ни одной оценки 5. N = 5.

10

Отсортировать студентов по фамилии в обратном алфавитному порядке. Вывести на экран фамилии и даты рождения студентов, не получивших за все время обучения ни одной оценки 2. N = 6.

11

Отсортировать студентов по году рождения. Вывести на экран средний балл каждого студента. N = 5.

12

Отсортировать студентов по месяцу рождения. Вычислить средний балл группы и вывести список студентов, имеющих средний балл, больше чем средний балл группы. N = 5.

13

Отсортировать студентов по дню рождения. Вывести на экран анкетные данные студентов, получивших за первый экзамен оценку 2. N = 6.

14

Отсортировать студентов по оценке по первому предмету. Вывести на экран фамилию самого молодого студента группы.  N = 7.

15

Отсортировать студентов по оценке по второму предмету. Вывести на экран фамилии студентов, родившихся с 23 февраля по 8 марта. N = 6.

16

Отсортировать студентов по оценке по третьему предмету. Вывести на экран фамилию студента, имеющего наилучшую успеваемость. N = 5.

17

Отсортировать студентов по оценке по второму предмету. Вывести на экран список студентов, чей средний балл выше значения, задаваемого с клавиатуры. N = 6.

18

Отсортировать студентов по оценке по первому предмету. Вывести на экран список студентов, фамилии которых начинаются на буквы А или О. N = 7.

19

Отсортировать студентов по фамилии в алфавитном порядке. Вывести на экран список студентов моложе 18 лет. N = 5.

20

Отсортировать студентов по фамилии в обратном алфавитном порядке. Вывести на экран анкетные данные студентов, получивших одну оценку 2 за все время обучения.   N = 6.

21

Отсортировать студентов по оценке по году рождения. Вывести на экран анкетные данные студентов, получивших за первый и второй экзамен оценку 5. N = 7.

22

Отсортировать студентов по оценке по месяцу рождения. Вывести на экран анкетные данные студентов, чьи фамилии оканчиваются на «ов» и их даты рождения. N = 6.

23

Отсортировать студентов по оценке по дням рождения. Вывести на экран анкетные данные студентов, которые родились зимой. Если таких нет, то выдать соответствующий текст. N = 6.

24

Отсортировать студентов по оценке по третьему предмету. Вывести на экран оценки всех студентов, фамилии которых оканчиваются на «ова». N = 7.

25

Отсортировать студентов по оценке по первому предмету. Вывести на экран фамилии и даты рождения студентов, не получивших за все время обучения ни одной тройки и двойки 5. N = 7.

26

Отсортировать студентов по фамилии в обратном алфавитному порядке. Вывести на экран средний возраст студентов 2. N = 6.

27

Отсортировать студентов по оценке по второму предмету. Вывести на экран средний балл студентов, сдавших сессию целиком. N = 6.

28

Отсортировать студентов по месяцу рождения. Вычислить средний балл группы и вывести список студентов, имеющих средний балл, ниже чем средний балл группы. N = 5.

29

Отсортировать студентов по дню рождения. Вывести на экран анкетные данные студентов, получивших за первый и второй экзамен оценку 2. N = 6.

30

Отсортировать студентов по оценке по третьему предмету. Вывести на экран фамилии самых успевающих студентов группы.  N = 7.

3. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ ОТЧЕТА 

Отчет о лабораторной работе должен содержать:

  •  Название и цель лабораторной работы;
  •  Вариант и условие задач, блок-схему, программу и окно с  решением;
  •  ответы на контрольные вопросы по указанию преподавателя.




1. 2010 роки Основи медсестринства 1 Виснаженому хворому призначено харчування з підвищеною енергетичною
2. Капитанская дочка ЕГЭ конспект СВЯЗЬ С РОМАНОМ ДУБРОВСКИЙ
3. тема філософських вчень які обстоюють обмеженість раціонального пізнання протиставляють йому інтуїцію ві
4. 101938 Лезвия с плавающей головкой коробка конфет садовая тележка Анечка Ботова лезв
5. Форма бухгалтерского учета ~ это совокупность учетных регистров для отражения хозяйственных операций
6. аМПО отделВзводРота батареяБатальон дивизионПолкБригада больше в МД нетДивизияКорпусАрмия Проти.html
7. Издание осуществлено в рамках Государственной программы научномет
8. реферат дисертації на здобуття наукового ступеня кандидата медичних наук4
9. Реферат на тему- Технология обучения в школе С
10. Публичное право jus publicum ~ совокупность норм регулирующих вопросы религиозного характера и вопросы управ
11. код Статус По спорам с поставщиками деньгам Сумка черная 590р.
12. ІПалладіна Закінчив Петербурзький університет 1908 р
13. варіант повісті ldquo; Батечко Гобсек rdquo; 1848 ~ остаточний варіант повісті ldquo; Гобсек rdquo; вміщено до сце
14. Ижевский государственный технический университет Е
15. Берегсталь завод ООО
16. Менеджмент Профиль- Экономика и управление организацией Гариева Элина Маратовна Роль центра
17. Управление заемным капиталом предприятия1
18. тематизировать знания учащихся по теме ldquo;Имя существительноеrdquo; обогатить словарный запас детей
19. дати Фудодати Дзэнкуцудати Утихатидзидати
20. Реферат Студентки 3 курса 1 группы Научный руководитель ~ К