|
Программирование >> Структурное программирование
Определение максимального из трех целых чисел 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 Прототип функции, размещенный вне описания какой-то другой функции, относится ко всем вызовам данной функции, появляющимся поспе этого прототипа в данном файле. Прототип функции, размещенный внутри описания некоторой функции, относится только к вызовам внутри этой функции.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |