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

Этап 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. Перейдем непосредственно к разработке основных функций демонстрационной программы, а именно следующих функций.

  • начальное формирование массива из N20 объектов класса (ввод с клавиатуры, ввод из заданного массива, ввод из файла);

  • добавления объекта в массив;

  • вывод элементов массива на экран.

Прежде всего, в главной программе (файл 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;}

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