
- •Часть 1
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •§ 1. Основные понятия программы
- •1.2. Директива препроцессора #include
- •Структура программы
- •Комментарии
- •Ключевые слова, идентификаторы, переменные
- •§ 2. Ввод, вывод
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Операция присваивания
- •§ 4. Программирование ветвлений
- •4.1. Оператор if
- •4.2. Тернарная операция
- •4.3. Оператор выбора switch
- •Г л а в а 2 циклы
- •§ 1. Оператор while
- •§ 2. Оператор break
- •§ 3. Оператор do … while
- •§ 4. Оператор for
- •Г л а в а 3 Введение в массивы
- •§ 1. Основные понятия
- •§ 2. Способы определения массивов
- •§ 3. Вывод массива. Функции printf и cprintf
- •§ 4. Типы задач при работе с массивами
- •Упражнения и тесты
- •Г л а в а 4 модульное программирование. Функции
- •§1. Функции без результатов. Параметры-значения
- •1.1. Примеры. Правила оформления и вызова функций
- •Формальные и фактические параметры
- •Передача параметров по значению
- •§ 2. Функции типа void с результатами
- •2.1. Вычислeниe бeсконeчных сумм
- •2.2. Что такое ссылочный тип
- •2.3. Параметры ссылочного типа
- •§ 3. Функции, отличные от void. Оператор return
- •§ 4. Область действия имён. Локальные и глобальные имена
- •§ 5. Встраиваемые (inline) функции
- •§ 6. Параметры по умолчанию
- •§ 7. Перегрузка функций
- •7. Сравнение функций типа void и отличных от типа void.
- •Г л а в а 5 введение в объектно-оРиентированное программирование
- •§ 1. Первое знакомство с ооп
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Упражнения и тесты
- •Оглавление
- •3.1. Константы …………………………………………….………..….........…8
- •Упражнения и тесты …….………………..………………………….…………....19
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 1
Формальные и фактические параметры
Параметры, записанные в скобках заголовка функции, назовём формальными параметрами (Len, y и ch). Параметры, записанные при вызове функции, назовём фактическими параметрами, или аргументами (LEN, Y, C). Между ними должно быть следующее соответствие:
в типе, с учётом их совместимости. Например, вместо параметра типа char можно передать не только символ, как показано в первом вызове, но и его код типа int, как показано во втором вызове (подробности в гл. 4). Вместо формального вещественного параметра можно передать целый, но не наоборот;
в порядке следования. Нарушение этого требования приведёт либо к ошибке компиляции, если типы фактических и формальных параметров несогласованны, либо повлияет на результат. Если в нашем примере вызвать функцию LINE2(“*”, 5, 20), то компилятор сообщает о невозможности преобразования char в int. Если же вызвать LINE2 (Y, LEN, ‘-‘), то в строке LEN будет выведено Y символов “-“;
в количестве параметров. Количество параметров при вызове должно быть таким, как в прототипе и в заголовке перед текстом функции. Поэтому если в процессе отладки программы добавили или удалили один или несколько параметров функции, то это надо не забыть сделать в трёх местах: в прототипе, перед текстом функции и при вызове. Заметим, что это требование справедливо, если не используются параметры по умолчанию (см. §6).
Передача параметров по значению
При передаче в функцию входных параметров, изменение которых не возвращается в вызывающую функцию, используется метод, который называется передачей по значению. Такие параметры по аналогии с языком Pascal можно назвать параметры-значения. Они имеют следующие особенности:
для фактического и формального параметров компилятор отводит разные ячейки памяти;
при выполнении программы содержимое каждого аргумента копируется в ячейку для соответствующего формального параметра, то есть при первом вызове в нашем примере выполняется Len=20, y=5 и ch=’*’ , хотя это явно нигде не записывается;
из первой особенности следует, что если в функции изменить формальный параметр, то это изменение не повлияет на значение переменной, используемой при вызове, то есть фактического параметра. Если бы в функции изменили y (например, там было бы записано y++), то значение соответствующей переменной Y в головной функции после второго вызова осталось бы без изменения, т. е. тем, что ввели;
в качестве фактического параметра, соответствующего параметрузначению, может быть выражение соответствующего или совместимого типа. Например, функцию можно вызвать так: LINE2 ( LEN*2, Y+1, ‘*’);. Как частный случай можно передавать константу, как показано при первом вызове, или переменную (см. второй вызов). При этом её имя, используемое при вызове, не обязательно должно отличаться, как в нашем примере, от имени формального параметра. В головной программе переменную для фактической длины символов можно было бы тоже назвать Len. Но и в этом случае для Len в main и для Len в функции Line2 компилятор резервирует разные ячейки памяти.