ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
Схожі підручники
- Соціальна педагогіка (частина 2)
- МЕТОДИЧНІ РЕКОМЕНДАЦІЇ ДО ПРОВЕДЕННЯ СЕМІНАРСЬКИХ ЗАНЯТЬ, ОРГАНІЗАЦІЇ І ПРОВЕДЕННЯ САМОСТІЙНОЇ ТА ІНДИВІДУАЛЬНО-КОНСУЛЬТАЦІЙНОЇ РОБОТИ СТУДЕНТІВ
- Методичка з курсу Політологія №2
- Історія педагогіки (частина 1)
- СЛОВНИК ОСНОВНИХ ЕКОЛОГІЧНИХ ТЕРМІНІВ ТА ПОНЯТЬ
- Белая книга (частина 2) (онлайн)
