- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
Лекция 17 Файлы
Цели:
-
освоить методику написания алгоритмов с использованием файлов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.
Работу с файлами можно сравнить с работой с массивами. Главное преимущество файлов перед массивами заключается в том, что массивы хранятся в ОП и информация исчезает с завершением работы программы, а информация, хранящаяся в файлах, может храниться нужное время на каком-либо носителе. Основной задачей, которая предполагает использование файлов, является обработка и хранение большого объёма информации. Когда происходит обработка информации из файла, программа часто обращается к файлу, следовательно, и к некоторой области жёсткого диска, что может нанести вред поверхности жёсткого диска. Поэтому нужно, определив размер файла, выделить динамическую память, в которую затем записать информацию из файла, обработать эту информацию и переписать обработанную информацию в файл. Для хранения и обработки информации из файла используют динамический массив структур и динамические структуры – списки, стеки, очереди.
Пример. Каждого студента можно описать при помощи следующих характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу (с использованием файлов), определяющую количество студентов:
-
сдавших сессию на «отлично»;
-
не сдавших хотя бы 1 экзамен.
Ход выполнения работы
-
Алгоритм должен быть универсальным с точки зрения пользователя. Это означает, что он должен давать возможность не только определять указанные в задаче характеристики, но и предлагать пользователю вводить данные в файл, добавлять в конец файла новую порцию информации и читать информацию из файла. Для достижения этих целей при написании программы воспользуемся оператором выбора switch(). При этом работа с файлом будет осуществляться не напрямую, а через динамический массив структур. Для ввода-вывода значений будут использоваться потоковые функции.
-
Написать программу, соответствующую алгоритму:
Алгоритм |
Программа |
структурный_тип 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; } |
Примечание. Записью в файле называется блок данных, хранящихся в одной структуре, т.е. порция информации об одном студенте (в данном примере).
-
Создать проект и реализовать данную задачу в среде Visual C++ 6.0.