КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Функции. где имя – идентификатор (название) функции;
Тело [return [РВ];] }
где имя – идентификатор (название) функции; тип – описатель типа функции (результата); bi – список (перечисление через запятую) формальных параметров, используемых в вычислениях (действиях) тела функции с указанием типа каждого; описатели bi – операторы описания типов формальных параметров, выполненные вне заголовка; () – ограничители списка формальных параметров; тело функции – основная часть (совокупность операторов), реализующая вынесенные в отдельный алгоритм вычисления (действия); return РВ; – оператор возврата (return) результата вычислений; РВ – результат вычислений (выражение); [ ] – признак необязательности содержимого; { } – ограничители тела функции. Первая строка структуры является заголовком функции. Структура вызова функции: имя ([a1,..., ai,..., an]) где имя – идентификатор функции; a1, ai, an – список (перечисление через запятую) фактических параметров (аргументов), численные значения которых требуется передать в дополнительную функцию (подпрограмму); () – ограничители аргументов; [ ] – признак необязательности содержимого. Правила записи и использования 1. Различия структур определения функций обусловлено возможностью использования различных средств машинной обработки создаваемых программ. Большинство средств поддерживают оба варианта. 2. Деление функций на главную и дополнительные осуществляется по имени. Главной является функция с именем main (головная). В этой функции в большинстве случаев описатель типа, список формальных параметров и оператор return не указываются. 3. Дополнительной считается функция с любым, кроме main, именем. Для пользовательских функций имена формируются самим пользователем аналогично идентификаторам переменных. Для стандартных – указываются в технической документации. 4. Функция предписывает выполнение указанных в теле вычислений (действий) с операндами – формальными параметрами, идентификаторы которых указаны в списке заголовка. 5. В качестве формальных параметров используются переменные и указатели. 6. Физически формальные параметры (переменные) – дополнительные ячейки памяти, предназначенные для временного хранения, передаваемых им значений фактических параметров. 7. Количество, типы и последовательность расположения формальных параметров в списке задается создателем функции. 8. В функции наряду с формальными параметрами могут использоваться вспомогательные (локальные) переменные. 9. Для возврата результата вычисления тела функции дополняются выражением оператора return. В качестве выражения могут использоваться константы, переменные и их совокупности. Результаты вычислений тела функции – константы. 10. В основную (вызывающую) функцию передается значение только одной константы – результата вычисления выражения return. Поэтому, если все планируемые в алгоритме вычисления могут быть сведены к одной формуле, их можно оформить в качестве выражения return. 11. Тип возвращаемого значения определяется типом функции. Если он не указан, подразумевается целочисленный результат (int). Результат возвращается в точку вызова. 12. В функции при необходимости могут быть несколько операторов возврата (return), располагаемых в теле функции в соответствии с требованиями алгоритма. 13. В головной функции оператор return можно не указывать (результат не требуется возвращать куда-либо). В этом случае на этапе компиляции может выдаваться соответствующее предупреждение. 14. Головная и дополнительные функции – есть отдельные программные модули. Поэтому в них могут использоваться одноимённые переменные, указатели и массивы. 15. Тексты (определения) дополнительных пользовательских функций могут располагаться в любом месте программы (вне тела любой из функций), стандартных – в соответствующих библиотеках языка Си в виде объектных модулей. 16. Независимо от взаиморасположения функций выполнение программного модуля начинается с головной функции. 17. Из тела каждой функции можно обращаться к любой другой, а также и к ней самой. 18. Фактические и формальные параметры в списках должны совпадать по количеству, месту расположения и типу. 19. В качестве фактических параметров используются константы, переменные, вызовы дополнительных функций, арифметические выражения, адреса переменных и массивов. 20. Вызов дополнительной функции требует ее предварительного определения (расположение над вызывающей). В противном случае её необходимо описать (задать прототипом). Описание размещается над вызывающей функцией. Описания стандартных функций (их прототипы) находятся в стандартных заголовочных файлах. Прототип является конструкцией, аналогичной описателям переменных, что позволяет проверить указанные в вызове типы фактических параметров и возвращаемого результата на соответствие указанным в заголовке функции. Прототип функции аналогичен ее заголовку и имеет структуру [тип] имя([тип [b1],...,тип [bi],...,тип [bn]]); где имя – идентификатор (название) функции; тип – описатель типа функции (результата); b1, bi, bn – список (перечисление через запятую) формальных параметров с указанием типа; () – ограничители списка формальных параметров; [ ] – признак необязательности содержимого; ; – признак оператора. В списке допускается указывать только типы формальных параметров. Рассмотрим конкретные примеры определения, вызова, и описания функций. Пример взаимодействия головной функции с одной пользовательской и стандартными Вариант 1. #include<stdio.h> /* stdio.h - файл с прототипами функций ввода-вывода */ #include<math.h> /* math.h - файл с прототипами математических функций */
float sum(float a, float b); /* прототип пользовательской функции */
main() /* заголовок головной функции */ { float a, b, c, d, d1; /* описатели локальных переменных */ ... c = pow(a, 2) + b; /* вычисление с вызовом стандартной функции pow */ d = sum(a, b) - 0.5*c; /* вычисления с вызовами поль- */ d1 = d + sum(3.6, sqrt(d)); /* зовательской функции sum */ ... printf(“%f %f %f ”, c, d, d1); /* вызов стандартной функции printf */ }
/* определение пользовательской функции sum */ float sum(float s1, float s2) /* заголовок дополнительной функции */ { float s; /* описание локальной переменной s */ s = s1 + s2; /* вычисление s по формальным параметрам s1 и s2 */ return s; /* возвращение значения s в вызывающую функцию */ } В представленном фрагменте до определения главной функции, путем подключения заголовочных файлов, выполнены описания стандартных функций (математических и ввода-вывода) и пользовательской функции sum – указанием её прототипа. Главная функция расположена над дополнительной и не содержит в заголовке описатель типа и список формальных параметров. Дополнительная функция предназначена для вычисления суммы двух операндов (формальных параметров) и выполнена по первому варианту структуры. Заголовок определяет тип возвращаемого значения (float), название функции (sum) и список формальных параметров – вещественных переменных s1 и s2. Порядок их расположения в списке задан произвольно. Искомая переменная s (локальная) рассчитывается в теле функции и указана в операторе return как возвращаемое значение. Из тела главной функции выполняются обращения к стандартным функциям: sqrt – с одним фактическим параметром (d), pow – с двумя (a, 2) и printf – с четырьмя (“%f %f %f ”, c, d, d1). В арифметическом выражении вычисления переменной d в качестве первого операнда используется вызов пользовательской функции sum с указанием фактических параметров – a и b, описанных в головной функции как локальные переменные. Типы (вещественные) и последовательность расположения в списке определяются аналогичными формальным параметрам (s1 и s2) заголовка вызываемой функции sum. В арифметическом выражении вычисления переменной d1 в качестве второго операнда используется вызов пользовательской функции sum с указанием фактических параметров – 3.6 и sqrt(d). Типы операндов (вещественные) и последовательность расположения в списке определяются аналогичными формальным параметрам (s1 и s2) заголовка вызываемой функции sum. Выполнение программного модуля (аналогично работе со стандартными функциями) приведет к двукратной автоматической передаче численных значений фактических параметров (a, b), а затем (3.6, sqrt(d)) из головной функции в вызываемую пользовательскую (sum) формальным параметрам (s1, s2). После выполнения вычислений тела функции результат (s) автоматически возвратится в точки вызова как операнды вычисления переменных d и d1. Время существования переменных s1, s2 и s соответствует длительности работы функции sum. Вариант 2. #include<stdio.h> /* stdio.h - файл с прототипами функций ввода-вывода */ #include<math.h> /* math.h - файл с прототипами математических функций */
/* определение пользовательской функции sum */ float sum(s1, s2) /* заголовок дополнительной функции */ float s1, s2; {return s2+s1; /*возвращение значения s в вызывающую функцию */ } main() /* заголовок головной функции */ { float a, b, c, d, d1; /* описатели локальных переменных */ ... c = pow(a, 2) + b; /* вычисление с вызовом стандартной функции pow */ d = sum(a, b) - 0.5*c; /* вычисления с вызовами поль- */ d1 = d + sum(3.6, sqrt(d)); /* зовательской функции sum */ ... printf(“%f %f %f ”, c, d, d1); /* вызов стандартной функции printf */ } Дополнительная функция составлена с использованием второго варианта структуры. Тело дополнительной функции составляет один оператор return. Расположение дополнительной функции над основной с описанием типов формальных параметров вне заголовка подпрограммы при машинной обработке приводит к выдаче предупреждений о невозможности проконтролировать типы по заголовку функции, что может повлиять на результаты счета. Устранение возможных последствий выполняется стандартным способом – указанием прототипа дополнительной функции над главной. При составлении дополнительной функции по первому варианту структуры и размещении её над основной, прототип не требуется. В этом случае заголовок функции играет роль прототипа. Рассмотренные структуры и правила их использования позволяют осуществить программирование задачи с факториалами, предварительно выполнив идентификацию переменных (табл. 6.1). Таблица 6.1
Программа решения примера 6.1 #include <stdio.h> /* stdio.h - файл с прототипами функций ввода-вывода */ #include <conio.h> /* conio.h - файл с прототипом функций getch(), clrscr()*/ #include <math.h> /* math.h - файл с прототипами математических функций*/ long fakt(int fi); /* прототип функции расчета факториала */ /* определение головной функции */ main() { float a, z1, z2, z; int n, m, k; clrscr(); printf("\n Введите значения a, n, m, k: "); scanf("%f%d%d%d", &a, &n, &m, &k); z1 = log(a) + fakt(n); z2 = fakt(m) + fakt(k-m); z = z1 + z2 - 0.2*a; fprintf(stdprn, "\n a=%.2f n=%d m=%d k=%d" "\n z1=%.2f z2=%.2f" "\n z=%.2f\n", a, n, m, k, z1, z2, z); getch(); } /* определение функции расчета факториала */ long fakt(int f) {int i; long fi; /* описание переменной текущего значения факториала */ fprintf(stdprn, "\n\n f=%d", f); for(fi=1, i=1; i<=f; i++) /* заголовок цикла расчета факториала */ {fi = fi * i; /* расчет текущего значения факториала */ fprintf(stdprn, "\n %d %ld",i, fi); /* вывод текущего значения */ } return fi; /* возврат в головную функцию значения переменной fi */ } 16.9 5 4 10 В подпрограмме наряду с формальным параметром f использованы локальные переменные fi и i. Первая из них определяет значение вычисляемого факториала, изменяясь от единицы до конечного значения. Вторая используется как параметр цикла для организации последовательного умножения в заданном диапазоне. Функция fprintf позволяет проверить правильность работы подпрограммы.
Дата добавления: 2014-01-07; Просмотров: 324; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |