Аргументы. Вызов по значению — КиберПедия 

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Аргументы. Вызов по значению

2017-09-27 223
Аргументы. Вызов по значению 0.00 из 5.00 0 оценок
Заказать работу

В Си все аргументы функции передаются “по значению”. Это следует понимать так, что вызываемой функции посылаются значения ее аргументов во временных переменных, а не сами аргументы. Такой способ передачи аргументов несколько отличается от спецификации var при параметре в Паскале, которая позволяет подпрограмме иметь доступ к самим аргументам, а не к их локальным копиям.

Главное отличие заключается в том, что в Си вызываемая функция не может непосредственно изменить переменную вызывающей функции: она может изменить только ее частную, временную копию.

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

/* power: возводит base в n-ю степень; n >= 0, версия 2 */int power(int base, int n){ int p; for (p = 1; n > 0; --n) p = p * base; return p;}

Параметр n выступает здесь в роли временной переменной, в которой циклом for в убывающем порядке ведется счет числа шагов до тех пор, пока ее значение не станет нулем. При этом отпадает надобность в дополнительной переменной i для счетчика цикла. Что бы мы ни делали с n внутри power, это не окажет никакого влияния на сам аргумент, копия которого была передана функции power при ее вызове.

При желании можно сделать так, чтобы функция смогла изменить переменную в вызывающей программе. Для этого последняя должна передать адрес подлежащей изменению переменной (указатель на переменную), а в вызываемой функции следует объявить соответствующий параметр как указатель и организовать через него косвенный доступ к этой переменной.

Механизм передачи массива в качестве аргумента несколько иной. Когда аргументом является имя массива, то функции передается значение, которое является адресом начала этого массива; никакие элементы массива не копируются. С помощью индексирования относительно полученного значения функция имеет доступ к любому элементу массива.

Аргументы по умолчанию

Формальному параметру функции может быть задан аргумент по умолчанию (default argument). Обычно это константа, которая часто встречается при вызове функции. Использование аргумента по умолчанию позволяет не писать его значение при каждом вызове. Следующая функция вычисления степени целого числа демонстрирует сказанное:

int sqr_or_power(int n, int k = 2) //k = 2 по умолчанию { if (k == 2) return (n * n); else return pow(n,k); }

Здесь предполагается, что чаще всего эта функция применяется для вычисления значения квадрата целого числа n. Вызовы этой функции могут выглядеть следующим образом:

sqr_or_power(i + 5); //вычислит (i + 5) * (i + 5) sqr_or_power (i + 5, 3); //вычислит (i + 5) в кубе

Обратите внимание, что в первом случае при вызове функции sqr_or_power указан только один параметр, поэтому второму параметру автоматически присвоится значение 2, так как он объявлен по умолчанию равным 2. Только несколько последних параметров функции могут иметь значения по умолчанию:

void foot (int i, int j = 7);//допустимо void foot (int i, int j = 2, int k); //недопустимо void foot (int i, int j = 3, int k = 7); //допустимо void foot (int i = 1, int j = 2, int k = 3); //допустимо void foot (int i=- 3, int j); //недопустимо

То есть аргументами по умолчанию могут быть аргументы, начиная с правого конца списка параметров функции и далее последовательно слева направо без перерывов. Во втором примере недопустимое использование параметров по умолчанию, так как крайний правый параметр не является параметром по умолчанию,а следующий за ним параметр при движении справа налево пытаемся объявить как параметр по умолчанию - получаем разрыв,а это недопустимо. Похожая ситуация наблюдается и в последнем примере - также разрыв параметров по умолчанию. Использование аргументов по умолчанию, как и многих других возможностей по умолчанию, позволяет уменьшить труд программистов по набиранию текста программы.

 

Прототипы функций

Язык C++ позволяет использовать прототипы функций. По сути, возвращаемый тип, идентификатор функции и типы параметров с обязательной точкой с запятой в конце составляют прототип функции. Прототип функции (function prototype) — это объявление функции, но не ее определение. Благодаря явному объявлению возвращаемого типа и списка типов аргументов, в C++ при обращении к функции возможны строгая проверка типов и неявные преобразования типов.

Итак, функция может быть объявлена до того, как она определена. Определение функции может идти позже в этом же файле, браться из библиотеки или из указанного пользователем файла. Прототип функции имеет следующую форму:

тип имя(список_объявлений_аргументов);

список_объявлений_ аргументов может быть пустым, содержать единственное объявление или несколько объявлений, разделенных запятыми. Если функция не имеет параметров, допускается использование ключевого слова void. В C++ функция с пустым списком параметров выглядит как имя_функции(). Такая информация позволяет компилятору отслеживать совместимость типов. Аргументы преобразуются к указанным в объявлении типам так же, как в случае присваивания.

Рассмотрим пример прототипа функции min, которая принимает два целочисленных параметра, находит минимальное из них и возвращает его

int min(int, int);

И возвращаемый тип функции, и типы аргументов в списке указываются явно. Определение функции min () должно соответствовать этому объявлению. Прототип функции может также содержать имена аргументов. В случае min () это могло бы выглядеть так:

int min(int x, int у);

В C++ используется эллипсический символ (ellipsis) (...) для обозначения списка аргументов, который не указан, но подразумевается. Функция printf () из стандартной библиотеки stdio.h имеет следующий прототип:

int printf(const char* cntrl_str,...);

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

Пример 10. Программа, иллюстрирующая применение прототипов функций.

//Сложение трех целых — иллюстрация прототипов функций #include <iostream.h>int add3(int, int, int);double average(int);void main() {int score_l, score_2, score_3, sum;cout << "Enter three marks: ";cin >> score_l >> score_2 >> score_3;sum = add3(score_l, score_2, score_3);cout << "Sum= " << sum;cout << " Average= " << average(sum);sum = add3(1.5 * score_l, score_2, 0.5 * score_3);cout << "Weight sum= " << sum << ".";cout << "Weight average= " << average(sum) << "." << "n";}int add3(int a, int b, int с){ return (a + b + с); } double average(int s) { return (s / 3.0); }

Разбор программы

int add3(int, int, int); double average(int);

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

sum = add3(1.5 * score_l, score_2, 0.5 * score_3);

Вызов функции суммирования трех целочисленных параметров add3, параметры в скобках будут неявно преобразованы к целому типу.

int add3(int a, int b, int с) { return (а + b + с); }

Это определение функции соответствует объявлению прототипа функции перед main ().

Так как список аргументов в прототипе функции может включать имена переменных,

int add3(int а, int b, int с);

тоже допустимо.

 

Варианты заданий:

1. Вычислить , где S1 и k1 - сумма и количество положительных элементов массива X(8); S2 и k2 - сумма и количество положительных элементов массива Y(10).

2. Вычислить , где S1 и k1 - сумма и количество положительных элементов массива X(10); S2 и k2 - сумма и количество отрицательных элементов массива Y(8).

3. Вычислить суммы элементов каждой строки матриц А(n,n), B(m,m).

4. Найти наибольшие элементы и их порядковые номера массивов X(10) и Y(7).

5. Вычислить суммы положительных элементов каждой строки матриц А(n,n), B(m,m).

6. Вычислить суммы отрицательных элементов каждого столбца матриц А(n,n), B(m,m).

7. Найти наименьшие элементы и их порядковые номера массивов А(5) и В(10).

8. Найти наименьшие элементы для матриц A(3,4) и B(4,5).

9. Вычислить , где xmax и xmin – максимальный и минимальный элементы массива X(10), где ymax и ymin – максимальный и минимальный элементы массива Y(8). Максимальный и минимальный элементы массива вычислять в одной подпрограмме.

10. Преобразовать массивы X(12) и Y(10), расположив в них подряд только положительные элементы. Вместо остальных элементов записать нули.

11. Вычислить среднее арифметическое положительных элементов для массивов A(n1), A(n2), A(n3).

12. Подсчитать количество элементов матриц X(n1,m1) и Y(n2,m2), удовлетворяющих условиям 0 ≤ xij ≤ 1 и 0 ≤ yij ≤ 1.

13. Вычислить суммы элементов главных диагоналей матриц A(n,n) и B(m,m).

14. Вычислить , где S1 - сумма положительных элементов массива X(8); S2 - сумма отрицательных элементов массива Y(10). Обе суммы вычислять в одной подпрограмме.

15. Вычислить суммы элементов, стоящих выше главных диагоналей матриц A(n,n) и B(m,m).

16. Вычислить произведения элементов побочных диагоналей мат­риц A(n,n) и B(m,m).

17. Вычислить , где xi и yi заданы массивами. Все суммы вычислять в одной подпрограмме.

18. Найти минимальный элемент для каждой строки матриц A(n,n) и B(m,m).

19. Найти максимальный элемент для каждого столбца матриц A(n,n) и B(m,m).

20. Вычислить суммы элементов, стоящих ниже главных диагоналей матриц A(n,n) и B(m,m).

  1. Вычислить сумму: 1!+2!+3!+…+n!, используя процедуру вычисления факториала числа k!.
  2. Даны координаты двух отрезков (x1, y1), (x2,y2). Определить какой из отрезков длиннее. Вычисление длины отрезка оформить подпрограммой. Длина отрезка вычисляется по формуле .
  3. Найдите сумму элементов четных и сумму нечетных строк матриц A(n,n) и B(m,m).
  4. Найдите произведения элементов четных и нечетных столбцов мат­риц A(n,n) и B(m,m).
  5. Найдите средние значения элементов каждой строки матриц A(n,n) и B(m,m).
  6. Замените элементы главных диагоналей матриц A(n,n) и B(m,m) на 0, а все остальные элементы матриц на 1.

27. Вычислить , где k1 и k2 - количество четных элементов массивов X(n) и Y(m).

28. Вычислить , где где S1 и k1 - сумма и количество нечетных элементов массива X(n); S2 и k2 - сумма и количество нечетных элементов массива Y(m).

 


 

Рекомендуемая литература:

1. И.Г.Семакин, А.П.Шестаков «Основы алгоритмизации и программирования»: учебник для студ. сред. проф. образования / М.: Издательский центр «Академия», 2008.

2. Васильев П.П. «Турбо Паскаль в примерах и задачах: Освой самостоятельно»: Учеб. пособие.-М.: Финансы и статистика, 2003.

3. Долгов А.И. Алгоритмизация прикладных задач/А.И.Долгов – М.: Флинта, 2011.-136с.

4. Кауфман В.Ш. Языки программирования. Концепции и принципы/ В.Ш Кауфман – М.:ДМК-Пресс, 2010.-464с.3. Браун С. Visual Basic 6/ Питер, 2005. –573с.

5. В.Д.Колдаев - Основы алгоритмизации и программирования, Москва ИД "ФОРУМ" - ИНФРА-М, 2006, 414 с.

6. Основы алгоритмизации и программированияО. Л. Голицына, И. И. Попов, Издательство: Форум, 2008, 432 с.

 

 


Поделиться с друзьями:

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.025 с.