Краткие теоретические сведения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Краткие теоретические сведения



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

Описание функции – декларация ее прототипа в начале файла. Испо­ль­зует­ся следующий способ декларации функций:

< тип результата > <ID функции >(< тип > ID,…< тип > ID);

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

Пример описания функции fun со списком параметров:

float fun (int, float, int, int);

Прототип функции сообщает компилятору о том, что далее в тексте программы будет приведено ее полное определение (текст), имеющее следующий вид: 

< тип результата > <ID функции >(список параметров)

                     {

                                 код функции

                      }

тип результата определяет тип значения, который возвращается функцией в точку ее вызова при помощи оператора возврата return. Если тип функции не указан, то по умолчанию - int. Список параметров состоит из перечня типов и ID параметров, разделенных запятыми. Функция может не иметь параметров (void), но круглые скобки необходимы в любом случае.

Если функция не возвращает значения - void (пустая), например, функция вывода горизонтальной строки на экран:

void lin(char a) {            // a = ’-‘ или a = ’=’;

int k;

for(k=0; k<80; k++) printf(“%c”, a);

}

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

Пример функции, определяющей наименьшее из двух целых чисел:

     int min_i(int x, int y) {

int t;

if (x<y) t=x;

else t=y;

   return t;

}

Можно написать функцию min_i и таким образом:

    mini(int x, int y) {

return (x<y)? x:y;

}

здесь тип возвращаемого результата по умолчанию будет int.

В языке Си каждая функция – это отдельный блок программы, вход в который возможен только через вызов данной функции. Например, нельзя оператором перехода goto передать управление внутрь функции.

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

<ID функции >(список аргументов);

список аргументов - значения, передаваемые в функцию на место ее параметров (константы, переменные, выражения).

 

Область действия переменных

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

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

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

В языке Си каждая переменная принадлежит к одному из четырех классов памяти – автоматическая (auto), внешняя (extern), статическая (static), регистровая (register). Тип памяти указывается ключевым словом (auto, extern, static, register), стоящим перед спецификацией типа переменной. Например, register int a;

По умолчанию переменная относится к классу auto и будет размещена в стеке.

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

При необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента сле­дует в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала исполь­зо­вать операцию «*».

Фрагмент программы, использующей функцию, в которой меняются местами значения аргументов x и y:

...

void z1(int*, int*);                    // Описание прототипа

void main(void) {

int a=2, b=3;

printf(“\n a=%d, b=%d”, a, b);

z1(&a, &b);                         // Обращение к функции

printf(“\n a = %d, b = %d”, a, b);

}

void z1(int *x, int*y) {                       // Описание (реализация) функции

    int t;

t = *x;

*x = *y;

*y = t;

return;

}

При таком способе передачи аргументов их значения будут изменены, т.е. на экран монитора будет выведено:

a = 2, b = 3

a = 3, b = 2

Функции могут вызывать сами себя - рекурсивные функции.

Пример рекурсивной функции – вычисление факториала n!:

    int fac (int n) {

int b;

     if (n= =1) return 1;

        b = fac (n-1)*n;

     return b;

    }

Вызов функции в рекурсии не создает новую копию функции, а создает новые копии локальных переменных и параметров. Из рекурсивной функции необходимо предусмотреть выход.

На функцию можно создать указатель, например, указатель р на функцию, возвращающую значение типа type и имеющую параметры типа type 1, type 2, объявляется следующим образом:

              type (* p)(type 1, typ e2);          

Варианты заданий

В задании Лабораторной работы 3, вычисление Y(x) и S(x) реализовать в виде функций.

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

Работу программы проверить для a=0,1; b=0,8; h=0,1; n выбрать в зависимости от варианта задания (с факториалом, без факториала).

Контрольные вопросы

1. Чем функция пользователя отличается от стандартной функции?

2. Способы передачи аргументов в функцию.

3. Поясните понятие “локальные” и “глобальные” переменные.

4. Для чего применяется оператор return?

5. Поясните понятие «класс памяти» функции.


ЗАДАНИЕ 5. Циклические процессы с использованием одномерных массивов и функций пользователя

 

Цель работы: изучить правила работы с одномерными массивами, связь массивов с указателями.

 



Поделиться:


Последнее изменение этой страницы: 2020-11-28; просмотров: 49; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.33.41 (0.009 с.)