vector<string> month_input_tbl; // month_input_tbl[0]=="jan"
void init_input_tbl(vector<string>& tbl)
// инициализирует вектор входных представлений
{
tbl.push_back("jan");
tbl.push_back("feb");
tbl.push_back("mar");
tbl.push_back("apr");
tbl.push_back("may");
tbl.push_back("jun");
tbl.push_back("jul");
tbl.push_back("aug");
tbl.push_back("sep");
tbl.push_back("oct");
tbl.push_back("nov");
tbl.push_back("dec");
}
int month_to_int(string s)
// Является ли строка s названием месяца? Если да, то возвращаем ее
// индекс из диапазона [0:11], в противном случае возвращаем –1
{
for (int i=0; i<12; ++i) if (month_input_tbl[i]==s) return i;
return –1;
}
На всякий случай заметим, что стандартная библиотека С++ предусматривает более простой способ решения этой задачи. См. тип
map<string,int>
в разделе 21.6.1.
Если мы хотим вывести данные, то должны решить обратную задачу. У нас есть представление месяца с помощью чисел
int
, и мы хотели бы представить их в символьном виде. Наше решение очень простое, но вместо использования таблицы перехода от типа
string
к типу
int
мы теперь используем таблицу перехода от типа
int
к типу
string
.
vector<string> month_print_tbl; // month_print_tbl[0]=="January"
void init_print_tbl(vector<string>& tbl)
// инициализируем вектор представления для вывода
{
tbl.push_back("January");
tbl.push_back("February");
tbl.push_back("March");
tbl.push_back("April");
tbl.push_back("May");
tbl.push_back("June");
tbl.push_back("July");
tbl.push_back("August");
tbl.push_back("September");
tbl.push_back("October");
tbl.push_back("November");
tbl.push_back("December");
}
string int_to_month(int i)
// месяцы [0:11]
{
if (i<0 || 12<=i) error("Неправильный индекс месяца.");
return month_print_tbl[i];
}
Для того чтобы этот подход работал, необходимо где-то вызвать функции инициализации, такие как указаны в начале функции main().
// первая инициализация таблиц представлений:
init_print_tbl(month_print_tbl);
init_input_tbl(month_input_tbl);
Итак, действительно ли вы прочитали все фрагменты кода и пояснения к ним? Или ваши глаза устали, и вы перешли сразу в конец главы? Помните, что самый простой способ научиться писать хорошие программы — читать много чужих программ. Хотите — верьте, хотите — нет, но методы, использованные в описанном примере, просты, хотя и не тривиальны, и требуют объяснений. Ввод данных — фундаментальная задача. Правильная разработка циклов ввода (с корректной инициализацией каждой использованной переменной) также очень важна. Не меньшее значение имеет задача преобразования одного представления в другое. Иначе говоря, вы
должны знать такие методы. Остается лишь выяснить, насколько хорошо вы усвоили эти методы и не упустили ли из виду важные факты.
Задание
1. Разработайте программу, работающую с точками (см. раздел 10.4). Начните с определения типа данных
Point
, имеющего два члена — координаты
x
и
y
.
2. Используя код и обсуждение из раздела 10.4, предложите пользователю ввести семь пар (x,y). После ввода данных запишите их в вектор объектов класса
Point
с именем
original_points
.
3. Выведите на печать данные из объекта
original_points
, чтобы увидеть, как они выглядят.
4. Откройте поток
ofstream
и выведите все точки в файл
mydata.txt
. В системе Windows для облегчения просмотра данных с помощью простого текстового редактора (например, WordPad) лучше использовать расширение файла
.txt
.
5. Закройте поток
ofstream
, а затем откройте поток
ifstream
для файла
mydata.txt
. Введите данные из файла
mydata.txt
и запишите их в новый вектор с именем
processed_points
.
6. Выведите на печать данные из обоих векторов.
7. Сравните эти два вектора и выведите на печать сообщение Что-то не так
!
, если количество элементов или значений элементов в векторах не совпадает.