Листинг 1

Методические указания к лабораторным работам

Й семестр

Порядок выполнения лабораторных работ

 

1. Познакомиться с темой и целью лабораторной работы.

2. Изучить необходимые к выполнению лабораторной работы теоретические сведения и примеры программ.

3. Познакомиться с общим заданием к лабораторной работе и индивидуальным вариантом задания.

4. Написать и отладить программу решения задачи индивидуального варианта.

5. Протестировать работу программы на различных наборах исходных данных.

6. Продемонстрировать преподавателю работу программы.

7. Оформить отчет.

8. Защитить лабораторную работу.

 

Оборудование, технические средства, инструмент

Лабораторные работы выполняются в компьютерном классе, оснащенном персональными компьютерами. На компьютерах должна быть установлена система программирования, поддерживающая создание программ на С++ (консольных и c использованием библиотеки Qt).

 

Требования к оформлению отчета

 

Отчет по лабораторной работ должен содержать:

§ титульный лист;

§ задание к лабораторной работе (общее задание и индивидуальный вариант задания);

§ постановка задачи;

§ листинг программы;

§ тестовые примеры, иллюстрирующие все варианты работы программы.

Требования к защите лабораторных работ

 

После оформления отчета, лабораторную работу защищают, т. е. поясняют алгоритм работы программы и отвечают на контрольные вопросы.

Лабораторная работа № 5.

Шаблоны. STL

 

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

Задание

 

Изменить программу, созданную на основе задания лабораторной работы №3. Для работы с объектами производного класса использовать контейнерный класс STL list или vector.

Добавить в программу возможность сортировки и удаления объектов производного класса по какому-либо полю.

Для описания структуры созданной программы построить диаграмму классов UML.

Пример

В листинге 1 представлена программа, в которой определены базовый класс Student, производный класс Студент-Спортсмен (Stud_Sport), а также класс Группа студентов (Group_stud). Класс Группа студентов (Group_stud) содержит список указателей на объекты производного класса Stud_Sport. Так же класс Group_stud содержит методы: метод add_st(Student* st1) – добавляет адрес объекта производного класса в список указателей; метод stud_max_grade() – формирует список студентов с максимальным рейтингом; метод diskOut() – записывает объекты производного класса Stud_Sport в файл; метод showData() – выводит список студентов спортсменов, отсортированный по фамилии студента в алфавитном порядке; метод del_obj() – удаляет из списка студента по заданной фамилии. В функции main() выполняется тестирование этих методов.

 

Для создания программы использовалась среда разработки Qt Creator 3.0.0 (основан на Qt 5.2.0). На рисунке 1 показан состав проекта программы.

 

 

Рисунок 1 – Состав проекта программы

 

Создание проекта в Qt Creator: Файл -> Новый файл или проект … -> Проект без использования Qt -> Простой проект на С++.

Добавление класса в проект: Файл -> Новый файл или проект … -> С++ -> Класс С++.

Компиляция, сборка и выполнение проекта: Сборка -> Запустить.

На рисунке 2 показан результат выполнения программы.

 

Листинг 1

 

// student.h

 

#define STUDENT_H

#include <string>

using namespace std;

 

class ErrorStud

{ public:

string message; // сообщение

ErrorStud(const string& s) : message(s) {}

};

 

class Student

{ protected:

string fam;

string name;

int grade;

public:

Student();

Student(string fam1, string name1, int grade1);

~Student(){}

 

string getfam();

string getname();

int getgrade();

void setfam(string fam1);

void setname(string name1);

void setgrade(int grade1);

};

 

#endif // STUDENT_H

// student.cpp

 

#include "student.h"

#include <iostream>

using namespace std;

 

Student::Student()

{ fam = "";

name = "";

grade = 0;

}

Student::Student( string fam1, string name1, int grade1)

{ fam = fam1;

name = name1;

if (grade1 <0 ||grade1 >100) throw ErrorStud("Рейтинг должен быть от 0 до 100!");

else grade = grade1;

}

string Student::getfam() { return fam;}

string Student::getname(){ return name;}

int Student::getgrade(){ return grade;}

void Student::setfam(string fam1){ fam = fam1;}

void Student::setname(string name1){name = name1;}

void Student::setgrade(int grade1){grade = grade1;}

// stud_sport.h

#ifndef STUD_SPORT_H

#define STUD_SPORT_H

#include "student.h"

 

class Stud_Sport : public Student

{ string vid_sporta;

public:

string getvid_sporta();

void setvid_sporta(string vid_sporta1);

Stud_Sport();

Stud_Sport(string fam1, string name1, int grade1, string vid_sporta1);

~ Stud_Sport() {}

void display();

};

 

#endif // STUD_SPORT_H

// stud_sport.cpp

#include "stud_sport.h"

#include <iostream>

using namespace std;

 

Stud_Sport::Stud_Sport():Student(){vid_sporta = "";}

Stud_Sport::Stud_Sport(string fam1, string name1, int grade1, string vid_sporta1): Student(fam1,name1,grade1)

{ vid_sporta = vid_sporta1;}

string Stud_Sport::getvid_sporta() {return vid_sporta;}

void Stud_Sport::setvid_sporta(string vid_sporta1){vid_sporta = vid_sporta1;}

 

void Stud_Sport::display()

{

cout << " \nФамилия: " << fam;

cout << " Имя: " << name;

cout << " Рейтинг: " << grade;

cout << " Вид спорта: " << vid_sporta;

}

// group_stud.h

#ifndef GROUP_STUD_H

#define GROUP_STUD_H

#include "stud_sport.h"

#include <list>

#include <string>

using namespace std;

 

class Group_stud

{ string name_gr;

list <Stud_Sport*> st;

public:

Group_stud();

string getname();

void setname(const string name_gr1);

void add_st(Stud_Sport *st1);

void stud_max_grade();

void diskOut();

void showData();

void del_obj();

};

 

#endif // GROUP_STUD_H

// group_stud.cpp

#include "group_stud.h"

#include <iostream>

#include <fstream>

using namespace std;

 

bool compare_fam(Stud_Sport* st1, Stud_Sport* st2)

{

return st1->getfam() < st2->getfam();

}

 

Group_stud::Group_stud(){ name_gr = "";}

 

string Group_stud::getname(){ return name_gr;}

void Group_stud::setname(const string name_gr1){name_gr = name_gr1;}

 

void Group_stud::add_st(Stud_Sport* st1)

{

st.push_back(st1);

}

 

void Group_stud::stud_max_grade()

{ list <Stud_Sport*>::iterator itr;

itr = st.begin();

int max = (*itr)->getgrade();

for(itr = st.begin(); itr != st.end(); ++itr)

if ((*itr)->getgrade() > max) max = (*itr)->getgrade();

cout << "\nГруппа " << name_gr;

cout << "\nСписок студентов с максимальным рейтингом: \n";

for(itr = st.begin(); itr != st.end(); ++itr)

if ((*itr)->getgrade() == max)

(*itr)->display();

}

 

void Group_stud::diskOut()

{ ofstream fout("C:\\1.txt");

fout << st.size() << endl;

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

list <Stud_Sport*>::iterator itr;

for(itr = st.begin(); itr != st.end(); ++itr)

{ fout << (*itr)->getfam() << endl;

fout << (*itr)->getname() << endl;

fout << (*itr)->getgrade() << endl;

fout << (*itr)->getvid_sporta() << endl;

}

fout.close();

}

 

void Group_stud::showData()

{ st.sort(compare_fam);

list <Stud_Sport*>::iterator itr;

cout << "\nГруппа " << name_gr;

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

for(itr = st.begin(); itr != st.end(); ++itr)

(*itr)->display();

}

 

void Group_stud::del_obj()

{ int fl = 0;

string fam;

cout << "\nInput fam for del: "; cin >> fam;

list <Stud_Sport*>::iterator itr;

for(itr = st.begin(); itr != st.end();++itr)

if ((*itr)->getfam() == fam)

{st.erase(itr) ;fl = 1; break;}

if (fl == 0) cout << "\nНет в списке! \n";

}

// main.cpp

#include "student.h"

#include "stud_sport.h"

#include "group_stud.h"

#include <iostream>

#include <fstream>

#include <list>

using namespace std;

 

 

void vvod2(string &fam2,string &name2, int &grade2, string &vid_sporta2)

{ cout << "Фамилия: "; cin >> fam2;

cout << "Имя: "; cin >> name2;

cout << "Рейтинг: "; cin >> grade2;

cout << "Вид спорта: "; cin >> vid_sporta2;

}

 

int main()

{ int pr;

string fam2, name2, vid_sporta2;

int grade2;

int nMenu;

int m;

Group_stud gr;

string name_gr1;

cout << "\nВведите название группы:"; cin >> name_gr1;

gr.setname(name_gr1);

Stud_Sport *st;

list <Stud_Sport*> spisok;

 

//вывод пунктов меню

cout << "\nВведите: " << endl;

cout << "\n1 - Ввод списка студентов группы и запись в файл";

cout << "\n2 - Чтение списка студентов группы из файла";

cout << "\n>";

cin >> nMenu;

 

try { switch (nMenu)

{ case 1 : cout << "\nВвод списка студентов группы:\n";

do

{ vvod2(fam2, name2, grade2,vid_sporta2);

st = new Stud_Sport(fam2, name2, grade2,vid_sporta2);

spisok.push_back(st);

gr.add_st(st);

cout << "\nПродолжить ввод? 1- Да, 0 - Нет " << endl;

cin >> pr;

}while(pr == 1);

gr.diskOut();

gr.showData();

break;

case 2 :

ifstream fin("C:\\1.txt");

fin >> m; fin.get();

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

{ getline(fin, fam2);

getline(fin, name2);

fin >> grade2; fin.get();

getline(fin, vid_sporta2);

st = new Stud_Sport(fam2, name2, grade2,vid_sporta2);

spisok.push_back(st);

gr.add_st(st);

}

gr.showData();

break;

}

 

gr.stud_max_grade();

gr.del_obj();

gr.showData();

//gr.diskOut();

 

list <Stud_Sport*>::iterator itr;

for(itr = spisok.begin(); itr != spisok.end(); ++itr)

delete (*itr);

spisok.clear();

}

catch(const ErrorStud& e)

{ cout << e.message << endl;}

return 0;

}

 

 

 

 

Рисунок 2 – Результат выполнения программы