![](/user_photo/2706_HbeT2.jpg)
- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
8.4. Обмен данными между функциями
Программа на С++ может состоять из нескольких функций, которые при выполнении программы вызывают друг друга и обмениваются данными: вызываемая функция получает входные данные от вызывающей функции и обрабатывает их. По окончании работы функция передает в вызывающую функцию результаты расчета. Вызывающая функция может использовать полученные данные в своих расчетах, а может передавать их в другую функцию.
Для обмена данными между функциями в С++ используются следующие способы:
оператор return;
глобальные переменные;
аппарат формальных и фактических параметров.
С помощью оператора return можно передать в вызывающую функцию единственный результат работы функции.
8.4.1. Использование глобальных переменных
Переменная, объявленная вне функций, называется глобальной. Переменная, объявленная в функции, в том числе и в заголовке функции, называется локальной.
Пример использования глобальной переменной двумя функциями: одна функция изменяет значение этой переменной, другая – выводит значение глобальной переменной на экран:
#include <conio.h>
#include <iostream.h>
int a=1; //глобальная переменная
void f1(int x) / x – локальная переменная
{
int y=10; //локальная переменная
a=x+y;
cout<<”x=”<<x<<” a=”<<a<<endl; //x=2 a=12
}
int main( )
{
int z=2; //локальная переменная
//Вывод значения глобальной переменной
cout<<”a=”<<a<<endl; //a=1
f1(z); //вызов функции
cout<<”a=”<<a; <<a=12
getch();
}
Глобальные переменные имеют статическую продолжительность жизни: память для них выделяется в начале работы программы, а освобождается – в момент завершения программы.
Локальные переменные имеют, как правило, локальную продолжительность жизни: память для них выделяется при входе в блок (составной оператор), а освобождается – при выходе из блока.
Глобальную переменную можно использовать от точки ее объявления до конца файла с текстом программы, за исключениием функций, где переменная переобъявлена. Таким образом, глобальные переменные можно использовать для обмена данными между функциями. Например, одна функция может задавать значение глобальной переменной, другая – изменять это значение, а третья – выводить значение переменной на экран.
Пример программы, которая вводит последовательность из n целых чисел и выводит на экран все простые числа этой последовательности:
#include <conio.h>
#include <iostream.h>
int x; //глобальная переменная
bool simple(); //прототип функции проверки числа: простое?
void main()
{
int n; //количество чисел
bool ok=false; //true – простое, false - нет
cout <<”n? ” cin>>n;
for (int i=0; i<n; i++)
{
cout <<”x? ”;
cin>>x;
if (simple())
{ cout<<x<<’ ‘; ok=true; }
}
if (!ok)
cout<<”No”;
getch();
}
bool simple()
{
int d=2; //пробный делитель
while (d<=sqrt(x) && x%d!=0)
d++;
if (d<=sqrt(x) || x==1)
return false;
return true;
}
Тесты:
n=6, a: 2 13 4 1 121 20 результат: 2 13
n=6, a: 4 15 65 22 24 100 результат: “No”
Недостатки использования глобальных переменных:
не позволяют создавать гибкие параметрические функции;
снижают надежность программы: если глобальная переменная должна использоваться в функции только как входная, то можно непреднамеренно изменить значение переменной внутри функции;
усложняют распределение работы над программой между несколькими программистами.