Программирование на C / C++ / Лабораторная работа №4 / laba9
.docЗадание: Строка таблицы данных содержит следующую информацию о первокурсниках: фамилия, имя, отечество, группа, количество баллов, набранных на вступительных экзаменах.
Требуется найти: перечень групп, в которых максимальное количество студентов, набравших максимальное количество баллов.
Считывание исходного файла с клавиатуры, вывод на экран.
Сортировка:
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)