ФУНКЦИЯ. ПЕРЕДАЧА ПАРАМЕТРОВ И ВОЗВРАТ ЗНАЧЕНИЙ ИЗ ФУНКЦИИ. РЕКУРСИВНЫЕ ФУНКЦИИ.


ЛАБОРАТОРНАЯ РАБОТА №1

ЦЕЛЬ РАБОТЫ: Изучить работу пользовательских функций в программах на языке Си. Научиться разрабатывать свои функции, позволяющие повысить структурированность программы. Изучить правила оформления функции в программе, передачу параметров в функцию и возврат результатов работы функции.

1. Порядок выполнения работы.

//Программа 1
1.1. Напечатать все цифры натурального числа введенного с клавиатуры и подсчитать их количество.
#include <stdio.h>
int func(long int);
void main() {
long int x;
int k;
printf(«Введите число»);
scanf(«%li», &x);
k = func(x);
printf(«Количество цифр в числе %li равно %d», x, k);
}
int func(long int a) {
int i=0;
while(a>0) {
printf(«%3d», a%10);
a/=10;
i++;
}
return i;
}
— Изменить программу так, чтобы она выводила цифры числа в правильном порядке.

1.2. Разобрать работу рекурсивной функций, выполняющую эту же задачу.

#include <stdio.h>
int func(long int);
void main() {
long int x;
int k;
printf(«Введите число»);
scanf(«%li», &x);
k = func(x);
printf(«Количество цифр в числе %li равно %d», x, k);
}
int func(long int a) {
int i=0;
if(a<10) {
printf(«%3d»,a%10);
return ++i;
}
else {
i=1+func(a/10);
printf(«%3d»,a%10);
return i;
}
}
2. Содержание отчета.

1. Разобрать работу программы 1.
2. Сделать изменения в п.1 и записать текст программы.
3. Описать принцип работы рекурсивной функции.
4. Занести в отчет текст программы индивидуального задания.

3. Вопросы по лабораторной работе:

1. Что такое функция? Роль функции в программе.
2. Для чего делается объявление функции? Когда нужно объявлять функцию?
3. Где определяется функция в программе?
4. Что такое вызов функции?
5. Параметры функции.
6. Возвращение значения функцией.
7. Параметры функции по умолчанию.
8. Перегрузка функции.
9. inline-функции.
10. Рекурсивные функции.

ПРИЛОЖЕHИЕ.
Функция – это фрагмент программы со своим именем, к которому можно обратиться для выполнения необходимых действий.
Функция содержит как данные, так и операции над этими данными. Если для объекта имя ссылается на область памяти, где он хранится, то и имя функции ссылается на начало кода этой функции. Функции в Си играют ту же роль что и функции, программы, процедуры в других языках.
— они освобождают от повторного программирования, если конкретную задачу нужно решать в программе несколько раз.
— повышают уровень модульности программы, облегчают её чтение, внесение изменений, коррекцию ошибок.
— улучшают структуру программы.
Функции бывают библиотечные и пользовательские. Для использования библиотечных функций нужно указать заголовочный файл, в которых они объявлены. (директива #include).
Весь принцип программирования на Си основан на понятии функции. Выполнение программы начинается с команд, содержащихся в функции main(), затем из неё вызываются другие функции: printf, scanf() и т.д. Это библиотечные функции языка Си.
Наряду с библиотечными функциями можно создавать свои пользовательские функции. Для этого нужно знать как определить функцию и как к ней обратиться. Различают 3 момента работы с функцией:
1. Объявление функции или прототип функции.
2. Вызов функции.
3. Определение функции.
Объявление функции должно быть обязательно, если функция определена ниже ее вызова. Объявлять можно в начале модуля в заголовке программы, тогда функция доступна в любой другой функции; или в функции, где она вызывается, тогда область ее видимости ограничена этой функцией.

1. void PrintTime(int);
void main()
{}

2. void main()
{ void PrintTime(int );
}
Определять функцию можно в любом месте программы. Единственное ограничение – нельзя определить функцию внутри определения другой функции.
void PrintTime(int x)
{
struct time t;
gettime(&t); //получить системное время
printf(«Сейчас: %2d:%02d:%02d.%02d\n»,
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
}

Переменная x — является формальным параметром. Это новая переменная и под нее должна быть выделена отдельная ячейка памяти. При вызове функции мы присваиваем формальному аргументу значение фактического аргумента.
PrintTime(1);
Фактический аргумент может быть константой, переменной или сложным выражением.
Можно передавать в функцию несколько фактических аргументов, разделенных запятыми.
printnum (i, j) ;
Оператор return прекращает работу функции и передает управление следующему оператору в вызывающей функции, даже если он не является последним оператором в функции. Количество операторов return не ограничено. Возвращаемое значение присваивается переменной по выходу из функции.
y=max(i, j);

Формальный параметр может иметь значение по умолчанию. Все параметры, стоящие справа от него тоже должны иметь значения по умолчанию. Эти значения передаются в функцию, если при вызове данные параметры не указаны.
void noName2 (float x, int y=16, char z=’a’) {
printf(«x = %0.1f y = %d, z = %d \n», x,y, (int)z);
}
Имена функций могут быть перегружены в пределах одной области видимости. Компилятор отличает одну функцию от другой по сигнатуре. Сигнатура задается числом, порядком следования и типами ее параметров.
Перед определением функции может быть использован спецификатор inline для того, чтобы компилятор помещал код функции непосредственно в место вызова функции.
void notinline(void) { };
inline void isinline(void) { };
void main() {}
К функции можно обращаться тремя способами: из тела основной программы, из тела другой функции, из тела самой функции. Функции, которые вызывают сами себя называются рекурсивными.

Дополнительное:

Загрузка...