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

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

07.04.2015, 13:35. Показов 1969. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru