Глобальные и локальные переменные
Глобальные переменные — это переменные, объявленные вне основной программы и подпрограмм.
Глобальные переменные доступны из любой функции. Поэтому их надо объявлять вне всех подпрограмм. Остальные переменные, объявленные в функциях, называются локальными (местными), поскольку они известны только той подпрограмме, где они объявлены.
• Если в подпрограмме объявлена локальная переменная с таким же именем, как и глобальная переменная, то используется локальнаяпеременная.
• Если имена глобальной и локальной переменных совпадают, то для обращения к глобальной переменной в подпрограмме перед ее именем ставится два двоеточия:
:: var = ::var * 2 +var;
Везде, где можно, надо передавать данные в функции через их параметры. Если же надо, чтобы подпрограмма меняла значения переменных, надо передавать параметр по ссылке.
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Ответить на контрольные вопросы.
3. Выполнить задание.
Контрольные вопросы
1. Что такое функция?
2. Что включает в себя заголовок функции?
3. Какая существует связь между формальными и фактическими параметрами?
4. Как вы понимаете глобальные и локальные данные?
Задания для выполнения
1. На отрезке [2,n] найти все натуральные числа, сумма цифр которых при умножении числа на aне изменяется. Сумму цифр числа вычислять в функции.
2. Ввести натуральное число n. Найти и вывести все числа в интервале от 1 до n-1, у которых сумма всех цифр совпадает с суммой цифр числа n. Если таких чисел нет, то вывести сообщение. Сумму цифр числа вычислять в функции.
3. Ввести координаты n точек. Вычислить количество точек, попадающих в кольцо с внутренним радиусом R1и внешним R2 (R1<R2) и координаты точек, не принадлежащих этому кольцу. Проверку на принадлежность точки кольцу определять в функции.
4. Вычислить сумму факториалов всех нечетных чисел от mдо n. Вычисление факториала оформить в функции.
5. Ввести nцелых чисел. Вычислить сумму тех из них, которые содержат только четные цифры. Определить также, сколько нечетных цифр в найденной сумме. Поиск четных и нечетных цифр осуществлять в одной функции.
6. Ввести n целых чисел. Для каждого из них найти и вывести наибольшее число m (m>1), на которое сумма цифр числа делится без остатка. Если такого числа нет, то выводить слово “нет”. Сумму цифр числа вычислять в функции.
7. Ввести координаты nточек. Вывести количество точек, не попадающих в круг радиуса rс центром в точке О(x0, y0), и координаты точек, лежащих в этом круге. Расстояние от точки до центра круга вычислять в функции.
8. Ввести n целых чисел. Вывести наибольшую и наименьшую цифры в записи каждого из этих чисел, используя одну подпрограмму для их поиска .
9. Ввести n натуральных чисел. Вывести значения тех из них, которые делятся на каждую из своих цифр, используя подпрограмму. Предусмотреть случай, что таких чисел нет.
10. Ввести n троек вещественных чисел a, b, c. Вычислить среднее арифметическое значение максимальных элементов каждой тройки. Поиск максимального значения осуществлять в функции.
11. Натуральное число, в записи которого nцифр, называется числом Армстронга, если сумма его цифр, возведенная в степень n, равна самому числу. Вывести все числа Армстронга от 1 до K или сообщение об их отсутствии. Сумму цифр числа вычислять в функции.
12. Ввести натуральное число n.Вычислить y=1!+2!+3!+...+n! (n>1).Вычисление факториала оформить в функции.
13. Ввести n троек целых чисел. Вывести номер первого четного числа в каждой тройке, осуществляя его поиск в функции. Если четного числа в тройке нет, то считать его номер равным нулю.
14. Ввести координаты n точек. Подсчитать число точек, находящихся внутри круга радиусом R с центром в начале координат. Расстояние точки от начала координат вычислять в функции.
15. Вычислить суммы факториалов всех нечетных чисел от 1 до 9. Вычисление факториала осуществлять в функции.
ЛАБОРАТОРНАЯ РАБОТА № 23
РЕКУРСИВНЫЕ ФУНКЦИИ
Цель работы:получение навыков в написании программ с использованием рекурсивных функций.
Краткие теоретические сведения
Рекурсивной (самовызываемой или самовызывающей) называют функцию, которая прямо или косвенно вызывает сама себя.
При каждом обращении к рекурсивной функции создается новый набор объектов автоматической памяти, локализованных в коде функции.
Возможность прямого или косвенного вызова позволяет различать прямую или косвенную рекурсии. Функция называется косвенно рекурсивной в том случае, если она содержит обращение к другой функции, содержащей прямой или косвенный вызов первой функции. В этом случае по тексту определения функции ее рекурсивность (косвенная) может быть не видна. Если в функции используется вызов этой же функции, то имеет место прямая рекурсия, т.е. функция по определению рекурсивная.
Рекурсивные алгоритмы эффективны в задачах, где рекурсия использована в самом определении обрабатываемых данных. Поэтому изучение рекурсивных методов нужно проводить, вводя динамические структуры данных с рекурсивной структурой. Рассмотрим вначале только принципиальные возможности, которые предоставляет язык Си для организации рекурсивных алгоритмов.
В рекурсивных функциях необходимо выполнять следующие правила.
1. При каждом вызове в функцию передавать модифицированные данные.
2. На каком-то шаге должен быть прекращен дальнейший вызов этой функции, это значит, что рекурсивный процесс должен шаг за шагом упрощать задачу так, чтобы для нее появилось нерекурсивное решение, иначе функция будет вызывать себя бесконечно.
3. После завершения очередного обращения к рекурсивной функции в вызывающую функцию должен возвращаться некоторый результат для дальнейшего его использования.
Пример 1. Заданы два числа a и b, большее из них разделить на меньшее, используя рекурсию.
Текст программы может быть следующим:
. . .
double proc(double, double);
void main (void)
{
double a,b;
puts(“ Введи значения a, b : ”);
scanf(“%lf %lf”, &a, &b);
printf(“\n Результат деления : %lf”, proc(a,b));
}
//––––––––––––––––––– Функция –––––––––––––––––––––
double proc( double a, double b) {
if ( a< b ) return proc ( b, a );
else return a/b;
}
Если a больше b, условие, поставленное в функции, не выполняется и функция proc возвращает нерекурсивный результат.
Пусть теперь условие выполнилось, тогда функция proc обращается сама к себе, аргументы в вызове меняются местами и последующее обращение приводит к тому, что условие вновь не выполняется и функция возвращает нерекурсивный результат.
Пример 2. Функция для вычисления факториала неотрицательного значения k (для возможных отрицательных значений необходимо добавить дополнительные условия).
double fact (int k) {
if ( k < 1 ) return 1;
else
return k * fact ( k – 1);
}
Для нулевого значения параметра функция возвращает 1 (0! = 1), в противном случае вызывается та же функция с уменьшенным на 1 значением параметра и результат умножается на текущее значение параметра. Тем самым для значения параметра k организуется вычисление произведения
k * (k–1) * (k–2) * ... * 3 * 2 * 1 * 1
Последнее значение «1» – результат выполнения условия k < 1 при k = 0, т.е. последовательность рекурсивных обращений к функции fact прекращается при вызове fact(0). Именно этот вызов приводит к последнему значению «1» в произведении, так как последнее выражение, из которого вызывается функция, имеет вид: 1 * fact( 1 – 1).
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Ответить на контрольные вопросы.
3. Выполнить задание.
Контрольные вопросы
1. Что такое рекурсивная функция?
2. Что такое прямая рекурсия?
3. Что такое косвенная рекурсия?
4. На каком-то шаге должен быть прекращен дальнейший вызов рекурсивной функции?
Задания для выполнения
Написать программы решения следующих задач, используя рекурсивную функцию.
1. Найти наименьшую цифру в десятичной записи заданного натурального числа.
2. Подсчитать количество цифр в заданном натуральном числе.
3. Вычислить наибольший общий делитель двух натуральных чисел.
4. Найти число, которое образуется из заданного натурального числа при записи его цифр в обратном порядке. Например, для числа 1234 получаем результат 4321.
5. Вычислить сумму: 1! + 2! + 3! + … +n! (n≤15).
6. Вычислить сумму: 2! + 4! + 6! +…+n! (n≤16, n – четное).
7. Логическая функция возвращает 1, если ее аргумент – простое число.
8. Вычислить функцию Аккермана для всех неотрицательных целых аргументов m и n:
9. Найти количество нечетных цифр в десятичной записи заданного натурального числа.
10. Найти количество цифр, кратных 3, в десятичной записи заданного натурального числа.
11. Вычислить значение (значение 0!=1).
12. Вычислить произведение четного количества n (n ³ 2) сомножителей следующего вида:
y = .
13. Вычислить y = xn по следующему правилу: y = (xn/2 )2, если n четное и y = x × yn–1, если n нечетное.
14. Вычислить значение y(n) = .
15. Вычислить значение x = , используя рекуррентную формулу xn = = , в качестве начального значения использовать x0 = 0,5×(1 + a).
ЛАБОРАТОРНАЯ РАБОТА № 24
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|