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

Механизм вывода функции

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

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

При выполнении оператора return управление передается назад – в место вызова. Передаваемый результат подставится вместо вызова и присвоится указанной переменной.

Выводы

Для написания собственной функции необходимо:

  • определить функцию(написать заголовок и тело)

  • объявить функцию(написать прототип)

  • в нужном месте программы организовать вызов функции.

Основные принципы построения функции:

  1. Каждая функция решает одну подзадачу.

  2. Исходные данные всегда передаются через параметры. (за незначительным исключением)

  3. Результат всегда передается из функции с помощью оператора return или другими средствами.

+

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

Данные в функции передаются по значению, адресу.

Любое данное имеет текущее значение и адрес.

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

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

Передача в функцию значения аргумента

Пусть в функцию хотим передать значение int

… func(int a,…)

{

// используем a для анализа или вычисления

return …;

}

int main(void)

{

int A;// объявили аргумент

cin>>A;// определили аргумент

… func(A);// передали текущее значение аргумента

…

}

// При передачи по значению исходные данные из функции main заносятся в параметры функции. Функция производит действия над параметрами, => над копиями исходных данных, передаваемых из функции main. Следовательно, изнутри мы не можем изменить исходные данные. Обратной связи нет.

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

Анализ характеристик функций:

1) название функции – Geron

2) исходные данные: a, b, c

типы исходных данных -> double a, double b, double c

3) результат функции S -> double

Geron.cpp:

#include<math.h>

double Geron(double a, double b, double c) // копирование значений А, B и C

{

double S, P;

P=(a+b+c)/2;

S=sqrt(P*(P-a)*(P-b)*(P-c));

return S;

}

Geron.h:

#ifndef GERON_H

#define GERON_H

double Geron(double a, double b, double c);

#endif

main.cpp:

#include<iostream>

using namespace std;

#include “Geron.h”

int main(void)

{

double A, B, C, S;

cin>>A>>B>>C;

S=Geron(A,B,C);

cout<<S<<endl;

return 0;

}

+

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

    Передача исходных данных в функцию ссылки на аргумент

Ссылка – константный адрес другой переменный или альтернативное имя другой переменной.

int &rA=A;// объявляется ссылка rA, которая сразу инициализируется переменной А

Если ссылка – параметр функции, то после вызова её ссылка инициализируется аргументом.

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

Ссылка часто используется для передачи из функции дополнительных результатов.

//

При объявлении ссылки она обязательно инициализируется именем другого объекта (адресата) и с этого момента становится альтернативным именем адресата. Ссылку нельзя переназначать. Ссылка только ссылается на один объект.

При передаче по ссылке экономится память и есть прямой доступ к аргументу. При необходимости аргумент можно защитить от изменения:

const int &rA;

//

Пусть из функции необходимо передать дополнительный результат целого типа.

… func(…, ТипРезультата &result) // создается &result=result,

{

…

result=результату; // передача результата

…

}

int main(void)

{

ТипРезультата result;

…

… func(…, result);

cout<<result<<endl;

…

return 0;

}

Написать программу, в которой для данного прямоугольника вычисляется периметр и площадь.

double Pram(double a, double b, double &S)

{

double P;

P=2*(a+b);

S=a*b;// вычислили и передали площадь

return P;

}

int main(void)

{

double A, B, P, S;

cin>>A>>B;

P=Pram(A,B,S);

cout<<”S=”<<S<<endl;

cout<<”P=”<<P<<endl;

return 0;

}

Задача: переписать функцию swap с применением ссылок

void swap(int &rA, int &rB)

{

int x;

x=rA;

rA=rB;

rB=x;

}

int main(void)

{

int A, B;

cin>>A>>B;

swap(A,B);

cout<<A<<B;

return 0;

}

Выводы:

1) в функцию передаем значение аргумента, если в ней не надо изменять аргумент и он занимает небольшой объем памяти

2) в функцию передаем ссылку на её константный объект, если аргумент не надо изменять в функции, но он занимает большой объем памяти

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

+

  1. Передача адреса простого аргумента в функцию. Написать схематично программу с функцией, возвращающей результат (вещественное число) через параметр - указатель.

    Передача в функцию адреса аргумента

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

Передача данных по адресу.

Пусть из функции необходимо передать результат целого типа

Необходимо:

  • Объявить в функции main переменную целого типа под результат.

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

  • В имени функции и в прототипе объявить параметр указатель на целый тип.

  • Внутри функции вычислить результат и записать его значение по указанному в параметре адресу.

… func(…, int *result) // параметр является указателем, *result=&result

{

…

*result=результату;// возвратили результат функции через параметр

return;

}

int main(void)

{

int result; //переменная целого типа под результат.

…

… func(…, &result); // передали в функцию адрес переменной res

cout<<result<<endl;

…

return 0;

}

Написать функцию, в которой две переменные обмениваются своими значениями.

void Swap(int *p1, int *p2)

{

int a;

a=*p1;

*p1=*p2;

*p2=a;

return;

}

int main(void)

{

int A, B;

cin>>A>>B;

Swap(&A, &B);

cout<<A<<’ ‘<<B<<endl;

return 0;

}

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

… func(const double *p, int n)

{

// алгоритм обработки исходного массива

}

Если исходное данное – одномерный числовой массив типа double с const, говоря о том, что массив не изменим. Цикл перебора. Элементы массива можем анализировать и использовать при вычислениях в правой части. Изменять не можем.

  1. Выделение памяти под массив-результат функции пользователя в функции main(). Написать схематично программу с функцией пользователя, в которой на основе исходного одномерного числового массива формируется массив-результат.

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

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

  1. Использование const при объявлении параметров функции.

+

  1. Рекурсивные функции языка С++ и их применение при программировании.

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