- •Лабораторная работа №5 функции
- •Как использовать функции
- •Переменные в функциях
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Передача параметров
- •Возвращаемые значения
- •Возврат значений типа float
- •Использование return() в функции main()
- •Использование макроопределений
- •Проектирование программы
- •Автоматические или внешние переменные?
- •Неправильный ввод
Переменные в функциях
Если программа содержит другие функции, кроме функции main(), вам необходимо решить, где и как вы будете определять переменные. Си имеет несколько типов переменных. В этой работе рассмотрим автоматические, внешние и статические переменные.
Автоматические (локальные) переменные
Некоторые функции нуждаются в собственных переменных и константах. В качестве примера снова рассмотрим проблему временной остановки вывода информации на экран монитора. Можно приостановить вывод, используя следующие инструкции:
printf("Для продолжения нажмите любую клавишу");
move_on = getchar();
Если вывод информации на экран во время выполнения программы надо приостанавливать несколько раз, выполняющие это действие инструкции помещают в отдельную функцию. Каждый раз, когда возникает необходимость притормозить вывод, достаточно просто вызвать соответствующую функцию. Так как getchar() возвращает значение, переменную, принимающую его, можно определить внутри функции pause():
pause()
{
intmove_on;
printf("Для продолжения нажмите любую клавишу");
move_on = getchar();
return(0);
}
В данном случае переменная move_on является составной частью функции pause(). Переменную, которая определена внутри функции, принято называть локальной переменной для этой функции. Локальную переменную можно использовать только внутри той функции, где она была определена. В языке Си переменные такого типа обычно называют автоматическими.
Задумайтесь над этим. Если вы определили переменную внутри какой-либо функции, то эта переменная имеет смысл только для данной функции. Сказанное справедливо и для переменных, определенных в функции main(). Посмотрите на программу
main()
{
intmove_on;
puts("Сообщения заполняют экран\n");
/*Здесь будет серия сообщений, которые заполнят экран*/
pause();
}
pause()
{
printf("Для продолжения нажмите любую клавишу");
move_on = getchar();
return(0);
}
При компиляции этой программы будет выдано сообщение об ошибке, так как функция pause() не может использовать переменную move_on. Ведь она определена внутри main(), а поэтому является локальной для main() и только внутри этой функции имеет смысл и может быть использована. Для того чтобы переменная move_on могла быть использована в функции pause(), следует определить ее внутри именно этой функции.
Рис.4. Автоматические переменные могут иметьодно и то же имя в разных функциях
Вследствие того, что автоматические переменные имеют смысл только внутри собственной функции, можно использовать одно и то же имя переменной в разных функциях. На рис.4 продемонстрирована переменная с именем age, которая определена и в функции main(), и в функции spouse(). Каждая переменная является автоматической (или локальной) для той функции, где ее определили, так что на самом деле в программе присутствуют две переменные с одинаковым именем. Каждая из них имеет собственное значение, которое хранится в различных элементах памяти. Компилятор определяет, значение какой из переменных age должно быть отображено на экране, на основании того, в какой из функций помещена инструкция printf();. Выполняя функцию printf(), помещенную внутри spouse(), программа отобразит значение переменной age, определенной внутри этой функции. При выполнении инструкции printf(), помещенной внутри функции main(), она будет иметь дело с переменной age, определенной в main(). Таким образом, компилятор поддерживает одновременно две переменные с именем age.