
Этап 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();
}