Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика и ВТ Брукшир.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.07 Mб
Скачать

5.3.4Функции

Рассмотрим вариации понятия процедуры, которые существуют во многих языках программирования'. Иногда цель процедуры заключается в том, чтобы вычислить значение, а не выполнить какие-либо действия. (Рассмотрим различие между процедурой, которая подсчитывает число проданных вещей, и процедурой, которая сортирует список: в первом случае процедура возвращает значение, во втором — выполняет действие.) Процедура, возвращающая значение, называется функцией. Здесь термин «функция» применяется к программной единице, отличающейся от процедуры тем, что в результате ее выполнения значение вычисляется и возвращается вызывающей программе как «значение функции». Это значение можно либо сохранить в переменной, либо тут же использовать в вычислениях. Например, в языках С, C++ и С# можно использовать выражение ProjectJanSales = EstimatedSales (January); для того чтобы присвоить переменной ProjectJanSai es результат применения функции EstimatedSales, определяющей, сколько вещей предположительно будет продано в январе. Или можно использовать выражение

if (LastJanSales < EstimatedSales (January)) ... else ...

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

Функции определяются почти так же, как процедуры. Различие состоит в том, что заголовок функции обычно начинается с описания типа возвращаемого этой функцией значения, а в теле функции присутствует оператор возврата, операндом которого является возвращаемое значение. Определение функции CylinderVoiume в языке С приведено на рис. 5.13. (На самом деле существует более лаконичная форма записи, но из педагогических соображений мы используем эту запись). При вызове эта процедура получает конкретные значения для формальных параметров Radius и Height и возвращает результат вычисления объема цилиндра с такими параметрами. Таким образом, эту функцию можно использовать в программе для определения стоимости содержимого цилиндра радиусом 3.45 и высотой 12.7, поместив ее в оператор:

Cost = CostPerVolUnit * Cylinder-Volume (3.45. 12.7).

5.3.5Операторы ввода-вывода

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

Например, для того чтобы считать значение, введенное с клавиатуры, и присвоить его переменной Value, на языке Pascal нужно записать

readln (Value);

а чтобы вывести это значение на экран

writeln (Value);

Обратите внимание на то, что синтаксис в этих примерах такой же, как при вызове процедуры с параметрами. Зарезервированные слова read! n и writel n представляют собой имена процедур, написанных заранее для выполнения определенных действий.

Точно так же программист, работающий с языком С, для осуществления ввода и вывода информации может использовать процедуры (формально согласно терминологии, применяемой для языка С, они являются функциями) scanf и printf. Однако процедуры prinft языка С и writeln языка Pascal существенно отличаются в использовании параметров. Процедура writeln просто выводит переданные ей параметры в заданном порядке. В процедуре же prinft предполагается, что первый параметр описывает, в каком виде следует выводить следующие за ним параметры. То есть первый параметр в операторе вызова процедуры описывает, как данные будут располагаться на экране. Такой подход называется форматируемым вводом-выводом (formatted I/O).

Например, программист, чтобы вывести на экран переменные Значение1 и Зна-чение2 в десятичном представлении на одной строке и затем перейти на новую строку, на языке С напишет: printf ("%d %d\n", Значение]., Значение2);

Обратите внимание на то, что первый параметр (в двойных кавычках) описывает, как текст будет отображаться на экране. Он состоит из директив преобразования (%d обозначает, что выводимое целое число необходимо преобразовать в строку десятичных цифр в кодировке ASCII и поместить ее на место соответствующей директивы), печатных символов (между двумя директивами %й расположен символ пробела) и непечатных символов или управляющих последовательностей (у нас это \п — перейти на новую строку). Следовательно, в нашем примере текст состоит из числа в десятичном представлении, за которым следует пробел, другое число, возврат каретки1 и перевод строки. Оставшиеся параметры задают переменные в порядке их вывода на экран. Функция prinft формирует результирующую строку с учетом изложенного выше и выводит ее на экран начиная с текущей позиции вывода.

Вот другой пример. Если переменным Agel и Аде2 присвоены значения 16 и 25 соответственно, то в результате выполнения оператора printf ("Возраст участников от %б\п до ld.\n". Agel. Age2); на экране появится сообщение

Возраст участников от 16 до 25.

Обратите внимание на то, что сообщение на экране получается вследствие помещения значений переменных Agel и Аде2 в позиции, отмеченные значком %й, в первом параметре (рис. 5.14). Без форматируемого ввода-вывода программист, работающий на языке Pascal, для получения такого же результата использовал бы последовательность из двух команд

writeln ("Возраст участников от ". Agel); writeln ("до". Age2. "."):

Поскольку языки C++, Java и С# являются объектно-ориентированными, операции ввода-вывода в них рассматриваются как передача данных к объекту и от объекта. В частности, язык C++ предоставляет уже готовые объекты cin и cout для обозначения стандартных устройств ввода (например, клавиатура) и вывода (например, монитор).

Элементы данных, которые нужно ввести с клавиатуры или вывести на экран, передаются к этим объектам и от них в форме сообщений. Например, получить значение с клавиатуры и присвоить его переменной Value можно с помощью выражения

cin » Value;

которое предписывает объекту cin присвоить полученные им данные переменной Value. Точно так же выражение

cout « Value:

предписывает объекту cout вывести на экран данные, присвоенные переменной

Value.