БлогNot. Класс "тетрадки" :)

Класс "тетрадки" :)

Задачки, подобные рассмотренной, удобно применять для базового контроля знаний по классам, постановка сводится к тому, что нужно написать класс с заданными свойствами, методами, конструкторами и одним-двумя переопределёнными операторами, например, так:

Класс: Тетрадь
Свойства: Количество листов (кратное 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 [4440 просмотров]


теги: c++ учебное

К этой статье пока нет комментариев, Ваш будет первым