№ | Фамилия и инициалы | Курс | Группа |
Иванов А.А. | ИСТ – 101 | ||
Сидоров Б.Б. | АСУ – 120 | ||
. | … | … | … |
# include <iostream.h>
# include <fstream.h>
# include <string.h>
# include <iomanip.h>
# include <stdlib.h>
const int N=200;
struct student
{
char name[30];
int kurs;
char gr[7];
};
struct group
{
char gr[7];
int ng;
};
// Прототипы функций
student *inputstudentfile (int &nn);
void outputstudent (student st[], int nn);
group *perechengroup (student st[], int nn, int &kk);
void outputgroup (group z[], int kk);
void outputgroupfile (group z[], int kk);
// Ввод исходного массива задолжников из файла
student *inputstudentfile (int &nn)
{
ifstream fin;
char file[10];
char iniz[7]; // рабочая переменная для инициалов
student t; // рабочая переменная для подсчета записей в файле
student *ps;
int i;
cout << ”Имя файла:”;
cin >> file;
fin.open(file);
if(fin==NULL) {cout<<”Файл не открыт.\n”; exit(1);}
// подсчет записей в файле
nn =0;
do {
fin >> t.name >> iniz >> t.kurs >> t.gr;
nn++;
}while (fin.good());
nn--;
fin.close();
// выделение памяти для динамического массива
ps= new student [nn];
if(ps=NULL) { cout<<”Нет динамической памяти.”; getch(); exit(1);}
// ввод массива задолжников из файла
|
|
fin.open(file);
if(fin==NULL) {cout<<”Файл не открыт.\n”; exit(1);}
for (i=0; i< nn; i++)
{
fin >> ps[i].name >> iniz >> ps[i].kurs >> ps[i].gr;
strcat(ps[i].name, “ “); // добавление инициалов через
strcat(ps[i].name, iniz); // пробел к фамилии
}
fin.close();
return ps;
}
// Вывод массива задолжников на экран
void outputstudent (student st[], int nn)
{
cout<< “Фамилия и инициалы Курс Группа \n”;
for (i=0; i<nn; i++)
cout << setw(16)<< st[i].name << setw(7)<< st[i].kurs << setw(8) << st[i].gr << endl;
}
// Формирование перечня групп, имеющих задолжников
group *perechengroup (student st[], int nn, int &kk)
{
int i,j,fl;
group *p;
// выделение памяти для динамического массива (перечня)
p= new group [nn];
if(p==NULL) { cout<<”Нет динамической памяти.”; getch(); exit(1);}
kk=0;
for (i=0; i<nn; i++)
{
fl=1;
for (j=0; j<kk; j++)
if (strcmp(st[i].gr, p[j].gr) == 0) { fl=1; p[j].ng++; }
if (fl==1) { strcpy(p[k].gr, st[i].gr); p[k].ng =1; kk++; }}
return p;
}
// Вывод перечня групп, имеющих задолжников, на экран
void outputgroup (group z[], int kk)
{
cout<< “ Группа Кол-во \n”;
for (i=0; i< kk; i++)
cout << setw(8)<< z[i].gr << setw(8)<< z[i].ng << << endl; }
// Вывод перечня групп, имеющих задолжников, в файл
void outputgroupfile (group z[], int kk)
{
оfstream fout;
char file[10];
int i;
cout << ”Имя файла:”;
cin >> file;
fout.open(file);
if(!fout.good()) {cout<<”Файл не открыт.\n”; exit(1);}
for (i=0; i< kk; i++)
fout << setw(8)<< z[i].gr << setw(8)<< z[i].ng << << endl;
fout.close(); }
/*основная функция программы */
void main()
{
student *pst; // указатель на исходную таблицу задолжников
int n; // n – число строк в исходной таблице
group *pz; // указатель на перечень групп, имеющих задолжников
int k; // к – число групп в перечне
pst=inputstudentfile (n);
cout << ” Исходный массив структур. \n”;
outputstudent (pst, n);
pz=perechengroup (pst, n, k);
cout << ” Перечень групп, имеющих задолжников. \n”;
outputgroup (pz, k);
outputgroupfile (pz, k);
|
|
delete [] pst;
delete [] pz;
}
Задания для лабораторной работы:
1. Исходные данные вводятся из файла.
2. Результаты выводятся на экран и в файлы.
3.1 Строка таблицы данных содержит следующую информацию о первокурсниках: фамилия, имя, отчество, группа, количество баллов, набранных на вступительных экзаменах.
Требуется найти:
3.1.1) перечень фамилий с указанием числа студентов с такой фамилией;
3.1.2) перечень имён с указанием числа студентов с таким именем;
3.1.3) перечень отчеств с указанием числа студентов с таким отчеством;
3.1.4) перечень групп с указанием числа студентов, обучающихся в них;
3.1.5) перечень баллов с указанием числа студентов, набравших это количество баллов;
3.1.6) перечень имен, встречающихся максимальное количество раз;
3.1.7) перечень групп, в которых максимальное количество обучающихся студентов;
3.1.8) перечень студентов, набравших максимальное количество баллов;
3.1.9) перечень групп, в которых максимальное количество студентов, набравших максимальное количество баллов;
3.1.10) перечень групп, в которых средний балл студентов по группе максимален.
3.2 Строка таблицы данных содержит следующую информацию о книгах: автор, наименование, издательство, год издания.
Требуется найти:
3.2.1) перечень авторов с указанием числа их книг;
3.2.2) перечень наименований с указанием числа книг с таким названием;
3.2.3) перечень издательств с указанием числа книг, выпущенных ими;
3.2.4) перечень годов изданий с указанием числа книг, выпущенных в эти годы;
3.2.5) перечень авторов, имеющих максимальное число книг;
3.2.6) перечень издательств, выпустивших максимальное число книг;
3.2.7) перечень наименований книг, встречающихся максимальное число раз;
3.2.8) перечень годов изданий, в которые выпущено максимальное число книг;
3.2.9) перечень издательств, выпустивших книги авторов, которые имеют максимальное число книг в таблице данных;
3.2.10) перечень авторов, выпустивших книги в годы издания, в которые опубликовано максимальное число книг в таблице данных.
3.3 Строка таблицы данных содержит следующую информацию о владельцах авто: ф.и.о. владельца, марка авто, год выпуска, страна производитель.
Требуется найти:
3.3.1) перечень владельцев с указанием числа их авто;
3.3.2) перечень марок авто с указанием их числа;
3.3.3) перечень стран производителей с указанием количества авто, выпущенных ими;
3.3.4) перечень годов выпуска с указанием количества авто, выпущенных в эти годы;
3.3.5) перечень владельцев, имеющих максимальное число авто;
3.3.6) перечень стран, выпустивших максимальное количество авто;
3.3.7) перечень марок авто, встречающихся максимальное число раз;
3.3.8) перечень годов выпуска, в которые выпущено максимальное количество авто;
3.3.9) перечень стран, выпустивших марки авто, которых имеется в таблице данных в максимальном количестве;
3.3.10) перечень марок, выпущенных в годы, в которые произведено максимальное количество авто в таблице данных.
Контрольные вопросы:
1. Как осуществляется доступ к динамическим элементам массива?
2. Что такое стек?
3. Каким образом происходит распределение памяти?
4. В чем преимущества динамических массивов структур?
5. Какие функции отвечают за выделение и освобождение памяти? Привести примеры.