
- •Отчет по лабораторной работе №2
- •Содержание
- •Цель работы
- •1.Теоретическая часть
- •1.1.Основные понятия о функциях
- •1.1.1.Определение функций
- •1.1.2.Описание функции
- •1.1.3.Вызов функции
- •1.1.4.Передача параметров
- •1.2.Inline функция
- •1.3.Рекурсивные функции
- •2.Практическая часть
- •2.1.Описание программы 2lb1.Cpp
- •2.2.Описание программы 2lb2.Cpp
- •2.3.Описание программы laba1_3.Cpp
- •Заключение
- •Список литературы
- •Приложение а
1.3.Рекурсивные функции
Рекурсивной называют функцию, которая прямо или косвенно вызывает сама себя. Классический пример - это функция вычисляющая факториал n! = 1*2*...*n, 0! = 1
Сравнивая рекурсию с итерационными методами, отмечают, что рекурсивные алгоритмы наиболее пригодны в случаях, когда поставленная задача или используемые данные определены рекурсивно. В противном случае гораздо эффективнее применять итеративные методы.
2.Практическая часть
2.1.Описание программы 2lb1.Cpp
В данной программе просится вывести число a, принадлежащееN, в степениb, принадлежащейR.. Программа должна создать две функции.1-я функция, которая находит произведение 2-х чисел, располагается после функции main.2-я функция, которая выводит результат на экран, располагается до функции main. Данная процедура осуществляется непосредственно согласно введенным правилам объявления и описания функции. Также используется функцияpow(a,b), которая возводит целое положительное числоaв вещественную степеньb.
2.2.Описание программы 2lb2.Cpp
В данной программе просится вычислить периметр параллелограмма с помощью inline функции. Для реализации этой идее применяются правила объявления inlineфункции, код которой вставляется в место вызова.
2.3.Описание программы laba1_3.Cpp
В данной программе просят вычислить
частичную сумму ряда
.
Расчет при этом производится 2-мя способами:
1) с помощью рекурсивной функции ;
2) с помощью функции, содержащей итерационный цикл.
Первая функция r() реализуется за счет рекурсивного обращения к самой себе условием окончания данного обращения в случае достижения аргументом iзначения ноль, что соответствует выходу значения аргумента суммы ряда за обозначенный предел. Вторая функция it() реализуется за счет цикла for с условием окончания i=n, где n –значение максимального аргумента суммы ряда, введенного пользователем и проверенного на положительность и целостность.
Заключение
В ходе написания программ я получил навык в методе разделения выполняемых задач по соответствующим функциям
После написания программ я всецело осознал преимущество использования функций в программах
При многократном вычислении одного и того же выражения в программе я понял, но конечно же не увидел наглядно, как inlineфункция помогает избежать лишних затрат времени на традиционное обращение к функции на основе стека
При использовании рекурсивной функции я в полной мере убедился в том, что её преимущество перед функцией с итерационным циклом состоит лишь в наглядности вычисляемого выражения
Список литературы
Подбельский В.В. Язык Си++. – М.: Финансы и статистика,1996.–560 с.
Дейтел Х., Дейтел П. Язык пограммирования С++: перевод с англ.
М.:ЗАО «Издательство БИНОМ»,1998,1024с.
Приложение а
Листинг программы 2LB1.cpp
Листинг программы
//Program 1
#include <iostream.h>;
#include <math.h>;
#include <conio.h>;
/* Directiva preprocessora #include <imya faila>:osushestvlyaet
poisk faila v standartnih directoriyah.
iostream.h-input and output on a stream,uses functions cout,cin
math.h- matematicheskie funcsii,
conio.h-rabota s ekranom,uses functions clrscr(),getch()
*/
float st(float b,float c);
float v(float b,float c)
{cout<<"chislo a v stepeni b = \n\n"<<st(b,c)<<endl<<endl;};
void main()
{
clrscr();
float b=0,c=0; int a=0;
cout<<"proga vichislyayushaya chislo a v stepeni b \n\n";
cout<<"vvedite stepen chisla \n\n";
cin>>b;
cout<<"vvedite chislo a \n\n";
cin>>c;
a=c;
while (a<2 || a!=c) //proverka na prinadlegnost k N
{cout<<"a dolgno bit >=2 & celoe";
cout<<"vvedite chislo a \n\n";
cin>>c; a=c;};
v(b,a);
getch();}
}
float st(float b,float c)
{return pow(c,b);} //a v stepeni b
Листинг программы 2LB2.cpp
Листинг программы
//Program 2
#include <iostream.h>;
#include <math.h>;
#include <conio.h>;
/* Directiva preprocessora #include <imya faila>:osushestvlyaet
poisk faila v standartnih directoriyah.
iostream.h-input and output on a stream,uses functions cout,cin
math.h- matematicheskie funcsii,
conio.h-rabota s ekranom,uses functions clrscr(),getch() */
inline float p(float x, float y);
void main()
{
clrscr();
cout<<"proga schitayushaya perimetr parallelogramma \n\n";
float x=0,y=0;
cout<<"vvedite dlinu 1 storoni parallelogramma \n\n";
cin>>x;
while (x<=0)
{cout<<"dlina storoni dolgna bit >0 \n\n";
cout<<"vvedite dlinu 1 storoni parallelogramma \n\n";
cin>>x;};
cout<<"vvedite dlinu 2 storoni parallelogramma \n\n";
cin>>y;
while (y<=0)
{cout<<"dlina storoni dolgna bit >0 \n\n";
cout<<"vvedite dlinu 2 storoni parallelogramma \n\n";
cin>>y;};
cout<<"perimetr= "<<p(x,y);
getch();
}
inline float p(float x, float y)
{return 2*(x+y);}
Листинг программы 2LB3.cpp
Листинг программы
//Program 3
#include <iostream.h>;
#include <math.h>;
#include <conio.h>;
/* Directiva preprocessora #include <imya faila>:osushestvlyaet
poisk faila v standartnih directoriyah.
iostream.h-input and output on a stream,uses functions cout,cin
math.h- matematicheskie funcsii,
conio.h-rabota s ekranom,uses functions clrscr(),getch() */
float r(int);
float it(int,float);
void main()
{
clrscr();
int n=0; float k,f,s=0;
cout<<"proga vichislyayushaya chastichnuyu summu ryada \n\n";
cout<<"vvedite chislo n \n\n";
cin>>k;
n=k;
while ((n<1)||(n!=k))//proverka na prinadlegnost k N
{cout<<"n dolgno bit >=1 & celoe \n\n";
cout<<"vvedite chislo n \n\n"; cin>>k; n=k;};
cout<<"summa po rekursii = "<<r(n)<<endl;
//vivod otveta po rekursii
cout<<"summa po itteracii = "<<it(n,s)<<endl;
//vivod otveta po itteracii
getch();
}
float it(int n,float s)
{
for (float i=1;i<=n;i++)
s+=(i+1.)/(2*i+1.); /*funkciya v cikle i ot 1 do n pribavlyaet k predidusheyi
summe poluchivsheecya chastnoe*/
return s;} //vozvrashaet s
float r(int n)
{ if (n==1) {return ((n+1.)/(2*n+1.));}
else {return ((n+1.)/(2*n+1.)+r(n-1));};}
//funkciya pribavlyaet k znacheniyu r(n) znach. r(n-1) poka n!=1