- •1. Основы алгоритмизации и программирования
- •1.1. Этапы подготовки и решения задач на эвм
- •1.2. Алгоритмы и способы их описания Понятие алгоритма
- •Способы описания алгоритмов
- •Структурные схемы алгоритмов
- •1.3. Компиляция и интерпретация программ
- •1.4. Стили программирования
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентированное программирование
- •2.1. Пример готовой программы.
- •2.2. Структура основной программы
- •2.3. Алфавит языка
- •2.4. Константы и переменные Константы
- •Переменные
- •Примеры записи имен переменных
- •2.5. Арифметические выражения
- •Примеры вычисления арифметических выражений
- •Стандартные функции
- •Примеры программирования арифметических выражений
- •Контрольные задания
- •1. Составить описания для заданных переменных
- •2.6. Линейные вычислительные процессы
- •Оператор присваивания
- •Странные операторы присваивания
- •Функции ввода-вывода
- •Функции ввода исходных данных с клавиатуры
- •Потоковый ввод данных числового типа
- •Функция форматного ввода
- •Операторы вывода данных на экран Потоковый вывод
- •Форматный вывод
- •Контрольные задания
- •2.7. Разветвляющиеся вычислительные процессы
- •Логические выражения
- •Порядок выполнения операций в логических выражениях
- •Условные операторы
- •Короткий условный оператор
- •Полный условный оператор
- •If (логическое выражение) { p1;} else {p2;}
- •Вложенные структуры условных операторов
- •Оператор выбора
- •Контрольные задания
- •2.8. Циклические вычислительные процессы
- •Операторы цикла с условием
- •Оператор цикла do...While
- •Оператор цикла с параметром
- •2.9. Базовые алгоритмы
- •Задача 1. Алгоритм организации счетчика
- •Задача 2. Алгоритм накопления суммы
- •Задача 3. Алгоритм накопления произведения
- •Задача 4. Алгоритм поиска минимального члена последовательности
- •Задача 5. Табулирование функции (или кратные циклы)
- •Задача 6. Вычисление сумм последовательностей
- •2.10. Указатели и массивы Указатели
- •Понятие массива
- •Общий вид описания массива
- •Одномерные массивы
- •Описание одномерного массива
- •Индексированные переменные
- •Ввод-вывод одномерных массивов
- •Обработка одномерных массивов
- •Задача 1. Организация счетчика
- •Задача 2. Накопление суммы и произведения
- •Задача 3. Поиск минимального и максимального элементов массива
- •Двухмерные массивы
- •Описание двухмерного массива
- •Ввод-вывод двухмерного массива
- •Обработка матриц
- •2.11. Подпрограммы Структура сложной программы
- •Функции
- •Общий вид описания функции
- •Обращение к функции
- •Пример программы с функцией
- •Механизм замены параметров
- •Параметры-массивы в функциях
- •Рекурсия
- •Примеры программирования задач с использованием подпрограмм
- •Задача 1
- •2.12. Текстовые данные
- •Символьный тип данных
- •Ввод-вывод символьных данных
- •Обработка символьных данных
- •Ввод-вывод строковых данных
- •Обработка строковых данных
- •Стандартные функции обработки строк
- •Сравнение строк:
- •Сцепление строк
- •Определение длины строки
- •Копирование строк
- •Поиск символа в стоке
- •Пример программы для задачи с текстовыми данными
- •Контрольные задания
- •2.13. Динамическое выделение памяти
- •Структуры данных Понятие структуры
- •Обработка структур
- •Пример задачи с использованием структурированных данных
- •2.15. Файлы данных Понятие файла
- •Работа с файлами
- •Открытие файла
- •Обработка открытого файла
- •Закрытие файла
- •Функции ввода/вывода
- •Работа с текстовыми файлами
- •Обработка бинарных файлов
- •Контрольные задания
- •Заключение
- •Оглавление
Механизм замены параметров
В языке С++ существует два механизма передачи параметров в функции: по значению и по адресу.
Как правило, параметры функции (кроме массивов и указателей) передаются по значению. Параметры, передаваемые по значению, играют роль входных параметров. Фактическим параметром, передаваемым по значению, может быть константа, переменная или выражение. Для них при вызове функции в памяти компьютера временно выделяются ячейки, в которые передаются копии значений фактических параметров. При выполнении функции значения в этих ячейках могут измениться, однако соответствующие им фактические параметры останутся без изменения.
Результат работы функции возвращается в точку вызова с помощью оператора return. Таким образом, функция может вернуть только одно скалярное значение. Если функция должна вернуть несколько результатов, то этот возврат реализуется с помощью указателей, т.е. параметров, передаваемых по адресу.
При передаче параметров по адресу все действия в процедуре выполняются непосредственно над фактическим параметром, а не его копией. Поэтому любое изменение формального параметра приводит к изменению соответствующего ему фактического параметра.
Рассмотрим два примера, иллюстрирующих механизмы передачи параметров
Пример 1 Пример 2
#include "stdafx.h" #include "stdafx.h"
void Z (int у) void Z (int *у)
{ {
y=l; *y=1;
} }
void main() void main()
{ int х; { int х;
x=0; х=0;
Z(x); Z(&x);
printf("x=%d", x); printf("x=%d", x);
} }
В примере 1 процедура Z содержит формальный параметр у, который передается по значению, поэтому его изменение в процедуре (у=1;) не влияет на значение фактического параметра х. После выполнения программы на экран будет выведено: х=0.
В примере 2 формальный параметр у – это указатель. Это означает, что в функции изменяется значение в той ячейки памяти, адрес которой передавался в функцию Z, т.е. по адресу фактического параметра X. На экран будет выведено: х = 1.
Параметры-массивы в функциях
Если мы хотим передать в подпрограмму отдельный элемент массива, то в качестве соответствующего ему формального параметра указывается простая переменная того же типа.
Массивы, так же как и простые переменные, можно передавать в функции в качестве параметров. Так как имя массива – это адрес, то передача массива происходит всегда по адресу.
Рассмотрим, например, функцию, вычисляющую среднее значение элементов массива. Желательно сделать ее так, чтобы в нее можно было передавать массивы любого размера и она всегда правильно вычисляла результат. В языке С++ функции не могут самостоятельно определять размер массива, поэтому он должен быть обязательно одним из параметров.
#include "stdafx.h"
int Sum ( int A[], int N )
{
int i, sum;
sum = 0;
for ( i = 0; i < N; i ++ )
sum += A[i];
return sum/N;
}
void main()
{
int x[5]={1,2,3,4,5},y[3]={11,22,33};
printf("\nsr x=%d sr y=%d\n",
Sum(x,5),Sum(y,3));
}
Обратите внимание, что в заголовке функции размер массива указан отдельно. Нельзя объявлять массив-параметр как A[N], а только как A[] или *A.
Если в функцию передаётся двумерный массив, то описание соответствующего аргумента функции должно содержать количество столбцов; количество строк - несущественно, поскольку фактически передаётся указатель. Например: int Х[ ][5], или Х[5][5].
Рассмотрим пример функции, перемножающей матрицы А и В; результат - матрица С.
const nmax = 10;
void product(int А[][nmax], int В[][nmax],int С[][nmax], int m, int n, int k)
{ /* m - число строк в матрице А; n - число строк в матрице В (должно быть равно числу столбцов в матрице А); k - число столбцов в матрице В. */ for (int i=0; i< m; i++) for (int j=0; j< k; j++){ С[i][j]=0; for (int l=0; l< n; l++)
С[i][j] + = А[i][l]*В[l][j]; } }
В приведённом примере есть недостаток - здесь заранее фиксируется максимальная размерность матриц. Но использоваться может только часть памяти.