ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн

Пример применения структур

Рассмотрим теперь, каким образом можно применить способность структуры объединять данные различных типов. Возможно, вы знаете, что в английской системе мер основными единицами измерения длины служат фут и дюйм, при- чем один фут равен 12 дюймам. Расстояние, равное 15 футам и 8 дюймам, запи- сывается как 15'-8". Дефис в данной записи не означает знак «минус» , а служит для разделения значений футов и дюймов. Иллюстрация к английской системе мер приведена на рис. 4.5.

Рис. 4.5. Английская система мер

Предположим, вам необходимо создать инженерный проект с использовани- ем английской системы мер. Было бы удобно представлять длины в виде двух чисел, одно из которых равнялось бы количеству футов, а другое — количест- ву дюймов. В следующем примере, ENGLSTRC, такая идея реализована с помощью структуры. Мы покажем, как можно при помощи типа Distance складывать две длины.

// englstrc.cpp

// английская система мер, реализованная с помощью структуры

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

struct Distance               // длина в английской системе

{

  int feet;

  float inches;

};

//////////////////////////////////////////////////////////

int main()

{

  Distance d1, d3;            // определения двух переменных

  Distance d2 = { 11, 6.25 }; // определение с инициализацией

  // ввод полей переменной d1

  cout << "\nВведите число футов: "; cin >> d1.feet;

  cout << "Введите число дюймов: "; cin >> d1.inches;

  // сложение длин d1 и d2 и присвоение результата d3

  d3.inches = d1.inches + d2.inches; // сложение дюймов

  d3.feet = 0;                       // с возможным заемом

  if( d3.inches >= 12.0 )            // если сумма больше 12.0,

  {                                  // то уменьшаем

   d3.inches -= 12.0;                 // число дюймов на 12.0 и

   d3.feet++;                         // увеличиваем число футов на 1

  }

  d3.feet += d1.feet + d2.feet;      // сложение футов

  // вывод всех длин на экран

  cout << d1.feet <<"\'-" << d1.inches << "\" + ";

  cout << d2.feet <<"\'-" << d2.inches << "\" = ";

  cout << d3.feet <<"\'-" << d3.inches << "\"\n";

  return 0;

}

 

Здесь структура Distance состоит из двух полей: feet и inches. Число дюймов не обязательно является целым, поэтому для его хранения мы используем тип float. Число футов, наоборот, всегда является целым, и поэтому его можно хра- нить в переменной типа int.

Мы определяем переменные типа Distance, d1, d2 и d3, причем переменную d2 мы инициализируем значением 11'-6.25", а переменные d1 и d3 пока оставлены без начального значения. Далее программа запрашивает у пользователя число футов и дюймов, которые используются для инициализации переменной d1 (при этом число дюймов должно быть меньше 12.0). Затем значения d1 и d2 склады- ваются, а результат присваивается переменной d3. Наконец, программа выводит две первоначальные длины и их сумму. Примером результата работы програм- мы может служить следующий:

Введите число футов: 10 Введите число дюймов: 6.75 10'-6.75" + 11'-6.25" = 22' -1"

Обратите внимание на то, что мы не можем сложить две длины следующим образом:

d3 = d1 + d2;      // некорректное действие

Такое действие вызовет ошибку потому, что в C++ не определены дейст- вия, которые необходимо выполнить при сложении переменных типа Distance. Операция + применима для стандартных типов C++, но она не определена для типов данных, которые создаются пользователями (как мы увидим в гла- ве 8 «Перегрузка операций», одним из достоинств классов является возмож- ность определять сложение и другие операции над пользовательскими типами данных).

 

9