Этап 2.
Очевидно, чтобы проверить работу конструкторов необходимо создать объекты класса. Это сделаем в файле main.cpp
Так как разработка программы подразумевает демонстрацию ее многочисленных функций, то имеет смысл сразу разработать меню и тестировать создание объектов в одном из его пунктов. Меню разрабатывается в функции main. Меню заключено в бесконечный цикл while, выход из которого осуществляется только в том случае, если пользователь выберет пункт меню «Выход», т.е. введет 0. Данный прием позволяет за один сеанс работы с программной протестировать различные ее функции. Можно указать сразу все пункты меню, как это сделано ниже, либо дописывать их по мере разработки программы. Реализация меню осуществляется с помощью конструкции swith-case. Код операторов case может быть заменен так называемыми заглушками, например, выводом на экран соответствующего сообщения, как это сделано в операторе case 2. Данные заглушки будут удалены после разработки соответствующей методов.
В ветви case 1 происходит создание двух разных объектов класса с помощью двух различных конструкторов и вывод этих объектов на экран.
#include <iostream>
#include <conio.h>
#include "CStudent.h"
int CStudent::k=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 с;
cin>>с;
switch(с)
{
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;
break;
}
case '2': {cout<<"\nЗаглушка: Формирование нового списка студентов "; break;}
case '2': break;
case '3': break;
case '4': break;
case '5': break;
case '6': break;
case '7': break;
case '0': {q=1; break;}
default: cout<<"Ошибка ввода\n";
}
cout<<"\nПрограмма завершена. Количество объектов =" <<CStudent::k<< "\nДля продолжения нажмите Enter";
_getch();
}
}
Обратите внимание, что статическое поле k до начала работы программы инициализируется нулем. После завершения работы программы проверяется, что количество объектов равно нулю (т.е. все cозданные объекты удалены).
Этап 3. Разработаем метод ввода данных объекта с клавиатуры.
В файл CStudent.h добавим заголовок метода
void intput ();
В файл CStudent.cpp добавим определение метода
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 f;
cin>>f;
if (f==0) gender=male; else gender=female;
cout<<"\n Enter year: ";
cin>>year;
}
Протестируем метод в ветви case 1 функции main (файла main.cpp):
cout<<"\nДемонстрируется работа ввода данных с клавиатуры";
s1.input();
s1.output();
Так в программе необходимо будет считывание данных из файла разработаем еще один метод input с одним параметром – именем файлового потока.
void input(ifstream &);
Предполагаем, что в текстовом файле данные студента записаны в отдельных строках, тогда простейшее считывание будет определено следующем образом:
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);//считали остаток строки после целого числа
}
Для того, чтобы протестировать данный метод создадим в папке с проектом файл Students.txt и введем в него следующие данные:
Иванова
Математика
1
1986
Протестируем метод в ветви case 1 функции main (файла main.cpp): введем следующий код:
cout<<"\nДемонстрируется работа ввода данных с файла";
ifstream f("Students.txt");
if (f)
{
s1.input(f);
cout<<"\nДанные считаны из файла: \n" ;
s1.output();
f.close();
}
else cout<<"Файл не найден";
Очевидно, что оба методы написаны небезопасно, так как не контролируют типы и диапазоны вводимых значений. В качестве самостоятельно работы, Вы можете их усовершенствовать.
Этап 4. Перейдем непосредственно к разработке основных функций демонстрационной программы, а именно следующих функций.
начальное формирование массива из N20 объектов класса (ввод с клавиатуры, ввод из заданного массива, ввод из файла);
добавления объекта в массив;
вывод элементов массива на экран.
Прежде всего, в главной программе (файл main.cpp) создадим массив объектов и переменную, хранящую число заполненных пользователем элементов массива.
const int N=20;
CStudent students[N];
int n = 0; // количество студентов в массиве, введенных пользователем
Это описание целесообразно добавить перед функцией main, так как в этом случае массив будет глобальным, т.е. видимым всем функция программы.
Для заполнения массива целесообразно сначала написать функции добавления элемента в массив (с вводом данных с клавиатуры и с файла), протестировать их, а затем использовать в цикле для начального формирования массива.
Опишем функции add() и add_from_file() перед функцией main
//********Функция добавления студента в массив на 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Невозможно добавить студента. Массив заполнен";
}
Соответственно вызов данных функций осуществим в ветви case 3.
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;
}
Чтобы проверить, что данные добавились в массив корректно, опишем функцию вывода элементов массива на экран (до функции main).
//**********Функция вывода массива на экран**************
void output()
{
if (n == 0) cout<<"Нет студентов в списке";
else
for (int i=0; i<n; i++)
students[i].output();
}
}
Соответственно вызов данного метода осуществим в ветви case 4.
case 5: { output(); break; }
После того, как Вы убедились, что методы add() add_from_file() работают корректно, можно перейти к описанию метода начального формирования массива, у которого три ветви - введение элементов с клавиатуры, чтение из файла и формирование массива на основе заданного.
//*****************Метод формирования массива студентов************************
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 ("Уткин", "Математика", 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<<"Список уже сформирован, Вы можете только добавить студента";
}
Соответственно вызов данной функции осуществим в ветви case 3.
case '2': { new_array(); break;}
Обратите внимание, что при чтении данных из файла подразумевается, что в первой строке файла хранится число студентов.
