Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 4

Программа, вычисляющая интеграл методом трапеций и рисующая график

07.04.2015, 13:35. Показов 1992. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть готовая программа, не очень хотела работать ни в одной операционке, но я ее кое-как заставил работать на ХР.
Делал ее не я. Файлы .ехе работают, который считает интеграл запускается даже на восьмерке. А вот .срр не могу откомпилировать, что Devcpp, что Borland выдают ошибки. Могли бы вы посмотреть в чем проблема.
Здесь архив c самой программой http://файлообменник.рф/6qwaeztcnmr5.html

Коды:
файл 1-й integral.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include<iostream>
#include <stdlib.h>
#include<fstream>
#include <Windows.h>
#include<math.h>
#include<conio.h>
#define MAX 1000
#define NMAX 500
 
using namespace std;
void vvod(),integ(),vivod(),grafik();
double f(double);
double integf(double,double);
double s=0,s1,a,b,c,p1,p2;
int vid,end=0,n;
 
int main()  
{
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); 
vvod();
if(end==1) //если аварийный флаг принял значение 1
    {getch();return 0;}//то программа закрывается
integ();
vivod();
grafik();
return 0;
}
 
void grafik() //делается запрос хочет ли пользователь вывести график на экран 
{int g;
cout<<"\n\nНарисовать график?\n1. Да\n2. Нет\n";
cin>>g;
if(g==1) //если да то открывается служебный файл и вводятся из него данные
    {
    fstream fout;
    fout.open("inf.txt",ios::out);
    fout<<vid<<" "<<a<<" "<<b<<" "<<c<<" "<<p1<<" "<<p2<<" "<<s<<" "<<s1<<" "<<n<<"\n";
    fout.close();
    system("grafic.exe");
    }
}
 
 
void vvod()//ввод информации 
{
start:
cout<<"Выберите способ ввода данных:\n1. С клавиатуры\n2. Из файла\n";
int sp;
cin>>sp;
if(sp!=1&&sp!=2){cout<<"Данные не корректны. Попробуйте снова";end=1;goto start;}
if(sp==1)//если с клавиатуры
    {
    gstart:
    cout<<"Выберите вид функции:\n1. y=a*x^3+b*x+c\n2. y=a*sin(x+b)+c\n3. y=a*log(x+b)+c\n";
    cin>>vid;
    if(vid!=1&&vid!=2&&vid!=3){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto gstart;}
    fstart:
    cout<<"Введите коэффициенты -1000<=a,b,c<=1000 \n";
    cin>>a>>b>>c;
    if(!(-MAX<=a&&a<=MAX)||!(-MAX<=b&&b<=MAX)||!(-MAX<=c&&c<=MAX)){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto fstart;}
    xstart:
    cout<<"Введите пределы интегрирования -1000<=p1,p2<=1000\n";
    cin>>p1>>p2;
    if(!(-MAX<=p1&&p1<=MAX)||!(-MAX<=p2&&p2<=MAX)){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto xstart;}
    jstart:
    cout<<"Введите количество разбиений 2<=n<=500\n";
    cin>>n;
    if(!(2<=n&&n<=NMAX)){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto jstart;}
    }
if(sp==2)//если из файла
    {
        tstart:
    cout<<"Введите имя файла: ";
    char fname[20];
    cin>>fname;
    hstart:
    cout<<"Выберите вид функции:\n1. y=a*x^3+b*x+c\n2. y=a*sin(x+b)+c\n3. y=a*log(x+b)+c\n";
    cin>>vid;
    if(vid!=1&&vid!=2&&vid!=3){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto hstart;}
    fstream qwe;
    qwe.open(fname,ios::in);
    qwe>>a>>b>>c>>p1>>p2>>n;
    if(!(-MAX<=a&&a<=MAX)||!(-MAX<=b&&b<=MAX)||!(-MAX<=c&&c<=MAX)||
        !(-MAX<=p1&&p1<=MAX)||!(-MAX<=p2&&p2<=MAX)  || !(2<=n&&n<=NMAX))
        {cout<<"Данные не корректны. Попробуйте снова.";end=1;goto tstart;}
    cout<<"vid = "<<vid<<"\n"<<"a = "<<a<<", b = "<<b<<", c = "<<c<<"\n";
    cout<<"p1 = "<<p1<<", p2 = "<<p2<<"\n";
    qwe.close();
    }
if(vid==3)//условие в 3 функции из-за логарифма
    {if(p1<p2&&p1<0.1){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto tstart;}
    if(p1>p2&&p2<0.1){cout<<"Данные не корректны. Попробуйте снова.";end=1;goto tstart;}
    }
    
}
 
 
void vivod()//вывод результатов расчетов
{
cout<<"Площадь методом трапеций равна: "<<s;
cout<<"\nТочное значение: "<<s1;
if(s1!=0)
    cout<<"\nПогрешность равна: "<<fabs((s1-s)/s1)*100<<" %";
getch();
}
 
void integ()//интегрирование
{
double shag,p;
int znak=1;
if(p1>p2)
    {p=p1;
    p1=p2;
    p2=p;
    znak=-1;
    }
shag=(p2-p1)/n;
for(double q=p1;q<p2;q+=shag)
    {s+=((f(q)+f(q+shag))/2)*shag;
    }
s*=znak;
s1=integf(p1,p2)*znak;
}
 
 
double integf(double p1, double p2)//возврат значения интеграла по формуле Ньютона-Лейбница в зависимости от функции
{
if(vid==1)
    return ((a*p2*p2*p2*p2)/4+(b*p2*p2)/2+c*p2) - ((a*p1*p1*p1*p1)/4+(b*p1*p1)/2+c*p1);
if(vid==2)
    return (-a*cos(p2+b)+c*p2) - (-a*cos(p1+b)+c*p1);
if(vid==3)
    return (a*(p2+b)*log(fabs(p2+b))-a*p2+c*p2) - (a*(p1+b)*log(fabs(p1+b))-a*p1+c*p1);
}
 
double f(double x)//возврат значения в зависимости от функции
{
if(vid==1)
    return a*x*x*x+b*x+c;
if(vid==2)
    return a*sin(x+b)+c;
if(vid==3)
    return a*log(fabs(x+b))+c;
}
файл 2-й grafic.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include<iostream> // поток ввода вывода
#include<stdlib.h> // 
#include<fstream>//поток ввод вывод в файл 
#include<conio.h> // для getch
#include <graphics.h>
#include<math.h>
#define MAXN 500
#define xkol 400
#define ykol 320
#define xstart 10
#define ystart 150
 
double a,b,c,p1,p2;
double stepx,stepy;
double f(double);
int gdriver = DETECT, gmode, errorcode;
int vid,y0,n,end;
void vvod(),vivod(),maxmin(),ox(),graf_f(),trapez();
 
int main() 
{
clrscr(); //очистка экрана
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); 
initgraph(&gdriver, &gmode,""); //инициализация графического модуля
vvod();
vivod();
bar(xstart-10,ystart-10,xkol+xstart+10,ykol+ystart+10); //обозначение рабочей области
maxmin();
if(end==1)return 0;
ox();
graf_f();
trapez();
getch();getch();
return 0;
}
 
void trapez() //нанесение трапеций на график
{
double step,d;
step=(p2-p1)/n;
setcolor(4);
line(xstart,y0,xstart,y0-(int)(f(p1)/stepy)); // первая линия трапеций
for(d=step;d<p2-p1+step/2;d+=step)//+step
    {
 
    line(xstart+(int)(d/stepx),y0,xstart+(int)(d/stepx),y0-(int)(f(d+p1)/stepy));// вертикальная
    line(xstart+(int)(d/stepx),y0-(int)(f(d+p1)/stepy),xstart+(int)((d-step)/stepx),y0-(int)(f(d+p1-step)/stepy));//наклонная
    getch();
    }
cout<<"\nНажмите любую клавишу для выхода";
getch();
}
 
void graf_f() //нанесение самого графика функции
{
setcolor(2);
for(int q=0;q<=xkol;q++)
    {
    line(q+xstart,y0-(int)( f(p1+(q*stepx))/stepy ),q+1+xstart,y0-(int)( f(p1+((q+1)*stepx))/stepy ));///две линии
    line(1+q+xstart,y0-(int)( f(p1+(q*stepx))/stepy ),q+1+xstart,1+y0-(int)( f(p1+((q+1)*stepx))/stepy ));
    }
getch();
}
 
void ox()// нанесение на график оси Х 
{
char *tmp;
setcolor(4);
line(xstart,y0,xstart+xkol,y0);
        //стрелочка
line(xstart+xkol,y0,xstart+xkol-5,y0-5);
line(xstart+xkol,y0,xstart+xkol-5,y0+5);
outtextxy(xstart+xkol, y0-10, "x");
tmp=itoa(p1, tmp, 10); //ИЗ ЧИСЛА В СТРОКУ
outtextxy(xstart,y0+5, tmp);
tmp=itoa(p2, tmp, 10);
outtextxy(xstart+xkol-10, y0+5, tmp);
}
 
void maxmin() //вычисление максимума и минимума функции
{
double maxf,minf;
stepx=(p2-p1)/xkol;
if(stepx==0){cout<<"\n\nГрафик невозможно построить";end=1;getch();}
maxf=f(p1);
minf=f(p1);
for(double q=p1;q<=p2;q+=stepx)
    {if(maxf<=f(q))maxf=f(q);
     if(minf>=f(q))minf=f(q);
    }
if(maxf<=0)
    {maxf=0;
    y0=ystart - 10;
    }
if(minf>=0)
    {minf=0;
    y0=ykol+ystart - 10;
    }
stepy=(maxf-minf)/ykol;
 
if(stepy==0){cout<<"\nГрафик невозможно построить\n";end=1;getch();}
if(0>minf&&0<maxf)
    y0=(int)(fabs(maxf)/stepy+ystart) - 10;
 
cout<<"\n\nНажмите любую клавишу для продолжения";
}
void vvod() //ввод информации из служебного файла
{
fstream fin;
fin.open(".\\inf.txt",ios::in);
fin>>vid>>a>>b>>c>>p1>>p2>>s>>s1>>n;
fin.close();
}
void vivod()  //вывод результатов расчетов 
{
double s,s1;
cout<<"Площадь методом трапеций равна: "<<s;
cout<<"\nТочное значение: "<<s1;
if(s1!=0)
cout<<"\nПогрешность равна: "<<fabs((s1-s)/s1)*100<<" %";
}
double f(double x) //возврат значения в зависимости от функции 
{
if(vid==1)
    return a*x*x*x+b*x+c;
if(vid==2)
    return a*sin(x+b)+c;
if(vid==3)
    return a*log(fabs(x+b))+c;
}
Код вроде правильный, потому что .ехе ведь как-то скомпилировал тот, кто это написал, но у меня компиляторы не хотят. Напишите какие ошибки, если есть, или скиньте скомпилированные .ехе пожалуйста. Хотя бы graphic.exe
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2015, 13:35
Ответы с готовыми решениями:

Интеграл методом трапеций.
помогите вычислить интеграл методом трапеций от функции sqr(tg(x))+sqr(ctg(x)) на промежутке

Интеграл методом трапеций
Кто знает, как написать код вычисления интеграла методом трапеций? Помогите тупой девочке(

Интеграл методом трапеций
Помогите пожалуйста! Нужно разработать программу, которая вычисляет точное и приближенное значения определенного интеграла методом...

7
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.04.2015, 15:51
graphics.h - древняя Borland-библиотека времён MS-DOS, поэтому скомпилировать это можно только древним Borland C++. Но заработает ли в Windows - не известно, и не ясно, зачем ты вставил функции Windows типа SetConsoleCP().
Либо graphics.h, либо функции Windows и графика Windows.
0
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 4
08.04.2015, 14:06  [ТС]
Блин все говорят, что grafics.h древняя, попробуйте кто-нибудь в виртуальной машине скомпилировать этот код, у меня странные ошибки например undefined symbol _line in modulи т.д. при запуске, а при компиляции нет ошибок.
SetConsol для русского ввода-вывода
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.04.2015, 19:47
В твоей программе ошибки даже без графики. xstart, ystart в main() не определены, s, s1 в vvod() и т. д. Так что просто скомпилировать не выйдет.
0
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 4
09.04.2015, 03:15  [ТС]
Все, я сделал. Поставил в виртуалку очень старую винду и такой же Борланд. Насчет ошибок, s1, s да неопределены, но остальные норм. Теперь надо как-то в старом Борланде сделать русский ввод-вывод, ни SetConsoleCp ни setlocale не действуют
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
09.04.2015, 04:07
Цитата Сообщение от Johny3Teers Посмотреть сообщение
Поставил в виртуалку очень старую винду и такой же Борланд.
В чем смысл самого процесса?
Шоб було?

За это время можно было спокойно переписать прогу под актуальный GUI.
0
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 4
09.04.2015, 07:52  [ТС]
Ну что с меня препод требует то и пробую делать, а например что такое GUI я даже не знаю т.к. только пару месяцев как начал учить язык, тем более нам его дают на всем старом
0
09.04.2015, 10:13

Не по теме:

Похоже, с преподаванием в стране проблемы, если до сих пор используют такую древность.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2015, 10:13
Помогаю со студенческими работами здесь

Интеграл методом трапеций
Программа считает интеграл методом трапеций. Почему то, если задать, например, функцию y = x , и посчитать на отрезке -0,1234 до 0,1234 и...

Вычислить интеграл методом трапеций.
Вычислить интеграл методом трапеций, разделив отрезок интегрирования на 36 частей. Проверить результат с помощью метода симпсона. ...

Вычислить интеграл методом трапеций
Составите, пожалуйста, программу по методу трапеций, для вычисления значения определённого интеграла: ...

Вычислить интеграл методом трапеций
Вычислить интеграл от 0 до 4 dx нужно вычислить в визуал бейсике.програмный код нужен для вычисления

Двойной интеграл методом трапеций
Добрый день! Необходимо вычислить двойной интеграл методом трапеций. Я нашел формулу в данной методичке (раздел 2.2.2): delete]При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru