Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаба1 3й семестр

.docx
Скачиваний:
7
Добавлен:
15.05.2017
Размер:
74.84 Кб
Скачать

Ст. Новичонок М.С. Гр. ІНФ-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 ();//количество авторов, у которых предподчтительная тема совпадает с темой книги

};