Функции Лекция 14 - 15
Понятие функции
Объявление функции
Список параметров функции
Оператор return
Пример функции 1. Возведение неотрицательного числа а в натуральную степень b
Пример программы, использующей функцию step ():
Пример функции 2. функция для нахождения наибольшего из двух целых чисел
Формальные и фактические параметры функции
Область видимости переменных
Локальные переменные
Глобальные переменные
Недостатки использования глобальных переменных
Формальные параметры
Параметры-значения
Пример 3. Передача данных по значению (1)
Пример 3. Передача данных по значению (2)
Параметры - ссылки
Пример 3a. Передача данных по ссылке (1)
Пример 3a. Передача данных по ссылке (2)
Пример 3а. Передача данных по ссылке (3)
Передача массивов в функцию
Пример 4. Функция поиска максимального значения в массиве (1)
Пример 4. Функция поиска максимального значения в массиве (2)
Передача матриц в функцию через параметры
Пример 5. Поиск строк матрицы, не содержащих нулей
Постановка задачи
Метод решения задачи
Создание и заполнение матрицы (функции InitMatr)
Схема алгоритма формирования матрицы
Вывод матрицы на экран (функция OutMatr)
Схема алгоритма вывода матрицы на экран
Поиск строки без нулей и вычисление произведения элементов в строке
Алгоритм поиска строки без нулей
Схема алгоритма вычисления произведения элементов строки матрицы (функция PrStr)
Схема главной функции (1)
Схема главной функции (2)
Схема главной функции (3)
Схема главной функции (4)
Исходный текст программы (1)
Исходный текст программы (2)
Исходный текст программы (3)
Исходный текст программы (4)
Исходный текст программы (5)
Исходный текст программы (6)
Исходный текст программы (7)
Исходный текст программы (8)
Исходный текст программы (9)
Задания для самостоятельного решения
Контрольные вопросы по теме работы
Итоги Рассмотренные вопросы:
Библиографический список
542.50K
Категория: ПрограммированиеПрограммирование

Функции. Прототип функции. Локальные, глобальные переменные. Формальные параметры (язык C)

1. Функции Лекция 14 - 15

Иллюстративный материал к
лекциям по алгоритмизации и
программированию
Автор Саблина Н.Г.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
2016 г.
1

2.

25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
2

3. Понятие функции

• Функции - это самостоятельные единицы программы,
предназначенные для решения конкретных подзадач, обычно
повторяющиеся несколько раз.
• Перед использованием функция должна быть объявлена
• Все функции в языке Си – глобальные, т.е. функция не может быть
объявлена внутри другой функции
• В Си можно объявить функцию с помощью прототипа, т.е. заголовка
функции, а полное ее описание сделать после функции main()
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
3

4. Объявление функции

тип <имя функции> (список параметров)
{
тело функции
}
• Функция может возвращать результат
• Тип определяет тип значения, которое возвращает функция
• Если тип не указан, то по умолчанию функция возвращает целое
значение (типа int).
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
4

5. Список параметров функции

• перечень типов и имен параметров, разделенных запятыми.
• Функция может не иметь параметров, но круглые скобки необходимы
в любом случае.
Пример правильного списка параметров:
f (int х, int у, float z);
Пример неправильного списка параметров:
f (int х, у, float z);
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
5

6. Оператор return

• вызывает немедленный выход из текущей функции и возврат в
вызывающую функцию.
• используется для возврата значения функции.
• в теле функции может быть несколько операторов return, но может не
быть ни одного.
• если нет return, возврат в вызывающую программу происходит после
выполнения последнего оператора тела функции.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
6

7. Пример функции 1. Возведение неотрицательного числа а в натуральную степень b

float step (float a, int b)
{ int i; float s;
if(a<0) return (-1); /* основание отрицательное */
s=1;
for ( i=b; i; i--) s*=a;
//s=s*a;
return s;
}
Эта функция возвращает значение -1, если основание отрицательное,
и аb, если основание неотрицательное.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
7

8. Пример программы, использующей функцию step ():

#include <stdio.h>
float step (float , int ) ; //прототип функции
main()
{float x; int y;
printf (" \nВведите основание степени x="); scanf ("%f", &x);
printf (" Введите показатель степени y="); scanf ("%d", &y);
if (step (x,y) +1) printf(" x в стпени y=%f\n", step(x,y));
else printf(" основание отрицательно \n");
}
float step(float a, int b)
{
… return s;
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
8

9. Пример функции 2. функция для нахождения наибольшего из двух целых чисел

a) int max(int a, int b)
{int m;
if(a>b) m=a; else m=b;
return m;}
b) без использования дополнительной переменной:
int max(int a, int b)
{ if(a>b) return a; else return b;}
c) короткий if (без ветви else) :
int max(int a, int b)
{ if(a>b) return a; return b;}
d) c использованием условной операции:
int max(int a, int b){ return (a>b)? a: b;}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
9

10. Формальные и фактические параметры функции

• Формальные параметры - это переменные, объявленные при
описании функций как ее аргументы.
• Фактические параметры - это параметры, с которыми функция
вызывается для выполнения
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
10

11. Область видимости переменных

• Область действия (видимости) переменной - это правила, которые
устанавливают, какие данные доступны из данного места программы.
• С точки зрения области действия переменных различают три типа
переменных:
– глобальные
– локальные
– формальные параметры.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
11

12. Локальные переменные

• Это переменные, объявленные внутри функции.
• Локальная переменная доступна внутри блока, в котором она
объявлена.
• Локальная переменная существует пока выполняется блок, в котором
эта переменная объявлена. При выходе из блока эта переменная (и ее
значение) теряется.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
12

13. Глобальные переменные

• Это переменные, объявленные вне какой-либо функции.
• Могут быть использованы в любом месте программы, но перед их
использованием они должны быть объявлены.
• Область действия глобальной переменной - вся программа.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
13

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

• они занимают память в течение всего времени работы программы;
• делает функции менее общими и затрудняет их использование в
других программах;
• использование внешних переменных делает возможным появление
ошибок из-за побочных явлений. Эти ошибки, как правило, трудно
отыскать.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
14

15. Формальные параметры

• используются в теле функции так же, как локальные переменные.
• Область действия формальных параметров - блок, являющийся телом
функции.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
15

16. Параметры-значения

• Все аргументы функции передаются по значению
При вызове функции в стеке выделяется место для формальных
параметров функции, и туда заносится значение фактического
параметра, т. е. значение параметра при вызове функции.
• Далее функция использует и меняет значения в стеке. При выходе из
функции измененные значения параметров теряются.
• В языке С вызванная функция не может изменить переменные,
указанные в качестве фактических параметров в функции при
обращении к ней.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
16

17. Пример 3. Передача данных по значению (1)

void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
25.04.2016
#include <stdio.h>
//прототип функции
void swap(int a, int b);
void main( )
{
int x = 5, y = 10;
printf (“Вначале x = %d и y = %d\n”, x, y);
swap(x, y);
printf (“Теперь x = %d и y = %d\n”, x, y);
}
void swap(int a, int b) //реализация функции
{ …}
кафю РТС дисциплина Алгоритмизация и
программирование
17

18. Пример 3. Передача данных по значению (2)

x
y
main ()
5
10
{
int x = 5, y = 10;
printf (“Вначале x = %d и y =
%d\n”, x, y);
swap(x, y);
printf (“Теперь x = %d и y = %d\n”,
x, y);
}
25.04.2016
a
b
5
10
temp
10
5
5
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
кафю РТС дисциплина Алгоритмизация и
программирование
18

19. Параметры - ссылки

• Для возможности изменения внутри функции значений переменных,
являющихся параметрами этой функции, необходимо передавать в
функцию не значения этих переменных, а их адреса
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
19

20. Пример 3a. Передача данных по ссылке (1)

void swap1(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
20

21. Пример 3a. Передача данных по ссылке (2)

#include <stdio.h>
void swap1(int* a, int* b); //прототип функции
void main( )
{
int x = 5, y = 10;
printf (“Вначале x = %d и y = %d\n”, x, y);
swap1 (&x, &y);
printf (“Теперь x = %d и y = %d\n”, x, y);
}
void swap1 (int* a, int* b) //реализация функции
{ …}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
21

22. Пример 3а. Передача данных по ссылке (3)

адрес1
адрес2
x
y
main ()
10
105
5
{
int x = 5, y = 10;
printf (“Вначале x = %d и y =
%d\n”, x, y);
swap1 (&x, &y);
printf (“Теперь x = %d и y = %d\n”,
x, y);
}
25.04.2016
a
b
адрес1
адрес2
temp
5
void swap1 (int* a, int* b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
кафю РТС дисциплина Алгоритмизация и
программирование
22

23. Передача массивов в функцию

• Если в качестве аргумента функции используется массив, то
необходимо в качестве формального параметра передать адрес
начала массива.
• Адрес любого другого элемента массива можно вычислить по его
индексу и типу элементов массива.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
23

24. Пример 4. Функция поиска максимального значения в массиве (1)

int max_m (int *a, int N)
{int im, j;
im = 0;
for(j = 1; j < N; j++)
if(a[j] > a[im]) im = j;
return a[im];
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
24

25. Пример 4. Функция поиска максимального значения в массиве (2)

#include <stdio.h>
int max_m(int *a, int N);
void main( )
{int N, i, mas[100], max;
puts(“Введите размер массива, но не более 100”);
scanf(“%d”, &N);
for(i = 0; i < N; i++) mas[i] = random(100);
max=max_m (mas, N);
printf(“Максимальный элемент равен %d”, max);
}
//реализация функции max_m
int max_m(int *a, int N) { … }
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
25

26. Передача матриц в функцию через параметры

• Для передачи матрицы в функцию в качестве параметров нужно
указать
– адрес начала вспомогательного массива указателей на начала
срок матрицы
– размерность матрицы: количество строк и столбцов
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
26

27. Пример 5. Поиск строк матрицы, не содержащих нулей

Имеются две матрицы А и В натуральных чисел размерностью Na x Ma,
Nb x Mb соответственно.
Вычислить произведение элементов в тех строках матриц А и В, которые
не содержат нулевых элементов.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
27

28. Постановка задачи

Исходными данными для этой задачи являются:
Na, Nb – количество строк в матрицах,
Ma, Mb – количество столбцов в матрицах; целые числа, вводятся с
клавиатуры.
А, В – матрицы, заполняются случайными числами в ходе выполнения
программы.
Выходными данными являются произведения элементов выбранных
строк матриц.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
28

29. Метод решения задачи

Решение нашей задачи можно разделить на несколько подзадач:
а) создание и заполнение матрицы заданного размера;
б) вывод матрицы на экран;
в) поиск строки, не содержащей нулей;
г) вычисление произведения элементов найденной строки.
Каждую из этих подзадач оформим в виде отдельной функции.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
29

30. Создание и заполнение матрицы (функции InitMatr)

• Матрица создается динамически.
• Заполняется с помощью датчика случайных чисел с параметром
• В качестве параметров передадим в эту функцию размерность
матрицы: M и N.
• Память под матрицу выделятся динамически, с использованием
дополнительного массива указателей на начала строк матрицы.
• Сама функция возвращает адрес начала массива указателей на начала
строк матрицы.
• Функция вызывается дважды: для матрицы А и для матрицы В
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
30

31. Схема алгоритма формирования матрицы

Начало
Ввод N, M
i=1, N
j=1, M
A[i,j] = random(30)
Вывод А
Конец
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
31

32. Вывод матрицы на экран (функция OutMatr)

• Через параметры в эту функцию будут передаваться:
– размерность матрицы (передается по значению),
– сама матрица (передается по ссылке на начало массива
указателей).
• Функция вызывается дважды: для матрицы А и для матрицы В
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
32

33. Схема алгоритма вывода матрицы на экран

Начало
Ввод N, M, А
i=1, N
j=1, M
A[i,j]
Конец
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
33

34. Поиск строки без нулей и вычисление произведения элементов в строке

• удобно оформить в виде отдельных функций. В качестве параметров
передавать в эти функции
– строку (одномерный массив)
– ее размер (количество элементов в строке).
• Функция поиска нулей возвращает 0, если нули в строке есть, и 1 ,
если нулей нет.
• Функция вычисления произведения возвращает значение
произведения.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
34

35. Алгоритм поиска строки без нулей

Начало
Ввод M, S
i=1, M
нет
S[j]=0
да
NulStr=1
NulStr=0
Вывод NulStr
Конец
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
35

36. Схема алгоритма вычисления произведения элементов строки матрицы (функция PrStr)

Начало
Ввод M, S
P=1
j =1, M
P = P S[j]
Ввод P
Конец
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
36

37. Схема главной функции (1)

Начало
Вычисление произведения
элементов строк матрицы
Введите размеры матриц
Na, Ma, Nb, Mb
1
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
37

38. Схема главной функции (2)

1
InitMatr (Na, Ma, A)
InitMatr (Nb, Mb, B)
Матрица А
OutMatr (Na, Ma, A)
Матрица В
OutMatr (Nb, Mb, B)
2
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
38

39. Схема главной функции (3)

2
i = 1, Na
k=NulStr (A[i], Ma)
нет
k
да
P=PrStr (A[i], Ma)
P
3
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
39

40. Схема главной функции (4)

3
i = 1, Nb
k=NulStr (B[i],
Mb)
нет
k
да
P=PrStr (B[i], Mb)
P
Конец
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
40

41. Исходный текст программы (1)

#include <stdio.h>
#include <stdlib.h>
//прототипы функций
int ** InitMatr (int N,int M);
//N,M -размерность матрицы; параметры-значения
//функция возвращает адрес созданной матрицы
void OutMatr(int **A, int N, int M);
//N,M -размерность матрицы;
//A - матрица, передается через адрес массива указателей
//на начала строк
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
41

42. Исходный текст программы (2)

//---Функция определения в строке нулевых элементов ---int NulStr (int *S, int M);
//S - адрес строки массива, M - кол-во элементов в строке
//---Функция вычисления произведения элементов в строке-long int PrStr(int * S, int M);
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
42

43. Исходный текст программы (3)

//--------Головная программа -------main()
{ int ** A, **B ; //адреса исходных матриц}
int Na,Ma,Nb,Mb; // размерности матриц
//ввод исходных данных
printf("\nВведите размеры матриц A и B\n");
printf("Количество строк в матрице А Na=");scanf("%d",&Na);
printf (" Количество столбцов в матрице А Ma="); scanf("%d",&Ma);
printf (" Количество строк в матрице В Nb=");scanf("%d",&Nb);
printf (" Количество столбцов в матрице В Mb="); scanf("%d",&Mb);
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
43

44. Исходный текст программы (4)

randomize();
A=InitMatr(Na,Ma); //Заполнение матрицы A
B=InitMatr(Nb,Mb); // Заполнение матрицы B
//Вывод исходных матриц на экран
printf ("\nMaтрица A\n"); OutMatr(A,Na,Ma);
printf("\nMaтрица B\n"); OutMatr(B,Nb,Mb);
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
44

45. Исходный текст программы (5)

//printf ('Произведения элементов в строках без нулей ');
printf ("\n В мaтрице A:\n" );
for (int j=0; j<Na ; j++) if (NulStr (A[j], Ma))
printf ( "\nСтрока %d P=%d", j, PrStr(A[j], Ma));
printf ("\n В мaтрице B:\n" );
for ( j=0; j<Nb ; j++) if (NulStr (B[j], Mb))
printf ( "\nСтрока %d P=%d", j, PrStr(B[j], Mb));
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
45

46. Исходный текст программы (6)

//---------- функция заполнения матрицы ----------------}
int ** InitMatr (int N,int M)
{int ** A;
A=new int* [N];
for (int i=0 ; i< N; i++) A[i]=new int [M];
for (i=0 ; i< N; i++)
for (int j=0; j<M; j++) A[i][j]=random(10);
return A;
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
46

47. Исходный текст программы (7)

//----функция вывода матрицы на экран------}
void OutMatr(int **A, int N, int M)
{
for (int i=0 ; i< N; i++) {
for (int j=0; j<M; j++) printf ("%4d ", A[i][j]);
printf("\n");}
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
47

48. Исходный текст программы (8)

//{--Функция определения в строке нулевых элементов ----}
int NulStr (int *S, int M)
{
for (int i=0; i< M; i++)
if (S[i]==0) return 0;
return 1;
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
48

49. Исходный текст программы (9)

//--Функция вычисления произведения элементов в строке—
long int PrStr(int *S, int M)
{
long int P=1;
for (int i=0; i< M ; i++) P=P*S[i];
return P;
}
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
49

50. Задания для самостоятельного решения

Вариант 1.
Описать функцию next() без параметров, которая считывает с
клавиатуры первый символ, отличный от пробела, и объявляет его
своим значением. Использовать эту функцию для подсчета
количества отличных от пробела символов вводимого текста.
Вариант 2.
Даны длины a, b, c сторон некоторого треугольника. Найти медианы
треугольника, сторонами которого являются медианы исходного
треугольника. Длина медианы, проведенной к стороне a, равна
Вариант 3.
Описать рекурсивную функцию root(f,a,b,eps), которая методом
деления отрезка пополам находит с точностью eps корень
уравнения f(x)=0 на отрезке [a,b]. (Считать, что eps > 0, a > b,
f(a)*f(b) < 0). Найти с ее помощью один корень уравнения
sin(x)=0.5.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
50

51.

Вариант 4.
y
Разработать процедуру вычисления
eps по следующей итерационной формуле:
k
x
с заданной точностью
y0 1; yn 1 yn x / ynk 1 yn / k , n 0,1,2,...
Вариант 5.
Разработать функцию поиска подстроки в массиве символов. При успешном
поиске возвращать позицию подстроки относительно начала массива.
Вариант 6.
Даны три целые матрицы размером 9*4. Напечатать ту из них, в которой
больше нулевых строк. Для подсчета количества нулевых строк,
используйте функцию.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
51

52.

Вариант 7.
Написать функцию, равномерно дополняющую строку пробелами до
определенной длины и с ее помощью отформатировать
простейший текст.
Вариант 8.
Даны три вещественных матрицы 4*4. Напечатать квадрат матрицы с
наименьшим следом.
Вариант 9.
Ввести с клавиатуры матрицу 4*4 и подсчитать ее определитель.
Процедуру подсчета определителя оформить в виде функции.
Вариант 10.
Написать функцию перевода строчных букв, введенного с клавиатуры
текста, в прописные и обратно.
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
52

53. Контрольные вопросы по теме работы

Что такое функция?
Что такое прототип функции?
Чем отличаются глобальные и локальные переменные?
Что такое формальные параметры?
Как передать аргументы в функцию из головной программы по
значению?
Как передать аргументы в функцию из головной программы при
помощи указателей?
Каким образом функция возвращает значения в программу?
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
53

54.

Для чего нужен оператор return?
Как передать массив функции?
Где должна быть описана функция и где может располагаться тело
функции?
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
54

55. Итоги Рассмотренные вопросы:

• Функции
• Прототип функции
• Типы переменных
• Формальные параметры
25.04.2016
кафю РТС дисциплина Алгоритмизация и
программирование
55

56. Библиографический список

• Подбельский В.В., Фомин С.С. Курс программирования на языке
Си: учебник. М.: ДМК Пресс, 2012. – 384 с.
• Павловская Т.А. C/C++. Программирование на языке высокого
уровня: учебник для студентов вузов, обучающихся по
направлению "Информатика и вычисл. техника" СПб.: Питер, 2005.
- 461 с.
• Павловская Т. А., Щупак Ю. А. С++. Объектно-ориентированное
программирование. Практикум. Практикум. — СПб.: Питер, 2006.
— 265 с: ил.
• Березин Б.И. Начальный курс C и C++ / Б.И. Березин, С.Б. Березин. М.: ДИАЛОГ-МИФИ, 2001. - 288 с
• Каширин И.Ю., Новичков В.С. От С к С++. Учебное пособие для
вузов. – М.: Горячая линия – Телеком, 2012. – 334 с.
25.04.2016
каф. РТС дисциплина Алгоритмизация и
программирование

57.

Автор:
Саблина Наталья Григорьевна
Ст. преподаватель
каф. РТС УрФУ
15.05.2017
57
English     Русский Правила