- •Методические указания к лабораторным работам по дисциплине «программирование»
- •Часть 1
- •Введение
- •Содержание отчетов
- •Варианты индивидуальных заданий
- •Подготовка к лабораторным работам
- •Лабораторная работа № 1. Алгоритмизация линейных вычислительных процессов.
- •Лабораторная работа № 2. Алгоритмизация разветвляющихся вычислительных процессов.
- •Лабораторная работа № 3. Алгоритмизация циклических вычислительных процессов.
- •Лабораторная работа № 4. Программирование вложенных циклов и матричных задач
- •Лабораторная работа № 5. Алгоритмизация задач обработки символьной информации
- •Лабораторная работа № 6. Процедуры и функции
- •Лабораторная работа № 7. Файлы и структуры
- •Лабораторная работа № 8. Алгоритмизация задач обработки динамических массивов
- •Лабораторная работа № 9. Алгоритмы и программы сортировки
- •Приложение 1
- •Приложение 2
- •Библиографический список
- •Оглавление
- •Часть 1
- •600000, Владимир, ул. Горького, 87.
- •§ 1. Арифметика действительных чисел. Вычисление по формулам.
- •7. Смешаноv1 литров воды температурыt1 сv2 литрами воды температурыt2 . Найти объем и температуру образовавшейся смеси.
- •11. Даныx, y, z. Вычислитьа, b, если
- •Базовые функции
Лабораторная работа № 7. Файлы и структуры
1. Цель работы
Изучение описания и принципов работы с пользовательскими типами данных: перечисляемый тип, записи. Изучение принципов алгоритмизации задач, связанных с обработкой файлов разного типа. Изучение перегрузки функций.
2. Порядок выполнения работы
Изучить общую схему работы с файлами, принципы хранения содержимого файла в памяти, содержимое файловой переменной. Изучить описание перечисляемого типа и структуры, правила работы с ними. Изучить отличия работы с бинарными и текстовыми файлами.
Изучить возможности и правила перегрузки функций.
Изучить синтаксические конструкции enum и struct, объявление файловой переменной FILE *.
Изучить функции для работы с бинарными и текстовыми файлами: fopen, fclose, fwrite, fread, ferror, eof, fgets, fputs.
Изучить пример выполнения задания.
Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям п. 2.7, используя метод пошаговой детализации.
Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Необходимо решить задачу, предполагая, что исходная информация может храниться и в бинарном, и в текстовом файле. Организовать информацию для хранения в бинарном файле в виде структуры, одно из полей которой сделать перечисляемого типа. Алгоритм решения задачи разбить на функциональные блоки, оформить блоки в виде функций. Выделить функции, одинаковые по смыслу, но различные по реализации, в зависимости от типа входных данных, и создать перегружаемые функции.
Разработать программу на языке С++ для алгоритма п. 2.6, используя модульный подход (см. п. 2.8 лаб. раб. № 6).
Выполнить отладку и компиляцию программы, получить исполняемый файл.
Выполнить тестирование программы несколькими наборами входных данных.
Составить диаграмму модулей, дерево вызова функций и спецификации функций (в отчет по лабораторной работе).
3. Пример выполнения задания
Дан файл, содержащий сведения об учениках школы и их оценках. Определить, имеются ли в школе однофамильцы, и подсчитать количество учеников, имеющих отметки не ниже «хорошо».
3.1 Текст программы на С++ (часть).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
//модуль type_menu.h //файл содержит интерфейсы функций для "типизированного" файла (функции //верхнего уровня, вызываемые из меню) #pragma once #include "type_func.h" //перегружаемые функции void WriteFile(int n, rec &wrec);//открытие "типизированного" файла для записи void ReadFile(int n, rec &wrec);//открытие "типизированного" файла для чтения void CheckNameDuplicated(int n, rec &nrec); //проверка однофамильцев void NumberOfBPupil(rec &urec);//поиск кол-ва учеников с отметками не ниже //хорошо в типизированном файле //============================================================ //модуль text_menu.h //файл содержит интерфейсы функций для текстового файла (функции верхнего //уровня, вызываемые из меню) #pragma once #include "text_func.h" //перегружаемые функции void WriteFile(int n, string_user &st); //открытие текстового файла для записи void ReadFile(int n, string_user &st); //открытие текстового файла для чтения void CheckNameDuplicated(int n, string_user &st); //проверка однофамильцев void NumberOfBPupil(string_user &st); //поиск кол-ва учеников с отметками не //ниже хорошо в текстовом файле //============================================================ //модуль type_menu.срр (представлена одна функция) //файл содержит реализации функций для "типизированного" файла (для меню) #include "stdafx.h" #include "type_menu.h" //открытие "типизированного" файла для записи void WriteFile(int n, rec &wrec) { FILE * fo; fo = fopen("type.txt","wb"); //открываем (создаем) файл для записи if (fo == NULL) { cout << "Ошибка открытия файла для записи" << endl; exit(EXIT_FAILURE); } for(int i = 0; i < n; i++) { int temp=0; //временная переменная для оценок cout << "Введите имя ученика: "; cin >> wrec.name; cout << "Введите фамилию ученика: "; cin >> wrec.subname; cout << "Введите класс, где обучается ученик: "; cin >> wrec.clas; cout << "Введите оценки ученика (4 штуки от 1 до 5)" << endl; for(int j = 0; j < 4; j++) { cout << "Введите " << j+1 << " оценку: "; cin >> temp; wrec.marks[j] = (mark)temp; } WriteElement(wrec, fo); //запись одной структуры в файл cout << endl; } fclose(fo); //закрываем файл cout << endl; }//============================================================ //модуль text_menu.cpp (представлена одна функция) //файл содержит реализации функций для текстового файла (функции для меню) #include "stdafx.h" #include "text_menu.h" //проверка однофамильцев в текстовом файле void CheckNameDuplicated(int n, string_user &st) { FILE * ft; ft = fopen("text.txt","r"); //открываем существующий файл для чтения if (ft == NULL) { cout << "Ошибка открытия файла для чтения" << endl; exit(EXIT_FAILURE); } if(HasDuplicatedName(n, st, ft)) cout << "В школе есть однофамильцы" << endl; else cout << "В школе нет однофамильцев" << endl; fclose(ft); cout << endl; }//============================================================ //модуль type_func.h //файл содержит интерфейсы функций для "типизированного" файла (функции //преобразования - функции нижнего уровня) #pragma once //перечисляемый тип с оценками enum mark {very_bad = 1, bad = 2, satisfactory = 3, good = 4, excellent = 5}; struct rec //структура данных { char name[10]; char subname[15]; int clas; mark marks[4]; }; //перегружаемые функции void WriteElement(rec &wrec, FILE * f1); //запись структуры в файл void ReadElement (rec &rrec, FILE * f1); //чтение структуры из файла bool HasDuplicatedName(int n, rec &nrec, FILE * f1); //есть ли однофамильцы int GetNumberOfBPupil(rec &urec, FILE * f1); // кол-во учеников с оценками не //ниже хорошо //============================================================ //модуль type_func.срр (представлена только часть функций) //файл содержит реализации функций преобразования для "типизиров." файла #include "stdafx.h" #include "type_func.h" //------------------------------------------------------------------------------------------------- //запись структуры в файл void WriteElement(rec &wrec, FILE * f1) { fwrite(&wrec,sizeof(rec),1,f1); //записываем одну структуру }//------------------------------------------------------------------------------------------------- //чтение структуры из файла void ReadElement(rec & rrec, FILE * f1) { fread(&rrec, sizeof(rec), 1, f1); //читаем одну структуру }//------------------------------------------------------------------------------------------------- //поиск однофамильцев в школе bool HasDuplicatedName (int n, rec &nrec, FILE * f1) { char str[100][15]; //массив для фамилий for(int i = 0; i < n; i++) { fread(&nrec, sizeof(rec), 1, f1); strncpy(str[i], nrec.subname, 15); //записываем только фамилии в // созданный массив } for(int i = 0; i < n-1; i++) //поиск одинаковых фамилий { for(int j = i+1; j < n; j++) if(strcmp(str[i], str[j]) == 0) //сравниваем строки (фамилии) return true; } return false; }//============================================================ //модуль text_func.h //файл содержит интерфейсы функций для текстового файла (функции нижнего //уровня) #pragma once #define MAX_LEN 25 typedef char string_user[MAX_LEN];
//перегружаемые функции void WriteElement(string_user &st, FILE * f1); //запись строки в файл void ReadElement (string_user &st, FILE * f1); //чтение строки из файла bool HasDuplicatedName (int n, string_user &st, FILE * f1); //поиск однофамильцев int GetNumberOfBPupil(string_user &st, FILE * f1); //поиск кол-ва учеников с //оценками не ниже хорошо //============================================================ //модуль text_func.cpp (представлена только часть функций) //файл содержит реализации функций преобразования для текстового файла #include "stdafx.h" #include <fstream> #include "text_func.h" #include "type_func.h" //для типа оценок mark //------------------------------------------------------------------------------------------------- //запись строки в текстовый файл void WriteElement(string_user &st, FILE * f1) { fputs(st, f1); fputs("\n",f1); }//------------------------------------------------------------------------------------------------- //чтение строки из текстового файла void ReadElement(string_user &st, FILE * f1) { fgets(st, MAX_LEN, f1); OemToAnsi(st, st); }//------------------------------------------------------------------------------------------------- |
4. Контрольные вопросы
1. Что такое файл? Общая схема работы с файлом.
2. Что содержит файловая переменная?
3. Как работают функции fopen и fclose?
4. Что такое структура? Как обращаться к полям структуры?
5. Как выглядит объявление структуры? Как в памяти хранится переменная структурного типа?
6. В чем отличие обработки текстового и бинарного файлов?