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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: