ТОП 10:

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



 

Предположим, что в файле «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. В файле задан текст. Определить частоту повторяемости входящих в текст цифр.

 







Последнее изменение этой страницы: 2016-07-11; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.230.1.126 (0.008 с.)