- •Нижегородский государственный университет им. Н.И. Лобачевского
- •Оглавление
- •Предисловие
- •Глава 1. Вычисление значений функций
- •1.1. Операторы циклов
- •1.2. Операторы ветвления
- •Когда в программе нужно выбрать один из многочисленных вариантов, бывает целесообразным применять оператор-переключатель switch. Этот оператор называется ещё оператором множественного выбора [1].
- •Switch (выражение)
- •1.3. Алгоритмы, необходимые для написания программ
- •Глава 2. Суммирование рядов
- •Глава 3. Позиционная запись числа
- •Глава 4. Делители целого числа
- •5.1. Сортировка вставкой
- •5.2. Метод пузырька
- •5.3. Сортировка выбором
- •5.4. Быстрая сортировка
- •Глава 6. Работа с файлами. Построение массивов без повторений
- •6.1. Работа с файлами
- •6.2. Построение массивов без повторений
- •Глава 7. Обработка последовательности символов
- •7.1. Алгоритм выделения слова из строки
- •7.2. Выбор слов, подходящих под шаблон
- •7.3. Перевод прописных символов в строчные
- •Глава 8. Побитовые операции
- •Глава 9. Преобразование и построение матриц
- •Содержимое файла “input.Txt”
- •Глава 10. Структуры
- •Выделение памяти под объект coat
- •Содержимое файла "input.Txt".
- •Содержимое файла "outout.Txt"
- •Содержимое файла "input.Txt"
- •11. Динамические структуры данных
- •11.1. Односвязные списки
- •11.2. Очереди
- •11.3. Стеки
- •Содержимое файла “input.Txt”
- •Содержимое файла “input.Txt”
- •Список литературы
Глава 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
Упражнения
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b.
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить объединение массивов a и b.
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b.
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить дополнение массива a до массива b.
Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него один раз.
Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него более одного раза.
В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработнойя платы. Создать список отделов и вычислить общую сумму заработной платы сотрудников каждого отдела.
В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список сотрудников и вычислить общую сумму их заработной платы.
В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и вычислить общую сумму заработной платы за каждый месяц.
В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список студентов с указанием их среднего балла за сессию.
В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список предметов с указанием среднего балла по этому предмету в сессию.
Задан произвольный массив. Исходная информация записана в файле. Построить массив только из уникальных значений, с указанием, сколько раз элемент входит в исходный массив.
В файле задан список слов. Составить список уникальных слов с указанием, сколько раз они встречаются в исходном списке.
В файле задан список слов. Составить список слов, встречающихся в списке только один раз.
В файле задан список слов. Составить список слов, встречающихся в списке более одного раза.
В файле задан произвольный набор чисел. Создать массив неповторяющихся чисел с указанием о том, сколько раз число встречается в исходном массиве, и упорядочить числа по возрастанию частоты повторяемости.
В файле задан произвольный набор чисел. Создать массив неповторяющихся положительных чисел с указанием о том, сколько раз число встречается в исходном массиве, и упорядочить числа по убыванию частоты повторяемости.
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b и упорядочить ее по убыванию.
Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b, исключая отрицательные элементы.
В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список должников с указанием их суммарной задолженности.
В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список годов с указанием суммарной задолженности и определить год с максимальной задолженностью.
В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список оценок с указанием их повторяемости за сессию. Определить наиболее часто встречающиея оценки.
В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и общего количества сотрудников в отделе. Определить отдел с максимальным числом сотрудников.
В файле задан текст. Определить частоту повторяемости входящих в текст латинских букв. Строчные и прописные буквы считать одинаковыми.
В файле задан текст. Определить частоту повторяемости входящих в текст цифр.