Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Композиция для работы с объектами




 

Взаимодействие трех классов CMenu (описывает пользовательский интерфейс), CCatalogue (описывает массив из 100 указателей на объекты типа CBook), CBook (описывает книгу) приведено в листинге 4.

В главной функции объявляется объект класса CMenu с идентификатором menu, который вызывает открытый метод ShowMenuAndSelect().

Класс CMenu поддерживает ввод данных для взаимодействия с объектом, заданным указателем m_p и вывод данных, полученных в результате работы объекта типа CCatalogue. Конструктор класса CMenu создает объект, а деструктор разрушает. Объект menu активизирует меню программы, в котором указаны операции с каталогом книг: поиск по названию, добавление, удаление книги с указанным названием, сортировка по авторам, просмотр каталога книг. Объект с указателем m_p вызывает метод класса CCatalogue. Если в каталоге нет книг, то возможна только операция добавления. Метод align() служит для форматирования вывода. Функции width() и setf() стандартного класса ios, изменяет ширину поля вывода и устанавливает флаг выравнивания для выводимых данных.

Класс CCatalogue отвечает за операции меню. Для выполнения обращается к классу CBook через указатели на объекты этого класса.

Класс CBook содержит описание автора и название книги. Метод check() проверяет совпадение значения параметра метода и значения поля m_title. Метод используется объектом класса CCatalogue при поиске книги в каталоге по названию. Программный код реализации композиции для работы с объектами приведен в листинге 4.

Листинг 4. Композиция для работы с объектами

//Book.h - спецификация класса CBook

#pragma once

#include <string>

using namespace std;

class CBook {

private:

string m_author; //автор

string m_title; //название

int m_year; //год издания

public:

CBook();

CBook(const string&, const string&, int);

~CBook();

//методы установки значений

void setAuthor(const string&);

void setTitle(const string&);

void setYear(const int);

//методы возврата значений

string getAuthor() const {return m_author;}

string getTitle() const {return m_title;}

int getYear() const {return m_year;}

//метод проверки названия книги

bool check(const string&) const;

};

//Catalogue.h - спецификация класс CCatalogue

#pragma once

#include"stdafx.h"

#include<iostream>

#include "Book.h"

static const int MAX_SIZE=100;

class CCatalogue

{

int m_q; //фактическое число книг

public:

CBook* m_pBook[MAX_SIZE]; //массив указателей на книги

CCatalogue(); //конструктор по умолчанию

~CCatalogue(); //деструктор

bool ins(const string&, const string&, int);//добавление

bool del(const string&); //удаление

int find(const string&) const; //поиск

void sort(); //сортировка

int getNumberOfBook() const; //возврат количества книг

};

// Menu.h - спецификация класса меню CMenu

#include "Catalogue.h"

class CMenu {

public:

CCatalogue* m_p; //указатель на каталог книг

CMenu(); //конструктор

~CMenu(); //деструктор

void showMenuAndSelect(); //активизация меню

private:

void find() const; //поиск книги по названию

void view() const; //просмотр состояния каталога

void ins(); //добавление книги

void del(); //удаление книги по названию

void sort(); //сортировка в каталоге по авторам

void align(int) const; //выравнивание при выводе

};

// Composition3.cpp: Композиция для работыс объектами

#include "stdafx.h"

#include <iostream>

#include "Menu.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{ setlocale(LC_ALL, "russian");

CMenu menu; menu.showMenuAndSelect(); return 0;

system("pause");

return 0;

}

//Book.cpp - реализация класса CBook

#include "stdafx.h"

#include "Book.h"

CBook::CBook():m_year(0), m_title(" "), m_author(" ") {}

CBook::CBook(const string& author, const string& title, int year):m_year(year),

m_title(title), m_author(author) { }

CBook::~CBook() { }

//установить автора

void CBook::setAuthor(const string& author) {m_author=author;}

//установить название

void CBook::setTitle(const string& title) {m_title=title;}

//установить год издания

void CBook::setYear(const int year) {m_year=year;}

//проверка книг по названию

bool CBook::check(const string& key) const

{if (m_title==key) return true; return false;}

//CCatalogue.cpp - реализация класс CCatalogue

#include "stdafx.h"

#include "Catalogue.h"

CCatalogue::CCatalogue():m_q(0){} //конструктор

CCatalogue::~CCatalogue() //деструктор

{ for(int i=0; i<m_q; i++) delete m_pBook[i];}

//возврат фактического количества книг

int CCatalogue::getNumberOfBook() const {return m_q;}

/* Добавление новой книги:

1. проверить наличие книги в массиве;

2. если книга уже есть в массиве, вернуть ложь,

если книги нет->

- создать новый объект и занести в массив;

- увеличить число книг в массиве и вернуть истину.*/

bool CCatalogue:: ins(const string& author, const string& title, int year)

{

if(find(title)!=-1) return false;

m_pBook[m_q++]=new CBook(author, title, year);

return true;

}

/* Удаление книги из массива:

1. проверить наличие книги в массиве;

2. если книги нет в массиве, вернуть ложь,

если книга найдена->

- разрушить найденный объект;

- сжать массив;

- уменьшить число книг в массиве и вернуть истину.*/

bool CCatalogue::del (const string& key)

{

int i=find(key);

if(i<0) return false;

delete m_pBook[i];

while(i<m_q-1) m_pBook[i++]=m_pBook[i+1];

m_q--;

return true;

}

/* Поиск книги по названию:

1. проверить название каждой книги;

2. если есть совпадение, вернуть индекс книги,

если нет совпадений, вернуть -1.*/

int CCatalogue::find(const string& key) const

{

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

if(m_pBook[i]->check(key)) return i;

return -1;

}

//сортировка массива по авторам (простой метод обмена)

void CCatalogue::sort()

{

for(int j=1; j<m_q; j++)

for(int i=0; i<m_q-1; i++)

if(m_pBook[i]->getAuthor()>m_pBook[i+1]->getAuthor())

{ CBook* tmp=m_pBook[i];

m_pBook[i]=m_pBook[i+1];

m_pBook[i+1]=tmp;

}}

// Composition3.cpp: Композиция для работыс объектами

#include "stdafx.h"

#include <iostream>

#include "Menu.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{ setlocale(LC_ALL, "russian");

CMenu menu; menu.showMenuAndSelect(); return 0;

system("pause");

return 0;

}

//Menu.cpp - реализация класса CMenu

#include"stdafx.h"

#include<iostream>

#include<iomanip>

#include<windows.h>

#include"Menu.h"

using namespace std;

const static int N(512);

CMenu::CMenu():m_p(new CCatalogue){} //конструктор

CMenu::~CMenu() {delete m_p;} //деструктор

void CMenu::showMenuAndSelect() //активизация меню

{ char choice;

do { cout<<"\n1.Поиск";

cout<<"\n2.Включение";

cout<<"\n3.Удаление";

cout<<"\n4.Сортировка";

cout<<"\n5.Просмотр";

cout<<"\n6.Выход\n";

cout<<"Выберите опцию:";cin>>choice; cin.ignore();

if(m_p->getNumberOfBook())

switch(choice) {

case '1': find(); break;

case '2': ins(); break;

case '3': del(); break;

case '4': sort(); break;

case '5': view(); break;

}

else

if(!m_p->getNumberOfBook() && choice=='2') ins();} while(choice!='6');

}

void CMenu::find() const //поиск по ключу

{ string title; int cp;

cout<<"\nВведите заглавие->"; getline(cin, title);

int iKey=m_p->find(title);

if(iKey!=-1) {

cout<<"Автор: "; cp=GetConsoleCP(); SetConsoleCP(1251);

cout<<m_p->m_pBook[iKey]->getAuthor()<<endl; SetConsoleCP(cp);

cout<<"Заглавие: "; cp=GetConsoleCP(); SetConsoleCP(1251);

cout<<m_p->m_pBook[iKey]->getTitle()<<endl; SetConsoleCP(cp);

cout<<"Год: "; cp=GetConsoleCP(); SetConsoleCP(1251);

cout<<m_p->m_pBook[iKey]->getYear()<<endl; SetConsoleCP(cp);

}

else cout<<"Не найдено!"<<title<<endl;

}

void CMenu::view() const //просмотр состояния

{ int n=m_p->getNumberOfBook();

align(20); cout<<"Автор"; align(50); cout<<"Заглавие";

align(10); cout<<"Год";cout<<endl;

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

{ int cp=GetConsoleCP();

SetConsoleCP(1251);

align(20); cout<<m_p->m_pBook[i]->getAuthor();

align(50); cout<<m_p->m_pBook[i]->getTitle();

align(10); cout<<m_p->m_pBook[i]->getYear();

SetConsoleCP(cp);

}

}

void CMenu::ins() //добавление

{ string author, title;

int year;

cout<<"\n Введите заглавие->"; getline(cin, title);

if(m_p->find(title)<0)

{ cout<<"\n Введите автора->"; getline(cin, author);

cout<<"\n Введите год->"; cin>>year;

if(m_p->ins(author, title, year))

cout<<"\nВвод закончен";

}

else cout<<title<<" - ввод завершен\n";

}

void CMenu::del()

{ string title;

cout<<"\nВведите заглавие->"; getline(cin, title);

if(m_p->del(title)) cout<<"\nУдаление завершено!";

else cout<<title<<" - удаление невозможно\n";

}

void CMenu::sort()

{ m_p->sort(); cout<<"\nсортировка завершена!\n";

}

void CMenu::align(int n) const //выравнивание

{ cout.width(n); cout.setf(ios_base::left);

}

 

 

Рисунок 1.3 – Результат работы программы для работы с объектами

 

Результат работы программы приведен на рисунке 1.3.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...