Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

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

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

        Определение функции состоит из двух частей: заголовка и тела. Заголовок определяет имя функции, ее тип и формальные параметры, тело определяет действия над данными, выполняемые функцией. Возращающее функцией значение передается в вызывающюю программу опрератором return   (выражение). Значение "выражения" и есть результат функции (возращаемого значения). Если в нашей программе функция физически следует за вызывающей ее функцией main, то надо в последней объявить функцию внешней с помощью описателя extern: extern int fun(); или еще проще int fun();. В противном случае при компиляции будет выдана ошибка. Всякая функция имеет вид:     

[тип] имя([список формальных параметров])
      описания формальных параметров;
{
описания;
операторы;
}

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

  Рассмотрим пример программы возведения числа в степень. Для этого составим функцию power(t,n); В нашей реализации функция power предшествует головной программе, поэтому она предварительно не объявлена. Описание формальных параметров функции происходит в заголовке (int t,n;) Оператор int p=1;  в теле функции определяет переменную p целого типа и присваивает ей начальное значение равное 1. Выражение int p=1; в точности эквиалентно   последовательности операторов int p; p=1; Обращение к функции задает один из аргументов стнадартной функции printf в программе main. Выражение power(t,n) предписывает вызов функции. Когда программа main достигает этой точки, то все управление передается функции power. Операторы , содержащиеся в теле функции power фактически оперируютя данными. Когда достигается оператор return , осуществляется переход в ту точку программы main, из которой мы пришли в power. Значение, вычисляемое функцией power, передается в головную программу с помощью оператора return(p). В скобках в общем случае может быть любое значение.

               Прмер 2.0

/*Функция y=t**n*/
      int power(t,n);
      int t,n;
      {
int p=1;
         while(n!=0)
   {
if(n%2 !=0) p=p*t;
n=n/2;
t=t*t;
   }
return(p);
}
    /*Возведение в степень- головная программа*/
   #include <stdio.h>
   main()
{
     int a,n;
     printf("Введи a,n \n");
     scanf("%d %d",&a,&n);
     printf("%d в степени %d = %d",a,n
power(a,n));
}

      Рекурсия.

               В языке Си можно использовать рекурсивно, т.е. функция может вызывать сама себя. Простейший пример 2.1, где функция main вызывает сама себя остановить которую можно только с помощью CTRL+C  - ^С. При рекурсивном обращении к функции - создается новый экземпляр данных.

                Пример 2.1

#include <stdio.h>
main()
{
printf("проверка рекурсии \n");
main();
}

Следущий пример 2.2 использует рекурсию для вычисления k! . При первом вызове fact(i) , если не равно 1, функция порождает выражение i*fact(i-1); в свою очередь, вызов fact(i-1) производит (i-1)*fact(i-2), что вместе с ранее полученным результатом дает i*(i-1)*fact(i-2). Рекурсия закончистся, как только следующий вызов функции получит аргумент, равный еденице. Нетрудно сообразить, что в конечном счете мы получим требуемое произведение.

Прмер 2.2

#include <stdio.h>
int fact(k);
int k;
{
  if(k==1)
return(1);
  else
    return(k*fact(k-1));

}
main()
{
int i=1;
    printf("проверка рекурсии\n");
    while(i<8)
              {
printf("%d!= %d\n",i, fact(i));
i=i+1;
}
}

[ Назад | Оглавление | Далее ]









helloworld.ru © 2001-2021
Все права защищены