Пятница, 2025-06-20, 3:54 PM
Приветствую Вас Гость | RSS
Главная | Функции | Регистрация | Вход
Меню сайта
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Программирование

    Функции. Объявление и определение функции. выполнение функции. Локальные и глобальные переменные C++. Аргументы функции — фактические и формальные. Перегрузка функций. Возвращаемые значения. Массивы

     

    Функции.

    Использование функций

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

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

    Различают два вида функций : встроенные и определённые пользователем. Встроенные функции являются составной частью пакета компилятора и предоставляются фирмой-изготовителем. Нестандартные функции разрабатываются программистом.

    Функции возвращают либо некоторое реальное значение либо некоторое значение типа void (то есть «ничего»).

    Функция так же может принимать некоторые значения, то есть иметь параметры.

    В общем виде объявление функции может иметь вид:

    int MyFunction(int some Value, float SameFloat);

    Вызов функции имеет вид:

    Rezult=MyFunction(12.4,4.7);

    Использование функций требует что бы функция была сначала объявлена, а потом определена. Объявление функции сообщает компилятору тип возвращаемого значения, тип параметров и как функция работает, и называется прототипом функции.

    Существуют три способы объявления функции:

    1. можно записать протопип в файл, а потом подключить его в основную программу при помощи #include.
    2. поместить прототип в файл, где используется эта функция.
    3. определить функцию перед вызовом, в этом случае описание и есть объявление ( это не очень хороший стиль).

    Прототип функции имеет вид:

    В прототипе используется список формальных параметров.

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

    Пример: заголовок функции складывающей два числа.

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

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

    #include <iostream.h>
    int Add(int x, int y);
    int Add(int x,int y)
    {
    cout << “В Add складываются “ <<x<< “и”<<y<<”\n”;
    return (x+y);
    }
    int main()
    {  int a,b,c;
    cout <<”Введите два числа:\n”;
    cin >>a;
    cin >> b;
    c=Add(a,b);
       cout <<”a+b=”<<c<<”\n”;
    return 0;
    }

    Макрофункции

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

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

    Пример 3.

    /* текст программы до обработки препроцессором */ 
    #include<stdio.h>
    #define SQUARE(x)  x*x
     void main(void)
    {
       int y=5,rez;
    printf("квадрат y равен %d\n",SQUARE(y)); printf("квадрат y+2 равен %d\n",SQUARE(y+2)); printf("частное равно %f\n",100./SQUARE(y));
    }

    Перегрузка функций

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

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

    inline int Area(int,int);

    Возмоожны рекурсивные функции, то есть функции, вызывающие самое себя.

    Пример.

    #include <iostream.h>
    int fib(int n);
    int fib(int n)
    { if (n<3)
                   return 1;
       else
       return (fib(n-2)+fib(n-1));
    }
    int main(void)
    {
    int i,rez;
    cout <<"введите число Фибоначи = ";
    cin >> i;
    rez=fib(i);
    cout <<i<<"-oe число Фибоначи ="<<rez<<"\n";
    return 0;
    }

    Результат:

    введите число Фибоначи = 6
    6-oe число Фибоначи =8

     

    Возврат более одного результата

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

    Пример.

    #include<iostream.h>
    #include<conio.h>
    //  #include"sqwere.cpp"
    #include <math.h>
    int sqwere(float a,float b, float c,float *x1,float *x2);
    // объявление функции, ниже идут заголовок и тело этой функции
    int sqwere(float a,float b, float c,float *x1,float *x2)
    { float   d;
    d=b*b-4.*a*c;
    if(d<0.)return 0;
    *x1=(-b-sqrt(d))/(2.*a);
    *x2=(-b+sqrt(d))/(2.*a);
    if(d==0.)return 1;
    if(d>0)  return 2;
    }

     

    int main(void)
    {
    float a,b,c,x1,x2;
    int rez;
    cout <<"Введите числа\n a:";
    cin >>a;
    cout <<"\n b=:";
    cin >>b;
    cout <<"\n c=:";
    cin >>c;
    // вызов функции с фактическими параметрами
    rez=sqwere(a,b,c,&x1,&x2);
    switch(rez)
    { case 0: cout << "корней нет \n";break;
      case 1: cout << "корнь один = "<< x1 <<" \n";break;
      case 2: cout << "корней два x1= "<< x1 <<"  x2= "<<x2<<"\n";break;
    }
    return 0;
    }

     

    Та же самая программа написана при помощи ссылок, найдите отличия

    #include<iostream.h>
    #include<conio.h>
    #include <math.h>
    int sqwere(float a,float b, float c, float &x1,float &x2);
    int sqwere(float a,float b, float c,float &x1,float &x2)
    { float   d;
    d=b*b-4.*a*c;
    if(d<0.)return 0;
    x1=(-b-sqrt(d))/(2.*a);
    x2=(-b+sqrt(d))/(2.*a);
    if(d==0.)return 1;
    if(d>0)  return 2;
    }

     

    int main(void)
    {
    float a,b,c,x1,x2;
    int rez;
    cout <<"Введите числа\n a:";
    cin >>a;
    cout <<"\n b=:";
    cin >>b;
    cout <<"\n c=:";
    cin >>c;
    rez=sqwere(a,b,c,x1,x2);
    switch(rez)
    { case 0: cout << "корней нет \n";break;
      case 1: cout << "корнь один = "<< x1 <<" \n";break;
      case 2: cout << "корней два x1= "<< x1 <<"  x2= "<<x2<<"\n";break;
    }
    return 0;
    }

    uCozCopyright MyCorp © 2025