Главная->Інформатика та програмування->Содержание->Структурные переменные в качестве аргументов

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

Структурные переменные в качестве аргументов

Структурные переменные могут использоваться в качестве аргументов функций. Мы продемонстрируем два примера, в одном из которых участвует уже знакомая нам структура Distance, а другой пример будет работать с графическим объектом.

Структура Distance

Следующий пример, ENGLDISP, содержит функцию, которая использует аргумент типа Distance — структуры, фигурировавшей в нескольких примерах из главы 4 «Структуры».

// engldisp.cpp

// передача структурных переменных в функцию #include <iostream> using namespace std; //////////////////////////////////////////////////////////

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

{

int feet; float inches;

};

////////////////////////////////////////////////////////// void engldisp( Distance ); // объявление

int main() {

Distance d1,d2;        //  определение двух длин

                       //      ввод значений полей d1

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

                       //      ввод значений полей d2

cout << "\nВведите число футов: "; cin >> d2.feet; cout << "Введите число дюймов: "; cin >> d2.inches; cout << "\nd1 = ";

engldisp(d1);     // вывод значения d1

cout << "\nd2 = ";

engldisp(d2);     // вывод значения d2

cout << endl; return 0;

}

//--------------------------------------------

// функция engldisp(), отображающая значения // полей структурной переменной типа Distance

void engldisp(Distance dd )// параметр dd типа Distance {

 cout << dd.feet << "\'-" << dd.inches << "\"";

}

В функции main() производится запрос на ввод пользователем двух расстоя- ний, каждое из которых задается числом футов и числом дюймов. Полученные значения сохраняются в двух структурных переменных d1 и d2. Затем произво- дится вызов функции engldisp(), принимающей в качестве аргумента значение типа Distance. Задачей функции является вывод расстояния в стандартной фор- ме записи, такой, как 10'-2.25". Результат взаимодействия программы с пользо- вателем выглядит следующим образом:

Введите количество футов; 9 Введите количество дюймов: 4 Введите количество футов: 5 Введите количество дюймов: 4.25 d1 = 9'-4" d2 = 5'-4.25"

При объявлении функции, ее определении и вызовах, структурная перемен- ная использовалась в качестве аргумента так же, как и любая другая переменная стандартного типа char или int.

В функции main() обращение к функции engldisp() происходит дважды. В пер- вом случае в качестве аргумента передается переменная d1, во втором случае — переменная d2. Параметром функции engldisp() служит переменная dd типа Distance. Как и в случаях с переменными стандартных типов, параметру dd присваивается значение передаваемой функцией main() величины типа Distance. Операторы функции engldisp() могут получать доступ к полям переменной dd с помощью выражений dd.feet и dd.inches. На рис. 5.4 показано, каким образом структурная переменная передается в качестве аргумента функции.

Как в случаях с простыми переменными, структурный параметр dd является лишь копией аргументов d1 и d2, передаваемых в функцию. Поэтому если бы функция engldisp() изменяла значение переменной dd (хотя в данном примере она не делает этого) с помощью операторов

dd.feet = 2; dd.inches = 3.25;

то сделанные изменения никак не отразились бы на значениях переменных d1 и d2.

Рис. 5.4. Передача структуры в качестве аргумента

Структура circle

Следующий пример передачи структурной переменной в функцию будет реали- зован с использованием консольной графики. Исходные и заголовочные файлы для этих функций перечислены в приложении Д «Упрощенный вариант кон- сольной графики». При необходимости их можно найти на сайте издательства, адрес которого указан во введении к этой книге. Вам нужно будет включить со- ответствующие заголовочные файлы MSOFTCON.H или BORLACON.H и исходные файлы MSOFTCON.CPP или BORLACON.CPP в проект. Функции консольной графики описаны в приложении Д, а процедура добавления указанных файлов к проекту — в приложениях В «Microsoft Visual C++» и Г «Borland C++ Builder».

В этом примере структура с именем circle представляет графический объект типа «круг». Круги имеют определенные координаты своего центра на экране консоли и радиус. Кроме того, они обладают определенным цветом и стилем за- полнения, информацию о которых можно найти в приложении Д. Приведем листинг программы CIRCSTRC:

// circstrc.cpp

// графические объекты типа круг

#include "msoftcon.h"           // для графических функций

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

struct circle                   // графический объект "круг"

{

  int xCo, yCo;                 // координаты центра

  int radius;

  color fillcolor;              // цвет

  fstyle fillstyle;             // стиль заполнения

};

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

void circ_draw(circle c)

{

  set_color(c.fillcolor);       // установка цвета

  set_fill_style(c.fillstyle);  // установка стиля заполнения

  draw_circle(c.xCo,c.yCo,c.radius); // рисование круга

}

//--------------------------------------------------------

int main()

{

  init_graphics();              // инициализация графики

  // создание кругов

  circle c1 = {15, 7, 5, cBLUE, X_FILL };

  circle c2 = {41, 12, 7, cRED, O_FILL };

  circle c3 = {65, 18, 4, cGREEN, MEDIUM_FILL };

  circ_draw(c1);                // рисование кругов

  circ_draw(c2);

  circ_draw(c3);

  set_cursor_pos(1, 25);        //cursor to lower left corner

  return 0;

}

Каждая из переменных c1, c2 и c3 типа circle инициализируется своим набо- ром значений полей. Для c1 это выглядит следующим образом:

circle c1 = {15, 7, 5, cBLUE, X_FILL };

Предполагается, что ваша консоль имеет размер 80 колонок на 25 строк. Число 15 означает номер колонки (координату x), а число 7 — номер строки (координата у, отсчитываемая от верхней границы экрана), определяющие мес- тоположение центра круга. Далее, число 5 задает радиус окружности, cBLUE — цвет круга, a X_FILL означает, что круг будет заполнен символами 'X'. Аналогич- ным образом задаются параметры остальных кругов.

Когда параметры для всех кругов заданы, мы рисуем их на экране путем троекратного вызова функции circ_draw() — по одному вызову для каждого из кругов. На рис. 5.5 приведен результат работы программы CIRCSTRC. Можно заме- тить, что круги выглядят несколько неровно — это является следствием неболь- шого числа единиц отображения на экране в консольном режиме.

Рис. 5.5. Результат работы программы CIRCSTRC

Обратите внимание на то, что структуры хранят параметры кругов, в то вре- мя как функция circ_draw() заставляет эти круги рисовать себя на экране. Как мы выясним в главе 6 «Объекты и классы», объекты образуются путем объеди- нения структур и функций в единые элементы, способные как хранить данные, так и выполнять действия над ними.

 

12