Цель работы: Изучить использование классов в С++.
Задание:
Описать класс «домашняя библиотека». Предусмотреть возможность работы с произвольным числом книг, поиска книги по какому-либо признаку (например, по автору или по году издания), добавления книг в библиотеку, удаления книг из нее, сортировки книг по разным полям.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
Теоретические сведения:
Класс является абстрактным типом данных, определяемых пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.
Данные класса называются полями ( по аналогии с полями структуры), а функции класса – методами. Поля и методы называются элементами класса. Описание класса в первом приближении выглядит так:
1 2 3 4 5 6 |
class <имя>{ [private:] <описание скрытых элементов> public: <описание доступных элементов> };// Описание заканчивается точкой с запятой |
Спецификаторы доступа private и public управляют областью видимости элементов класса. Элементы, описанные после служебного слова private. видимы только внутри класса. Интерфейс класса описывается после спецификатора public.
В качестве примера создадим класс, моделирующий персонаж компьютерной игры. Для этого требуется задать его свойства (например, количество щупалец, силу или наличие гранатомёта) и поведение.
1 2 3 4 5 6 7 8 |
class monstr{ int health, ammo; public: monstr(in the=100, int am=10){health=he,ammo=am;} void draw(int x,int y,int scale, int position); int gethealth(){return health;} int get_ammo(){return ammo;} } |
Методы класса, описанные в самом классе по умолчанию inline.
Методы класса описываются так:
1 2 3 4 |
void monstr::draw(int x, int y, int scale, int position) { //тело метода } |
метод можно определить как inline и вне класса:
1 2 3 4 |
inline int monstr::get_ammo() { return ammo; } |
Текст программы:
Модуль «LIBRARY.H»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//Класс библиотека #ifndef _LIBRARYH #define _LIBRARYH typedef unsigned int UINT; typedef unsigned short int BOOL; struct BOOK{ char * Author; char * Title; char * Manufactor; UINT Pages; UINT Year; }; struct BOOKLISTITEM{ char * Author; char * Title; char * Manufactor; UINT Pages; UINT Year; BOOKLISTITEM *Next; BOOKLISTITEM *Previous; }; ////////////////////////////////////////////// //Определение констант const TRUE=1,FALSE=0; const S_AUTHOR=0,S_TITLE=1,S_MANUFACTOR=2,S_PAGES=3,S_YEAR=4; class LIBRARY { private: protected: public: BOOKLISTITEM * root; LIBRARY();//конструктор root=NULL; ~LIBRARY();//деструктор // BOOL AddBook(char *Author,char *Title,char *Manufactor,UINT Pages,UNIT Year); BOOL AddBook(BOOK &Book); // BOOL DeleteBook(char *Author,char *Title,char *Manufactor,UINT Pages,UNIT Year); BOOL DeleteBook(BOOKLISTITEM *bli); BOOKLISTITEM* FindBook(BOOK &Book,BOOKLISTITEM *Start); BOOL Sort(UINT Field); void Print(); }; template <class T>BOOL PrintBook(T *Book); template <class T>BOOL InputBook(T *Book); #include "LIBRARY.CPP" #endif |
Модуль «LIBRARY.CPP»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
#ifndef _LIBRARYCPP #define _LIBRARYCPP #include "LIBRARY.H" #include <string.h> #include <stdio.h> #include <conio.h> LIBRARY::LIBRARY()//конструктор root=NULL; { root=NULL; } LIBRARY::~LIBRARY()//деструктор { BOOKLISTITEM *bli=root; if (bli) bli=bli->Next; while (bli) { delete bli->Previous; bli=bli->Next; } if (bli) delete bli; } // BOOL AddBook(char *Author,char *Title,char *Manufactor,UINT Pages,UNIT Year); BOOL LIBRARY::AddBook(BOOK &Book) { BOOKLISTITEM * bli=new BOOKLISTITEM; if (!bli) return FALSE; bli->Author=strdup(Book.Author); bli->Title=strdup(Book.Title); bli->Manufactor=strdup(Book.Manufactor); bli->Pages=Book.Pages; bli->Year=Book.Year; //Переставляем указатели if (root) root->Previous=bli; bli->Next=root; bli->Previous=NULL; root=bli; return TRUE; } // BOOL DeleteBook(char *Author,char *Title,char *Manufactor,UINT Pages,UNIT Year); BOOL LIBRARY::DeleteBook(BOOKLISTITEM *bli) { //Исправление указателей if (bli->Previous) bli->Previous->Next=bli->Next; if (bli->Next) bli->Next->Previous=bli->Previous; if (root==bli) root=NULL; //Удаление книги delete bli; return TRUE; } BOOKLISTITEM* LIBRARY::FindBook(BOOK &Book,BOOKLISTITEM *Start) { if (!root) return NULL; BOOKLISTITEM *bli=Start; BOOL Find=TRUE; while (bli) { if (Book.Author) { if (strcmpi(Book.Author,bli->Author)!=0) Find=FALSE; } if (Book.Title) { if (strcmpi(Book.Title,bli->Title)!=0) Find=FALSE; } if (Book.Manufactor) { if (strcmpi(Book.Manufactor,bli->Manufactor)!=0) Find=FALSE; } if (Book.Pages) { if (Book.Pages!=bli->Pages) Find=FALSE; } if (Book.Year) { if ((Book.Year)!=bli->Year) Find=FALSE; } if (Find) return bli; bli=bli->Next; } return NULL; } BOOL LIBRARY::Sort(UINT Field) { LIBRARY Library; BOOK Book; if (!root) return TRUE; while (root) { BOOKLISTITEM * max=root; BOOKLISTITEM * bli=root; while (bli) { switch (Field) { case S_AUTHOR: if (strcmpi(max->Author,bli->Author)<0) max=bli; break; case S_TITLE: if (strcmpi(max->Title,bli->Title)<0) max=bli; break; case S_MANUFACTOR: if (strcmpi(max->Manufactor,bli->Manufactor)<0) max=bli; break; case S_PAGES: if (max->Pages<bli->Pages) max=bli; break; case S_YEAR: if (max->Year<bli->Year) max=bli; break; } bli=bli->Next; } if (max->Previous) max->Previous->Next=max->Next; if (max->Next) max->Next->Previous=max->Previous; if (root==max) root=max->Next; memcpy((char*)&Book,(char*)max,sizeof(Book)); Library.AddBook(Book); delete max; } this->root=Library.root; return TRUE; } void LIBRARY::Print() { BOOKLISTITEM *bli=this->root; while (bli) { PrintBook(bli); printf("Нажмите любую кнопку для продолжения...\n");getch(); bli=bli->Next; } printf("Вывод завершён. "); getch(); } template <class T>BOOL PrintBook(T *Book) { printf("\nАвтор: "); if (Book->Author) printf("%s",Book->Author); printf("\nКнига: "); if (Book->Title) printf("%s",Book->Title); printf("\nИздательство: "); if (Book->Manufactor) printf("%s",Book->Manufactor); printf("\nСтраниц: "); if (Book->Pages) printf("%u",Book->Pages); printf("\nГод: "); if (Book->Year) printf("%u",Book->Year); printf("\n"); return TRUE; } template <class T>BOOL InputBook(T *Book) { const MAX=256; char *str1=new char[MAX]; char *f="%256s"; if (!str1) return FALSE; printf("\nАвтор: ");fflush(stdin); scanf(f,str1); Book->Author=strdup(str1); printf("Книга: ");fflush(stdin); scanf(f,str1); Book->Title=strdup(str1); printf("Издательство: ");fflush(stdin); scanf(f,str1); Book->Manufactor=strdup(str1); printf("Страниц: ");// fflush(stdin); scanf("%u",&Book->Pages); printf("Год: "); //fflush(stdin); scanf("%u",&Book->Year); delete str1; return TRUE; } #endif |
Модуль «LAB10.CPP»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#include "library.h" #include <stdlib.h> char ch=' '; LIBRARY Library; BOOK Book; BOOKLISTITEM *bli; void main() { while (ch!=27) { clrscr(); printf("1-Добавить книгу\n2-Удалить книгу\n3-Вывод списка книг\n4-Поиск книги\n5-Сортировка\n"); ch=getch(); clrscr(); switch(ch) { case '1': printf("Добавление книги:\n"); InputBook(&Book); if (!Library.AddBook(Book)) printf("Не удалось добавить книгу.\n"); break; case '2': printf("Удаление книги:\n"); InputBook(&Book); bli=Library.FindBook(Book,Library.root); if (bli) Library.DeleteBook(bli); else {printf("Ошибка. Возможно такой книги нет.\n");getch();} break; case '3': Library.Print(); break; case '4': printf("Введите данные о книге, которую хотите найти:\n"); ch=' '; const MAX=256; char *str1 =new char[MAX]; char *f="%256s"; if (Book.Author) free(Book.Author); if (Book.Title)free(Book.Title); if (Book.Manufactor)free(Book.Manufactor); Book.Author=NULL; Book.Title=NULL; Book.Manufactor=NULL; Book.Pages=0; Book.Year=0; fflush (stdin); while (ch!='0') { printf("Текущие параметры поиска:\n"); PrintBook(&Book); printf("\nВведите параметры поиска\n"); printf("1-Автор\n2-Название\n3-Издательство\n4-Страниц\n5-Год\n0-Начать поиск\n"); ch=getch(); switch (ch) { case '1': printf("Введите автора: "); fflush(stdin); scanf(f,str1); if (Book.Author) free(Book.Author); Book.Author=strdup(str1); break; case '2': printf("Введите название: "); fflush(stdin); scanf(f,str1); if (Book.Title) free(Book.Title); Book.Title=strdup(str1); break; case '3': printf("Введите издательство: "); fflush(stdin); scanf(f,str1); if (Book.Manufactor) free(Book.Manufactor); Book.Manufactor=strdup(str1); break; case '4': printf("Введите количество страниц: ");fflush(stdin); scanf("%u",Book.Pages); break; case '5': printf("Введите год: ");fflush(stdin); scanf("%u",Book.Year); break; } } delete str1; bli=Library.root; printf("Результаты:\n"); while (bli) { bli=Library.FindBook(Book,bli); if (bli) { PrintBook(bli); getch(); bli=bli->Next; } } printf("Вывод закончен."); getch(); break; case '5': printf("Выберите параметры сортировки: \n"); printf("1-по автору\n2-по названию\n3-по издательству\n4-по количеству страниц\n5-по году\n"); ch=getch(); UINT Field; Field=ch-'1'; if (!Library.Sort(Field)) printf("Произошла ошибка при сортировке.\n"); else printf("Сортировка прошла успешно.\n"); getch(); break; case '6': case '7': break; } } } |
Вывод: Были изучены классы в С++.