Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SIT.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
349 Кб
Скачать
☆

Лекция 5 Функции языка с

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

Рассмотрим конкретный пример. Эта небольшая программа переводит метры в caнтиметры.

Программа 5.1:

#include<stdio.h>

void main() {

int numbег_metr;

printf(“input number meters\n");

scanf("%d”,&number_metr);

int cm=100 *number_metr;

printf(“number of cm in %d = %d cm\n", number_metr, _cm);

}

Ту же программу напишем с использованием функции пользователя.

Программа 5.2:

#include<stdio.h>

void main() {

int_cm(int m); /* прототип функции или объявление функции, где int m -

это параметp функции */

int number metr;

printf("input number meters\n");

scanf(“%d”, &number_metr);

printf(“ number of'cm in %d = %d cm\n". number_metr, _cm(number_metr));

//в функции_cm(number_metr) number_metr является ее аргументом

int cm(int m)// описание или тело функции, m -параметр

return m*100;}

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

Основная форма описания (definition) функции имеет вид

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

{

тело функции

}

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

В списке параметров для каждого параметра должен быть указан тип. Пример правильного списка параметров:

f(int x, int у. float z)

Пример неправильного списка параметров: f(int x, у, float z)

Оператор return

Оператор return, с которым мы уже встречались, имеет два варианта использования.

Во-первых, этот оператор вызывает немедленный выход из текущей функции и возврат в вызывающую программу.

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

Приведем пример программы, реализующей возведение числа а в натуральную степень b с использованием функции пользователя.

Пpoграмма 5.3:

#include<stdio.h>

float step(float a, int b);

void main()

{ float x;

int i;

printf(“input x \n");

scanf("%f",&x);

printf("input i \n");

scanf(“%ud", &i);

printf(“%f^%d = %f\n",x,i, step(x,i));

}

float step(float a, int b)

{

if(a<0) return (-1);

float c=1;

for(int i= b;i>=l; i-- )c*=a;

return c;

}

Эта функция возвращает значение -1, если основание отрицательное, и а^n - если основание неотрицательное. Рассмотрим еще один пример, реализующий функцию для нахождения наибольшего из двух чисел.

Пpoграмма 5.4:

#include<stdio.h>

#include<stdlib.h>

void max(int, int);

main()

{int u. v;

scanf("%d", &u);

scanf(“%d”, &v);

max(u,v);

return EXIT_SUCCESS;

}

void max(int a, int b)

{ int m;

if(a>b) m=a;

else m=b;

printf("mux number= %d", m);

}

Возможно также написать эту функцию без использования дополнительной переменной:

max(int a, int b)

{if(a>b) return a;

else return b; }

Можно еще короче:

max(int а, int b)

{if (a>b) return a;

return b;}

A можно и так:

Программа 5.5:

#include <stdio.h>

#include<stdlib.h>

max(int, int);

main()

{int u, v;

scanf("%d", &u);

scanl("%d",&v);

printf("max number= %d", max(u, v));

return EXIT SUCCESS;

}

max(int a, int b)

{return (a>b)?a:b;}

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

Использование функций, возвращающих указатели, имеет некоторые особенности. Указатели не являются ни типом целое (int), ни типом беззнаковое целое (unsigned int). Их значениями являются адреса памяти данных определенного типа. Соответственно должна быть описана и функция. Рассмотрим пример описания функции, возвращающей указатель на тип char. Этa функция находит в строке первый пробел и возвращает его адрес.

Программа 5.6:

#include<stdio.h>

#include<stdlib.h>

char* find(char* string);

main()

{char s[20], *p;

gets(s);

p=s;

printf(“address= %p \n", p);

pintf(“address of the space = %p \n", find(p));

return EXIT SUCCESS;

}

char* find(char* string)

{int i=0;

while ((string[i] !=' ')&&(string[i] !='\0'))

{

i++;

printf("address" %p \n", &string[i]);

}

if(string[i]) return &string[i];

else return NULL;

}

Когда функция не возвращает никакого значения, она должна быть описана как функция типа void (пустая). В стандарте языка С Кернигана и Ритчи ключевого слова void не было вообще. Это слово пришло из C++ и оказалось очень удобным. Например, для вывода на экран горизонтальной строки, состоящей из заданного символа, можно использовать следующую функцию, которая, конечно, не должна возвращать никакою значения:

void gorizonial _line(char ch)

{int i;

for(i=0; i <80; i++) printf("%c". ch);}

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]