- •Программирование на языке высокого уровня
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Ввод-вывод данных в стиле с
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения):
- •Функция очистки экрана результатов:
- •Выражения и операции
- •Логические выражения и операции.
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель.
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
Прототип (шаблон) функции
Порядок расположения функций в программе определяется следующим правилом: объект описывается или объявляется раньше, чем он используется.
Обычно главную функцию main() стараются расположить в начале программы, поскольку она описывает общий алгоритм решаемой задачи и с нее начинается выполнение программы. Для того чтобы не нарушить общее правило использования функций, перед функцией main() располагают прототипы (шаблоны) функций, описание которых следует за функцией main().
Прототип повторяет заголовок функции, за которым ставится разделитель точка с запятой (;), то есть вводится пустой оператор вместо тела функции. Компилятор не требует задания имен параметров в прототипе, поскольку проверяет только соответствие типов данных прототипа и описания функции.
Пример 39.
При использовании прототипа одной из функций копирования строки, рассмотренных выше, копирование символов из строки str1 в строку str2 может выполнить следующая программа:
#include<stdio.h>
#include<conio.h>
void copystring (char st1[ ], char st2[ ]); // прототип функции
void main ( ) // главная функция
{ char str1[80], str2[80]; // массивы для строк
clrscr( ); //очистка экрана
puts (“Введите строку (<80 символов)”);
gets (str1); // ввод строки
copystring (str1, str2); // вызов функции
puts (“Скопированная строка:” );
puts (str2); // вывод строки
}
void copystring (char st1[ ], char st2[ ]); //описание функции
{ int i;
for (i=0; st2[i]=st1[1]; i++); // цикл копирования
}
Блочная структура программы
Как было отмечено выше, тело функции может быть блоком или составным оператором. Блок как совокупность описаний объектов и операторов может включать вложенные блоки, и тогда появляются внешние и локальные переменные по отношению к блоку, а также глобальные переменные, описанные вне функций программы.
В дополнение к атрибутам имени и типа объекта существует ещё два атрибута – область действия и время жизни, определяемые классом хранения (памяти) по умолчанию или задаваемые программистом. Область действия (видимости) – это часть текста программы, в котором видим и может быть использован данный объект. Переменные, описываемые в охватывающем блоке, являются внешними для вложенных блоков и включают их в область своего действия за одним исключением – внутренняя переменная имеет приоритет над одноимённой внешней переменной, закрывая её, и даже тип внутренней переменной может быть переопределён.
Время жизни – это интервал времени, в течение которого значение объекта (переменной или функции) доступно для использования в некоторой части программы. Время жизни переменной может быть локальным или глобальным. Объект, с глобальным временем жизни, имеет распределённую для него память и определённое значение на протяжении всего времени выполнения программы. Для локального объекта выделяется новая область памяти при каждом входе в блок и освобождается при выходе из блока, при этом значение объекта теряется. Переменные, описанные в функции, в том числе формальные параметры имеют локальную область действия. Сами функции в программе являются внешними по отношению друг к другу и имеют глобальное время жизни, то есть существуют на протяжении всего времени выполнения программы.
С-программа является отдельным программным модулем, который оформляется и записывается во внешнюю память как исходный файл с расширением “.cpp”, например, myprog.cpp.
Структуру модуля программы и области действия её объектов можно представить следующей схемой:
/* Глобальные объекты и описания */ /* Область действия */
д ирективы предпроцессора глобальная
макроопределения
прототипы функций
описания типов
описания глобальных переменных
заголовок функции локальная
{ внешние переменные блока;
операторы;
{ внутренний блок локальная
}
}
описания других функций
конец программы
Пример 40.
Применение вложенных блоков с одноимёнными переменными.
Программа:
void main ( )
{ int i=2; // i – переменная внешнего блока
int count=0; // count – внешняя переменная
while ( count <= i ) // цикл внешнего блока
{ int=0; // i – локальная переменная внутреннего блока
count++; // счётчик циклов
printf ( “В цикле: count=%d; i=%d\n”, count, i );
}
// конец внутреннего блока, возврат к переменной i внешнего блока:
printf ( “Вне цикла: count=%d, i=%d”, count, i );
}
Результаты программы:
В цикле count=1 i=0
В цикле count=2 i=0
В цикле count=3 i=0
Вне цикла count=3 i=2
Программист может явно задать атрибуты области действия и времени жизни с помощью спецификаторов классов памяти (хранения): для переменных (auto – локальный, register – регистровый, static – статический, extern – внешний) и для функций (static, extern).
Переменные с классом хранения auto (принимается по умолчанию) и register относятся к локальным в блоке и по области действия и по времени жизни. Для переменных с классом auto выделяется память в стеке (временная память), а с классом register – в одном из свободных регистров процессора.
Память для переменных с классом static отводится в сегменте данных (статическая память программы), а не в стеке, благодаря чему они сохраняют своё значение при выходе из блока. Если отсутствует явная инициализация таких переменных, то по умолчанию они устанавливаются в 0. Инициализация выполняется один раз и не повторяется при новом входе в блок. Объекты класса static имеют локальную область действия (блок) и глобальное время жизни (время выполнения программы).
Пример 41.
Использование статических переменных.
Программа:
void example (int c); // прототип функции
void main ( ) // главная функция
{ int count; // локальная переменная блока
for (count=9; count >= 5; count -= 2) // цикл счетчика
example (count); // вызов функции
}
void example (int c) // заголовок функции
{ int f=1; // локальная переменная
static int stat=1; // статическая переменная
printf (“c=%d, f=%d, stat=%d\n”, c, f ,stat);
stat++; // изменение статической переменной
}
Результаты программы: c=9, f=1, stat=1
c=7, f=1, stat=2
c=5, f=1, stat=3