Лекция 17. ü освоить методику написания алгоритмов с использованием файлов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего
Файлы
Цели:
ü освоить методику написания алгоритмов с использованием файлов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.
Работу с файлами можно сравнить с работой с массивами. Главное преимущество файлов перед массивами заключается в том, что массивы хранятся в ОП и информация исчезает с завершением работы программы, а информация, хранящаяся в файлах, может храниться нужное время на каком-либо носителе. Основной задачей, которая предполагает использование файлов, является обработка и хранение большого объёма информации. Когда происходит обработка информации из файла, программа часто обращается к файлу, следовательно, и к некоторой области жёсткого диска, что может нанести вред поверхности жёсткого диска. Поэтому нужно, определив размер файла, выделить динамическую память, в которую затем записать информацию из файла, обработать эту информацию и переписать обработанную информацию в файл. Для хранения и обработки информации из файла используют динамический массив структур и динамические структуры – списки, стеки, очереди.
Пример. Каждого студента можно описать при помощи следующих характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу (с использованием файлов), определяющую количество студентов:
1) сдавших сессию на «отлично»;
2) не сдавших хотя бы 1 экзамен.
Ход выполнения работы
1. Алгоритм должен быть универсальным с точки зрения пользователя. Это означает, что он должен давать возможность не только определять указанные в задаче характеристики, но и предлагать пользователю вводить данные в файл, добавлять в конец файла новую порцию информации и читать информацию из файла. Для достижения этих целей при написании программы воспользуемся оператором выбора switch(). При этом работа с файлом будет осуществляться не напрямую, а через динамический массив структур. Для ввода-вывода значений будут использоваться потоковые функции.
2. Написать программу, соответствующую алгоритму:
Алгоритм | Программа |
структурный_тип stud { сhar fio[30]; int kurs; сhar spec[30]; int hist; int math; int phis; }; объявление stud *st, FILE *pf; цел: var, n, i, count_5, count_2; var=0 пока var!=0 ввод var выбор var случай 1: // создание и // запись в файл ввод n выделение динамической памяти под указатель st для i=0 до n-1 шаг 1 заполнить каждое поле элемента массива структур отдельно все_для i открыть файл pf в режиме записи записать в файл pf массив st закрыть файл освободить выделенную динамическую память под указатель st выход случай 2: //открытие файла // для добавления ввод n выделение динамической памяти под указатель st для i=0 до n-1 шаг 1 заполнить каждое поле элемента массива структур отдельно все_для i открыть файл pf в режиме добавления дозаписать в файл pf массив st закрыть файл освободить выделенную динамическую память под указатель st выход случай 3: // открытие файл в // режиме чтения //определение // характеристик открыть файл pf в режиме чтения определить длину файла n выделение динамической памяти под указатель st заполнить массив st из файла pf count_5=count_2=0 для i=0 до n-1 шаг 1 //определяем //количество отличников если sti–>hist= =5 && sti–>math= =5 && sti–>phis= =5 count_5++; все_если //определяем количество // студентов, не //сдавших хотя бы один //экзамен если sti–>hist= =2|| sti–>math= =2|| sti–>phis= =2 count_2++; все_если все_если все_для i закрыть файл освободить выделенную динамическую память под указатель st печать count_5; печать count_2; выход все_выбор все_цикл | #include "stdio.h" #include "stdlib.h" #include "iostream.h" #include "iomanip.h" typedef struct { char fio[30]; int kurs; char spec[30]; int hist; int math; int phis; } stud; int main() { stud *st; FILE *pf; int var, i, count_5, count_2; long int n; var=-1; while(var!=0) { cout<<"0–выход; 1–запись; " <<"2–добавление;" <<"3–характеристики: var="; cin>>var; switch(var) { case 1: cout<<"n="; cin>>n; st=(stud*)malloc(n*sizeof(stud)); //заполнение массива структур for(i=0;i<=n-1;i++) { cout<<"fio="; cin>>((st+i)–>fio); cout<<"kurs="; cin>>((st+i)–>kurs); cout<<"spec="; cin>>((st+i)–>spec); cout<<"history=";cin>>((st+i)–>hist); cout<<"math="; cin>>((st+i)–>math); cout<<"phis="; cin>>((st+i)–>phis); } //файл открывается для записи данных if((pf=fopen("my_f.dat","w”))==NULL) { printf("файл не открыт\n"); break; } //запись в файл fwrite(st, sizeof(stud), n, pf); fclose(pf); free(st); break; case 2: cout<<"n="; cin>>n; st=(stud*)malloc(n*sizeof(stud)); //заполнение массива структур for(i=0;i<=n-1;i++) { cout<<"fio="; cin>>((st+i)–>fio); cout<<"kurs="; cin>>((st+i)–>kurs); cout<<"spec="; cin>>((st+i)–>spec); cout<<"history=";cin>>((st+i)–>hist); cout<<"math=";cin>>((st+i)–>math); cout<<"phis="; cin>>((st+i)–>phis); } //файл открывается для добавления if((pf=fopen("my_f.dat","a”))==NULL) { printf("файл не открыт\n"); break; } //дозапись в файл fwrite(st, sizeof(stud), n, pf); fclose(pf); free(st); break; case 3: //файл открывается для чтения if((pf=fopen("my_f.dat","r”))==NULL) { printf("файл не открыт\n"); break; } //определение длины файла в байтах fseek(pf, 0, SEEK_END); n=ftell(pf); //n – количества записей в файле n=n/sizeof(stud); st=(stud*)malloc(n*sizeof(stud)); rewind(pf); //заполнение массива структур fread(st, sizeof(stud), n, pf); count_5=count_2=0; for (i=0;i<=n-1;i++) { //количество отличников if((st+i)–>hist= =5&& (st+i)–>math= =5&& (st+i)–>phis= =5) count_5++; //количество студентов, не //сдавших хотя бы один экзамен if((st+i)–>hist= =2|| (st+i)–>math= =2|| (st+i)–>phis= =2) count_2++; } cout<<"count_5="<<count_5<<endl; cout<<"count_2="<<count_2<<endl; fclose(pf); free(st); break; } }return 1; } |
Примечание. Записью в файле называется блок данных, хранящихся в одной структуре, т.е. порция информации об одном студенте (в данном примере).
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Дата добавления: 2015-08-08; просмотров: 567;