Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК-1_АЯП_рус.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.19 Mб
Скачать

Void lin(char a)

{

int k;

for(k=0; k<79; k++)

printf(“%c”, a);

}

Если у функции отсутствует список параметров, то при декларации такой функции желательно в круглых скобках также указать ключевое слово void. Например, заголовок основной функции должен выглядеть так: void main(void).

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

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

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

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

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

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

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

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

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

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

Указатели и функции.

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

Пример функции, в которой меняются местами значения аргументов x и y:

Void z1(int * X, int * y)

{ int t=*x;

*x=*y;

*y=t;

}

Участок программы с обращением к данной функции :

int a=2, b=3;

Void z1(int*, int*);

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

z1(&a, &b);

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

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

a=2, b=3

a=3, b=2

В языке С функции могут вызывать сами себя. В этом случае функция называется рекурсивной.

Еще рассмотрим на примере возведения числа в квадрат использование функции возвращающее свое значение и не возвращающее свое значение.

#include <stdio.h>

float Kwadrat(float A)

{

return A * A;

}

float С;

main()

{

printf("введи число \n");

scanf("%f",&С);

printf("квадрат = %8.2f\n",Kwadrat(С));

}

Как видно из примера - имя функции Kwadrat - она вычисляет квадрат числа. В строке printf("Kwadrat = %8.2f\n",Kwadrat(B)); эта функция вызывается - на вход подается значение (введенное число), а в результате получаем результат - квадрат числа, который возвращается в программу по команде return.

Рассмотрим еще один вариант работы с функцией, возвращающей значение без команды return.

#include <stdio.h>

Kwadrat(float A, float *B)

{

*B = A * A;

}

float C, D;

main()

{

printf("введи число \n");

scanf("%f",&C);

Kwadrat(C,&D);

printf("квадрат = %8.2f\n",*D);

}

Пример рекурсивной функции – вычисление факториала числа n!=1*2*3*…*n:

fac(int n)

{

int b;

if (n= =1) return 1;

b=fac (n-1)*n;

return n;

}

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

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

type (*p)(type1 t1, type2 t2);

Функции и массивы.

Часто одни и те же операции проходится повторять со многими массивами. Поэтому целесообразно эти операции оформить в виде функции

Ниже приведены программы, в которых реализована передача в функции одномерных и двумерных массивов.

Передача одномерного массива. Функция sum (a) принимает элементы массива a[5] и увеличивает вдвое.

#include<stdio.h>

#include<conio.h>

void sum(int x[5]);

void main()

{ int a[5];

clrscr();

printf("\n введи массив \n ");

for(i=0;i<5;i++)

scanf("%d",&a[i]);

sum (a);

printf("\n измененный массив\n ");

for(i=0;i<5;i++)

printf("%d ",a[i]);

getch();

}

void sum(int x[5])

{ int i;

for(i=0;i<5;i++)

x[i]+=2;

}

Результатат программы:

введи массив

4 7 2 8 1

измененный массив

6 9 4 10 2

Передача двумерного массива. В следующих программах функции реализуют операцию ввода матрицы (input_matrix(int x[5][5])) и операцию вывода матрицы (printfarray(int x[n][m])):

а) ввода матрицы.

#include<stdio.h>

#include<conio.h>

void input_matrix(int x[5][5]);

void main()

{ int a[5][5],i,j;

clrscr();

input_matrix (a);

for(i=0;i<5;i++)

{ for(j=0;j<5;j++)

printf("%d ",a[i][j]);

printf("\n");

}

getch();

}

void input_matrix(int x[5][5])

{ int i,j;

printf("\n vvedi");

for(i=0;i<5;i++)

for(j=0;j<5;j++)

scanf("%d",&x[i][j]);

}

б) ввода матрицы.

#include<stdio.h>

#define n 2

#define m 3

void printfarray(int x[n][m]);

main()

{ int a1[n][m]={{1,2,3},{4,5,6}};

printf("massiv a1\n");

printfarray(a1);

}

void printfarray(int x[n][m])

{ int i,j;

for(i=0;i<2;i++)

{for(j=0;j<3;j++)

printf("%d",x[i][j]);

printf("\n");

}

getchar();

}

Основная литература: 2[40-45], 3[9 лекция]

Дополнительная литература:1,2,3,5

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

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

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

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

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

5.В каких случаях необходимо в функциях испрльзовать указатель?.

Лекция 9.Cимвольные данные. Функции библиотеки обработки символов. Массивы символов. Функции преобразования символьных строк. Функции работы со строками:

Символ – это нечто, что может появиться на экране компьютера.

Описание символьной переменной

char имя переменной;