Файл: Отчет о выполнении лабораторной работе 10 по дисциплине Объектноориентированное программирование Тема лабораторной работы Обобщённое программирование Вариант 7 Самара, 2023.pdf
Добавлен: 03.12.2023
Просмотров: 15
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего образования
САМАРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Институт автоматики и информационных технологий
Кафедра «Информационные технологии»
ОТЧЕТ
о выполнении лабораторной работе № 10
по дисциплине «
Объектно-ориентированное программирование
»
Тема лабораторной работы: «Обобщённое программирование»
Вариант № 7
Самара, 2023
Руководитель
старший преподаватель
Агафонова Н. С.
(должность)
(подпись)
(дата)
( фамилия, инициалы )
Студенты
2-ИАИТ-112
Дубинчина Е. О.
Зайцева А. Н.
(группа)
(подпись)
(дата)
( фамилия, инициалы )
Цветок
Поставщик
Название
ФИО
Вид
Адрес
Страна
Сезон цветения
Цена
Программный код :
Class.h
//Описание классов с объявлением прототипов методов
#pragma once
#include
#include
#include
#ifndef
CLASS_H
#define
CLASS_H
using namespace std;
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class
Flower
//класс Цветок
{
char name[30];
//название char type[50];
// тип char country[15];
// страна произв.
char season[10];
// сезон цветения int prise;
// цена public
:
//int get_key() const; //получение ключа, const - чтобы показать, что метод не меняет состояние класса void input();
//Ввод структуры static void print_header();
//Распечатка шапки static void print_footer();
//Распечатка низа таблицы bool checkvalid();
// проверка на валидность friend ostream
&
operator<<
(
ostream
&
out
,
const
Flower
&
flower
);
// перегрузка вывода
};
/// /////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
class
Provider
{
char name[128];
// ФИО
char address[90];
// адрес public
:
void input();
//Ввод структуры static void print_header();
//Распечатка шапки static void print_footer();
//Распечатка низа таблицы friend ostream
&
operator<<
(
ostream
&
out
,
const
Provider
&
provider
);
// перегрузка вывода
};
#endif
Class.cpp
//файл для реализации методов, заявленных в class.h
#include
"class.h"
void
Flower
::input()
// запись одного объекта
{
cin.ignore();
cout
<<
"Введите наименование: "
;
cin.getline(name, 30);
cout
<<
"Введите вид: "
;
cin.getline(type, 50);
cout
<<
"Введите страну: "
;
cin.getline(country, 15);
cout
<<
"Введите сезон цветения: "
;
cin.getline(season, 10);
cout
<<
"Введите цену: "
;
cin
>>
prise;
cin.ignore();
}
void
Flower
::print_header()
{
cout
<<
left
<<
"+----------------------------------------------------------------------------
+"
<<
endl;
cout
<<
"| "
<<
setw(15)
<<
"Название "
;
// выводим наименование cout
<<
"| "
<<
setw(17)
<<
"Вид "
;
// выводим вид цветка cout
<<
"| "
<<
setw(13)
<<
"Страна "
;
// выводим страну произрастания cout
<<
"| "
<<
setw(15)
<<
"Сезон "
;
// выводим сезон цветения cout
<<
"| "
<<
setw(6)
<<
"Цена "
;
// выводим цену cout
<<
"|"
<<
endl;
cout
<<
"+----------------------------------------------------------------------------+"
<<
endl;
}
void
Flower
::print_footer()
{
cout
<<
"+----------------------------------------------------------------------------+"
<<
endl;
}
// проверка на валидность bool
Flower
::checkvalid() {
try
{
if
(strcmp(type,
"Садовый"
) != 0 && strcmp(type,
"Комнатный"
) != 0) {
throw invalid_argument
(
" Неверный вид цветка! "
);
}
if
(strcmp(season,
"Зима"
) != 0 && strcmp(season,
"Весна"
) != 0 && strcmp(season,
"Лето"
) != 0 && strcmp(season,
"Осень"
) != 0){
throw invalid_argument
(
" Неверный сезон цветения! "
);
}
return true
;
}
catch
(
exception
& e) {
// Выводим сообщение об ошибке cout
<<
left
<<
setw(8)
<<
" Ошибка: "
<<
setw(16)
<<
e.what();
return false
;
}
}
void
Provider
::input()
// запись одного объекта
{
cin.ignore();
cout
<<
"Введите ФИО: "
;
cin.getline(name, 60);
cout
<<
"Введите адрес: "
;
cin.getline(address, 50);
}
void
Provider
::print_header()
{
cout
<<
left
<<
"+--------------------------------------------------------------+"
<<
endl;
cout
<<
"| "
<<
setw(33)
<<
"ФИО "
;
// выводим ФИО поставщика cout
<<
"| "
<<
setw(26)
<<
"Адрес "
;
// выводим адрес поставщика cout
<<
"|"
<<
endl;
cout
<<
"+--------------------------------------------------------------+"
<<
endl;
}
void
Provider
::print_footer()
{
cout
<<
"+--------------------------------------------------------------+"
<<
endl;
}
Function.cpp
//Функции
#include
#include
"class.h"
using namespace std;
//____________________________________Перегрузка оператора ostream
&
operator<<
(
ostream
&
out
,
const
Flower
&
flower
)
{
out
<<
left
<<
"| "
<<
setw(14)
<<
flower
.name
<<
" "
;
// выводим наименование out
<<
"| "
<<
setw(16)
<<
flower
.type
<<
" "
;
// выводим вид цветка out
<<
"| "
<<
setw(12)
<<
flower
.country
<<
" "
;
// выводим страну произрастания out
<<
"| "
<<
setw(14)
<<
flower
.season
<<
" "
;
// выводим сезон цветения out
<<
"| "
<<
setw(5)
<<
flower
.prise
<<
" "
;
// выводим цену out
<<
"|"
<<
endl;
return out
;
}
ostream
&
operator<<
(
ostream
&
out
,
const
Provider
&
provider
)
{
out
<<
left
<<
"| "
<<
setw(32)
<<
provider
.name
<<
" "
;
// выводим ФИО поставщика out
<<
"| "
<<
setw(25)
<<
provider
.address
<<
" "
;
// выводим адрес поставщика out
<<
"|"
<<
endl;
return out
;
}
Main.cpp
#include
#include
#include
#include
"class.h"
using namespace std;
////////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////
//Шаблоны функций
// запись бинарного файла template
<
class
T
>
void
WriteBin(
string
Fname
,
T
&
A
)
{
ofstream fout(
Fname
,
ios
::binary |
ios
::app);
fout.write((
char
*)&
A
,
sizeof
(
A
));
fout.close();
}
template
<
class
T
>
////////////////////////////////////////////////////////////////////
//добавление в список void add_list(
string
Fname
,
list
<
T
>&
list
)
{
T
A;
ifstream file(
Fname
,
ios
::binary);
if
(!file.is_open()) {
cout
<<
"Ошибка открытия файла "
<<
Fname
<<
endl;
return
;
}
while
(file.read((
char
*)&A,
sizeof
(A))) {
list
.emplace_back(A);
}
file.close();
}
template
<
class
T
>
////////////////////////////////////////////////////////////////////
//вывод списка void print_list(
list
<
T
>
list
)
{
for
(
auto
& a :
list
) {
cout << a << endl;
}
}
const char
* path1 =
"FILE_FLOWER.bin"
;
const char
* path2 =
"FILE_PROVIDER.bin"
;
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
int main() {
system(
"chcp 1251"
); system(
"cls"
);
list
<
Flower
> F_list;
//обобщенные списки
list
<
Provider
> P_list;
int
C;
do
{
// меню cout
<<
"Выберите необходимый вам список: "
<<
endl;
cout
<<
"1. Сведения о цветах"
<<
endl;
cout
<<
"2. Добавление цветка в файл"
<<
endl;
cout
<<
"3. Сведения о поставщиках"
<<
endl;
cout
<<
"4. Добавление поставщика в файл"
<<
endl;
cout
<<
"5. Выйти в основное меню"
<<
endl;
cout
<<
"Выберите пукнт из меню:"
<<
endl;;
cin
>>
C;
// считываем пункт меню
// обрабатываем некорректный ввод while
(C < 1 || C > 5)
{
cout
<<
"Некорректный ввод. Попробуйте еще раз: "
;
cin
>>
C;
// считываем пункт меню заново
}
// выполнение действий switch
(C) {
case
1:
//вывод списка цветов из файла
{
cout
<<
"База данных цветов из файла: "
<<
endl;
Flower
::print_header();
// выводим шапку таблицы print_list(F_list);
// вывод списка
Flower
::print_footer();
// выводим низ таблицы (для красоты и удобства)
break
;
}
case
2:
//метод для добавления цветка в файл
{
cout
<<
"Введите информацию о новом цветке: "
<<
endl;
Flower flower;
// запись для считывания flower.input();
// вызов метода для записи и присваивания данные if
(flower.checkvalid()) WriteBin(
"FILE_FLOWER.bin"
, flower);
// если валидно, то запись в бин.файл add_list(
"FILE_FLOWER.bin"
, F_list);
// запись в лист cout
<<
endl;
<
Provider
> P_list;
int
C;
do
{
// меню cout
<<
"Выберите необходимый вам список: "
<<
endl;
cout
<<
"1. Сведения о цветах"
<<
endl;
cout
<<
"2. Добавление цветка в файл"
<<
endl;
cout
<<
"3. Сведения о поставщиках"
<<
endl;
cout
<<
"4. Добавление поставщика в файл"
<<
endl;
cout
<<
"5. Выйти в основное меню"
<<
endl;
cout
<<
"Выберите пукнт из меню:"
<<
endl;;
cin
>>
C;
// считываем пункт меню
// обрабатываем некорректный ввод while
(C < 1 || C > 5)
{
cout
<<
"Некорректный ввод. Попробуйте еще раз: "
;
cin
>>
C;
// считываем пункт меню заново
}
// выполнение действий switch
(C) {
case
1:
//вывод списка цветов из файла
{
cout
<<
"База данных цветов из файла: "
<<
endl;
Flower
::print_header();
// выводим шапку таблицы print_list(F_list);
// вывод списка
Flower
::print_footer();
// выводим низ таблицы (для красоты и удобства)
break
;
}
case
2:
//метод для добавления цветка в файл
{
cout
<<
"Введите информацию о новом цветке: "
<<
endl;
Flower flower;
// запись для считывания flower.input();
// вызов метода для записи и присваивания данные if
(flower.checkvalid()) WriteBin(
"FILE_FLOWER.bin"
, flower);
// если валидно, то запись в бин.файл add_list(
"FILE_FLOWER.bin"
, F_list);
// запись в лист cout
<<
endl;
break
;
}
case
3:
//вывод списка поставщиков из файла
{
cout
<<
"База данных поставщиков из файла: "
<<
endl;
Provider
::print_header();
// выводим шапку таблицы print_list(P_list);
// вывод списка
Provider
::print_footer();
// выводим низ таблицы (для красоты и удобства)
break
;
}
case
4:
//метод для добавления поставщика в файл
{
cout
<<
"Введите информацию о новом поставщике: "
<<
endl;
Provider provider;
// запись для считывания provider.input();
// вызов метода для записи и присваивания данных
WriteBin(
"FILE_PROVIDER.bin"
, provider);
// запись в бин.файл add_list(
"FILE_PROVIDER.bin"
, P_list);
// запись в лист break
;
}
}
}
while
(C != 5);
return
0;
}
Пример работы программы :
;
}
case
3:
//вывод списка поставщиков из файла
{
cout
<<
"База данных поставщиков из файла: "
<<
endl;
Provider
::print_header();
// выводим шапку таблицы print_list(P_list);
// вывод списка
Provider
::print_footer();
// выводим низ таблицы (для красоты и удобства)
break
;
}
case
4:
//метод для добавления поставщика в файл
{
cout
<<
"Введите информацию о новом поставщике: "
<<
endl;
Provider provider;
// запись для считывания provider.input();
// вызов метода для записи и присваивания данных
WriteBin(
"FILE_PROVIDER.bin"
, provider);
// запись в бин.файл add_list(
"FILE_PROVIDER.bin"
, P_list);
// запись в лист break
;
}
}
}
while
(C != 5);
return
0;
}
Пример работы программы :