Композиция для работы с объектами
Взаимодействие трех классов 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|