Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 01:19   #1
Ovis
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 15
По умолчанию Пофиксить программу, вычисляющую определённый интергал методом трапеций.

В общем, программа уже написана, надо только найти в ней ошибку. Поясняю: программа работает по пунктам (Всего 3 пункта. Она вычисляет определённый интергал методом трапеций. Каждый пункт - новая подинтегральная функция). Проблема состоит в том, что она вычисляет первый пункт верно, а 2-й и 3-й, как мне кажется, не вычисляет вовсе. Что нужно в ней исправить? Ах, да, забыл сказать! Программа попросит точность, нужно ввести где-то 0,001...

Код:
#include <stdio.h>			 
#include <conio.h>		
#include <math.h>
#include <iostream>
typedef float(*func)(float);
float f1(float x);
float f2(float x);
float f3(float x);
float integ(float a,float b,int n,func f);
float toch(float a,float b,float E,func f);
main(void)
{
    system("cls");
    float a1,b1,E,k,m,t;
    int n,i;
    system("cls");
    do
	{
		printf("Viberite funkciyu:\n");
		printf("1)   (x+2.5)/(x+6.1)\n");
		printf("2)   (exp((-x)/7.5))*cos(0.1*x)*sin(0.2*x)\n");
		printf("3)   lg(x*x+x+6)\n");
		scanf("%i", &i);
		system("cls");
	} while (i<1 || i>3);
	/*printf("Ne vvodit' promejutki, soderjaschie znacheniya (-2.5) i (-6.1)!\n");
	printf("Vvedite nijniy predel integrirovaniya\n");
	scanf("%f",&a1);
	printf("Vvedite verhniy predel integrirovaniya\n");
	scanf("%f",&b1);
	printf("Vvedite tochnost':\n");
    scanf("%f",&E);*/
    switch(i)
    {
        case 1:
        {
            printf("Ne vvodit' promejutki, soderjaschie znacheniya (-2.5) i (-6.1)!\n");
	        printf("Vvedite nijniy predel integrirovaniya\n");
	        scanf("%f",&a1);
	        printf("Vvedite verhniy predel integrirovaniya\n");
	        scanf("%f",&b1);
	        printf("Vvedite tochnost':\n");
            scanf("%f",&E);
            k=toch(a1,b1,E,*f1);
            printf("Otvet %8.6f\n",k);
        }
        break;
        case 2:
        {
            
            printf("Vvedite nijniy predel integrirovaniya\n");
	        scanf("%f",&a1);
	        printf("Vvedite verhniy predel integrirovaniya\n");
	        scanf("%f",&b1);
	        printf("Vvedite tochnost':\n");
            scanf("%f",&E);
            m=toch(a1,b1,E,*f2);
            printf("Otvet %8.6f\n",k);
        }
        break;
        case 3:
        {
            printf("Vvedite nijniy predel integrirovaniya\n");
	        scanf("%f",&a1);
	        printf("Vvedite verhniy predel integrirovaniya\n");
	        scanf("%f",&b1);
	        printf("Vvedite tochnost':\n");
            scanf("%f",&E);
            t=toch(a1,b1,E,*f3);
            printf("Otvet %8.6f\n",k);
        }
        break;
     default:puts("nepravilno vveden nomer");
     }
     fflush(stdin);
     //getchar();
     getch();
}
float f1(float x)
{
    return((x+2.5)/(x+6.1));
}
float f2(float x)
{
    return((exp(-x/7.5))*(cos(0.1*x))*(sin(0.2*x)));
}
float f3(float x)
{
    return(log(x*x+x+6));
}
float integ(float a,float b,int n,func f)
{
    float S,h,dx;
    h=(b-a)/n;
    S=f(a)+f(b);
    dx=a+h;
    while(dx<b)
    {
        S=S+2*f(dx);
        dx=dx+h;
    }
    return(S*0.5*h);
}
float toch(float a,float b,float E,func f)
{
    int n;
    float S1,S2;
    n=2;
    S1=integ(a,b,n,*f);
    do
    {
        n=n*2;
        S2=S1;
        S1=integ(a,b,n,*f);
    }
    while(fabs(S1-S2)>E);
    return(S1);
}
Ovis вне форума Ответить с цитированием
Старый 02.04.2011, 11:57   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

Код:
#include <iostream>
using namespace std;

float f1(float x){
    return((x+2.5)/(x+6.1));
}
float f2(float x){
    return((exp(-x/7.5))*(cos(0.1*x))*(sin(0.2*x)));
}
float f3(float x){
    return(log(x*x+x+6));
}

//а b - границы отрезка, h - ширина шага, float func(float x) - функция, передающаяся в функцию
float trapec(float a,float b,float h,float func(float x)){
	float sum=0;
	for (float i=a+h;i<b;i+=h)
		sum+=func(i);
	return h*(((func(a)+func(b))/2)+sum);
}

int main(){
	setlocale(0,"Rus");
	int i,k;
	float a,b,h;
	cout<<"Выберите одну из трех функций";
	cin>>i;
	cout<<"Введите границы отрезка : ";
	cin>>a>>b;
	cout<<"Введите количество отрезков (чем больше отрезков, тем больше точность, но не переборщите)";
	cin>>k;
	if (k%2)//если k - нечетное - делаем четным
		k--;
	h=fabs(a-b)/k;//вычисление длины отрезка
	float I;
	switch(i){
		case 1:I=trapec(a,b,h,f1);		break;
		case 2:I=trapec(a,b,h,f2);		break;
		case 3:I=trapec(a,b,h,f3);		break;
		default:		break;
	}
	cout<<I<<endl
	system("pause");
}
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 02.04.2011, 23:36   #3
Ovis
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 15
По умолчанию

Конечно, спасибо, но мне нужно, к сожалению, исправить старый вариант программы...
Ovis вне форума Ответить с цитированием
Старый 03.04.2011, 00:27   #4
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

я так понял она вот тут

Код:
k=toch(a1,b1,E,*f3);
            printf("Otvet %8.6f\n",k)
;
Код:
m=toch(a1,b1,E,*f2);
            printf("Otvet %8.6f\n",k);
Код:
 t=toch(a1,b1,E,*f3);
            printf("Otvet %8.6f\n",k);
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 03.04.2011, 10:32   #5
Ovis
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 15
По умолчанию

Точно! Огромное спасибо!))))))
Ovis вне форума Ответить с цитированием
Старый 03.04.2011, 12:59   #6
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а ларчик-то просто открывался всего-то упростить switch и все )
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 03.04.2011, 17:35   #7
Ovis
Пользователь
 
Регистрация: 02.04.2011
Сообщений: 15
По умолчанию

К сожалению, преподаватель принимает от нас пока только вот такие длиннющие программы. Я только на первом курсе учусь... Поэтому пишем проги таким "новичковским" языком. Вот... Слушай, может, тогда подскажешь мне, как подключить русский язык?! А то меня не вставляет писюкать на транслите)) Но нужно, чтоб русский язык выводился с помощью функций puts и printf. Других мы пока не изучали))
Ovis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление интеграла методом трапеций Sepherot Помощь студентам 1 21.12.2010 22:18
Решение интеграла методом трапеций GOODMAN Паскаль, Turbo Pascal, PascalABC.NET 2 12.04.2010 22:09
Вычисление определенного интеграла методом трапеций Alexander886 Помощь студентам 0 06.12.2009 20:43
Методом трапеций высислить значение интеграла zloygeniyrus Помощь студентам 0 09.04.2009 08:44
Составить программу численного расчета интеграла методом трапеций J0n1cK Паскаль, Turbo Pascal, PascalABC.NET 0 05.04.2009 00:02