Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
231112.docx
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
1.93 Mб
Скачать

Int main()

{

using namespace std;

int cookies[ArSize] = {1,2,4,8,16,32,64,128};

// Некоторые системы требуют предварить int словом static,

// чтобы разрешить инициализацию массива

int sum = sum_arr(cookies, ArSize);

cout << "Total cookies eaten: " << sum << "\n"; // вывод количества съеденного печенья

getchar();

return 0;

}

// Возвращает сумму элементов массива целых чисел

int sum_arr(int arr[], int n)

{

int total = 0; for (int i = 0; i < n; i++) total = total + arr[i]; return total;

}

Функции и структуры

Теперь давайте перейдем от массивов к структурам. Создавать функции для структур гораздо легче, чем для массивов. Хотя структурные переменные подобны массивам в том, что и те, и другие могут содержать несколько элементов данных, когда речь идет об их применении в функциях, структурные переменные ведут себя как базовые переменные, имеющие единственное значение. То есть, в отличие от массивов, структуры связывают свои значения в одиночную сущность, Hjfti объект данных, который будет трактоваться как единое целое. Вспомните, что одну структуру можно присваивать другой. Аналогично, можно передавать структуры по значению, как это делается с обычными переменными. В этом случае функция работает с копией исходной структуры. Здесь нет никаких трюков вроде того, что имя массива является указателем на его первый элемент. Имя структуры — это просто имя структуры, и если необходим ее адрес, то вы можете получить его с помощью операции &. (В языках С и C++ символ & применяется в качестве операции взятия адреса, но в C++ этот символ дополнительно используется для идентификации ссылочных переменных, как будет показано в главе 8.)

Самый прямой способ использования структуры в программе — это трактовать их так же, как обычные базовые типы — т.е. передавать в виде аргументов и если нужно, то использовать их в качестве возвращаемых значений. Однако существует один недостаток в передаче структур по значению. Если структура велика, то затраты, необходимые для создания копии структуры, могут значительно увеличить потребности в памяти и замедлить работу программы. По этой причине (и еще потому, что изначально язык С не позволял передавать структуры по значению) многие программисты на С предпочитают передавать адрес структуры и затем использовать указатель для доступа к ее содержимому. В C++ предлагается третья альтернатива, которая называется передачей по ссылке и обсуждается в главе 8. Давайте сейчас рассмотрим два первых варианта, начиная с передачи и возврата целых структур.

Передача и возврат структур

Передача структур по значению имеет наибольший смысл, когда структура относительно компактна, поэтому давайте рассмотрим несколько примеров, демонст-

рирующих такой подход. Первый пример имеет дело со временем путешествия (не путать с путешествиями во времени). Некоторые карты сообщают, что на проезд из Thunder Falls в Bingo City нужно потратить 3 часа 50 минут, а на проезд из Bingo City в Grotesquo — 1 час 25 минут. Для представления этих периодов времени можно использовать структуру, один член которой предназначен для представления часов, а другой — для минут. Сложение двух периодов будет не простым, потому что придется преобразовывать минуты в часы, когда их сумма превышает 60. Например, два периода времени на дорогу, приведенные выше, дают в сумме 4 часа 75 минут, что должно быть преобразовано в 5 часов 15 минут. Давайте разработаем структуру для представления значений времени, а затем функцию, которая будет принимать две таких структуры в виде аргументов и возвращать структуру, представляющую их сумму.

Определить структуру просто:

struct travel_time {

int hours;

int mins;

};

Далее рассмотрим прототип для функции sum() , который вернет сумму двух таких структур. Возвращаемое значение должно иметь тип travel_time, как и два ее аргумента. Таким образом, прототип должен выглядеть следующим образом:

travel_time sum(travel_time t1, travel_time t2) ;

Чтобы сложить два периода времени, сначала необходимо сложить минуты. Целочисленное деление на 60 даст количество часов, в которые сложатся минуты, а операция модуля (%) даст оставшиеся минуты. В листинге 7.11 этот подход воплощен в функции sum (); еще одна функция, show_time (), служит для отображения содержимого структуры travel_time.

// travel.cpp -- using structures with functions

#include <iostream>

struct travel_time

{

int hours;

int mins;

};

const int Mins_per_hr = 60;

travel_time sum(travel_time t1, travel_time t2);

void show_time(travel_time t);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]