Класс "тетрадки" :)
Задачки, подобные рассмотренной, удобно применять для базового контроля знаний по классам, постановка сводится к тому, что нужно написать класс с заданными свойствами, методами, конструкторами и одним-двумя переопределёнными операторами, например, так:
Класс: Тетрадь
Свойства: Количество листов (кратное 4); Записи (по одной на страницу, максимальный размер = 80 символов)
Методы: Удалить лист (4 страницы, с контролем оставшегося количества листов); Добавить запись на указанную страницу; Вывести запись с указанной страницы
Конструкторы: С заданным количеством страниц
Переопределённые в классе операторы:!
(проверка, пуста ли тетрадь)
Вот первая пришедшая в голову реализация, проверена в Visual Studio 2010 Express.
#include <iostream> #include <cstring> #include <windows.h> #include <locale.h> using namespace std; class Paper { public: char **notes; //записи int n; //количество страниц Paper (int); void add (int, char *); int clear (int); void show (int); int operator ! (); }; Paper::Paper (int n=0) { if (n==0) n=4; if (n%4) n+=(4-n%4); //скорректировать число страниц до кратного 4 this->n = n; notes = new char * [n]; for (int i=0; i<n; i++) { notes[i]=new char [80]; notes[i][0]='\0'; } } void Paper::add (int page,char *s) { int n = (strlen(s)>79 ? 79 : strlen(s)); strncpy(notes[page], s, n); notes[page][n]='\0'; } int Paper::clear (int n) { //здесь n - номер листа, а не страницы if (n<0 || n>this->n/4-1) return 0; for (int p=n*4; p<n*4+4; p++) notes[p][0]='\0'; } void Paper::show (int page) { cout << endl << notes[page]; } int Paper::operator ! () { for (int i=0; i<n; i++) if (notes[i][0]) return 1; return 0; } int main () { SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL,"Russian"); Paper a(13); //создастся пустая тетрадь из 16 страниц cout << endl << " !a= " << !a; a.add(15,"Привет, мир!"); //добавили запись на страницу 15 a.show(15); //показали запись cout << endl << " !a= " << !a; a.clear(3); //очистили лист 3 cout << endl << " !a= " << !a; cin.sync(); cin.get(); return 0; }
Замечания:
Физически удалять лист незачем, реализована только очистка.
На самом деле, конечно, лист не состоит из страниц с подряд идущими номерами, а как-то так.
13.05.2016, 14:43 [4535 просмотров]