лаба1 3й семестр
.docxСт. Новичонок М.С. Гр. ІНФ-15-1
Лабораторная работа №1, 2
Тема: «Основы разработки классов в языке С++. Наследование, полиморфизм, инкапсуляция, исключения»
laba.cpp
/*ВАРИАНТ 6
Разработать класс, представляющий книгу в библиотеке. Книга характеризуется списком авторов, названием и темой.
Тема характеризуется кодом темы и названием темы. Автор характеризуется именем, фамилией, предпочтительной
темой и числом написанных книг
Необходимые операции таковы:
1. узнать название и тему книги
2. узнать, написал ли данный автор эту книгу
3. узнать среднее число написанных книг для всех авторов
4. добавить автора в книгу
5. вычеркнуть автора из книги
если автора нет - сгенерировать исключение
6. найти автора с максимальным числом написанных книг
7. найти число авторов, чья предпочтительная тема совпадает с темой
книги */
#include "book.h"
int main()
{
BOOK m1;
AUTHOR a;
a.surname="Ivanov";
a.name="Ivan";
a.prefer_topic="C++";
a.amount=2;
string nn="Kurs C++";
TOPIC at;
at.topic_kod=22;
at.topic_name="C++";
BOOK m2(a,nn,at);
cout<<m2;
getch();
cout<<"The name of the book"<<m2.getnam()<<endl;
TOPIC ttm=m2.gettem();
cout<<"topic: kod "<<ttm.topic_kod<<" The name of the topic"<<ttm.topic_name<<endl;
AUTHOR a1;
string s;
cout<<"zadanie 2\n";
for(int i=0;i<2; i++)
{cout<<"Input surname name and the name of book\n";
cin>>a1.surname;
cin>>a1.name;
while(cin.get()!='\n');
getline(cin,s,'\n');
a1.prefer_topic="";
a1.amount=0;
{
if(m2.wravt(a1,s)) cout<<"Yes"<<endl;
}
}
cout<<"zadanie 4\n";
cout<<"Input surname, name, prefer topic and amont of books \n";
AUTHOR a2;
cin>>a2.surname;
cin>>a2.name;
while(cin.get()!='\n');
getline(cin,a2.prefer_topic,'\n');
cin>>a2.amount;
m2.addavt(a2);
cout<<m2;
cout<<"zadanie 3\n";
cout<<"Avarage amount of books: "<<m2.sred_book()<<endl;
cout<<"zadanie 5\n";
cout<<"Input surname and name \n";
cin>>a2.surname;
cin>>a2.name;
a1.prefer_topic="";
a1.amount=0;
cout<<"zadanie 6\n";
AUTHOR d;
d=m2.findavtmax();
cout<<"Author: "<<d.surname<<" "<<d.name<<" "<<d.prefer_topic<<" "<<d.amount<<endl;
cout<<endl;
cout<<"zadanie 7\n";
int f=m2.colavt();
cout<<"Amount of authors: "<<f<<endl;
return 0;
}
book.cpp
#include "book.h"
BOOK::BOOK (AUTHOR& a, string& b, TOPIC& c):name_of_book(b)//конструктор с параметрами
{
author.push_back(a);
topic.topic_kod=c.topic_kod;
topic.topic_name=c.topic_name;
}
ostream& operator <<(ostream& out_p,BOOK& r1) //перегруженный оператор вывода
{
out_p<<"nazvanie book: "<<r1.name_of_book<<endl;
out_p<<"The topic of the book: name "<<r1.topic.topic_name << "
kod topic "<<r1.topic.topic_kod<<endl;
out_p<<"List of avtors:"<<endl;
for(int i=0;i< r1.author.size(); i++)
out_p<<r1.author[i].surname<<" : "<<r1.author[i].name<<" :
"<<r1.author[i].prefer_topic<<" : "<<r1.author[i].amount<<endl;
out_p<<endl;
return out_p;
}
BOOK::BOOK()//конструктор по умолчанию
{
name_of_book="";
topic.topic_kod=0;
topic.topic_name="";
}
BOOK::~BOOK()
{
cout<<"End of work"<<endl;
}
BOOK::BOOK(AUTHOR& a, string& b)//конструктор с параметрами
{
author.push_back(a);
name_of_book=b;
}
BOOK::BOOK(BOOK& a)//конструктор копирования
{
author=a.author;
name_of_book=a.name_of_book;
topic.topic_kod=a.topic.topic_kod;
topic.topic_name=a.topic.topic_name;
}
BOOK& BOOK::operator =(BOOK& a)
{
if(&a==this) return *this;
author=a.author;
name_of_book=a.name_of_book;
topic.topic_kod=a.topic.topic_kod;
topic.topic_name=a.topic.topic_name;
return *this;
}
string& BOOK::getnam()//возвращает название книги
{
return name_of_book;
}
TOPIC& BOOK::gettem()//возвращает тему книги
{
return topic;
}
float BOOK::sred_book()
{
float s=0;
for(int i=0;i< author.size(); i++)
s+=author[i].amount;
s/=author.size();
return s;
}
bool BOOK::wravt(AUTHOR& a,string& b)//узнать написал ли автор книгу
{ int fl=0;
if (name_of_book==b) fl=2;
for(int i=0;i< author.size(); i++)
{
if ((author[i].surname==a.surname) && (author[i].name==a.name) && (name_of_book==b))return true;
if ((author[i].surname==a.surname) && (author[i].name==a.name))
{cout<<"Error";
}
}
if(fl==2)
{
cout<<"Error";
}
if(fl==0)
{
cout<<"Error";
}
return true;
}
void BOOK::addavt(AUTHOR& a)
{
author.push_back(a);
}
void BOOK::delavt(AUTHOR& a)
{
int k;
bool fl=true;
for(int i=0;i< author.size(); i++)
if ((author[i].surname==a.surname) && (author[i].name==a.name)){fl=false; k=i;}
if (fl)
{
cout<<"Error";
}
else author.erase(author.begin()+k);
}
AUTHOR& BOOK::findavtmax()//найти автора с мах кол.книг
{
AUTHOR *c;
c=new AUTHOR;
int max=0;
for(int i=0;i< author.size(); i++)
if (author[i].amount>max)
{
max=author[i].amount;
*c=author[i];
}
return *c;
}
int BOOK::colavt ()//количество авторов у кот предпочтительная тема совпадает с темой книги
{
int kol=0;
for(int i=0;i< author.size(); i++)
if (author[i].prefer_topic==topic.topic_name) kol++;
return kol;
}
book.h
#include <conio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TOPIC
{ int topic_kod;
string topic_name;
};
struct AUTHOR
{
string surname;
string name;
string prefer_topic;
int amount;
};
typedef vector<AUTHOR> list_of_authors;
class BOOK
{
list_of_authors author;
string name_of_book;
TOPIC topic;
public:
BOOK();//конструктор по умолчанию(все поля пустые)
~BOOK();
BOOK (AUTHOR& a, string& b);
BOOK (AUTHOR& a, string& b, TOPIC& c);
BOOK(BOOK& a);//конструктор копирования
BOOK& operator =(BOOK& a);//перегрузка оператора присваивиния
friend ostream& operator <<(ostream& out_p,BOOK& r1); //перегруженный оператор вывода
string& getnam();//узнать название книги
TOPIC& gettem();// узнать тему
float sred_book();//узнать среднее число написанных книг для всех авторов
bool wravt(AUTHOR& a,string& b);//узнать написал ли автор книгу
void addavt(AUTHOR& a);//добавить автора в книгу
void delavt(AUTHOR& a);//удалить автора из списка авторов
AUTHOR& findavtmax();//найти автора с максимальным числом написанных книг
int colavt ();//количество авторов, у которых предподчтительная тема совпадает с темой книги
};