ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ ПРИ РАЗРАБОТКЕ ПРОГРАММ

Лабораторная работа 6

 

ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ ПРИ РАЗРАБОТКЕ ПРОГРАММ

 

Цель работы

Целью лабораторной работы является получение практических навыков в использовании функций при разработке программ.

Темы для предварительной проработки

Теоретический материал

Функция ¾ это логически завершенная совокупность описаний и операторов, предназначенных для выполнения определенной задачи. В языке С++нет деления на основную программу и подпрограммы, на процедуры и…  

Использование параметра - ссылки

void fun (int &р)

{ ++p;

cout << "p = " << р << endl;

}

void main ( )

{

int x = 10;

fun( x );

cout << "x=" << x << endl;

}

 

В результате будет выведена информация: р=11и х=11.

 

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

 

Использование параметра - указателя

{ ++*р; cout << "*p = " << *p << endl;

Double sgr (double);// Прототип функции sqr

. . . . . . . . .

int main ( )

{

cout << "5**2 = " << sgr (5) << endl; // Вызов функции

}

 

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

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

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

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

 

void funct1 ( float x, int y, int z =80 )

{

cout << "x = " << x << " y= " << y << "z=" << z << endl;

}

void funct2 ( float x, int y = 25 , int z = 100 )

{

cout << "x=" << x << "y=" << y << "z=" << z << endl;

}

void funct3 ( float x=3.5 , int y= 40, int z =200 )

{

cout << "x = " << x << "y = " << y << "z = " << z << endl;

}

main ( )

{

funct1 ( 5.1 , 10 );// по умолчанию один аргумент ¾ z

funct2 ( 10.2 );// по умолчанию два аргумента ¾ y ,z

funct3 ( );// по умолчанию все аргументы

}

На экране будет выведено: x =5.1 y = 10 z = 80

X =10.2 y = 25 z = 100

X =3.5 y = 40 z = 200

Из этих иллюстрационных программ видно , что аргумент по умолчанию ¾ это тот, значение которого задано при описании заголовка функции, а при ее вызове этот аргумент можно не указывать.

Если вместо параметра, заданного по умолчанию при обращении к функции, записывается другое значение фактического параметра, то значение по умолчанию подавляется заданным фактическим значением. Так, например, в последнем программном фрагменте при вызове функции funct (13.5, 75);на экране будет выведено :

 

x = 13.5 y =75 z = 80, т.е. z- принято по умолчанию.

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

Синтаксис языка С++ позволяет использовать указатель на функцию. Имя любой константы ¾ это указатель – константа, равный адресу точки…  

Int (*fcmp[4]) () {god, chena, nazv, avtor} ; .

В результате получился массив функций, доступ к элементам этого массива обычный, например:   int i =0;

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

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

 

Vоid sort (int mas [ 30 ]); .

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

 

Void sort ( int mas [ ], int n ) ; .

ПримерПривести пример программной реализации , в которой происходит передача символьного массива в функцию .   #include < iostream.h >

Р=стол

Р=стул

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

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

 

void fun1 (int mat [7][10]);// используется матрица mat(7,10)

Если используется многомерный массив неопределенной длины, то неопределенным может быть только одно измерение размерности, которое должно быть первым, например:

 

void fun2 ( int mat [ ] [10], int rows, int cols );

 

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

 

#include <iostream .h>

const int mincol = 1;

const int maxcol = 20;

const int minrow = 2;

const int maxrow = 30;

//Функция getnum ( )для ввода количества строк и столбцов

int getnum (const char *elemtype , int low , int high )

{

int n;

Do

{

Cout << " Введите количество " << elemtype

cin >> n; } while (( n<low) || (n>high));

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

Параметр - функция записывается в виде прототипа, т.е. указывается тип функции, ее имя и в скобках перечень типов формальных аргументов, или типов и…   Пример.4Составить программу c использованием функциивычисления интегралов метoдом трапеций (точность вычисления е…

Do

{ s1 =s;

h = (b -a ) /n;

s = ( fun (a) +fun (b) ) / 2;

for ( i = 1; i <= n-1; i++)

s += fun ( a + i *h );

s *= h; n *= 2; }

while ( fabs ( s-s1 ) > e );

return s; }

main ( )

{

float y;

y = ft ( 20 , 2 , 2, 3.0, fn1 ) +ft ( 20, 0, 1.0, fn2 );

cout << "y=" << y << endl;

}

Результат выполнения программы :

Y = 1.29012

Обращение к функции и передача результата

Если формальными аргументами функции являются параметры значения и в ней не используются глобальные переменные, то функция может передать в… double sgr (double); main( )

Квадрат числа = 100.

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

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

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

В С++ определено несколько способов передачи и возвращения результата вычислений, наиболее широко используемыми являются рассмотренные ранее:

¾ вызов функции с передачей параметров с помощью формальных аргументов - значений;

¾ вызов функции с передачей адресов с помощью параметров - указателей;

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

¾ вызов функций с передачей данных посредством глобальных переменных, например:

#include < iostream.h >

int a, b, c;

sum ( )

main ( )

{

cin >> a >> b;

sum ();

cout << c << endl;

}

sum( )

{ c = a + b ; }

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

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

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

#include<iostream.h>

#include<conio.h>

#include<math.h>

bool k;

double ost;

bool f(int n){

for(int i=2;i<n;i++)

{

ost=fmod(n,i);

if(ost==0)

return false;

}

return true;

}

void main(void){

int n;

cout<<"vvod n: ";

cin>>n;

if (f(n)==false)

cout<<"not simple";

else cout<<"simple";

getch();

}

//---------------------------------------------------------------------------

 

ЗАДАНИЯ

F(x)= x-(5*sin2x)1/2 , x< 1,