Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание3 (все этапы решения).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
175.1 Кб
Скачать

Этап 5.

На данном этапе опишем три требуемых в программе переопределенных операции. Операции сравнения < и == определим как сравнение по фамилии.

В файл CStudent.h добавим заголовки данных методов:

bool operator <(const CStudent &);// операция сравнения < студентов по фамилии

bool operator ==(const CStudent &);// операция сравнения == студентов по фамилии

CStudent & operator ++ ();//операция ++ перевод студента на следующий курс

В файл CStudent.cpp добавим определение этих методов

bool CStudent::operator <(const CStudent &a)

{return name<a.name;}

bool CStudent::operator ==(const CStudent &a)

{return name==a.name;}

CStudent & CStudent::operator ++()

{ if (year<5) year ++;

else cout<<"\nНевозможно перевести студента на следующий курс";

return *this;

}

Протестируем методы в ветви case 5 функции main (файла main.cpp):

case '5': {

CStudent s1 ("Петрова", "Информатика", female, 1);

CStudent s2 ("Иванова", "Информатика", female, 5);

cout<<"\nСозданы два студента";

s1.output();

s2.output();

cout<<"\nДемонстрируется работа операции == ";

if (s1==s2) cout <<"\nФамилии студентов совпадают";

else cout<<"\nФамилии студентов не совпадают";

cout<<"\nДемонстрируется работа операции <";

if (s1<s2) cout <<"\nФамилия прервого студента предшествует фамилии второго ";

else cout<<"\nФамилии второго струдента предшествует фамилии первого";

cout<<"\nДемонстрируется работа операции ++";

(s1++).output();

(s2++).output();

break;

}

Этап 6.

Опишем требуемый метод класса поиск студента с заданной фамилией в массиве студентов.

В файл CStudent.h добавим заголовок данного метода:

CStudent& find(string, int);//метод поиска в массиве студента с заданной фамилией

В файл CStudent.cpp добавим определение метода

//Метод поиска студента с заданной фамилией nam d в массиве размерности n

CStudent & CStudent::find(string nam, int n)

{

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

if (this[i].name==nam) {return this[i];}

cout<<"\nСтудент с фамилией "<<nam<< " не найден.";

static CStudent s;

return s;

}

Метод написан таким образом, что если студент с заданной фамилией не найден в мас сиве, то на экран выводится соотвествующее сообщение и возвращается «пустой» студент.

Протестируем метод в ветви case 6 функции main (файла main.cpp):

case '6':

{

if (n==0) cout<<"\nСписок студентов пуст";

else

{

cout<<"Введите фамилию студента: ";

string name;

getline (cin,name);

getline (cin,name);

CStudent s= students[0].find(name, n);

if (s.get_name()!="")

{ cout<<"\nСтудент найден:";

s.output();

}

}

break;

}

Этап 7.

На данном этапе опишем оставшиеся требуемые в программе демонстрационные функции:

  • удаление студента с заданной фамилией

  • удаление всех студентов заданного года

  • сортировка списка студентов по фамилии

  • сортировка списка студентов по специальности

При этом сам класс не требует изменений.

В главной программе опишем четыре соответствующие функции:

//*************Функция удаления студента по фамилии***********************

void del()

{

cout<<"Введите фамилию студента ";

string name;

getline (cin,name);

getline (cin,name);

CStudent s(name,"",unknown, 0);

bool f=false;

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

if (students[i]==s) //используем операцию класса ==

{ cout<<"Удален студент:";

students[i].output();

for (int j=i; j<n-1; j++)

students[j]=students[j+1];

n--;

f=true;

break;

}

if (f==false) cout<<"\nСтудент с фамилией "<<name <<" не найден";

}

//*************Функция удаления всех студентов с заданным годом обучения*********************

void del_year()

{

cout<<"\nВведите год обучения (1-5) ";

int year;

cin>>year;

bool f=false;

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

if (students[i].get_year()==year)

{ cout<<"\nУдален студент:";

students[i].output();

for (int j=i; j<n-1; j++)

students[j]=students[j+1];

n--;

f=true;

}

else i++;

if (f==false) cout<<"\nСтудентов с годом обучения "<<year <<" в списке нет";

}

//*************Функция сортировки (методом «пузырька») студентов по фамилии ****************

void sort_name()

{

CStudent s;

bool f;

do

{

f=false;

for (int i=0; i<n-1; i++) //используем операцию класса <

if (students[i+1]<students[i]) {s=students[i]; students[i]=students[i+1]; students[i+1]=s; f=true;}

}

while (f);

cout<<"\nСписок студентов отсортирован по фамилии";

output();

}

//**********Функция сортировки (методом «пузырька») студентов по специальности *************

void sort_spec()

{

CStudent s;

bool f;

do

{

f=false;

for (int i=0; i<n-1; i++)

if (students[i+1].get_speciality()<students[i].get_speciality()) {s=students[i]; students[i]=students[i+1]; students[i+1]=s; f=true;}

}

while (f);

cout<<"\nСписок студентов отсортирован по специальности";

output();

}

Тестируем данные функции в соответствующих ветвях.

case '7': {del();break;}

case '8': {del_year();break;}

case '9': {sort_name();break;}

case 's': {sort_spec();break;}

Приведем полный текст трех файлов проекта.

//CStudent.h - класс CStudent

#include <string>

#include <fstream>

using namespace std;

enum gender_type{male, female, unknown};

class CStudent

{

/* Поля класса CStudent */

string name;

string speciality;

gender_type gender;

int year;

public:

static int k;//Статическое поле для хранения количества созданных объектов

CStudent();//конструктор «пустого» студента

CStudent(string, string, gender_type, int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года

string get_name() {return name;}

string get_speciality(){return speciality;}

gender_type get_gender(){return gender;}

int get_year(){return year;}

void output();// метод вывода данных о студенте на экран

void input();// метод ввода данных студента с клавиатуры

void input(ifstream &);// метод ввода данных о студенте с файла

bool operator <(const CStudent &);// операция сравнения < студентов по фамилии

bool operator ==(const CStudent &);// операция сравнения == студентов по фамилии

CStudent & operator ++ ();//операция ++ перевод студента на следующий курс

CStudent& find(string, int);//метод поиска в массиве студента с заданной фамилией

~CStudent(){k--;};//конструктор «пустого» студента

};

//CStudent.cpp - методы класса CStudent

# include "CStudent.h"

# include <iostream>

# include <string>

# include <iomanip>

using namespace std;

//**************************Конструктор «пустого» студента******************

CStudent::CStudent(): name(""), speciality(""), gender(unknown), year(0) {k++;}

//***Конструктор создания студента на основе заданных фамилии, специальности, пола и года**

CStudent::CStudent(string n, string s, gender_type g, int y)

{

name=n;

speciality=s;

gender=g;

year=y;

k++;

}

// **************Метод вывода данных о студенте на экран****************

void CStudent::output()

{

cout.setf(ios::left);

cout<<"\n"<<setw(30)<<name<<setw(30)<<speciality;

if (gender==male) cout<<setw(8)<<"male";

else if (gender==female) cout<<setw(8)<<"female";

else cout<<setw(8)<<"unknown";

cout<<setw(4)<<year;

}

// ********************Метод ввода данных студента с клавиатуры*********************

void CStudent::input()

{

cout<<"\n Enter name: ";

getline(cin,name);

getline(cin,name);

cout<<"\n Enter speciality: ";

getline(cin,speciality);

cout<<"\n Enter gender(0-male, 1-female) : ";

bool g;

cin>>g;

if (g==0) gender=male; else gender=female;

cout<<"\n Enter year: ";

cin>>year;

}

// ********************Метод ввода данных студента с файла*********************

// Предполагается, что данные студента в файле размещены в отдельных строках

void CStudent::input(ifstream& f)

{

getline(f,name);

getline(f,speciality);

bool g;

f>>g;

if (g==0) gender=male; else gender=female;

f>>year;

string s;

getline(f,s);//считали остаток строки после целого числа

}

//**********Операция сравнения < студентов по фамилии*********

bool CStudent::operator <(const CStudent &a)

{return name<a.name;}

//**********Операция сравнения == студентов по фамилии*********

bool CStudent::operator ==(const CStudent &a)

{return name==a.name;}

//**********Операция ++ перевода студента на следующий курс*******

CStudent & CStudent::operator ++()

{ if (year<5) year ++;

else cout<<"\nНевозможно перевести студента на следующий курс";

return *this;

}

//Метод поиска студента с заданной фамилией nam d в массиве размерности n

CStudent & CStudent::find(string nam, int n)

{

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

if (this[i].name==nam) {return this[i];}

cout<<"\nСтудент с фамилией "<<nam<< " не найден.";

static CStudent s;

return s;

}

//main.cpp - Демонстрационная программа

#include <iostream>

#include <conio.h>

#include "CStudent.h"

void new_array();//функция первоначального создания списка студентов

void add();//функция добавления студента в конец списка с клавиатуры

void add_from_file(ifstream &);//функция добавления студента в конец списка из файла

void output();//функция вывода всех студентов на экран

void sort_name();//функция сортировки списка студентов по имени

void sort_spec();//функция сортировки списка студентов по специальности

void del();// функция удаления студента с заданной фамилией

void del_year();//функция удаления всех студентов с заданным годом рождения

int CStudent::k=0;//инициализация статической переменной

const int N=20;

CStudent students[N];

int n = 0; // количество студентов в массиве, введенных пользователем

int main ()

{

setlocale (0,"Rus");

bool q=0;

while (q!=1)

{

cout<<"\nВыберите действие:\n";

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<<"9 - Сотрировка студентов по фамилии\n";

cout<<"s - Сортировка студентов по специальности\n";

cout<<"0 - Выход\n";

char c;

cin>>c;

switch(c)

{

case '1':

{

cout<<"Количество созданных объектов ="<<CStudent::k;

cout<<"\nДемонстрируется работа двух конструкторов";

CStudent s1; s1.output();

CStudent s2 ("Петрова", "Информатика", female, 1);

s2.output();

cout<<"\nДемонстрируется работа методов получения значения полей\n";

cout<<s2.get_name()<<" "<<s2.get_speciality()<<" "<<s2.get_gender()<<" "<<s2.get_year();

cout<<"\nКоличество созданных объектов =" <<CStudent::k;

cout<<"\nДемонстрируется работа ввода данных с клавиатуры";

s1.input();

s1.output();

cout<<"\nДемонстрируется работа ввода данных с файла";

ifstream f("Students.txt");

if (f)

{

s1.input(f);

cout<<"\nДанные считаны из файла: \n" ;

s1.output();

f.close();

}

else cout<<"Файл не найден";

break;

}

case '2':

{

new_array();

break;

}

case '3': {

cout<<"Для добавления данных студетов с клавиатуты нажмите -1, из файла - 2: ";

int t;

cin>>t;

if (t==1) add();

else

{ifstream f("Students.txt");

if (f)

{

add_from_file(f);

cout<<"\nДанные считаны из файла.: \n" ;

f.close();

}

}

break;}

case '4': {output();break;}

case '5': {

CStudent s1 ("Петрова", "Информатика", female, 1);

CStudent s2 ("Иванова", "Информатика", female, 5);

cout<<"\nСозданы два студента";

s1.output();

s2.output();

cout<<"\nДемонстрируется работа операции == ";

if (s1==s2) cout <<"\nФамилии студентов совпадают";

else cout<<"\nФамилии студентов не совпадают";

cout<<"\nДемонстрируется работа операции <";

if (s1<s2) cout <<"\nФамилия прервого студента предшествует фамилии второго ";

else cout<<"\nФамилии второго струдента предшествует фамилии первого";

cout<<"\nДемонстрируется работа операции ++";

(s1++).output();

(s2++).output();

break;

}

case '6':

{

if (n==0) cout<<"\nСписок студентов пуст";

else

{

cout<<"Введите фамилию студента: ";

string name;

getline (cin,name);

getline (cin,name);

CStudent s= students[0].find(name, n);

if (s.get_name()!="")

{ cout<<"\nСтудент найден:";

s.output();

}

}

break;

}

case '7': {del();break;}

case '8': {del_year();break;}

case '9': {sort_name();break;}

case 's': {sort_spec();break;}

case '0': {q=1; break;}

default: cout<<"Ошибка ввода\n";

}

cout<<"\nПрограмма завершена. Количество объектов =" <<CStudent::k<< "\nДля продолжения нажмите Enter";

_getch();

}

}

//***********Функция добавления студента в массив на n-ое место (c клавиатуры)********************

void add()

{

if (n < N)

{

students[n].input();

n++;

}

else cout<<"\nНевозможно добавить студента. Массив заполнен";

}

//***********Функция добавления студента в массив на n-ое место (из файла)********************

void add_from_file(ifstream &f)

{

if (n < N)

{

students[n].input(f);

n++;

}

else cout<<"\nНевозможно добавить студента. Массив заполнен";

}

//**********Функция вывода массива на экран**************

void output()

{

if (n == 0) cout<<"Нет студентов в списке";

else

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

students[i].output();

}

//*****************Метод формирования массива студентов************************

static void new_array()

{

if (n == 0) {

cout<<("\nВыберите способ введения данных списка студентов: ");

cout<<("\n1 - ввод из фиксированного списка");

cout<<("\n2- ввод с клавиатуры");

cout<<("\n3- ввод с файла\n");

int s;

cin>>s;

switch (s)

{

case 1:

{

CStudent ar[] = {

CStudent ("Петров", "Информатика", male, 1),

CStudent ("Сидоров", "Экономика", male, 2),

CStudent ("Utkin", "Математика", male, 1),

CStudent("Иванова", "Информатика", female, 3),

CStudent ("Антонова", "Информатика", female, 1),

CStudent ("Макаров", "Информатика", male, 1)

};

n = sizeof (ar)/sizeof (CStudent); // количество элементов в массиве

for (int i = 0; i < n; i++) students[i] = ar[i];

cout<<"\nСписок студентов сформирован из заданного массива";

break;

}

case 2:

{

cout<<"Введите количество студентов < "<< N<<": ";

int num;

cin>>num;

for (int i = 1; i <= num; i++) add();

cout<<"\nФормирование списка завершено";

break;

}

case 3:

{

// в первой строке файла должно хранится число студентов

cout<<"\nВведите имя файла: ";

string filename;

cin>>filename;

ifstream f(filename);

if (f)

{

int num;

f>>num;//считали из первой строки файла количество студентов

string s;

getline(f,s);

for (int i = 1; i <= num; i++) add_from_file(f);

cout<<"\nФормирование списка из файла завершено";

f.close();

}

else cout<<"Файл не найден";

break;

}

}//switch

}

else cout<<"Список уже сформирован, Вы можете только добавить студента";

}

//*************Функция удаления студента по фамилии***********************

void del()

{

cout<<"Введите фамилию студента ";

string name;

getline (cin,name);

getline (cin,name);

CStudent s(name,"",unknown, 0);

bool f=false;

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

if (students[i]==s)

{ cout<<"Удален студент:";

students[i].output();

for (int j=i; j<n-1; j++)

students[j]=students[j+1];

n--;

f=true;

break;

}

if (f==false) cout<<"\nСтудент с фамилией "<<name <<" не найден";

}

//*************Функция удаления всех студентов с заданным годом обучения*********************

void del_year()

{

cout<<"\nВведите год обучения (1-5) ";

int year;

cin>>year;

bool f=false;

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

if (students[i].get_year()==year)

{ cout<<"\nУдален студент:";

students[i].output();

for (int j=i; j<n-1; j++)

students[j]=students[j+1];

n--;

f=true;

}

else i++;

if (f==false) cout<<"\nСтудентов с годом обучения "<<year <<" в списке нет";

}

//*************Функция сортировки студентов по фамилии *********************

void sort_name()

{

CStudent s;

bool f;

do

{

f=false;

for (int i=0; i<n-1; i++)

if (students[i+1]<students[i]) {s=students[i]; students[i]=students[i+1]; students[i+1]=s; f=true;}

}

while (f);

cout<<"\nСписок студентов отсортирован по фамилии";

output();

}

//*************Функция сортировки студентов по специальности *********************

void sort_spec()

{

CStudent s;

bool f;

do

{

f=false;

for (int i=0; i<n-1; i++)

if (students[i+1].get_speciality()<students[i].get_speciality()) {s=students[i]; students[i]=students[i+1]; students[i+1]=s; f=true;}

}

while (f);

cout<<"\nСписок студентов отсортирован по специальности";

output();

}