В языке "C" функции эквивалентны подпрограммам или функ-циям в фортране или процедурам в PL/1, паскале и т.д. Функ-ции дают удобный способ заключения некоторой части вычисле-ний в черный ящик, который в дальнейшем можно использовать,не интересуясь его внутренним содержанием. Использованиефункций является фактически единственным способом справитьсяс потенциальной сложностью больших программ. Если функцииорганизованы должным образом, то можно игнорировать то, какделается работа; достаточно знание того, что делается. Язык"C" разработан таким образом, чтобы сделать использованиефункций легким, удобным и эффективным. Вам будут часто вст-речаться функции длиной всего в несколько строчек, вызывае-мые только один раз, и они используются только потому, чтоэто проясняет некоторую часть программы. До сих пор мы использовали только предоставленные намфункции типа PRINTF, GETCHAR и PUTCHAR; теперь пора написатьнесколько наших собственных. так как в "C" нет операции воз-ведения в степень, подобной операции ** в фортране или PL/1,давайте проиллюстрируем механику определения функции на при-мере функции POWER(M,N), возводящей целое м в целую положи-тельную степень N. Так значение POWER(2,5) равно 32. Конеч-но, эта функция не выполняет всей работы операции **, пос-кольку она действует только с положительными степенями не-больших чисел, но лучше не создавать дополнительных затруд-нений, смешивая несколько различных вопросов. Ниже приводится функция POWER и использующая ее основнаяпрограмма, так что вы можете видеть целиком всю структуру. MAIN() /* TEST POWER FUNCTION */ { INT I; FOR(I = 0; I < 10; ++I) PRINTF("%D %D %D\N",I,POWER(2,I),POWER(-3,I)); } POWER(X,N) /* RAISE X N-TH POWER; N > 0 */ INT X,N; { INT I, P; P = 1; FOR (I =1; I <= N; ++I) P = P * X; RETURN (P); } Все функции имеют одинаковый вид: имя (список аргументов, если они имеются) описание аргументов, если они имеются { описания операторы } Эти функции могут быть записаны в любом порядке и нахо-диться в одном или двух исходных файлах. Конечно, если ис-ходная программа размещается в двух файлах, вам придетсядать больше указаний при компиляции и загрузке, чем если быона находилась в одном, но это дело операционной системы, ане атрибут языка. В данный момент, для того чтобы все полу-ченные сведения о прогоне "C"- программ, не изменились вдальнейшем, мы будем предполагать, что обе функции находятсяв одном и том же файле. Функция POWER вызывается дважды в строке PRINTF("%D %D %D\N",I,POWER(2,I),POWER(-3,I)); при каждом обращении функция POWER, получив два аргумента,вазвращает целое значение, которое печатается в заданномформате. В выражениях POWER(2,I) является точно таким же це-лым, как 2 и I. /Не все функции выдают целое значение; мызаймемся этим вопросом в главе 4/. Аргументы функции POWER должны быть описаны соответству-ющим образом, так как их типы известны. Это сделано в строке INT X,N; которая следует за именем функции. Описания аргументов помещаются между списком аргументови открывающейся левой фигурной скобкой; каждое описание за-канчивается точкой с запятой. Имена, использованные для ар-гументов функции POWER, являются чисто локальными и недос-тупны никаким другим функциям: другие процедуры могут ис-пользовать те же самые имена без возникновения конфликта.Это верно и для переменных I и P; I в функции POWER никак несвязано с I в функции MAIN. Значение, вычисленное функцией POWER, передаются в MAINс помощью оператора RETURN, точно такого же, как в PL/1.внутри круглых скобок можно написать любое выражение. Функ-ция не обязана возвращать какое-либо значение; операторRETURN, не содержащий никакого выражения, приводит к такойже передаче управления, как "сваливание на конец" функциипри достижении конечной правой фигурной скобки, но при этомв вызывающую функцию не возвращается никакого полезного зна-чения. Упражнение 1-13 ---------------- Апишите программу преобразования прописных букв из айлаввода в строчные, используя при этом функцию OWER(C), кото-рая возвращает значение 'C', если C'- не буква, и значениесоответствующей строчной уквы, если 'C'-буква.