Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
алгоритмы.rtf
Скачиваний:
2
Добавлен:
31.07.2019
Размер:
188.8 Кб
Скачать

26. Определение функции

Определение функции состоит из двух частей: заголовка и тела. Заголовок определяет имя функции, ее тип и формальные параметры, тело определяет действия над данными, выполняемые функцией. Возращающее функцией значение передается в вызывающюю программу опрератором return   (выражение). Значение "выражения" и есть результат функции (возращаемого значения). Если в нашей программе функция физически следует за вызывающей ее функцией main, то надо в последней объявить функцию внешней с помощью описателя extern: externintfun(); или еще проще intfun();. В противном случае при компиляции будет выдана ошибка. Всякая функция имеет вид:     

[тип] имя([список формальных параметров])

      описания формальных параметров;

{

описания;

операторы;

}

             Здесь квадратные скобки указываютя, что заключенная в них конструкция может отсутствовать. По умолчанию тип функции целый. Описание формальных параметров расположено между списком параметров и левой скобкой. Каждое описание заканчивается точкой с запятой. Формальные параметры функции полностью локализированы в ней и недоступны для других функций. Аргументы функции передаются по значению, а не их адреса.

27. Прототип функции

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

В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент).

В качестве примера, рассмотрим следующий прототип функции:

intfoo(int n);

Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.

28.Использование библиотечных функций

Библиотека Си - это множество предопределенных функций и

макро, предназначенное для использования в Си-программах.

Применение библиотеки Си делает программирование более лег-

ким и обеспечивает следующее:

1) интерфейс с функциями ОС (такими, как открытие и закры-

тие файлов);

2) использование быстрых и эффективных функций (таких, как

строковые манипуляции) в общих задачах программирования.

Библиотека Си особенно важна при использовании базовых фун-

кций, которые не содержатся в языке. Это, например, функции ввода

и вывода, распределения памяти и управления процессами.

Для обеспечения возможности контроля компилятором типов данных языка Си используются сопровождающие эту библиотеку include-файлы. Кроме определений и объявлений библиотечных функций как макро include-файлы содержат объявления функций со списками типов аргументов. Списки типов аргументов дают возможность компилятору контролировать обращение к библиотечным функциям. Это может быть полезным для обнаружения ошибок в программе, возникающих в результате несоответствия между типами фактических и формальных аргументов функций. Однако можно не использовать контроль типов аргументов.

К списку стандартных include-файлов библиотеки Си могут

быть добавлены новые include-файлы, содержащие списки типов аргументов для всех функций библиотеки Си.

Вызов библиотек СИ

Вызов Библиотек языка СИ Прежде чем вызвать процедуру библиотеки Си из программы

пользователя, нужно ее объявить в этой программе. Все библиотеч-

ные процедуры размещаются в объектном виде в библиотечных файлах,

которые сопровождают программное обеспечение компилятора Си. Во

время линкования программа увяэывается с соответствующим файлом

или файлами, чтобы разрешить ссылки на библиотечные функции и

обеспечить коды для вызываемых библиотечных функций.

В большинстве случаев подготовка к вызову библиотечных фун-

кций может быть осуществлена одним из следующих способов:

1) включением стандартного #include-файла в программу. Мно-

гие процедуры требуют объявлений и определений. Для этого можно

просто задать include-файлы, в которых определяются все требуемые

объявления и определения;

2) объявлением библиотечной функции, возвращающей значение

любого типа, кроме integer. Предполагается, что все функции возв-

ращают значение integer, если они заранее не объявлены. Обеспе-

чить эти объявления можно использовав библиотечные include-файлы,

содержащие объявления функций программы.

Можно также использовать другие способы, которые позволяют

вводить проверку аргументов в вызовах функций.

Обработка ошибок

При вызове функций должен быть обеспечен хороший способ об-

наружения и проверки ошибочных возвратов, если они есть. Иначе

программа может выработать неожиданный результат.

Для каждой функции библиотеки Си определено ожидаемое зна-

чение возврата. Для некоторых функций ошибочный возврат по неко-

торым причинам может быть не определенным. Это возникает, напри-

мер, тогда, когда типы возврата верного значения и ошибочного

совпадают. Некоторые функции при возникновении ошибки устанавли-

вают значение типа ошибки в глобальную переменную errno. Заметим,

что нельзя установить переменную errno, пока в описании функции

эта переменная не будет явно определена.

При использовании функций, устанавливающих errno, можно сверить значение errno со значениями ошибок, определенных в include-файле <errno.h>, или же

использовать функции perror и strerror. Если нужно распечатать

сообщение о стандартной ошибке - используется perror; если сооб-

щение об ошибке нужно расположить в строке, то используется

strerror.

Чтобы убедиться в практической возможности появления ошиб-

ки, нужно перед доступом к errno проверить возвращаемое значение.

Если при этом возникла ошибка, то нужно использовать значение

errno или функцию perror. Ошибки в математических функциях под-

держиваются функцией matherr.

Ошибки в операциях с потоком проверяются функцией ferror.

Функция ferror обнаруживает, установлены ли индикаторы ошибки

данного потока. Индикатор ошибки автоматически сбрасывается, если

поток закрывается или выбрасывается, или вызывается функция

clearerr для обнуления индикатора ошибки. Ошибки в низкоуровневых

операциях ввода/вывода требуют установки переменной errno. Про-

верка конца файла (eof) данного потока осуществляется функцией

feof. В низкоуровневых операциях ввода/вывода конец файла обнару-

живается при помощи функции eof или когда операция считывания

возвращает 0 как число прочитанных байтов.

29. Основные понятия массивов

Понятие массива знакомо из Паскаля. Массив — это структура однотипных элементов, занимающих непрерывную область памяти. С массивом связаны следующие его свойства: имя, тип, размерность, размер.

Формат описания массива следующий:

тип элементов имя [константное выражение]

Константное выражение определяет размер массива, т. е. числе элементов этого массива. Например, согласно описанию

in t A[10] ;

объявлен массив с именем А, содержащий 10 элементов целого

типа. Элементы массива обозначаются индексированными имена­ми. Нижнее значение индекса равно 0:

А[0] , А[1] , А[2] , А[3] , А[4] , А[5] , А[6] , А[7] ,

А[8] , А[9 ]

В отличие от Паскаля в Си нельзя определять произвольные

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

Размер массива может явно не указываться, если при его

объявлении производится инициализация значений элементов.

Например:

in t p[]={2 , 4 , б, 10 , 1} ;

В этом случае создается массив из пяти элементов со следующими значениями:

р[0]=2 , р[1]=4 , р[2]=б , р[3]=10 , р[4]= 1

В результате следующего объявления массива

in t М[б]={5 , 3 , 2} ; будет создан массив из шести элементов. Первые три элемента получат инициализированные значения. Значения остальных будут либо неопределенными, либо равны нулю, если массив внешний или статический.

30. Одномерные и многомерные массивы

Понятие массива знакомо из Паскаля. Массив — это структура однотипных элементов, занимающих непрерывную область памяти. С массивом связаны следующие его свойства: имя, тип, размерность, размер.

Формат описания массива следующий:

тип элементов имя [константное выражение]

Константное выражение определяет размер массива, т. е. числе элементов этого массива. Например, согласно описанию

in t A[10] ;

объявлен массив с именем А, содержащий 10 элементов целого

типа. Элементы массива обозначаются индексированными имена­ми. Нижнее значение индекса равно 0:

А[0] , А[1] , А[2] , А[3] , А[4] , А[5] , А[6] , А[7] ,

А[8] , А[9 ]

В отличие от Паскаля в Си нельзя определять произвольные

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

Размер массива может явно не указываться, если при его

объявлении производится инициализация значений элементов.

Например:

in t p[]={2 , 4 , б, 10 , 1} ;

В этом случае создается массив из пяти элементов со следующими значениями:

р[0]=2 , р[1]=4 , р[2]=б , р[3]=10 , р[4]= 1

В результате следующего объявления массива

in t М[б]={5 , 3 , 2} ; будет создан массив из шести элементов. Первые три элемента получат инициализированные значения. Значения остальных будут либо неопределенными, либо равны нулю, если массив внешний или статический.

Многомерные массивы. Двумерный массив трактуется как одномерный массив, элементами которого является массив с указанным в описании типом элементов. Например, оператор

float R[5][10] ;

объявляет массив из пяти элементов, каждый из которых есть массив из десяти вещественных чисел. Отдельные величины этого массива обозначаются именами с двумя индексами: R[0 ] [0] ,

R [ 0 ] [ 1 ] , ..., R [ 4 ] [ 9] . Объединять индексы в одну пару скобок нельзя, т.е. запись R[2, 3] ошибочна.

Пример описания трехмерного массива:

double X[3][7][20] ;

Как и в Паскале, порядок расположения элементов многомерного массива в памяти такой, что прежде всего меняется последний индекс, затем предпоследний и т.д., и лишь один раз про­

бегает свои значения первый индекс.

31. Указатели и массивы. Массив как параметр функции

Понятие массива знакомо из Паскаля. Массив — это структура однотипных элементов, занимающих непрерывную область памяти. С массивом связаны следующие его свойства: имя, тип, размерность, размер.

Формат описания массива следующий:

тип элементов имя [константное выражение]

Константное выражение определяет размер массива, т. е. числе элементов этого массива. Например, согласно описанию

in t A[10] ;

объявлен массив с именем А, содержащий 10 элементов целого

типа. Элементы массива обозначаются индексированными именами.

Указатель — это адрес поля памяти, занимаемого программным объектом. Для хранения адресов используются переменные типа «указатель». Формат описания таких переменных

следующий:

тип *имя_перем

Операции над указателями. Записывая выражения и операторы, изменяющие значения указателей, необходимо помнить главное правило: единицей изменения значения указателя является размер соответствующего ему типа. Продемонстрируем это правило на определенных выше указа­телях. Выполнение операторов

pti=pti+l; ИЛИ pti++;

изменит значение указателя pt i на 2, в результате чего он примет значение FFC2. В результате выполнения оператора pti—; значение указателя уменьшится на 2 и станет равным FFBE. Аналогично для указателей других типов:

ptc++; увеличит значение указателя на 1;

ptf++; увеличит значение указателя на 4.

Использование указателей для передачи параметров функции. Рассматривая ранее правила использования функций, мы обращали внимание на то, что в языке Си возможна только односторонняя передача значений фактических параметров из вызывающей программы к формальным параметрам вызываемой функции. Возвращаемое значение несет сама функция, используемая в качестве операнда в выражении. Отсюда, казалось бы, следует неукоснительное правило: в процессе выполнения функции не могут изменяться значения переменных в вызывающей программе. Однако это правило можно обойти, если в качестве параметров функции использовать указатели.