Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧКА прикладное ПРОГРАМ.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.06 Mб
Скачать

Список представляет собой таблицу

Фамилия и инициалы

Курс

Группа

1

Иванов А.А.

1

ИСТ – 101

2

Сидоров Б.Б.

1

АСУ – 120

.

Каждая строка содержит информацию об одном студенте. Таблица содержит n строк. Требуется написать программу, которая печатает перечень групп, имеющих задолжников с указанием их количества в группе.

# include <iostream.h>

# include <fstream.h>

# include <string.h>

# include <iomanip.h>

# include <stdlib.h>

# include <conio.h>

struct student

{

char name[30];

int kurs;

char gr[7];

};

struct group

{

char gr[7];

int ng;

};

class dmassiv // класс динамический массив структур

{

private:

student *pst; // указатель на исходную таблицу задолжников

int n; // n – число строк в исходной таблице

group *pz; // указатель на перечень групп, имеющих задолжников

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

public:

dmassiv() { n=0; pst=NULL; k=0; pz=NULL;} // конструктор

~dmassiv(); // деструктор

void inputstudentfile (); // ввод массива задолжников из файла

void outputstudent (); // вывод массива задолжников на экран

void outputgroup (); // вывод перечня групп задолжников на экран

void outputgroupfile (); // вывод перечня групп задолжников в файл

void perechengroup (); // формирование перечня групп задолжников

void add (); // добавление записи в массив задолжников

void deletename (); // удаление записи из массива задолжников

};

// Ввод исходного массива задолжников из файла

void dmassiv::inputstudentfile ()

{

ifstream fin;

char file[10];

char iniz[7]; // рабочая переменная для инициалов

student t; // рабочая переменная для подсчета записей в файле

int i;

// очистка рабочих областей (массива задолжников и перечня)

if(pst!=NULL) { delete[] pst; n=0; pst=NULL;}

if(pz!=NULL) { delete[] pz; k=0; pz=NULL;}

cout << ”Имя файла:” ;

cin >> file;

fin.open(file);

if( fin==NULL) {cout<<”Файл не открыт.\n”; exit(1);}

// подсчет записей в файле

n=0;

do {

fin >> t.name >> iniz >> t.kurs >> t.gr ;

n++;

}while (fin.good());

n--;

fin.close();

// выделение памяти для динамического массива

pst= new student [n];

if( pst==NULL ) { cout<<”Нет динамической памяти.”; getch(); exit(1);}

// ввод массива задолжников из файла

fin.open(file);

if( fin==NULL) {cout<<”Файл не открыт.\n”; exit(1);}

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

{

fin >> pst[i].name >> iniz >> pst[i].kurs >> pst[i].gr ;

strcat( pst[i].name, “ “); // добавление инициалов через

strcat( pst[i].name, iniz); // пробел к фамилии

}

fin.close();

}

// Вывод массива задолжников на экран

void dmassiv::outputstudent ()

{

cout << ” Исходный массив структур. \n” ;

cout<< “Фамилия и инициалы Курс Группа \n”;

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

cout << setw(16)<< pst[i].name << setw(7)<< pst[i].kurs << setw(8) << pst[i].gr << endl ;

}

// Формирование перечня групп, имеющих задолжников

void dmassiv::perechengroup ()

{

int i,j,fl;

// выделение памяти для динамического массива (перечня)

pz= new group [n];

if( pz==NULL ) { cout<<”Нет динамической памяти.”; getch(); exit(1);}

// очистка рабочей области (перечня)

if(pz!=NULL) { delete[] pz; k=0; pz=NULL;}

// формирование перечня групп

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

{

fl=1;

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

if (strcmp( pst[i].gr, pz[j].gr) == 0) { fl=1; pz[j].ng++; }

if (fl==1) { strcpy( pz[k].gr, pst[i].gr); pz[k].ng =1; k++; }

}

}

// Вывод перечня групп, имеющих задолжников, на экран

void massiv::outputgroup ()

{

cout << ” Перечень групп, имеющих задолжников. \n” ;

cout<< “ Группа Кол-во \n”;

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

cout << setw(8)<< pz[i].gr << setw(8)<< pz[i].ng << << endl ;

}

// Вывод перечня групп, имеющих задолжников, в файл

void dmassiv::outputgroupfile ()

{

оfstream fout;

char file[10];

int i;

cout << ”Имя файла:” ;

cin >> file;

fout.open(file);

if( !fout.good()) {cout<<”Файл не открыт.\n”; exit(1);}

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

fout << setw(8)<< pz[i].gr << setw(8)<< pz[i].ng << << endl ;

fout.close();

}

// Добавление записи в массив задолжников

void dmassiv::add ()

{

int i;

student t, // рабочая переменная для информации о добавляемом

*p; // указатель для сохранения адреса исходного массива

char iniz[7]; // рабочая переменная для инициалов

// ввод информации о добавляемом

cout << “Введите фамилию: ”;

cin >> t.name >> iniz;

strcat( t.name, “ “); // добавление инициалов через

strcat( t.name, iniz); // пробел к фамилии

cout << “Курс: ”;

cin >> t.kurs;

cout << “Группа: ”;

cin >> t.gr;

p=pst; // сохранение адреса исходного массива

// выделение памяти для массива и добавление введенной записи в него

pst= new student [n+1];

if( pst==NULL ) { cout<<”Нет динамической памяти.”; getch(); exit(1);}

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

pst[i]=p[i];

pst[n]=t; // добавление записи в массив

n++;

delete[] p; // удаление предыдущего массива

}

// Удаление записи по фамилии и группе из массива задолжников

void dmassiv::deletename ()

{

int i,j;

student t; // рабочая переменная для информации об удаляемом

char iniz[7]; // рабочая переменная для инициалов

// ввод фамилии и группы удаляемого

cout << “Введите фамилию: ”;

cin >> t.name >> iniz;

strcat( t.name, “ “); // добавление инициалов через

strcat( t.name, iniz); // пробел к фамилии

cout << “Группа: ”;

cin >> t.gr;

// поиск и удаление записи

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

if( strcmp(t.name, pst[i].name)==0 && strcmp(t.gr, pst[i].gr)==0) break;

if(i==n) {cout<<t.name<” не найден. \n“; getch(); exit(1);}

else { for ( j=i+1; j<n; j++)

pst[j-1]=pst[j];

n--;

}

}

// Определение деструктора

dmassiv::~dmassiv()

{

// очистка рабочих областей (массива задолжников и перечня)

if(pst!=NULL) { delete[] pst; n=0; pst=NULL;}

if(pz!=NULL) { delete[] pz; k=0; pz=NULL;}

}

/*основная функция программы */

void main()

{

dmassiv a; // Объект класса dmassiv

int j;

while (1)

{

clrscr();

cout << “1. Ввод таблицы из файла. \n”;

cout << “2. Вывод таблицы на экран. \n”;

cout << “3. Добавление записи в таблицу. \n”;

cout << “4. Удаление записи из таблицы. \n”;

cout << “5. Формирование перечня групп. \n”;

cout << “6. Вывод перечня групп на экран. \n”;

cout << “7. Вывод перечня групп в файл. \n”;

cout << “8. Выход из программы. \n”;

cout << “\n Ваш выбор (1-8) :”;

cin >> j;

switch(j)

{

case 1: a.inputstudentfile(); break;

case 2: a.outputstudent(); getch(); break;

case 3: a.add(); break;

case 4: a.deletename(); break;

case 5: a.perechengroup(); break;

case 6: a.outputgroup(); getch(); break;

case 7: a.outputgroupfile(); break;

case 8: cout << “Завершение рабоы.”; getch(); return;

default: cout << “ Ошибка в выборе пункта меню. Повторите.”; getch();

}}}

Задания для лабораторной работы:

Варианты заданий соответствуют заданиям лабораторной работы № 32-33. Для их решения необходимо использовать классы динамического массива структур, предусмотрев выполнение дополнительно операций добавления и удаления записей в исходном массиве. Для демонстрации методов класса требуется реализовать программу меню.

Контрольные вопросы:

1. Для какого класса существует конструктор?

2. Что такое деструктор?

3. Приведите пример выделения памяти для динамического массива.

4. Назовите основные характеристики деструктора.

5. К чему разрешает уровнь доступа private?

Лабораторная работа № 38-39

«Использование списков»

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

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

-осуществлять разработку кода программного модуля на современных языках программирования;

- оформлять документацию на программные средства;

- использовать инструментальные средства для автоматизации оформления документации;

знать:

- основные этапы разработки программного обеспечения;

- основные принципы технологии структурного и объектно-ориентированного программирования;

- методы и средства разработки технической документации.