- •1. Функции
- •1.1. Общие сведения
- •1.2 Описание функции
- •1.3 Объявление функций
- •1.4 Вызов функции
- •1.4 Область действия переменных
- •2 Механизм передачи параметров в функцию
- •2.1 Основные определения
- •2.3 Массивы – параметры функции
- •Передача функции в качестве параметра в функцию
- •3.1Указатель на функцию
- •Тип_результата (*имя_указателя_на_функцию) (список типов параметров);
- •3.2 Пример передачи имени функции в функцию
- •Рекурсии
- •4.1 Основные понятия
- •4.2 Примеры рекурсивных функций
- •4.2.1 Пример рекурсивной функции (strk), к раз выводящую одну и ту же фразу
- •4.2.3 Пример рекурсивной функции (sum) вычисления суммы элементов одномерного массива
4.2.3 Пример рекурсивной функции (sum) вычисления суммы элементов одномерного массива
Функция sum имеет два параметра – массив x и число его элементов n. При выполнении программы функция main вызывает функцию sum и передает функции sum фактический массив a и число его элементов n. Если n=1, то возвращается значение x[0]. Иначе sum(x,n) вызывает sum(x,n-1) и т. д. из оператора s=x[n-1]+sum(x,n-1);. При n=1 решение тривиально. Возвращаемый результат равен x[0]. Начинается обратный ход рекурсивных вычислений: возврат из вызванных функций результатов вычислений.
Ниже приведен текст программы с вызовом функции sum из главной функции main.
#include<stdio.h>
#include<math.h>
#include<conio.h>
long sum(int a[],int n);
main()
{
int i,n,a[10];
clrscr();
puts("Введите число элементов массива");
scanf("%d",&n);
puts("Вдедите массив целых чисел");
for(i=0;i<n;i++)
{
printf("Введите а[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
printf("%3d ",a[i]);
printf("\n");
printf("Сумма %d элем. массива а равна %ld \n",n,sum(a,n));
getch();
return(0);
}
/* Функция вычисления суммы n элементов массива */
long sum(int x[],int n)
{ long s;
if(n==1) //анализ на тривиальность решения
s=x[0];
else s=x[n-1]+sum(x,n-1);
return(s);
}
Литература
-
Климова Л.Н. Практическое программирование. Решение типовых задач. КУДИЦ_ОБРАЗ, 2001. – 592 с.
-
МС/С++. Программирование на языке высокого уровня / Т.А. Павловская. – СПБ.: Питер, 2002. – 464 с.
-
Демидович Е.М. Основы алгоритмизации и программирования. Язык СИ :учеб. Пособие / Е.М. Демидович – СПБ-Петербург, 2006. – 440 с.
ПРИЛОЖЕНИЕ
ПРИМЕРЫ ПРОГРАММ
1.
Составить программу для вычисления
интеграла функции
,
методом прямоугольников с заданной
точностью на заданном интервале.
РЕШЕНИЕ
#include<math.h>
#include<stdio.h>
#include<conio.h>
typedef float(*func)(float);
float f(float x);
float integral(float a,float b,int n,func f);
void main()
{float E,S1,S2,a,b;
int n;
puts("Vvedite intervali");
scanf("%f %f",&a,&b);
puts("Vvedite tochnost");
scanf("%f",&E);
n=2;
S1=integral(a,b,n,*f);
do
{
n=n*2;
S2=S1;
S1=integral(a,b,n,*f);
}
while(fabs(S1-S2)>E);
printf("a=%6.3f b=%6.3f E=%E\n",a,b,E);
printf("integral:%8.6f\n",S1);
}
float f (float x)
{
return((x*x+1.5)/tan(x));
}
float integral(float a,float b,int n ,func f)
{
float S,h;
int i;
h=(b-a)/n;
S=(f(a)+f(b))/2;
for(i=1;i<n;i++)
S=S+f(h*i+a);
return(S*h);
}
2.
Составить программу для вычисления
интеграла функции
,
методом Симпсона с заданной точностью
на заданном интервале.
РЕШЕНИЕ
#include<math.h>
#include<stdio.h>
#include<conio.h>
typedef float (*func)(float);
float f(float x);
float integral(float a,float b,int n,func f);
void main()
{
float e,S1,S2,a,b;
int n;
puts("Vvedite intervali");
scanf("%f %f",&a,&b);
puts("Vvedite tochnost");
scanf("%f",&e);
n=8;
S1=integral(a,b,n,*f);
do
{
n=n*2;
S2=S1;
S1=integral(a,b,n,*f);
}
while(fabs(S1-S2)>e)
printf("a=%6.3f b=%6.3f e=%e\n",a,b,e);
printf("integral:%8.6f\n",S1);
}
float f (float x)
{
return(sqrt(x)*cos(pow(x,2)));
}
}
float integral(float a,float b,int n ,func f)
{
float S,h;
int i;
h=(b-a)/n;
S=f(a)+f(b);
for(i=1;i<n;i++)
{
if(i%2==0)
{
S=(S+2*f(h*i+a));
}
else S=(S+4*f(h*i+a))
}
S=S*h/3;
return(S);
}
3.
Составить программу для вычисления
интеграла функции
,
методом Ньютона с заданной точностью
на заданном интервале.
РЕШЕНИЕ
#include <stdio.h>;
#include <math.h>;
float f(float);
float integral(float (*)(float),float,float,float);
int main()
{
float s;
s=integral(f,1,2,0.000001);
printf("s=%.10f\n",s);
return(0);
}
float f(float x)
{
return(sin(x)-7*x+9);
}
float integral(float (*y)(float),float a,float b,float e)
{ long int i,m=3;
float s,s2,dx;
dx=(b-a)/m;
s=y(a)+y(b);
for(i=1;i<m;i++)
{
if (i%3==0) s=s+2*y(a+dx*i);
else s=s+3*y(a+dx*i);
}
s=s*dx*3/8;
s2=y(a)+y(b);
do {
m=2*m;
dx=(b-a)/m;
for(i=1;i<m;i++)
{
if (i%3==0) s2=s2+2*y(a+dx*i);
else s2=s2+3*y(a+dx*i);
}
s2=s2*dx*3/8;
if(fabs(s-s2)<=e) break;
else { s=s2;}
printf("n=%ld %.10f\n",m,s2);
}
while(m<1000000);
return(s2);
}
4. Составить программу для транспонирования матриц А и В.
#include <stdio.h>
#include <conio.h>
#include <math.h>.h>
void vvod(float *p,int *n,int *m,char sim);
void vivod(float *p,int n,int m,char sim);
void vivod2(float *p,int m,int n,char sim);
void main(void)
{
float A[100];float a[100];float B[100];float b[100];
int n1,m1,n2,m2,n3,m3,n4,m4; float d;
clrscr();
vvod(A,&n1,&m1,'A');
vvod(B,&n2,&m2,'B');
vivod(A,n1,m1,'A');
vivod(B,n2,m2,'B');
vivod2(A,n1,m1,'a');
vivod2(B,n2,m2,'b');
fflush(stdin);
getchar();
}
void vvod (float *p,int *n,int *m,char sim)
{ int i,j;
printf("Введите n и m %c\n",sim);
scanf("%d%d",n,m);
for(i=0;i<*n;i++)
for(j=0;j<*m;j++)
{printf("%c[%d][%d]=",sim,i,j);
scanf("%f",p+i**n+j);
}
}
void vivod(float *p,int n,int m,char sim)
{ int i,j;
printf("Матрица %c\n",sim);
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
printf("%5.1f",p[i*n+j]);
printf("\n");}
}
void vivod2(float *p,int n,int m,char sim)
{ int i,j;
printf("Матрица %c транспонированная\n",sim);
for(i=0;i<m;i++){
for(j=0;j<n;j++)
printf("%5.1f",p[j*n+i]);
printf("\n");}
}
5.
Составить программу для вычисления
значения функции
,
где a,
b,
c
минимальные элементы массивов A,
B,
C
соответственно.
#include<stdio.h>
#include<math.h>
void vvod(int *w,int *n,char s);
void vivod(int *w,int n,char s);
float min(int *w,int n);
void main()
{FILE *fp;
int X[10],T[10],Z[10],a,b,c,nX,nT,nZ,key;
float L;
puts("Нажмите 0 для вывода на принтер или другую для - экрана");
scanf("%d",&key);
if (key==0) fp=stdprn;
else fp=stdout;
vvod (X,&nX,'X');
vvod (T,&nT,'T');
vvod (Z,&nZ,'Z');
vivod(X,nX,'X');
vivod(T,nT,'T');
vivod(Z,nZ,'Z');
a=min(X,nX);
b=min(T,nT);
c=min(Z,nZ);
puts("Минимальные значения массивов X, T, Z");
fprintf(fp,"a=%d b=%d c=%d\n",a,b,c);
L=-0.31*a+exp(-b)+c;
fprintf(fp,"L=%.4f\n",L);
fflush(stdin);
getchar();
}
void vvod(int *w,int *n,char s)
{
int i;
printf("Введите кол-во элементов массива %c\n",s);
scanf("%d",n);
printf("Введите массив %c\n",s);
for (i=0;i<*n;i++)
scanf("%d",w+i);
}
void vivod (int *w,int n,char s)
{
int i;
printf("Массив %c\n",s);
for (i=0;i<n;i++)
printf("%d ",*(w+i));
printf("\n");
}
float min(int *w,int n)
{
int i,m;
m=*(w+0);
for(i=0;i<n;i++)
if(m<*(w+i)) m=*(w+i);
return (m);
}
![]()
![]()
![]()
![]()
