- •Программирование на языке высокого уровня
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Ввод-вывод данных в стиле с
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения):
- •Функция очистки экрана результатов:
- •Выражения и операции
- •Логические выражения и операции.
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель.
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
Внешние описания переменных
На самом внешнем уровне (вне функций программы) переменная может быть описана в любом месте программы, но до первого обращения к ней. Область её действия распространяется от места определения до конца программы (модуля). Если определение переменной располагается перед всеми функциями программы, то она становится глобальной (общедоступной), то есть может использоваться любой функцией. Переменная на внешнем уровне может быть инициирована константным выражением.
Глобальные переменные могут использоваться для передачи данных между функциями наряду с передачей данных через список параметров функций.
Пример 42.
Использование глобальных переменных.
Программа:
int i1, i2=5; // глобальные переменные
void fun( ) // функция, изменяющая
{ i1= i2 * i2; // глобальные переменные
i2 *= i1;
}
void main // главная функция
{ fun ( ); // вызов функции
printf (“ Значения: i1=%d, i2=%d”, i1, i2);
}
Результаты программы:
Значения: i1=25, i2=125
Многомодульные программы Проект программы
Программа на С оформляется как один модуль или совокупность модулей. Модулем является самостоятельно компилируемый исходный файл с расширением “.cpp”. Структура модуля соответствует структуре одномодульной программы, рассмотренной выше. Отличие модулей от одномодульной программы состоит в возможном классе памяти объектов внешнего уровня и функций модуля, чем определяется область действия и время жизни переменных и функций.
Создание многомодульной программы кроме разработки модулей требует еще создания специального текстового файла проект (project), из которого компилятор узнает, какие модули образуют проект программы, чтобы получить исполняемый файл (.exe). Порядок включения исходных файлов в проект не имеет значения. Файл проекта может иметь любое допустимое имя, в том числе совпадающее с именем главного файла (с функцией main), и имеет расширение “.prj”, например, myprog.prj.
Внешние ссылки
При создании многомодульной программы функции из разных файлов могут использовать глобальные переменные. Переменные на внешнем уровне могут быть определены или объявлены. Определение (описание) переменной создает объект данных, то есть ему выделяется память. Такое определение должно находиться только в одном файле. Объявление переменной создает ссылку на объект, определенный в другом месте. Таких ссылок может быть несколько в разных файлах.
Функции по умолчанию глобально видимы, то есть, доступны в любых модулях. Однако, как и переменная, функция с предшествующим спецификатором static имеет областью действия только тот модуль, в котором определена.
Переменные данного модуля можно сделать видимыми в других модулях с помощью объявления их как внешних спецификатором extern (внешний), причем не только вне, но и внутри блока. При этом такие ссылки не резервируют память, поскольку память переменной выделена в том блоке, где она описана. Переменные внешнего уровня классов памяти static и extern имеют глобальное время жизни.
Пример 43.
Рассмотрим программу, текст которой размещен в двух файлах. Для связи функций программы используется глобальная переменная.
Файл TEST1.cpp:
#include<stdio.h>
int i=3; // описание глобальной переменной
static void next( ); // прототип статической функции
void main ( ) // главная функция
{ i++ ; // изменение глобальной переменной
printf (“B функции main i=%d\n”, i);
next ( ); // вызов “своей” функции
}
static next ( ) // функция данного модуля
{ i++ ; // изменение глобальной переменной
printf (“ B функции next i=%d\n”, i);
other ( ); // вызов функции другого модуля
}
Файл TEST2.cpp:
#include<stdio.h>
extern int i; // ссылка на внешнюю переменную
void other ( ) // функция глобально видима
{ i++ ; // изменение глобальной переменной
printf (“ B функции other i=%d\n”, i);
}
Файл текста программы TESTPROJ.prj:
TEST1.cpp
TEST2.cpp
Результаты программы:
B функции main i=4
B функции next i=5
B функции other i=6
Пример 44.
Для решения задачи, в которой осуществляется обмен данными между двумя переменными и определяется максимум из двух переменных, создать исходные текстовые файлы:
функции обмена значениями двух переменных Obmen( ) и
функции нахождения максимума из двух чисел Max2( );
главной функции, использующей предыдущие функции;
проект программы.
Файл главной функции OBMEMAIN.cpp:
#include <conio.h>
void main() // главная функция
{ int a, b; // рабочие переменные
clrscr ( );
printf (“Работа программы: \n”);
printf (“Ввести 2 числа: ”);
scanf (“%d%d”, &a, &b); // ввод чисел
printf (“До обмена: a=%d b=%d\n”, a, b);
Obmen (&a, &b); // вызов функции из файла OBMENMAX.cpp
printf (“После обмена: a=%d b=%d\n”, a, b);
printf (“Максимум=%d\n”, Max2(a,b)); // вызов функции из файла
OBMENMAX.cpp
printf (“Нажмите любую клавишу…”);
getch ( ); // задержка экрана результатов
}
Файл функций OBMENMAX.сpp:
void Obmen (int*x, int*y) // функция обмена данными двух переменных
{ int r;
r = *x; *x = *y; *y = r; // обмен данными через указатели
}
int Max2 (int x, int y) // функция поиска максимума из двух чисел
{ if (x>y) return (x);
else return (y);
}
Файл проекта OBMEN.prj:
OBMEMAIN.сpp
OBMENMAX.cpp
Результаты программы:
Ввести 2 числа: 5 7
До обмена: а=5 b=7
После обмена: a=7 b=5
Максимум=7
Нажмите любую клавишу…