Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

Глава 6. Работа с файлами. Построение массивов без повторений

6.1. Работа с файлами

Файл – это поименованная часть памяти диска, которая содержит некоторый набор записей [32]. В С++ средства для доступа к файлам объявлены в заголовочном файле fstream, который необходимо включить в программный код при работе с файлами. Для обозначения источника либо приемника данных применяется термин «поток». Потоки для работы с файлами создаются как объекты следующих классов:

  • ofstream – для вывода (записи) данных в файл;

  • ifstream – для ввода (чтения) данных из файла;

  • fstream – для чтения и записи данных (двунаправленный обмен).

Имя файла задается либо при создании объекта, либо при использовании метода open(). В качестве примера рассмотрим пример с двойной сортировкой (см. листинг 5.2), но информацию нужно получать из файла.

Листинг 6.1. В текстовом файле «input.txt» записана следующая информация: число студентов, а затем идут парой фамилия и номер группы (рис. 6.1). Необходимо преобразовать этот список так, чтобы он оказался отсортированным по группам и внутри каждой группы в алфавитном порядке. Полученный список вывести на экран дисплея и записать в файл.

//L6_1.cpp

#include <string.h>

#include <fstream>

#include <iostream>

using namespace std;

int main( )

{

setlocale(LC_CTYPE,"russian");

int n,i,*grup,f,k=0,gtmp;

char**name,*ntmp,fam[30];

fstream ff("input.txt"); //Соэдание объекта ff и открытие файла

ff>>n;

name=new char*[n]; //Выделение памяти для указателей,

//связанных с фамилией студентов .

grup=new int[n]; //Выделение памяти под номера групп

for(i=0;i<n;i++)

{

ff>>fam>>grup[i];

name[i]=strdup(fam); //Заполняется фамилия i-го студента

}

ff.close(); //Закрытие файла

. . . //См. листинг 5.2

ff.open("input.txt",ios::app); //Открытие файла для пополнения

ff<<"\nПолученный список\n";

for(i=0;i<n;i++)

{

ff.width(6);

ff<<grup[i]<<" ";

ff<<name[i]<<'\n';

}

ff.close(); //Закрытие файла

return 0;

}

Содержимое файла “input.txt

Рис. 6.1. Информация, находящаяся в файле «input.txt»

На рис. 6.2 приведен результат выполнения программы листинга 6.1.

Рис. 6.2. Результат работы программы листинга 6.1

6.2. Построение массивов без повторений

Предположим, что в файле «input.txt» записана информация, содержащая количество студентов в списке, фамилию студента, название предмета и оценку по этому предмету. Фамилии студентов и названия предметов могут повторяться (рис. 6.3). Необходимо сформировать список студентов и вычислить общее количество пропусков занятий для каждого из них, а также общее число пропусков занятий по каждому предмету. Таким образом, для каждого студента и каждого предмета нужно суммировать число пропусков занятий.

Содержимое файла “input.txt

Рис. 6.3. Информация, находящаяся в файле «input.txt»

Листинг 6.2. Сформировать список из неповторяющихся фамилий и список из неповторяющихся предметов. При вводе проверять, если среди раннее введенных фамилий (рис. 6.3) вводимые фамилии и предметы. Если их нет, то вводится новая запись, а если они уже есть, то добавляется число прогулов в уже существующую запись.

//L6_2.cpp

#include <string.h>

#include <fstream>

#include <iostream>

using namespace std;

int main( )

{

setlocale(LC_CTYPE,"russian");

int n,i,j,*nname,*nsubject,mn=0,ms=0,f,aut;

char**name,**subject,fam[30],sb[30];

fstream ff("input.txt");

ff>>n; //Читаем число записей

name=new char*[n]; //Выделяем память под указатели

//на фамилии.

subject=new char*[n]; //Выделяем память под указатели

//на названия предметов.

nname=new int[n]; //Выделяем память под количество

//пропусков длякаждого студента.

nsubject=new int[n]; //Выделяем память под количество

//под каждый предмет.

for(i=0;i<n;i++)

{

ff>>fam; //Ввод фамилии студента

ff>>sb; //Ввод предмета

ff>>aut; //Ввод числа прогулов студента по этому

//предмету.

for(j=0;j<mn;j++)

if(strcmp(name[j],fam)==0)

break;

if(j>=mn)

{

name[mn]=strdup(fam);

nname[mn++]=aut;

}

else

nname[j]+=aut;

for(j=0;j<ms;j++)

if(strcmp(subject[j],sb)==0)

break;

if(j>=ms)

{

subject[ms]=strdup(sb);

nsubject[ms++]=aut;

}

else

nsubject[j]+=aut;

}

ff.close();

cout<<"\nПолученные списки\nСТУДЕНТЫ\n\n";

for(i=0;i<mn;i++)

{

cout.width(10);

cout<<name[i];

cout.width(5);

cout<<nname[i]<<'\n';

}

cout<<"\nПРЕДМЕТЫ\n\n";

for(i=0;i<ms;i++)

{

cout.width(10);

cout<<subject[i];

cout.width(5);

cout<<nsubject[i]<<'\n';

}

cout<<'\n';

ff.open("input.txt",ios::app);

ff<<"\nПолученные списки\nСТУДЕНТЫ\n\n";

for(i=0;i<mn;i++)

{

ff.width(10);

ff<<name[i];

ff.width(5);

ff<<nname[i]<<'\n';

}

ff<<"\nПРЕДМЕТЫ\n\n";

for(i=0;i<ms;i++)

{

ff.width(10);

ff<<subject[i];

ff.width(5);

ff<<nsubject[i]<<'\n';

}

ff<<'\n';

ff.close();

return 0;

}

Результат работы программы листинга 6.2 приведен на рис. 6.4.

Рис. 6.4. Результат работы программы листинга 6.2

Листинг 6.3. В файле с именем «input.txt» содержится информация о количестве чисел и сами числа (рис. 6.5). Необходимо сформировать массив, не содержащий повторяющихся значений. Этот алгоритм был рассмотрен в главе 1. При работе с файлом он выглядит следующим образом.

//L6_3.cpp

#include <string.h>

#include <fstream>

#include <iostream>

using namespace std;

int main( )

{

setlocale(LC_CTYPE,"russian");

int n,i,m=0,*x,tmp;

fstream ff("input.txt"),f1; //Открытие файла "input.txt"

ff>>n; //Чтение n

x=new int[n]; //Запрос памяти под массив

ff>>tmp;

while(!ff.eof())

{

for(i=0;i<m;i++)

if(x[i]==tmp)

break;

if(i==m) //Если такого элемента еще не было,

//дополняем его и увеличиваем индекс

//элемента массива.

x[m++]=tmp;

ff>>tmp;

}

ff.close(); //Закрытие файла

//Открываем файл "input.txt" для пополнения

f1.open("input.txt", ios::app);

f1<<"\nПолученный вектор размерностью "<<m<<'\n';

for(i=0;i<m;i++)

{

f1.width(5); //Под выводимый объект выделяем 5 позиций

f1.setf(ios::left); //В поле вывода значение прижать к левому краю

f1<<x[i];

}

f1.close(); //Закрытие файла

return 0;

}

Содержимое файла "input.txt"

Рис. 6.5. Информация, находящаяся в файле «input.txt»

На рис. 6.6 представлен результат выполнения программы листинга 6.3.

Рис. 6.6. Результат работы программы листинга 6.3

Упражнения

  1. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b.

  2. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить объединение массивов a и b.

  3. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b.

  4. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить дополнение массива a до массива b.

  5. Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него один раз.

  6. Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него более одного раза.

  7. В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработнойя платы. Создать список отделов и вычислить общую сумму заработной платы сотрудников каждого отдела.

  8. В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список сотрудников и вычислить общую сумму их заработной платы.

  9. В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и вычислить общую сумму заработной платы за каждый месяц.

  10. В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список студентов с указанием их среднего балла за сессию.

  11. В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список предметов с указанием среднего балла по этому предмету в сессию.

  12. Задан произвольный массив. Исходная информация записана в файле. Построить массив только из уникальных значений, с указанием, сколько раз элемент входит в исходный массив.

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

  14. В файле задан список слов. Составить список слов, встречающихся в списке только один раз.

  15. В файле задан список слов. Составить список слов, встречающихся в списке более одного раза.

  16. В файле задан произвольный набор чисел. Создать массив неповторяющихся чисел с указанием о том, сколько раз число встречается в исходном массиве, и упорядочить числа по возрастанию частоты повторяемости.

  17. В файле задан произвольный набор чисел. Создать массив неповторяющихся положительных чисел с указанием о том, сколько раз число встречается в исходном массиве, и упорядочить числа по убыванию частоты повторяемости.

  18. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b и упорядочить ее по убыванию.

  19. Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b, исключая отрицательные элементы.

  20. В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список должников с указанием их суммарной задолженности.

  21. В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список годов с указанием суммарной задолженности и определить год с максимальной задолженностью.

  22. В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список оценок с указанием их повторяемости за сессию. Определить наиболее часто встречающиея оценки.

  23. В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и общего количества сотрудников в отделе. Определить отдел с максимальным числом сотрудников.

  24. В файле задан текст. Определить частоту повторяемости входящих в текст латинских букв. Строчные и прописные буквы считать одинаковыми.

  25. В файле задан текст. Определить частоту повторяемости входящих в текст цифр.