Предположим, что в файле «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