Шрифт:
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Как определять функцию.
Как передавать функции информацию: при помощи аргументов.
Различие между формальным и фактическим аргументами: первый является переменной, используемой функцией, а второй - значением, поступающим из вызывающей функции.
Где необходимо описывать аргументы: после имени функции и перед первой фигурной скобкой.
Где необходимо описывать остальные локальные переменные: после первой фигурной скобки.
Когда и как использовать оператор return.
Когда и как использовать адреса и указатели для доступа к объектам.
ВОПРОСЫ И ОТВЕТЫ
Вопросы
1. Напишите функцию, возвращающую сумму двух целых чисел.
2. Какие изменения должны были бы произойти с функцией из вопроса 1, если вместо целых складывались бы два числа типа float?
3. Напишите функцию alter, которая берет две переменные х и у типа int и заменяет соответственно на их сумму и разность.
4. Проверьте, все ли правильно в определении функции, приведенной ниже?
salami(num)
{
int num, count;
for(count = 1; count <= num; num++) printf(" Осалями!\n");
}
Ответы
1.
sum(j,k) int j, k;
{ return(j+k); }
2.
float sum(j,k) float j,k;
Необходимо также привести описание функции float sum и вызывающей программе.
3. Поскольку мы хотим изменить две переменные в вызывающей программе, можно воспользоваться адресами и указателями. Обращение к функции будет выглядеть так: alter(&x,&y). Возможное решение имеет следующий вид:
alter(px, ру)
int *рх, *ру; /* указатели на х и у*/
{
int sum, diff;
sum = *рх + *ру; /* складывает содержимое двух переменных, определяемых адресами */
diff = *рх- *ру;
*рх= sum;
*ру = diff;
}
4. Нет; переменная num должна быть описана перед первой фигурной скобкой, а не после нее. Кроме того, выражение num++ необходимо заменить на count++.
УПРАЖНЕНИЯ
1. Напишите функцию mах(х, у), возвращающую большее из двух значении.
2. Напишите функцию chllne(ch, i, j), печатающую запрошенный символ с i– й пo j– ю позиции. Смотри программу художник-график, приведенную в гл. 7.
10. Классы памяти и разработка программ
ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
КЛАССЫ ПАМЯТИ
ФУНКЦИЯ ПОЛУЧЕНИЯ СЛУЧАЙНЫХ ЧИСЕЛ
ПРОВЕРКА ОШИБОК
МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
СОРТИРОВКА
КЛЮЧЕВЫЕ СЛОВА: auto, extern, static, register
Одно из достоинств языка Си состоит в том, что он позволяет управлять ключевыми механизмами программы. Классы памяти языка Си - пример такого управления; они дают возможность определить, с какими функциями связаны какие переменные и как долго переменная сохраняется в программе. Классы памяти - первая тема данной главы.
Программирование, точно так же как написание романа (или даже письма),- это не просто знание языковых правил - это нечто большее. В данной главе мы рассмотрим несколько полезных функций. При этом попытаемся привести некоторые соображения, используемые при конструировании функций. В частности, сделаем упор на значение модульного подхода, разбивающего программы на выполнимые задачи. Сначала, однако, обсудим классы памяти.
КЛАССЫ ПАМЯТИ И ОБЛАСТЬ ДЕЙСТВИЯ
Мы уже упоминали раньше, что локальные переменные известны только функциям, содержащим их. В языке Си предполагается также, что о глобальных переменных "знают" сразу несколько функций. Предположим, например, что и main, и critic имеют доступ к переменной units. Это будет иметь место, если отнести units к "внешнему" классу памяти, как показано ниже:
/* глобальная переменная units */