Вызов функций: вызов по значению и по ссылке — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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

Вызов функций: вызов по значению и по ссылке

2020-05-08 280
Вызов функций: вызов по значению и по ссылке 0.00 из 5.00 0 оценок
Заказать работу

Во многих языках программирования существует два способа вызова функций — вызов по значению и вызов по ссылке.

1. Когда аргумент используется в вызове по значению, то вызываемой функции передается копия значения аргумента. Изменения, происходящие с копией, не отражаются на значении исходной переменной в вызывающей функции.

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

В С все вызовы передают аргументы по значению. Имеется возможность имитировать передачу аргумента по ссылке, используя операции взятия адреса и косвенные операции. Массивы автоматически передаются посредством имитации передачи аргумента по ссылке.

 

Классы памяти

Язык С поддерживает четыре класса памяти, обозначаемые спецификаторами класса памяти:

auto,

register,

extern и

static.

Класс памяти идентификатора помогает определить его период хранения, область действия и тип компоновки.

Четыре спецификатора класса памяти могут быть разбиты на два типа по периоду хранения:

· автоматический период хранения

· статический период хранения.

Для объявления переменных с автоматическим периодом хранения служат ключевые слова auto и register. Переменные с автоматическим хранением создаются, когда управление получает программный блок, в котором они объявлены и уничтожаются, когда происходит выход из блока.

Следующее объявление показывает, что переменные х и у типа float являются автоматическими локальными переменными:

auto float x, у;

Локальные переменные имеют автоматический период хранения по умолчанию, так что ключевое слово auto используется редко. Автоматическое хранение способствует экономии памяти, поскольку существуют только тогда, когда они необходимы.

Данные в программе на машинном языке для выполнения вычислений и другой обработки обычно загружаются в регистры.

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

Объявления register часто бывают не нужны. Современные оптимизирующие компиляторы способны распознать часто используемые переменные и могут размещать их в регистрах самостоятельно, не требуя от программиста объявления register.

Ключевые слова extern и static используются для объявления идентификаторов переменных и функций со статическим периодом хранения.

Рекурсия

Рекурсивная функция — это функция, которая вызывает саму себя непосредственно или косвенно через другую функции.

Рекурсивные подходы к решению задач имеют ряд общих элементов. Для решения задачи вызывается рекурсивная функция. Фактически функция знает решение только простейшего случая (случаев), или так называемого основного случая. Если функция вызывается для решения основного случая, то она просто возвращает результат. Если функция вызывается для решения более сложной проблемы, функция делит задачу на две обобщенных части: часть, для которой функция имеет способ решения, и часть, для которой функция решения не имеет. Чтобы сделать рекурсию возможной, последняя часть должна быть похожа на первоначальную задачу, но она должна быть более простым ее вариантом. Поскольку эта новая задача похожа на первоначальную, функция запускает (вызывает) свою новую копию, чтобы продолжить решение меньшей задачи. Этот процесс называется рекурсивным вызовом или шагом рекурсии.

Шаг рекурсии содержит ключевое слово return, поскольку результат рекурсии будет объединен с предыдущей частью задачи, для которой функция знала решение, чтобы сформировать окончательный результат, который будет передан первоначальной вызывающей функции, возможно main.

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

/* Рекурсивная функция factorial */

#include <stdio.h>

long factorial(long);

main () {

int i;

for (i = 1; i <= 10; i++)

printf("%2d!= %ld\n", i, factorial (i));

return 0; }

/* Рекурсивное определение функции factorial */

long factorial(long number)

{

if (number <= 1)

return 1; else

return (number * factorial(number - 1)); }

 

Вывод на экран

1! = 1

2! = 2

3! = 6

4! = 24

5! = 120

6! = 720

7! = 5040

8! = 40320

9! = 362880

10! = 3628800

Рис. 5. Вычисление факториалов рекурсивной функцией

         

Порядок выполнения работы

1. Изучите теоретический материал.

2. Напишите программу, согласно заданному в варианте задания условию.

3. Ответьте на контрольные вопросы.

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

Вариант 1.

Напишите функцию multiple для двух целых, которая определяет, кратно ли второе число первому. Функция должна получать два целых аргумента и возвращать 1 (true), если второе число кратно первому, и 0 (false) в противном случае. Используйте эту функцию в программе, которая вводит серию пар целых чисел.

Вариант 2.

Напишите программу, которая вводит последовательность целых чисел и передает их по одному функции even, которая использует операцию деления по модулю, чтобы определить, является ли целое четным. Функция должна получать один аргумент и возвращать 1, если целое четно и 0 в противном случае.

Вариант 3.

Напишите функцию, которая выводит у левой границы экрана сплошной квадрат из символов *, сторона которого определяется целым параметром side. Например, если side равно 4, функция выведет следующее изображение:

****

****

****

****

Вариант 4.

Напишите функцию, которая получает время в качестве трех целых аргументов (часы, минуты и секунды) и возвращает число секунд с момента, когда часы «пробили 12». Используйте эту функцию для вычисления промежутка времени в секундах между двумя моментами, которые лежат внутри одного и того же 12-ти часового круга.

Вариант 4.

Реализуйте следующие целые функции:

· Функция celsius возвращает эквивалент по шкале Цельсия температуры, заданной по шкале Фаренгейта.

· Функция fahrenheit возвращает эквивалент по шкале Фаренгейта температуры, заданной по шкале Цельсия.

Используйте эти функции для создания программы, которая печатает таблицы, показывающие температурные эквиваленты шкалы Фаренгейта для всех значений температуры по шкале Цельсия в диапазоне от 0 до 100 градусов, и эквиваленты шкалы Цельсия для всех температур шкалы Фаренгейта в диапазоне от 32 до 212 градусов. Напечатайте аккуратную таблицу в формате, который минимизирует число выводимых строк при сохранении ясности таблицы.

Вариант 5.

Напишите функцию, которая возвращает наименьшее из трех чисел с плавающей точкой.

Вариант 6.

Целое число называют совершенным числом, если сумма его делителей, включая 1 (но не само число), равна этому числу. Например, б является совершенным числом, поскольку 6 = 1+2 + 3. Напишите функцию perfect, которая определяет, является ли ее параметр совершенным числом. Используйте эту функцию в программе, которая находит и печатает все совершенные числа в диапазоне от 1 до 1000. Напечатайте все делители для каждого совершенного числа, чтобы убедиться, что число действительно является совершенным. Бросьте вызов своему компьютеру, попробовав проверить числа, намного большие 1000.

Вариант 7.

Целое число называют простым, если оно делится только на 1 и на само себя. Например, 2, 3, 5 и 7 являются простыми, а 4, 6, 8 и 9 — нет.

Напишите функцию, которая определяет, является ли число простым.

Используйте эту функцию в программе, которая находит и печатает все простые числа в диапазоне от 1 до 10000. Сколько чисел из этих 10000 вы действительно должны проверить, чтобы быть уверенным в том, что вы нашли все простые числа?

Первоначально вы могли подумать, что верхним пределом для делителей, с которыми нужно проверить простое число, является n/2, но в действительности вам нужно дойти только до значения квадратного корня из n. Почему? Перепишите программу и запустите ее двумя способами. Оцените увеличение производительности.

Вариант 7.

Напишите функцию, которая получает целое значение и возвращает число с обращенным порядком цифр. Например, для числа 7631 функция должна вернуть значение 1367.

Вариант 8.

 

Наибольший общий делитель (НОД) двух целых чисел является самым большим целым числом, на которое делится каждое из двух чисел. Напишите функцию gcd, которая возвращает наибольший общий делитель двух целых чисел.

Вариант 9.

Напишите функцию gualityPoints, которая вводит средний бал студента и возвращает 4, если средний бал студента составляет 90-100, 3, если 80-89, 2, если 70-79, 1, если 60-69, и 0, если средний бал ниже чем 60.

Вариант 10.

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

How much is 6 times 7? (Сколько будет шестью семь?)

Школьник должен напечатать ответ. Ваша программа проверяет ответ. Если он правильный, напечатайте фразу «Очень хорошо!». После этого задавайте следующий вопрос по умножению. Если ответ неправильный, напечатайте «Неверно. Пожалуйста попробуйте снова.» и разрешите школьнику отвечать на вопрос до тех пор, пока он не даст правильный ответ.

Вариант 11.

Напишите рекурсивную функцию power (base, exponent), которая возвращает значение

baseexponent

Например, power(3, 4) = 3*3*3*3. Предположим, что exponent

является целым, большим или равным 1. Подсказка: шаг рекурсии мог бы использовать соотношение

baseexponent = base * baseexponmtl

а завершающим условием будет случай, когда значение exponent станет равным 1, поскольку base = base

Вариант 12.

Последовательность чисел Фибоначчи 0, 1, 1, 2, 3, 5, 8, 13, 21,... начинается с числа 0 и 1 и имеет то свойство, что каждое последующее число является суммой двух предыдущих,

а) Напишите нерекурсивную функцию fibonacci(n), которая вычисляет n-ое число Фибоначчи.

b) Определите наибольшее число Фибоначчи, которое можно найти на вашей системе. Для этого измените программу части а) таким образом, чтобы для вычисления и возврата чисел Фибоначчи использовать тип double вместо int. Разрешите программе зациклиться, пока система не выдаст ошибку из-за чрезмерно большого значения.

Форма отчёта: отчет выполняется в текстовом редакторе в электронном виде.

Содержание отчета:

1. Тема работы.

2. Цель работы.

3. Текст отлаженной программы с комментариями

4. Ответы на контрольные вопросы


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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



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

0.009 с.