- •Красноярск
- •Федеральное агентство по образованию гоу впо «Сибирский государственный технологический университет»
- •220301 Автоматизация технологических процессов и производств,
- •230201 Информационные системы и технологии,
- •230105 Программное обеспечение вычислительной техники и автоматизированных систем всех форм обучения Красноярск
- •Содержание
- •Введение
- •1 Состав языка
- •1.1 Алфавит языка
- •1.2 Идентификаторы
- •1.3 Ключевые слова
- •1.4 Знаки операций
- •1.5 Константы
- •1.6 Комментарии
- •2.1 Концепция типа данных
- •2.2 Основные типы данных
- •3 Структура программы
- •4 Ввод/вывод
- •5 Переменные и выражения
- •5.1 Переменные
- •5.2 Операции
- •5.3 Выражения
- •6 Базовые конструкции структурного программирования
- •6.1 Оператор «выражение»
- •6.1.1 Задачи для решения на тему «линейные алгоритмы»
- •6.2 Операторы ветвления
- •6.2.1 Условный оператор if
- •6.2.2 Оператор switch
- •6.2.3 Задачи для решения на тему «условные алгоритмы»
- •6.3 Операторы цикла
- •6.3.1 Цикл с предусловием (while)
- •6.3.2 Цикл с постусловием (do while)
- •6.3.3 Цикл с параметром (for)
- •6.3.4 Задачи для решения на тему «сочетание цикла и разветвления»
- •6.4 Операторы передачи управления
- •6.4.1 Оператор goto
- •6.4.2 Оператор break
- •6.4.3 Оператор continue
- •6.4.4 Оператор return
- •6.4.5 Задачи для решения на тему «вложенные циклы (вычисление суммы ряда)»
- •7 Указатели и массивы
- •7.1 Указатели
- •7.1.1 Инициализация указателей
- •7.1.2 Операции с указателями
- •7.2 Ссылки
- •7.3 Массивы
- •7.3.1 Задачи для решения на тему «одномерные массивы»
- •7.3.2 Задачи для решения на тему «двумерные массивы»
- •7.4 Строки
- •7.4.1 Функции стандартной библиотеки
- •7.4.2 Задачи для решения на тему «строки»
- •8.1 Переименование типов (typedef)
- •8.2 Перечисления (enum)
- •8.3 Структуры (struct)
- •8.4 Битовые поля
- •8.5 Задачи для решения на тему «структуры»
- •9 Функции
- •9.1 Объявление и определение функций
- •9.2 Глобальные переменные
- •9.3 Возвращаемое значение
- •9.4 Параметры функции
- •9.5 Передача массивов в качестве параметров
- •9.6 Параметры со значениями по умолчанию
- •9.7 Функции с переменным числом параметров
- •9.8 Рекурсивные функции
- •9.9 Задачи для решения на тему «функции»
- •10 Директивы препроцессора
- •10.1 Директива #include
- •10.2 Директива #define
- •11 Динамические структуры данных
- •11.1 Линейные списки
- •11.2 Стеки
- •11.3 Очереди
- •11.4 Бинарные деревья
- •11.5 Задачи на тему «динамические структуры»
- •Задание на курсовую работу
- •Библиографический список
- •660049, Красноярск, пр. Мира, 82
9.7 Функции с переменным числом параметров
Если список формальных параметров функции заканчивается многоточием, это означает, что при ее вызове на этом месте можно указать еще несколько параметров. Проверка соответствия типов для этих параметров не выполняется, char и short передаются как int, a float - как double. В качестве примера можно привести функцию printf, прототип которой имеет вид:
int printf (const char*, ...);
Это означает, что вызов функции должен содержать по крайней мере один параметр типа char* и может либо содержать, либо не содержать другие параметры:
printf("Введите исходные данные"); // один параметр
printf("Cyммa: %5.2f рублей", sum); // два параметра
printf("%d %d %d %d", a, b, c, d); // пять параметров
Для доступа к необязательным параметрам внутри функции используются макросы библиотеки va_start, va_arg и va_end, находящиеся в заголовочном файле <stdarg.h>.
Поскольку компилятор не имеет информации для контроля типов, вместо функций с переменным числом параметров предпочтительнее пользоваться параметрами по умолчанию или перегруженными функциями, хотя можно представить случаи, когда переменное число параметров является лучшим решением.
9.8 Рекурсивные функции
Рекурсивной называется функция, которая вызывает саму себя. Такая рекурсия называется прямой. Существует еще косвенная рекурсия, когда две или более функций вызывают друг друга. Если функция вызывает себя, в стеке создается копия значений ее параметров, как и при вызове обычной функции, после чего управление передается первому исполняемому оператору функции. При повторном вызове этот процесс повторяется. Ясно, что для завершения вычислений каждая рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь алгоритма, заканчивающуюся оператором возврата. При завершении функции соответствующая часть стека освобождается, и управление передается вызывающей функции, выполнение которой продолжается с точки, следующей за рекурсивным вызовом.
Классическим примером рекурсивной функции является вычисление факториала (это не означает, что факториал следует вычислять именно так). Для того чтобы получить значение факториала числа n, требуется умножить на n факториал числа (n-1). Известно также, что 0!=1 и 1!=1.
long fact(long n){
if (n==0 || n==1) return 1;
return (n * fact(n - 1);
}
To же самое можно записать короче:
long fact(long n){
return (n>1) ? n * fact(n - 1) : 1;
}
Рекурсивные функции чаще всего применяют для компактной реализации рекурсивных алгоритмов, а также для работы со структурами данных, описанными рекурсивно, например, с двоичными деревьями. Любую рекурсивную функцию можно реализовать без применения рекурсии, для этого программист должен обеспечить хранение всех необходимых данных самостоятельно. Достоинством рекурсии является компактная запись, а недостатками - расход времени и памяти на повторные вызовы функции и передачу ей копий параметров, и, главное, опасность переполнения стека.
9.9 Задачи для решения на тему «функции»
Даны действительные числа s, t. Получить f(t, -2s, 1.17)+f(2.2, t, s-t), где
.Даны действительные числа s, t. Получить g(1.2, s)+g(t, s)-g(2s-1, st), где
.Дано действительное число y. Получить
,
где
Даны действительные числа a, b, c. Получить
.Даны действительные числа a, b. Получить u= min(a, b), v = min(ab,a+b), d = min(u+v2, 3.1416).
Даны натуральные числа n, m, целые числа a1, ..., an, b1, ..., bm, c1, ..., c30. Получить
при
в противном случае
Даны натуральные числа k, l, m, действительные числа x1, ..., xk, y1, ..., yl, z1, ..., zm. Получить
при
в противном случае
Даны действительные числа s, t. Получить h(s, t)+max(h2(s-t, st), h4(s-t, s+t))+h(1, 1), где
Даны действительные числа a0, ..., a6. Получить для x=1, 3, 4 значения p(x+1)-p(x), где p(y)=a6 y6 +a5y5 +...+a0.
Даны действительные числа s, t, a0, ...., a12. Получить p(1)-p(t)+p(s-t)-p(1), где p(x)=a12x12 +a11x11 +...+a0.
Даны действительные числа a1, ..., an, b1, ..., bm. В последовательности a1, ..., an, и в последовательности b1, ..., bm, все члены, следующие за членом с наибольшим значением (за первым по порядку, если их несколько), заменить на 0.5.
Даны целые числа a1, ..., an, b1, ..., bm, k. Если в последовательности a1, ..., an, нет ни одного члена со значением k, то первый по порядку член этой последовательности, не меньший всех остальных членов, заменить на значение k. По такому же правилу преобразовать последовательность b1, ..., bm применительно к значению 10.
Даны натуральные числа n, m найти НОД(n, m). Использовать программу, включающую РЕКУРСИВНУЮ процедуру вычисления НОД, основанную на соотношении НОД(n, m)= НОД(m, r), где r - остаток от деления n на m.
Написать процедуру сортировки строк матрицы в порядке неубывания суммы абсолютных величин элементов. Оформить как функцию вычисление суммы абсолютных величин элементов строки и как процедуру – перестановку строк.
Написать процедуру сортировки строк матрицы в порядке неубывания максимального по модулю элемента. Оформить как функцию вычисление максимального по модулю элемента строки и как процедуру – перестановку строк.
Написать процедуру сортировки строк матрицы из натуральных чисел в порядке неубывания суммы простых элементов строки. Оформить как функции вычисление суммы простых элементов строки и определение простоты числа и как процедуру – перестановку строк.
Написать процедуру поиска седловой точки матрицы. Элемент матрицы называется седловой точкой, если он одновременно максимален в своей строке и минимален в столбце. Оформить как функции поиск максимума в строке и проверку, будет ли заданный элемент минимальным в столбце.
Написать процедуру, вычеркивающую из матрицы строку и столбец, на пересечении которых располагается максимальный элемент матрицы. Поиск максимального элемента, а также вычеркивания строки и столбца оформить как процедуры.
