Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИС / Лабораторные работы / Лабораторная работа#8

.pdf
Скачиваний:
46
Добавлен:
22.03.2015
Размер:
385.44 Кб
Скачать

Лабораторная работа № 8

ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ОБРАБОТКИ ФАЙЛОВ

Цель занятия

1. Приобретение навыков формирования файлов, чтения файлов, записей в файл.

Постановка задачи

1.Для заданного варианта разработать алгоритм решения задачи на ЭВМ.

2.Составить программу на языке C++, которая работает с любым допустимым набором данных.

Содержание отчета

1.Постановка задачи для конкретного варианта.

2.Текст программы и результаты ее выполнения.

Методические указания Создание файла последовательного доступа

В C++ каждый файл рассматривается как последовательный поток байтов. Каждый файл завершается или маркером конца файла (EOF – end-of-file marker) или указанным числом байтов, записанным в служебную структуру данных поддерживающей системой. Когда файл открывается, то создается объект и с этим объектом связывается поток.

Для обработки файлов в C++ должны быть включены заголовочные файлы <iostream.h> и <fstream.h>.

С++ не предписывает никакой структуры файлу. Следовательно, необходимо задавать структуру файлов в соответствии с требованиями прикладных программ. Файлы открываются путем создания объектов классов потоков ifstream, ofstream или fstream. Конструктору объекта передаются два аргумента – имя файла и режим открытия файла.

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

 

Таблица 1 Режимы открытия файлов

 

 

 

Режим

Описание

ios::app

Записать все данных в конец файла.

 

ios::app

Переместиться в конец исходного открытого файла. Данные могут быть

 

записаны в любое место файла.

 

 

 

ios::in

Открыть файл для ввода.

 

ios::out

Открыть файл для вывода.

 

ios::trunc

Отбрасывать содержимое файла, если он существует (это также по умолчанию

 

делается для ios::out).

 

ios::nocreate

Если файл не существует, то операция его открытия не выполняется.

 

ios::noreplace

Если файл существует, то операция его открытия не выполняется.

 

Пример программы:

Составить программу для поиска в заданном файле минимального и максимального значений и запись этих значений в новый файл.

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

main()

{

setlocale(LC_ALL, "Russian"); int a;

ifstream readFile("File_in.dat", ios::in); ofstream writeFile("File_out.dat", ios::out); if (! readFile){

cerr << "File can’t open"<<endl; system("pause");

exit(1);

}

int max=0, min=0; while (! readFile.eof())

{

readFile >> a;

if (a>max) max=a; else

if(a<min) min=a;

}

writeFile << "Максимум=" << max<< endl; writeFile << "Минимум=" << min<< endl; system("pause");

return 0;

}

Последовательное чтение и запись в файл

Файл File_in должен быть открыт для чтения, так что создается объект ifstream. Объявление ifstream readFile("File_in.dat", ios::in); создает объект readFile класса ifstream и связывает с ним файл

File_in.dat, то есть открывает его для ввода. Аргументы в круглых скобках передаются конструктору класса ifstream, который открывает файл и устанавливает с ним «линию связи». Объекты класса ifstream открываются для ввода по умолчанию, так что для открытия файла File_in.dat на ввод может быть использован оператор ifstream readFile("File_in.dat");

Файл File_out должен быть открыт для вывода, так что для него создается объект ofstream. Для объекта ofstream режим открытия файла может быть или ios::out для вывода данных в файл, или ios::app

– для добавления данных в конец файла (без модификации каких-либо данных, уже имеющихся в файле). Существующие файлы, открываемые режимом ios::out, усекаются – все данные в файле отбрасываются. Если какой-то файл еще не существует, тогда создается файл с тем же именем.

Объявление ofstream writeFile("File_out.dat", ios::out); создает объект writeFile класса ofstream, связанный с файлом "File_out.dat", который открывается для вывода. Аргументы "File_out.dat" и ios::out передаются конструктору класса ofstream, который открывает файл. Это устанавливает «линию связи» с файлом. По умолчанию объекты класса ofstream открыты для вывода, поэтому для открытия файла clients.dat для вывода может быть использован оператор ofstream writeFile("File_out.dat");

После создания объекта класса ifstream и попытки открыть его программа проверяет, была ли операция открытия файла успешной. Фрагмент программы

if (! readFile) {

cerr << " File absent " << endl; exit(1);

}

использует перегруженную функцию-операцию operator ! – элемент класса ios, для определения того, успешно ли открылся файл. Некоторые возможные ошибки являются следствием попытки открыть для чтения несуществующий файл, попытки открыть файл для чтения без разрешения или открытия файла для записи, когда на диске нет свободного места.

Когда условие указывает, что попытка открытия файла была безуспешной, выводится сообщение «File can’t open» и вызывается функция exit для завершения программы. Аргумент функции exit возвращается среде окружения, из которой программа была вызвана. Аргумент 0 показывает, что программа завершается нормально, а любое другое значение, указывает среде окружения, что программа прекратила выполнение из-за ошибки. Значение, возвращаемое функцией exit, используется средой окружения (чаще всего операционной системой) для соответствующей реакции на ошибку

Фрагмент программы while (! readFile.eof())

{

readFile >> a;

if (a>max) max=a; else

if(a<min) min=a;

}

последовательно считывает из файла “File_in.dat” очередное значение. Чтение продолжает до тех пор, пока не встретится маркер конца файла. Условие конца файла определяется как readFile.eof(). Затем, каждое считанного значение проверяется на минимум и максимум.

Фрагмент программы

writeFile << "Maximum=" << max<< endl; writeFile << "Minimum=" << min<< endl;

записывает в файл “File_out.dat” надпись "Maximum=" и "Minimum=", а также максимальное и минимальное значение из всех считанных из исходного файла.

Поиск в файле

Для последовательного поиска данных в файле программа обычно начинает чтение данные с начала файла и читает все данные последовательно до тех пор, пока не будут найдены требуемые данные. Как класс ifstream, так и класс ofstream содержат функции-элементы для позиционирования указателя позиции файла (порядковый номер следующего байта в файле, который должен быть считан или записан). Этими функциями-элементами являются seekg (позиционировать для извлечения из потока) для класса ifstream и seekp (позиционировать для помещения в поток) для класса ofstream. Любой объект класса ifstream имеет так называемый указатель «get», который показывает номер в файле очередного вводимого байта; а любой объект класса ofstream имеет указатель «set», который показывает номер в файле очередного выводимого байта. Оператор

readFile.seekg(0) ;

позиционирует указатель позиции файла на начало файла (позиция 0), присоединенного к readFile. Аргумент функции seekg обычно является целым типа long. Второй аргумент, который может быть задан, показывает так называемое направление позиционирования. Направление позиционирования может быть ios::beg (по умолчанию) для позиционирования относительно начала потока, ios::cur – для позиционирования относительно текущей позиции в потоке и ios::end – для позиционирования относительно конца потока. Указатель позиции файла является целым числом, которое устанавливает позицию в файле как число байтов от начальной позиции в файле (иногда это называют смещением от начала файла).

Несколько примеров позиционирования указателя позиции в файле для извлечения из потока:

//Позиционирование readFile на n-ый байт, полагаем ios::beg readFile.seekg(n) ;

//Позиционирование readFile на n байтов вперед readFile.seekg(n, ios::cur);

//Позиционирование readFile на у-ый байт от конца файла readFile.seekg(у, ios::end);

//Позиционирование readFile на конец файла readFile.seekg(0, ios::end);

Варианты заданий

1.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, найти их среднее значение. Результат записать в файл File_out.dat.

2.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, найти их сумму. Результат записать в файл File_out.dat.

3.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, все значения больше 100 и менее 150 записать в файл File_out.dat.

4.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать 10 центральных значений файла, найти их среднее значение. Результат записать в файл File_out.dat.

5.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, найти их минимальное и максимальное значения. Результат записать в файл File_out.dat.

6.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла в одномерный массив и отсортировать массив по убыванию. Результат записать в файл File_out.dat.

7.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла в одномерный массив и отсортировать массив по возрастанию. Результат записать в файл File_out.dat.

8.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, найти моду массива. Результат записать в файл File_out.dat.

9.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 9 чисел начиная с 150го. Сформировать из них матрицу A(3 3) и посчитать сумму элементов главной диагонали. Полученную матрицу и сумму элементов главной диагонали записать в файл File_out.dat.

10.Дан файл File_in.dat, содержащий 65536 целых чисел. Определить количество чисел в диапазоне от 0 до 50, от 51 до 100, от 101 до 150. Результат записать в файл File_out.dat.

11.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла в одномерный массив и найти медиану массива. Результат записать в файл File_out.dat.

12.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 9 первых чисел. Сформировать из них матрицу A(3 3) и посчитать первую норму матрицы (максимальное значение из сумм столбцов матрицы). Полученную матрицу и полученную норму записать в файл File_out.dat.

13.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat только четные значения исходного файла.

14.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat только четные значения исходного файла.

15.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat только нечетные значения исходного файла.

16.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 9 первых чисел. Сформировать из них матрицу A(3 3) и посчитать ее определитель. Полученную матрицу и определитель записать в файл File_out.dat.

17.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat значения больше 150.

18.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat значения менее 100.

19.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 9 первых чисел. Сформировать из них матрицу A(3 3) и посчитать вторую норму матрицы (максимальное значение из сумм строк матрицы). Полученную матрицу и полученную норму записать в файл

File_out.dat.

20.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать значения файла, найти их сумму. Если сумма четная, записать в файл File_out.dat «Сумма четная». В противном случае записать в файл File_out.dat «Сумма нечетная».

21.Дан файл File_in.dat, содержащий 65536 целых чисел. Записать в файл File_out.dat первое и последнее исходного файла.

22.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 10 чисел начиная с 50го. Сформировать из них матрицу A(5 2). Полученную матрицу записать в файл File_out.dat.

23.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 4 последних числа.

Сформировать из них матрицу A(2 2). Записать в файл File_out.dat. инвертированную матрицу. Для матрицы 2 2 инвертирование происходит следующим образом: Если матрица определена как:

Тогда ее определитель считается как: опр=A D- C B

И обращение производят следующим образом:

24.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 9 первых чисел. Сформировать из них матрицу A(3 3) и посчитать сумму элементов главной диагонали. Полученную матрицу и полученную сумму записать в файл File_out.dat.

25.Дан файл File_in.dat, содержащий 65536 целых чисел. Определить количество чисел значение которых в диапазоне от 100 до 200. Результат записать в файл File_out.dat.

26.Дан файл File_in.dat, содержащий 65536 целых чисел. Определить количество чисел значение которых в диапазоне от 151 до 200, от 201 до 255. Результат записать в файл File_out.dat.

27.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать в массив A 10 первых чисел. Массив A отсортировать по возрастанию. Результат записать в файл File_out.dat.

28.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать в массив A 10 первых чисел. Массив A отсортировать по убыванию.

29.Переписать в массив B значения массива B в обратном порядке. Массивы A и B записать в файл File_out.dat.

30.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать из файла 10 последних чисел. Сформировать из них матрицу A(2 5). Полученную матрицу записать в файл File_out.dat.

31.Дан файл File_in.dat, содержащий 65536 целых чисел. Считать 20 значения файла начиная с 30го в одномерный массив и найти медиану массива. Результат записать в файл File_out.dat.