Программирование >>  Структурное программирование 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 342


Определение максимального из трех целых чисел tinclude <iostream.h>

int maximum(int, int, int); прототип функции

main () {

int a, b, c;

cout << Введите три целых числа: ; cin а b с;

cout << Максимум равен << maximum(а, b, с) << endl; return 0;

Определение функции maximum int maximum(int x, int y, int z) {

int max = x;

if (y > max)

max = y; if (z > max)

max = z;

return max;

Введите три целых числа: 22 85 17 Максимум равен 85

Введите три целых числа: 92 35 14 Максимум равен: 92

Введите три целых числа: 45 19 98 Максимум равен: 98

Рис. 3.4. Определенная программистом функция maximum

Если функция должна возвращать результат, то оператор

return выражение;

возвращает значение выражения в обращение к функции.

Наш второй пример использует определенную программистом функцию maximum для определения и возвращения наибольшего из трех целых чисел (рис. 3.4). Вводятся три целых числа. Затем эти целые числа передаются функции maximum, которая определяет наибольшее из чисел. Это значение возвращается функции main с помощью оператора return в maximum и печатается.



3.6. Прототипы функций

Прототип функции является одной из наиболее важных особенностей С++. Прототип функции указывает компилятору тип данных, возвращаемых функцией, количество параметров, которое ожидает функция, тип параметров и ожидаемый порядок их следования. Компилятор использует прототип функции для проверки правильности вызовов функции. Ранние версии С не выполняли такого рода проверку, поэтому был возможен неправильный вызов функции без обнаружения ошибок компилятором. Подобные вызовы приводили к неисправимым ошибкам выполнения или к хитроумным исправимым логическим ошибкам, которые было очень трудно обнаружить. Прототипы функции устранили этот недостаток.

Замечание по технике программирования 3.9

В С++ требуются прототипы функций. Используйте директиву препроцессора #in-clude, чтобы получить прототипы стандартных библиотечных функций из заголовочных файлов соответствующих библиотек. Используйте также #include для заголовочных файлов, содержащих прототипы функций, используемых вами или членами вашей группы.

Прототип функции maximum на рис. 3.4 имеет вид

int maximum(int, int, int);

Этот прототип указывает, что maximum имеет три аргумента типа int и возвращает результат типа int. Заметим, что прототип функции такой же, как заголовок описания функции maximum, за исключением того, что в него не включены имена параметров (х, у и z).

Хороший стиль программирования 3.7

Имена параметров могут быть включены в прототипы функции с целью документирования. Компилятор эти имена игнорирует.

Типичная ошибка программирования 3.9

Отсутствие точки с запятой в конце прототипа функции является синтаксической ошибкой.

Вызов функции, который не соответствует прототипу функции, ведет к синтаксической ошибке. Синтаксическая ошибка возникает также в случае отсутствия согласования между прототипом и описанием функции. Например, если бы в программе на рис. 3.4 прототип функции был бы написан так:

void maximum(int, int, int);

компилятор сообщил бы об ошибке, потому что возвращаемый тип void в прототипе функции отличался бы от возвращаемого типа int в заголовке функции.

Другой важной особенностью прототипов функций является приведение типов аргументов, т.е. задание аргументам подходящего типа. Например,



математическая библиотечная функция sqrt может быть вызвана с аргументом целого типа, даже если функция прототип в math.h определяет аргумент типа double, и при этом функция будет работать правильно. Оператор

cout sqrt(4);

правильно вычисляет sqrt(4), и печатает значение 2. Прототип функции заставляет компилятор преобразовать целое значение 4 в значение 4.0 типа double прежде, чем значение будет передано в sqrt. Вообще, значения аргументов, которые первоначально не соответствуют типам параметров в прототипе функции, преобразуются в подходящий тип перед вызовом функции. Эти преобразования могут привести к неверным результатам, если не руководствоваться правилами приведения типов С++. Правила приведения определяют, как типы могут быть преобразованы в другие типы без потерь. В приведенном выше примере sqrt тип int автоматически преобразуется в double без изменения его значений. Однако double преобразуется в int с отбрасыванием дробной части значения double. Преобразование больших целых типов в малые целые типы (например, long в short) может также привести к изменению значений.

Правила приведения типов применяются к выражениям, содержащим значения двух или более типов данных; такие выражения относятся к выражениям смешанного типа. Тип каждого значения в выражении смешанного типа приводится к наивысшему типу, имеющемуся в выражении (на самом деле создается и используется временная копия выражения - истинные значения остаются неизменными). На рис. 3.5 перечислены встроенные типы данных в порядке следования от высших типов к низшим.

Преобразование значений к низшему типу может привести к неверным значениям. Поэтому значения могут преобразовываться к низшему типу только путем явного присваивания значения переменной низшего типа, либо с помощью операции приведения к типу. Значения аргументов функции преобразуются к типам параметров в прототипе функции так, как если бы они были непосредственно присвоены переменным этих типов. Если наша функция square, которая использует параметр целого типа (рис. 3.3), вызывается с аргументом с плавающей точкой, аргумент преобразуется к типу int (низшему типу) и squre обычно возвращает неверное значение. Например, square(4.5) возвратит 16 вместо 20.25.

Типичная ошибка программирования 3.10

Преобразование от высшего типа в иерархии типов к низшему может изменить значение данных.

Типичная ошибка программирования 3.11

Отсутствие прототипа функции, когда функция не определена перед ее первым вызовом, приводит к синтаксической ошибке.

Замечание по технике программирования 3.10

Прототип функции, размещенный вне описания какой-то другой функции, относится ко всем вызовам данной функции, появляющимся поспе этого прототипа в данном файле. Прототип функции, размещенный внутри описания некоторой функции, относится только к вызовам внутри этой функции.



1 ... 62 63 64 [ 65 ] 66 67 68 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика