// integrall.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include "string.h" #include "math.h" //#include "Winbase.h" using namespace std; //typedef char* (*td_integral) (int,int,float,float (*f)(float)); typedef float (*td_func)(float); typedef float (*td_metd)(int,int,float,td_func); //#include void show_menu(char mod, int arg1) { switch(mod) { case 'a': printf(" \n"); printf("Welcome to Integral calculation programm! \n"); printf("Here some actions you can choose below: \n\n"); printf("==Avaliable calculation functions==\n"); printf("-----------------------------------\n"); printf("1) x+3 \n"); printf("2) x^2 + 5x - 1 \n"); printf("-----------------------------------\n"); printf("Your choise "); break; case 'b': printf("You have selected %d - one function. \n",arg1); printf("Now enter integral range to function count from 'a' to 'b' \n"); break; } } float func1(float x) { return x+3; } float func2(float x) { return x*x + 5*x - 1; } float trapeci (int a,int b,float n,td_func f) // func (*f) (func) { float h,x,summ1,summ2,rez; h=(b-a)/n; int i; summ1 = f(a)+f(a+n*h); summ2 = 0; for (i=1; i<= n -1; i++) { x = a+i*h; summ2 += f(a+i*h); } summ2 *= 2; rez = 0.5 * h * (summ1 + summ2); return rez; } float simpson (int a, int b, float n, td_func f) {float h,rez,x; float summ1=0; float summ2=0; float summ3=0; h = (b-a)/(6*n); int i; summ1 = (*f)(0)+(*f)(b); for (i=1; i<= 2*n-1; i+=2) { x = a+((b-a)*i)/(2*n); summ2 += (*f)(x); } for (i=2; i<= 2*n-2; i+=2) { x = a+((b-a)*i)/(2*n); summ3 += (*f)(x); } rez = (h)*(summ1+4*summ2+2*summ3); return rez; } float doubleculc(int a, int b,float epsi, td_func func,td_metd metod)//float (*metod)(int, int, float,td_func func)) { float n = 10; float I2N,IN; do { IN = metod(a,b,n,func);//integral_trapeciei(a,b,n,func);//simpson(a,b,n,func); I2N =metod(a,b,2*n,func); //integral_trapeciei(a,b,2*n,func);//simpson(a,b,2*n,func); n = n*2; } while (abs((I2N - IN))>epsi); return IN; } int _tmain() { int number; int a,b; float epsi,IN; float (*func)(float); float (*metod)(int, int, float,float (*f)(float)); int repeate = 0; do { show_menu('a',0); scanf("%d",&number); switch(number) { case 1: func = &func1; break; case 2: func = &func2; break; } do { system("cls"); show_menu('b',number); scanf("%d",&a); scanf("%d",&b); if(a>b){printf("A must be low than B");} }while(a>b); system("cls"); metod = &trapeci; printf("-----------TRAPECI----------\n"); printf("Epsi = 0.1 "); epsi = 0.1; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.01 "); epsi = 0.01; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.001 "); epsi = 0.001; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.00001 "); epsi = 0.00001; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); metod = &simpson; printf("-----------SIMPSON----------\n"); printf("Epsi = 0.1 "); epsi = 0.1; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.01 "); epsi = 0.01; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.001 "); epsi = 0.001; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("Epsi = 0.00001 "); epsi = 0.00001; IN = doubleculc(a,b,epsi,func,metod); printf(" %f\n",IN); printf("----------------------------\n"); printf("Repeate? "); scanf("%d",&repeate); }while(repeate); return 0; }