Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

if (s=="jan")

m = 1;

else if (s=="feb")

m = 2;

...

Это не просто утомительно; таким образом мы встраиваем названия месяцев в код. Было бы лучше занести их в таблицу, чтобы основная программа оставалась неизменной, даже если мы изменим символьное представление месяцев. Мы решили представить входную информацию в виде класса

vector<string>
, добавив к нему функцию инициализации и просмотра.

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
, чтобы увидеть, как они выглядят.

  • Читать дальше
  • 1
  • ...
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: