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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
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++.
В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.
Текстовый поток это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).
Двоичный поток это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.
Работа с файлами складывается из трех шагов.
1. Файл открывается. Это означает, что программа "захватывает" заданный по имени файл, сообщает Windows, что далее она будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда несколько программ одновременно хотят записывать информацию в один и тот же файл. Правда, считывать данные из файла, очевидно, допустимо одновременно множеством программ, поэтому в операции открытия файла обычно уточняется, что файл открывается "на чтение" (считывание информации, которая не меняется) либо "на запись" (данные в файле модифицируются).
Операция открытия файла возвращает некий идентификатор (как правило, целое число), которое идентифицирует в программе в дальнейшем нужный открытый файл. Этот идентификатор запоминается в переменной; обычно такая переменная называется файловой переменной.
2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются.
3. Файл закрывается. После этой операции он снова доступен другим программам для обработки.
Стандартные операции работы с файлами, существующие практически во всех реализациях С, хранятся в библиотеке stdio.h.
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) Запись в файл
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();
}
В файле должна храниться база монастырей Японии периода Нара. Каждая строка файла содержит запись об одном монастыре. Формат записи: название монастыря (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;
}
}
Добавить к программе пункт меню, который обеспечивает подсчет среднего количества монахов во всех монастырях.
Составить файл, содержащий список со сведениями об 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. |
Отчет о лабораторной работе должен содержать: