Скачиваний:
28
Добавлен:
02.05.2014
Размер:
168.96 Кб
Скачать

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

Требуется найти: перечень групп, в которых максимальное количество студентов, набравших максимальное количество баллов.

Считывание исходного файла с клавиатуры, вывод на экран.

Сортировка:

1)Сортировка групп, в которых максимальное количество студентов, набравших максимальное количество баллов, в алфавитном порядке.

Вывод на экран и в файл.

2)Сортировка фамилий, имен, отчеств в алфавитном порядке.

Вывод на экран и в файл.

3)Сортировка всех групп в алфавитном порядке.

Вывод на экран и в файл.

4)Сортировка по количеству баллов в порядке убывания.

Вывод на экран и в файл.

Цель работы: Изучение класса массивов структур и файловых потоков.

Блок-схема главной программы:

Программа:

#include<iostream.h> //библиотека для ввода, вывода

#include<fstream.h> //библиотека для работы с файлами

#include<string.h> //библиотека для строковых данных

#include<stdlib.h> //библиотека для выхода из программы

#include<conio.h> //библиотека для задержки на экране

#include<iomanip.h> //библиотека для выравнивания столбцов в таблице данных

const int l=31; //наибольшее возможное количество символов в строке

struct fio

{ //структура  fio включает данные студентов:

char fam[l]; //фамилии

char im[l]; //имена 

char ot[l]; //отчества

};

struct student

{ //структура  student включает данные студентов:

fio f; //ФИО

char gr[l]; //группу

int col; //количество баллов

};

struct gruppa

{ //структура  gruppa данные групп:

char gr[l]; //название группы

int ng; //количество студентов

};

const int N=100;

class massiv //класс massiv

{private:

student s[N];

int m; //количество студентов

gruppa z[N];

int k; //количество групп

public:

void inputstfile();

void outputst();

void perech();

void sortgr();

void outputgrmax();

void outputgrfile();

void alfsortfio();

void outputstfile();

void alfsortgr();

void sortcol();

};

void massiv:: inputstfile() // ввод из файла

{ifstream fin; //входной поток

char file[l];

cout<<"imya faila:";

cin>>file; //ввод файла

fin.open(file); //открытие файла

if(fin==NULL){cout<<"fail ne otkrit"; //если файл не обнаружен, вывод сообщения об ошибке на экран

getch(); //задержка на экране,

exit(1); //выход из программы

}

m=0;

fin>>s[m].f.fam>>s[m].f.im>>s[m].f.ot>>s[m].gr>>s[m].col;

while (fin.good()) //пока не прекратятся записи в файле

{

m++;

fin>>s[m].f.fam>>s[m].f.im>>s[m].f.ot>>s[m].gr>>s[m].col; //ввод из файла ФИО, групп, количества баллов

}

}

void massiv:: outputst() //вывод на экран массива студентов

{int i;

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

{

cout<<setw(14)<<setiosflags(ios::left)<<s[i].f.fam

<<setw(11)<<setiosflags(ios::left)<<s[i].f.im

<<setw(15)<<setiosflags(ios::left)<<s[i].f.ot

<<setw(6)<<setiosflags(ios::left)<<s[i].gr

<<setw(10)<<setiosflags(ios::left)<<s[i].col<<endl;

if((i+1)%10==0) getch(); //задержка на экране

}

getch();

}

void massiv:: perech() // формирование перечня групп,

{int i,j,fl,max; // с указанием количества студентов,

max=s[0].col; // набравших максимальное количество баллов (МАХ)

k=0;

for(i=1;i<m;i++) //вычисление максимального количества баллов

if (s[i].col>max) max=s[i].col;

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

if (s[i].col==max) //если количество баллов, набранных студентом, равно максимальному

{fl=1;

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

if(strcmp(s[i].gr,z[j].gr)==0) //если этот студент не первый в своей группе, набравший МАХ

{fl=0;

z[j].ng++; //счетчик студентов в группе, набравших МАХ

}

if (fl==1) //если этот студент первый в своей группе, набравший МАХ

{strcpy(z[k].gr,s[i].gr); //копирование названия группы в данный перечень групп

z[k].ng=1;

k++; //счетчик групп

}

}

}

void massiv::sortgr() // сортировка перечня групп (МАХ)

{int i,l,fl; // в алфавитном порядке

gruppa t;

l=k-1; //количество сравнений названий групп (МАХ)

do //выполнение действий:

{

fl=0;

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

if(strcmp(z[i].gr,z[i+1].gr)>0) //если алфавитный порядок названий групп нарушен

{

t=z[i]; //перестановка данных структуры gruppa

z[i]=z[i+1];

z[i+1]=t;

fl=1;

}

l--; //счетчик количества сравнений названий групп

} while(fl==1); //пока есть нарушения в алфавитном порядке

}

void massiv:: outputgrmax() // вывод на экран перечня групп, в которых максимальное количество студентов,

{ // набравших максимально количество баллов

int i,max1;

max1=z[0].ng;

cout<<"Tablichka grupp."<<endl;

for(i=0;i<k;i++) //вычисление максимального количества студентов, набравших МАХ

if (z[i].ng>=max1) max1=z[i].ng; // среди всех групп

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

if (z[i].ng==max1) //если количество студентов, набравших МАХ, в этой группе равно максимальному

cout<<setw(6)<<setiosflags(ios::left)<<z[i].gr //вывод группы, количества студентов группы,

<<setw(10)<<setiosflags(ios::left)<<z[i].ng<<endl; //набравших МАХ

getch(); //задержка на экране

}

void massiv:: outputgrfile() // сохранение в файле перечня групп (МАХ)

{ofstream out; //выходной поток

char file[l];

int i,max1;

cout<<"imya faila:";

cin>>file; //ввод файла

out.open(file); //открытие файла

if (out==NULL) {cout<<"Fail ne naiden"; //если файл не найден, вывод сообщения об ошибке,

getch(); // задержка на экране

exit(1); // выход из программы

}

max1=z[0].ng;

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

if (z[i].ng>=max1) max1=z[i].ng;

out<<"gruppa "<<"kolichestvo studentov MAX "<<endl;

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

if (z[i].ng==max1)

{out<<setw(6)<<setiosflags(ios::left)<<z[i].gr //запись в файл группы,

<<setw(10)<<setiosflags(ios::left)<<z[i].ng<<endl;} // количества студентов группы, набравших МАХ

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

}

void massiv:: alfsortfio() //сортировка массива студентов по фамилии, имени, отчеству

{int i,l,fl; //в алфавитном порядке

student t;

l=m-1; //количество сравнений ФИО

do //выполнение действий:

{

fl=0;

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

{

if(strcmp(s[i].f.fam,s[i+1].f.fam)>0) //если алфавитный порядок фамилий нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

else if(strcmp(s[i].f.fam,s[i+1].f.fam)==0) //в случае совпадения фамилий- сортировка по имени

if(strcmp(s[i].f.im,s[i+1].f.im)>0) // если алфавитный порядок имен нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

else if(strcmp(s[i].f.im,s[i+1].f.im)==0) // в случае совпадения имен- сортировка по отчеству

if(strcmp(s[i].f.ot,s[i+1].f.ot)>0) // если алфавитный порядок отчеств нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

}

l--; //счетчик количества сравнений ФИО

} while(fl==1); //пока есть нарушения в алфавитном порядке

}

void massiv:: outputstfile () //сохранение в файле массива студентов

{ofstream fout; //выходной поток

char file[l];

int i;

cout<<"imya faila:";

cin>>file; //ввод файла

fout.open(file); //открытие файла

if (fout==NULL) {cout<<"Fail ne naiden"; //если файл не найден, вывод сообщения об ошибке,

getch(); //задержка на экране

exit(1); //выход из программы

}

cout<<"familiya "<<"imya "<<"otchestvo "<<"gruppa "<<"Kolichestvo ballov"<<endl;

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

fout<<setw(14)<<setiosflags(ios::left)<<s[i].f.fam // запись в файл фамилий,

<<setw(11)<<setiosflags(ios::left)<<s[i].f.im // имен,

<<setw(15)<<setiosflags(ios::left)<<s[i].f.ot // отчеств

<<setw(6)<<setiosflags(ios::left)<<s[i].gr // названия группы

<<setw(10)<<setiosflags(ios::left)<<s[i].col<<endl; // количества баллов

fout.close();

}

void massiv:: alfsortgr() // сортировка массива студентов по названию группы

{int fl,i,l; // в алфавитном порядке

student t;

l=m-1; //количество сравнений названий групп

do //выполнение действий:

{

fl=0;

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

{

if(strcmp(s[i].gr,s[i+1].gr)>0) // если алфавитный порядок названий групп нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

else if(strcmp(s[i].gr,s[i+1].gr)==0) //в случае совпадения названий групп- сортировка по фамилии

if(strcmp(s[i].f.fam,s[i+1].f.fam)>0) // если алфавитный порядок фамилий нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

else if(strcmp(s[i].f.fam,s[i+1].f.fam)==0) //в случае совпадения фамилий- сортировка по имени

if(strcmp(s[i].f.im,s[i+1].f.im)>0) // если алфавитный порядок имен нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

else if(strcmp(s[i].f.im,s[i+1].f.im)==0) //в случае совпадения имен- сортировка по отчеству

if(strcmp(s[i].f.ot,s[i+1].f.ot)>0) // если алфавитный порядок отчеств нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

}

l--; //счетчик количества сравнений названий групп

} while(fl==1); //пока есть нарушения в алфавитном порядке

}

void massiv:: sortcol() //сортировка массива студентов по количеству баллов

{int fl,i,l; //в порядке убывания

student t;

l=m-1;

do

{

fl=0;

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

{if(s[i].col<s[i+1].col) //если порядок убывания количества баллов нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

if(s[i].col==s[i+1].col) //в случае совпадения количества баллов- сортировка по названию группы

if(strcmp(s[i].gr,s[i+1].gr)>0) // если алфавитный порядок названий групп нарушен

{

t=s[i]; //перестановка данных структуры student

s[i]=s[i+1];

s[i+1]=t;

fl=1;

}

}

l--; //счетчик количества сравнений названий групп

}while(fl==1); //пока есть нарушения в алфавитном порядке

}

void main() //Главная программа //

{massiv h;

int p;

while(1)

{clrscr();

cout<<"1.vvod iz faila.\n";

cout<<"2.vivod na ekran.\n";

cout<<"3.formirovanie perechnya GRUPPMAX.\n";

cout<<"4.sortirovka GRUPPMAX v alfavitnom poryadke.\n";

cout<<"5.vivod na ekran perechnya GRUPPMAX.\n";

cout<<"6.sohranenie v faile perechnya GRUPPMAX.\n";

cout<<"7.sortirovka FIO v alfavitnom poryadke. :2.\n";

cout<<"8.sohranenie v faile FIO v alfavitnom poryadke.\n";

cout<<"9.sortirovka vseh grupp v alfavitnom poryadke. :2,8.\n";

cout<<"10.sortirovka perecnya po kolichestvu ballov. :2,8.\n";

cout<<"11.vihod iz programmi.\n";

cout<<endl<<endl;

cout<<"vash vibor (1%16):";

cin>>p;

switch(p)

{ case 1:h.inputstfile();break;

case 2:h.outputst();break;

case 3:h.perech();break;

case 4:h.sortgr();break;

case 5:h.outputgrmax();break;

case 6:h.outputgrfile();break;

case 7:h.alfsortfio();break;

case 8:h.outputstfile();break;

case 9:h.alfsortgr();break;

case 10:h.sortcol();break;

case 11:cout<<"konets raboti";

getch();

return;

default:cout<<"net punkta";

getch();

break;

}

}

}

Тест:

1.vvod iz faila.

2.vivod na ekran.

3.formirovanie perechnya GRUPPMAX.

4.sortirovka GRUPPMAX v alfavitnom poryadke.

5.vivod na ekran perechnya GRUPPMAX.

6.sohranenie v faile perechnya GRUPPMAX.

7.sortirovka FIO v alfavitnom poryadke.

8.vivod na ekran FIO v alfavitnom poryadke.

9.sohranenie v faile FIO v alfavitnom poryadke.

10.sortirovka vseh grupp v alfavitnom poryadke.

11.vivod na ekran vseh grupp v alfavitnom poryadke.

12.sohranenie v faile vseh grupp v alfavitnom poryadke.

13.sortirovka perecnya po kolichestvu ballov.

14.vivod na ekran perecnya po kolichestvu ballov.

15.sohranenie v faile perecnya po kolichestvu ballov.

16.vihod iz programmi.

vash vibor (1%16):

Имя файла: test.txt (1) File: test.txt

Ivanov Petr Sergeevich MO 87 (2)

Kutlubaeva Kamila Yulaevna IVT 87

Kurochkin Ivan Vasilevich VM 78

Gabbasova Alfiya Ilgizovna IVT 84

Duzenko Olga Petrovna ACOI 87

Bashirov Ramil Salavatovich IVT 75

Garifullin Ildar Maratovich VM 87

Samoilov Fedor Nicolaevich IVT 87

Lastov Aleksey Viktorovich MO 87

Chinchik Maksim Anatolievich IVT 76

Gareeva Regina Radikovna IVT 87

Mochalkin Pavel Aleksandrovich CAPR 78

Gates Bill Microsoftovich MO 0

Ganeev Rinat Rashitovich ACOI 78

Shiyapova Svetlana Salavotovna CAPR 85

Ascarov Aidar Muratovich ACOI 87

Blinov Pavel Sergeevich IVT 65

Vasiliev Evgeniy Gavrilovich VM 65

Rednikova Ekaterina Dmitrievna CAPR 87

Disketkin Flash Modemovich ACOI 79

Bureeva Kceniya Mihailovna VM 76

Mustafina Adelya Ramilevna CAPR 78

Yudina Anastasiya Valerievna MO 73

Murtazin Bulat Ravilevich CAPR 54

Starosvetskiy Artem Vadimovich ACOI 87

Shiyapova Alina Salavotovna CAPR 82

Shiyapova Karina Salavotovna CAPR 82

Vasiliev Evgeniy Benediktovich MO 87

Упорядоченный в алфавитном порядке массив групп, в которых максимальное количество студентов, набравших максимальное количество баллов.

File: result1.txt (6)

Uporyadochnyi massiv GRUPPMAX v alfavitnom poryadke: (5)

gruppa kolichestvo studentov MAX

ACOI 3

IVT 3

MO 3

Упорядоченный массив фамилий, имен и отчеств в алфавитном порядке.

File: result2.txt (9)

familiya imya otchestvo gruppa Kolichestvo ballov

Ascarov Aidar Muratovich ACOI 87

Bashirov Ramil Salavatovich IVT 75 (8)

Blinov Pavel Sergeevich IVT 65

Bureeva Kceniya Mihailovna VM 76

Chinchik Maksim Anatolievich IVT 76

Disketkin Flash Modemovich ACOI 79

Duzenko Olga Petrovna ACOI 87

Gabbasova Alfiya Ilgizovna IVT 84

Ganeev Rinat Rashitovich ACOI 78

Gareeva Regina Radikovna IVT 87

Garifullin Ildar Maratovich VM 87

Gates Bill Microsoftovich MO 0

Ivanov Petr Sergeevich MO 87

Kurochkin Ivan Vasilevich VM 78

Kutlubaeva Kamila Yulaevna IVT 87

Lastov Aleksey Viktorovich MO 87

Mochalkin Pavel Aleksandrovich CAPR 78

Murtazin Bulat Ravilevich CAPR 54

Mustafina Adelya Ramilevna CAPR 78

Rednikova Ekaterina Dmitrievna CAPR 87

Samoilov Fedor Nicolaevich IVT 87

Shiyapova Alina Salavotovna CAPR 82

Shiyapova Karina Salavotovna CAPR 82

Shiyapova Svetlana Salavotovna CAPR 85

Starosvetskiy Artem Vadimovich ACOI 87

Vasiliev Evgeniy Benediktovich MO 87

Vasiliev Evgeniy Gavrilovich VM 65

Yudina Anastasiya Valerievna MO 73

Упорядоченный массив групп в алфавитном порядке.

File: result3.txt (12)

familiya imya otchestvo gruppa Kolichestvo ballov

Ascarov Aidar Muratovich ACOI 87

Disketkin Flash Modemovich ACOI 79 (11)

Duzenko Olga Petrovna ACOI 87

Ganeev Rinat Rashitovich ACOI 78

Starosvetskiy Artem Vadimovich ACOI 87

Mochalkin Pavel Aleksandrovich CAPR 78

Murtazin Bulat Ravilevich CAPR 54

Mustafina Adelya Ramilevna CAPR 78

Rednikova Ekaterina Dmitrievna CAPR 87

Shiyapova Alina Salavotovna CAPR 82

Shiyapova Karina Salavotovna CAPR 82

Shiyapova Svetlana Salavotovna CAPR 85

Bashirov Ramil Salavatovich IVT 75

Blinov Pavel Sergeevich IVT 65

Chinchik Maksim Anatolievich IVT 76

Gabbasova Alfiya Ilgizovna IVT 84

Gareeva Regina Radikovna IVT 87

Kutlubaeva Kamila Yulaevna IVT 87

Samoilov Fedor Nicolaevich IVT 87

Gates Bill Microsoftovich MO 0

Ivanov Petr Sergeevich MO 87

Lastov Aleksey Viktorovich MO 87

Vasiliev Evgeniy Benediktovich MO 87

Yudina Anastasiya Valerievna MO 73

Bureeva Kceniya Mihailovna VM 76

Garifullin Ildar Maratovich VM 87

Kurochkin Ivan Vasilevich VM 78

Vasiliev Evgeniy Gavrilovich VM 65

Упорядоченный массив по количеству баллов.

File: resultst.txt (15)

familiya imya otchestvo gruppa Kolichestvo ballov

Ascarov Aidar Muratovich ACOI 87

Duzenko Olga Petrovna ACOI 87 (14)

Starosvetskiy Artem Vadimovich ACOI 87

Rednikova Ekaterina Dmitrievna CAPR 87

Gareeva Regina Radikovna IVT 87

Kutlubaeva Kamila Yulaevna IVT 87

Samoilov Fedor Nicolaevich IVT 87

Ivanov Petr Sergeevich MO 87

Lastov Aleksey Viktorovich MO 87

Vasiliev Evgeniy Benediktovich MO 87

Garifullin Ildar Maratovich VM 87

Shiyapova Svetlana Salavotovna CAPR 85

Gabbasova Alfiya Ilgizovna IVT 84

Shiyapova Alina Salavotovna CAPR 82

Shiyapova Karina Salavotovna CAPR 82

Disketkin Flash Modemovich ACOI 79

Ganeev Rinat Rashitovich ACOI 78

Mochalkin Pavel Aleksandrovich CAPR 78

Mustafina Adelya Ramilevna CAPR 78

Kurochkin Ivan Vasilevich VM 78

Chinchik Maksim Anatolievich IVT 76

Bureeva Kceniya Mihailovna VM 76

Bashirov Ramil Salavatovich IVT 75

Yudina Anastasiya Valerievna MO 73

Blinov Pavel Sergeevich IVT 65

Vasiliev Evgeniy Gavrilovich VM 65

Murtazin Bulat Ravilevich CAPR 54

Gates Bill Microsoftovich MO 0

konets raboti (16)

net punkta (default)

Соседние файлы в папке Лабораторная работа №4