Программирование. Принципы и практика использования C++ Исправленное издание, стр. 206
// предполагаемый формат: (год: дети взрослые старики){ char ch1 = 0; char ch2 = 0; char ch3 = 0; Distribution dd; if (is >> ch1 >> dd.year >> ch2 >> dd.young >> dd.middle >> dd.old >> ch3) { if (ch1!= '(' || ch2!=':' || ch3!=')') { is.clear(ios_base::failbit); return is; } } else return is; d = dd; return is;}Этот код является результатом непосредственного воплощения идей, изложенных в главе 10. Если какие-то места этого кода вам не ясны, пожалуйста, перечитайте эту главу. Мы не обязаны определять тип
Distribution>>DistributionDistributionstring file_name = "japanese-age-data.txt";ifstream ifs(file_name.c_str());if (!ifs) error("Невозможно открыть файл ",file_name);// ...Distribution d;while (ifs>>d) { if (d.year<base_year || end_year<d.year) error("год не попадает в диапазон"); if (d.young+d.middle+d.old != 100) error("Проценты не согласованы"); // ...}Иначе говоря, мы пытаемся открыть файл
japanese-age-data.txtjapanese-age-data.txtstringЦикл чтения проверяет диапазон чисел и согласованность данных. Это основные правила проверки таких данных. Поскольку оператор
>>15.6.2. Общая схема
Что мы хотим увидеть на экране? Этот ответ можно найти в начале раздела 15.6. На первый взгляд, для изображения данных нужны три объекта класса
Open_polylineclearerМы хотим пометить ось x, указав годы. Вертикальная линия, проходящая через отметку 2008, означает год, после которого данные являются результатом экстраполяции.
В качестве названия изображения мы решили просто использовать метку окна.
const int xmax = 600; // размер окнаconst int ymax = 400;const int xoffset = 100;// расстояние от левого края окна до оси yconst int yoffset = 60; // расстояние от нижнего края окна до оси хconst int xspace = 40; // пространство между осямиconst int yspace = 40;const int xlength = xmax–xoffset–xspace; // длина осейconst int ylength = ymax–yoffset–yspace;В принципе эти инструкции определяют прямоугольную область (окно) и вложенный в него прямоугольник (определенный осями).

Без такого схематического представления о размещении элементов экрана в нашем окне с помощью символических констант код был бы безнадежно запутанным.
15.6.3. Масштабирование данных
Теперь мы должны определить, как изобразить данные в описанной области. Для этого масштабируем данные так, чтобы они помещались в прямоугольнике, определенном осями координат. Масштабирование осуществляется с помощью масштабных множителей, представляющих собой отношение диапазона изменения данных и меток на осях.
const int base_year = 1960;const int end_year = 2040;const double xscale = double(xlength)/(end_year–base_year);const double yscale = double(ylength)/100;Мы объявили наши масштабирующие множители (
xscaleyscaledouble