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

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);

}

Литература

  1. Климова Л.Н. Практическое программирование. Решение типовых задач. КУДИЦ_ОБРАЗ, 2001. – 592 с.

  2. МС/С++. Программирование на языке высокого уровня / Т.А. Павловская. – СПБ.: Питер, 2002. – 464 с.

  3. Демидович Е.М. Основы алгоритмизации и программирования. Язык СИ :учеб. Пособие / Е.М. Демидович – СПБ-Петербург, 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);

}

47

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