- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •2.2 Способы представления алгоритмов.
- •2.3 Базовые структуры алгоритмов.
- •2.3.1 Линейная структура.
- •2.3.3.2. Цикл с постусловием:
- •Типы данных.
- •3.1 Базовые типы данных.
- •2.3.3.1. Цикл с предусловием:
- •Целый тип (int)
- •Символьный тип (char)
- •Расширенный символьный тип (wchar_t)
- •Логический тип (bool)
- •Типы с плавающей точкой (float, double и long double)
- •3.2 Переменные.
- •3.3 Ссылки.
- •3.4 Указатели.
- •3.3 Выражения.
- •3.3 .1 Операции.
- •4. Реализация базовых структур алгоритмов в языке с.
- •4.1 Оператор присвавания
- •4.2 Оператор «выражение»
- •4.3 Операторы ветвления
- •4.3.1 Условный оператор .
- •4.3.2. Оператор switch.
- •4.4 Операторы цикла
- •4.4.1 Циклы с предусловием
- •4.4.1.1 Цикл for.
- •4.4.1.2 Цикл с условием (while)
- •4.4.1 .3 Цикл с постусловием (do while)
- •5. Функции. Основные понятия
- •Определение функции
- •Рекурсивные функции.
- •Одномерные массивы.
- •6.1 Статические массивы.
- •6.2 Динамические массивы.
- •6.2.2 Функции преобразования динамических массивов.
- •7. Алгоритмы поиска и сортировки.
- •7.2 Последовательный поиск c барьером.
- •7.3 Дихотомический поиск в упорядоченом массиве.
- •7.4 Cортировка массивов.
- •7.4.1 Обменная сортировка (метод пузырька)
- •7.4.2 Метод "простой выбор".
- •7.4.3 Сортировка "прямое включение"
- •8 . Матрицы
- •8.1 Статические матрицы.
- •8.2 Динамические матрицы.
- •9. Строки в с.
- •1. Длина строки – strlen.
- •3. Копирование строк.
- •4. Объединение строк.
- •5. Поиск в строках
- •10. Cтруктуры.
Определение функции
Определение функции задает тип возвращаемого значения, имя функции, типы и число формальных параметров, а также объявления переменных и операторы, называемые телом функции и определяющие действия функции.
Формат определения:
<тип> имя (список формальных параметров)
{
тело функции
}
Функция может возвращать значение любого типа. Если тип не задан, то по умолчанию функция возвращает значение типа int.
Функция не может возвращать массив, но может возвращать указатель на любой тип, в том числе и на массив. Тип возвращаемого значения, задаваемый в определении функции, должен соответствовать типу в объявлении этой функции.
Функция возвращает значение, если ее выполнение заканчивается оператором return, содержащим некоторое выражение. Указанное выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого значения и посылается в точку вызова функции в качестве результата. Оператор return прерывает выполнение функции, т. е. нормально он должен быть последним в теле функции. Функция может иметь несколько операторов return.
Если оператор return не содержит выражения или выполнение функции завершается после выполнения последнего ее оператора (без выполнения оператора return), то возвращаемое значение не определено. Для функций, которые не должны ничего возвращать, может быть использован тип void, указывающий на отсутствие возвращаемого значения.
Имя функции строится по стандартным правилам записи идентификаторов. Список формальных параметров - это заключенная в круглые скобки последовательность объявлений формальных параметров, разделенных запятыми. Формальные параметры - это переменные, используемые внутри тела функции и получающие значения при вызове функции путем копирования в них значений соответствующих фактических параметров.
Список формальных параметров может заканчиваться многоточием (…) – это означает, что число аргументов функции переменное. Однако предполагается, что функция имеет, по крайней мере, столько обязательных аргументов, сколько формальных параметров задано перед последней запятой в списке параметров.
Такой функции может быть передано большее число аргументов, но над дополнительными аргументами не проводится контроль типов, например,
void fn(unsigned c,float b,int a,…); т. е. число аргументов функции fn>3.
Если функция не имеет параметров, то наличие круглых скобок обязательно, а вместо списка параметров рекомендуется указать слово void.
Порядок и типы формальных параметров должны быть одинаковыми в определении функции и во всех ее объявлениях. Тип формального параметра может быть любым основным типом, структурой, объединением, перечислением, указателем или массивом. Типы фактических аргументов при вызове функции должны быть совместимы с типами соответствующих формальных параметров. Фактические аргументы функции при ее вызове помещаются в специальную область памяти программы, которая называется стек. Память в стеке выделяется в соответствии с типами формальных параметров. Несоответствие типов фактических аргументов и формальных параметров может быть причиной ошибки.
Параметры функции бывают двух видов: параметры-значения и параметры-ссылки( параметры-переменные). Параметры-значения функции могут рассматриваться как локальные переменные, для которых выделяется память в стеке при вызове функции и производится копирование значений фактических аргументов. При завершении работы функции происходит очистка стека от данных, принадлежащих этой функции, при этом значения переменных теряются. Такой способ передачи параметров в функцию не изменяет значения переменных в вызывающей функции, являющихся фактическими параметрами(это так называемое замещение по значению).
Второй способ передачи параметров представляет собой передачу в функцию адреса фактического аргумента(замещение по адресу). Полное замещение формального фактическим аргументом позволяет вызванной функции в отдельных случаях изменять значение фактического(так называемый побочный эффект функций).
В качестве такого параметра можно использовать указатель на некоторую переменную:
int fn2(int* pb);
Используя операцию косвенной адресации в теле функции, можно изменить значение этой переменной: *pb=6.
Другой способ передачи в функцию адреса переменной – передача параметра по ссылке, при этом в вызванной функции создается псевдоним исходной переменной, форма обращения к такому параметру-ссылке такая же, как и к обычной переменной, а сам параметр передается с помощью адреса, например, int fn3(int &ab); при этом обращение к переменной ab в теле функции fn3() такое же, как к обычной переменной типа int.
Тело функции – это составной оператор, содержащий объявления переменных (если необходимо), и операторы.
Все переменные, объявленные в теле функции без указания класса памяти, по умолчанию имеют класс памяти auto, т. е. являются локальными. При вызове функции локальным переменным отводится память в стеке и производится их явная инициализация. Управление передается первому оператору тела функции и начинается выполнение функции, продолжающееся до тех пор, пока не встретится оператор return или последний оператор тела функции. Управление при этом возвращается в точку, следующую за точкой вызова функции, а локальные переменные становятся недоступными. При новом вызове функции для локальных переменных память распределяется вновь, и поэтому старые значения локальных переменных теряются.
#include<iostream.h>
void FUN(int i, int*j, int&k)
{ i++; (*j)++; k++;}
void main(){
int i=1, j=2, k=3;
cout<<” i j k \n”;
cout<<i<<’ ‘<<j<<’ ‘<<k<<endl;
FUN(i, &j, k);
cout<<i<<’ ‘<<j<<’ ‘<<k<<endl; return 0;}
Результат работы программы:
i j k
1 2 3
1 3 4
Первый параметр замещается по значению. Его изменение в функции не влияет на исходное значение. Параметры-значения защищены от побочного эффекта функций. Второй параметр(j)-передается по адресу с помощью указателя. При этом для передачи в функцию адреса фактического параметра используется операция взятия адреса &, а для получения его значения в функции требуется операция разыменования. Третий параметр(k) передается по адресу при помощи ссылки.
Массивы всегда автоматически замещаются по адресу.
