Программирование. Принципы и практика использования C++ Исправленное издание, стр. 149
{ month feb (1 1 68 ) (2 3 66.66 ) ( 1 0 67.2)}{month dec (15 15 –9.2 ) (15 14 –8.8) (14 0 –2) }
Предположим, данные о температуре записаны в указанном выше формате и нам нужно их прочитать. К счастью, формат содержит автоматически идентифицируемые компоненты, такие как годы и месяцы (немного напоминает форматы HTML и XML). С другой стороны, формат отдельной записи довольно неудобен. Например, в ней нет информации, которая могла бы нам помочь, если бы кто-то перепутал день месяца с часом или представил температуру по шкале Цельсия, хотя нужно было по шкале Фаренгейта, и наоборот. Все эти проблемы нужно как-то решать.
10.11.1. Представление в памяти
Как представить эти данные в памяти? На первый взгляд, необходимо создать три класса,
YearMonthReadingYearMonthYearMonthMonthYearReadingReadingMonth• Если есть показания для какого-то месяца, то их обычно бывает много.
• Если есть показания для какого-то дня, то их обычно бывает много.
В этом случае целесообразно представить класс
YearMonthMonthDayDayDayMonthYearMonthDayconst int not_a_reading = –7777; // ниже абсолютного нуляАналогично, мы заметили, что часто в течение некоторых месяцев не производилось ни одного измерения, поэтому ввели понятие “пропущен месяц”, вместо того чтобы проверять пропуски для каждого дня.
const int not_a_month = –1;Три основных класса принимают следующий вид:
struct Day { vector<double> hour; Day(); // инициализируем массив hour значениями "нет данных"};Day::Day() : hour(24){ for (int i = 0; i<hour.size(); ++i) hour[i]=not_a_reading;}struct Month { // месяц int month; // [0:11] январю соответствует 0 vector<Day> day; // [1:31] один вектор для всех данных по дням Month() // не больше 31 дня в месяце (day[0] // не используется) :month(not_a_month), day(32) { }};struct Year { // год состоит из месяцев int year; // положительный == н.э. vector<Month> month; // [0:11] январю соответствует 0 Year() :month(12) { } // 12 месяцев в году};В принципе каждый класс — это просто вектор, а классы
MonthYearmonthyear
2432123232