Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции. Функция является основным структурным элементом языка С

Лекция5

Функция является основным структурным элементом языка С.

Синтаксис определения функции:

возвращаемый_тип имя_функции(список_параметров)

{

тело_функции

}..

Список__параметров:

Void

объявление_параметра[, объявление_параметра...]

Необязательные элементы помещаются в квадратные скобки. Взаимоисключающие варианты отделяются друг от друга вертикальной чертой (например, [+ | -] означает: “здесь может стоять либо плюс, либо минус, либо вообще ничего"). Многоточие показывает, что последний синтаксический элемент может повторяться произвольное число раз.

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

Оператор в С не обязан располагаться в одной строке. Он может занимать и несколько строк; переход на следующую строку с точки зрения компилятора эквивалентен простому пробелу.

Помимо определения для функции обычно пишется также ее объявление, или прототип, который размещается в заголовочном файле с расширением.h и служит для проверки корректности обращений к функции при раздельной компиляции исходных файлов. Прототип идентичен заголовку функции, но заканчивается точкой с запятой. Тело функции отсутствует:

Возвращаемый_ тип имя_функции (список_параметров);

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

имя_функции(параметры)

параметры:

пусто

параметр[, параметр...]

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

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

DoSomething(argi, arg2);

Функции, “возвращающие значение” типа void, могут вызываться только таким образом. С другой стороны, возвращаемое функцией значение можно использовать в выражениях наряду с переменными и константами:

aResult = 1. - cos(arg);

Задание

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

#include <stdio.h>

#include <conio.h>

int maxi(int,int);

void main(int argc, char* argv[])

{ int x,y,z;

printf("\n vvedite chislo");

scanf("%d",&x);

printf("\n vvedite chislo");

scanf("%d",&y);

z=maxi(x,y);

printf("\n maxi = %d",z);

getch();

}

int maxi(int a, int b)

{

int c;

if (a>=b) c=a; else c=b;

// printf("\n a=%d b=%d c=%d",a,b,c);

return c;

}

Можно функцию maxi поместить в отдельный файл. Тогда в текст основной программы следует включить директиву, подключающую данный файл.

#include"C:\Program Files\Borland\CBuilder5\Projects\maxi.cpp"

Пользователю предлагается ввести имя (в произвольной форме — только имя, имя и фамилию и т. п.), а затем номер телефона, просто как 7-значное число без пробелов или дефисов. После этого программа распечатывает полученные данные, выводя номер телефона в более привычном формате.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

void Convert(char *buffer, long num); /* Прототип функции */

int main(int argc, char* argv[])

{

long number;

char s[80], name[80];

printf("Enter name: ");

gets(name);

printf("Enter phone number: ");

gets (s);

number = atol(s);

/* Преобразовать номер в обычную форму. */

Convert(s, number);

/* Вывести результат. */

printf("\n%-30s %10s\n", name, s);

getch ();

return 0;

}

/* Определение функции */

void Convert(char *buffer, long num)

{

int grp1, grp2, grp3;

grp3 = num % 100; // Две последние цифры.

num /= 100;

grp2 = num % 100; // Две средние цифры

grp1 = num / 100; // Три старшие цифры

/* Преобразовать в строку. */

sprintf (buffer, "%03d-%02d-%02d", grp1, grp2, grp3);

}

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

Для преобразования полученных групп в строку вызывается функция sprintf (). Она совершенно аналогична функции printf () за исключением того, что вместо вывода на консоль записывает результат в строковый буфер, указанный первым параметром. В основной программе, т. е. в функции main (), использована функция ato1(), преобразующая строку в длинное целое.

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

 

Итог:

ü Функция может возвращать значение практически любого типа (включая определяемые пользователем) или не возвращать его вообще. В последнем случае функция описывается как void.

ü Функция может не иметь параметров. В этом случае на месте списка параметров в прототипе или определении также ставится ключевое слово void или список оставляют пустым; в вызове функции на месте списка аргументов также ничего не пишется (однако скобки необходимы). В прототипе, в отличие от определения, нет необходимости указывать имена параметров; список параметров может состоять из перечисления только их типов, разделенных запятыми, например: void Convert(char*, long);

ü Прототип не обязателен, если определение функции расположено в тексте программы выше того места, где она вызывается (точнее говоря, в этом случае прототипом служит само определение функции).

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

Void change(int *x, int *y); // прототип функции

Void main()

{

int a,b;

printf(“\nВведите а и в”);

scanf(“%d %d”,&a,&b);

change(&a,&b);

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

}

void change(int *x, int *y)

{

int z;

z=*x; *x =* y; *y=z;

}

Массив как параметр функции.

В С++ имя массива является константным указателем адреса элемента массива с нулевым индексом. Следовательно, при использовании имени массива в качестве параметра функции допускается изменять значения элементов массива.

Пусть требуется все элементы массива возвести в квадрат.

#include <stdio.h>

#include <conio.h>

void kvadr(float a[],int size_a); //прототип функции

int main(void)

{

const int k=10;

float d[k];

int i;

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

{

printf("\n vv %d el mas ",i);

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

}

kvadr(d,k); //вызов функции

printf("\n res mas \n");

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

printf("%7.2f",d[i]);

getch();

}

void kvadr(float a[],int size_a)

{

for(int j=0;j<size_a;j++)

a[j]=a[j]*a[j];

}

Рекурсивные и подставляемые функции.

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

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

#include <stdio.h>

#include <conio.h>

float stepen(float x,int n) //функция возведения в степень

{

if (n==0) return 1;

if (x==0)return 0;

if (n>0) return x*stepen(x,n-1);

if (n<0) return stepen(x,n+1)/x;

}

int main(void)

{

int m;

float a,y;

printf("\n vv osnovanie stepeni ");

scanf("%f",&a);

printf("\n vv stepen chisla ");

scanf("%d",&m);

y=stepen(a,m);

printf("\n rezultat = %5.3f",y);

getch();

}

Некоторыу функции языка С++ целесообразно определять как подставляемые. Это осуществляется с помощью директивы inline.

Например:

Inline float module(float x=0,floaty=0)

{

return x < 0.0? –x: x;

}

Функция modul определена как подставляемая. Это значит, что при вызове функции компилятор будет встраивать тело функции в место вызова функции. Поэтому при многократных вызовах подставляемой функции размеры программы будут увеличиваться, но исключаются временные затраты на передачу управления в вызываемую функцию и на возврат из нее. Наиболее эффективна подставляемая функция в том случае, если тело ее состоит из небольшого числа операторов.

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

От того, где объявлена переменная, зависит возможность ее использования. В С++ возможны три места объявления переменных:

  1. Вне каких-либо функций, в том числе и вне функции Main(). Такая переменная называется глобальной и может использоваться в любом месте программы от места объявления до конца программы.;
  2. Внутри тела функции. Она называется локальной и может использоваться только внутри функции.
  3. Переменная может быть объявлена как параметр функции. Тогда она рассматривается как локальная переменная для тела функции.

 


<== предыдущая лекция | следующая лекция ==>
Escape-последовательности | Массивы и указатели
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 456; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.051 сек.