Форум программистов, компьютерный форум CyberForum.ru

Перевод кода из Турбо паскаля в С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
24.02.2010, 21:04     Перевод кода из Турбо паскаля в С++ #1
Помогите перевести код из турбо Паскаля в С++
Pascal
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
{$N+}
{ Вычисление интегpала десятиточечным методом Гаусса }
uses crt,graph; 
var aaa,bbb,kkk: real; 
{константы десятиточечного метода Гаусса}
const
g10c1=0.9739065285/6. 2012983932; 
g10c2=0.8650633667/6. 2012983932; 
g10c3=0.6794095683/6. 2012983932; 
g10c4=0.4333953941/6. 2012983932; 
g10c5=0.1488743390/6. 2012983932; 
g10x1=0.0666713443/6. 2012983932; 
g10x2=0.1494513492/6. 2012983932; 
g10x3=0.2190863625/6. 2012983932; 
g10x4=0.2692667193/6. 2012983932; 
g10x5=0.2955242247/6. 2012983932; 
function F(x: real): real; {интегрируемая функция}
begin
F: = kkk*(exp(-aaa*x) - exp(-bbb*x)); 
end; 
function gauss_calc(a,b: real): real; {сам десятиточечный метод Гаусса}
var n,m,s,s1,s2,s3,s4,s5: real; 
begin
m: =(b+a) /2; n: =(b-a) /2; 
s1: =g10c1*(f(m+n*g10x1) +f(m-n*g10x1)); 
s2: =g10c2*(f(m+n*g10x2) +f(m-n*g10x2)); 
s3: =g10c3*(f(m+n*g10x3) +f(m-n*g10x3)); 
s4: =g10c4*(f(m+n*g10x4) +f(m-n*g10x4)); 
s5: =g10c5*(f(m+n*g10x5) +f(m-n*g10x5)); 
s: =s1+s2+s3+s4+s5; 
gauss_calc: =s*(b-a); 
end; 
{рекурсивная ф-ция подсчета с заданной точностью}
{ gc - ранее посчитаный интеграл на интервале (a,b) }
function gauss(a,b,eps,gc: real): real; 
var t,ga,gb: real; 
begin
t: =(a+b) /2; {разбиваем интервал на две половинки}
ga: =gauss_calc(a,t); {в каждой половинке считаем интеграл}
gb: =gauss_calc(t,b); 
if abs(ga+gb-gc) >eps then {проверяем точность вычислений}
begin
ga: =gauss(a,t,eps/2,ga); {рекурсия для первой половинки}
gb: =gauss(t,b,eps/2,gb); {рекурсия для второй половинки}
end; {при этом точность повышаем, чтобы }
{при сложении ошибка не накапливалась}
gauss: =ga+gb; {интеграл = сумме интегралов половинок}
end; 
procedure inputnum(prm: string; var num: real; lb,ub: real); {процедура ввода данных}
var q: boolean; 
begin
repeat
write('Введите ',prm,' '); readln(num); 
q: =(lb>=num) or (num>ub); 
if q then writeln('Число должно быть от ', lb: 0: 0,' до ',ub: 0: 0); 
until not q; 
end; 
procedure titul; {Вывод титульного листа}
var f: text; s: string; 
i: integer; 
begin
clrscr; 
assign(f,'f42. txt'); 
reset(f); 
while not eof(f) do begin
readln(f,s); 
while length(s) <79 do s: =' '+s+' '; 
writeln(s); 
end; 
close(f); 
end; 
function main_menu: integer; {Главное меню}
var i: integer; 
begin
Writeln('=========================================================='); 
Writeln('Что будем делать? '); 
Writeln('----------------------------------------------------------'); 
Writeln('0 - выход'); 
Writeln('1 - решать тестовый пример a=1,5 b=6 k=10 eps = 0.0001'); 
Writeln('2 - решать пример с произвольными a, b, k, eps'); 
Writeln('----------------------------------------------------------'); 
Write('Выбор >>> '); readln(i); 
Writeln('=========================================================='); 
main_menu: =i; 
end; 
procedure outputgraph(a,b,a1,b1: real; n: integer); {Вывод графика}
var i,j,j1,k: integer; t,y1,y2,x1,x2,x,y: double; s: string; 
begin
clearviewport; 
x1: =a1-1; x2: =b1+1; 
if x1<0.5 then x1: =-0.5; 
y2: =f(ln(bbb/aaa) /(bbb-aaa)) *1.2; 
y1: =-y2; 
{Линия y=0}
setcolor(15); 
y: =0; 
j: =trunc(480*(y-y2) /(y1-y2)); 
line(0,j,639,j); 
{Линии x=a,x=b}
setcolor(5); 
j: =trunc(480*(-y2) /(y1-y2)); 
i: =trunc(640*(a-x1) /(x2-x1)); 
j1: =trunc(480*(f(a) - y2) /(y1-y2)); 
line(i,j, i,j1); 
i: =trunc(640*(b-x1) /(x2-x1)); 
j: =trunc(480*(-y2) /(y1-y2)); 
j1: =trunc(480*(f(b) - y2) /(y1-y2)); 
line(i,j, i,j1); 
{Сам график}
setcolor(14); 
setlinestyle(0,0,3); 
t: =(b-a) /n; 
k: =0; 
j1: =trunc(480*(-y2) /(y1-y2)); 
for i: =0 to 640 do begin
x: =(x2-x1) *i/640+x1; 
y: =f(x); 
j: =trunc(480*(y-y2) /(y1-y2)); 
if j>479 then j: =479; 
if j<0 then j: =0; 
setcolor(14); 
setlinestyle(0,0,3); 
if i=0 then moveto(i,j) else lineto(i,j); 
setcolor(8); 
if (x>t*k+a) then begin
k: =k+1; 
setcolor(15); 
end; 
setlinestyle(0,0,1); 
if (x>=a) and (x<=b) then line(i,j, i,j1); 
end; 
setcolor(15); 
y: =f(b); 
i: =trunc(640*(b-x1) /(x2-x1)); 
j: =trunc(480*(y-y2) /(y1-y2)); 
line(i,j, i,j1); 
setlinestyle(0,0,1); 
setcolor(12); 
{Подписи}
setcolor(13); 
str(a: 6: 6,s); 
s: ='a='+s; 
i: =trunc(640*(a-x1) /(x2-x1)); 
outtextxy(i,j1+2,s); 
str(b: 6: 6,s); 
s: ='b='+s; 
i: =trunc(640*(b-x1) /(x2-x1)); 
outtextxy(i-10,j1+2,s); 
setcolor(15); 
y: =0; 
j: =trunc(480*(y-y2) /(y1-y2)); 
outtextxy(5,j+3,'y=0'); 
{Ждем... }
readkey; 
end; 
procedure equateit(a,b: real; eps: real); {процедура подсчета значения интеграла и вывода графика на экран}
var integral: real; i,j: integer; 
begin
Integral: =gauss(a,b,eps,gauss_calc(a,b)); 
writeln('Интеграл = ', integral: 0: 6); 
readkey; 
i: =vga; j: =vgahi; 
initgraph(i,j,'. . \bgi'); 
outputgraph(a,(b+a) /3,a,b,1); 
outputgraph((b+a) /3,2*(b+a) /3,a,b,1); 
outputgraph(2*(b+a) /3,b,a,b,1); 
closegraph; 
end; 
var sel: integer; 
eps: real; 
begin
titul; 
Writeln('=========================================================='); 
readkey; 
repeat
clrscr; 
sel: =main_menu; 
case sel of
1: begin
aaa: =1.5; bbb: =6; kkk: =10; 
eps: =1e-4; 
equateit(aaa,bbb,eps); 
end; 
2: begin
inputnum('a',aaa,0,1000); 
inputnum('b',bbb,-1000,1000); 
inputnum('k',kkk,-1000,1000); 
inputnum('точность',eps,0.000000001,1); 
equateit(aaa,bbb,eps); 
end; 
end; 
until sel=0; 
end.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NAG
8 / 8 / 1
Регистрация: 15.03.2009
Сообщений: 267
04.03.2010, 09:01     Перевод кода из Турбо паскаля в С++ #2
Алгоритм не меняется. Береш учебник по Си ищешь аналоговые ф-и и замеяешь в своей проге.
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
04.03.2010, 09:40     Перевод кода из Турбо паскаля в С++ #3
единственное реши как графику будешь выводить...
и под какую ось писать будешь и каким компилятором будешь пользоваться...
а всё остальное делается путём простого перевода с паскаля в С
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
09.03.2010, 22:31  [ТС]     Перевод кода из Турбо паскаля в С++ #4
Да мне хотя б без графики. Просто сделать аналогичный подсчет, только на С++. Если кому-то не сложно, помогите перевести код на С++. Ведь кому-то это как семечки...
smithy69
17 / 16 / 1
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 22:34     Перевод кода из Турбо паскаля в С++ #5
кому это как семечки, у него много подсолнухов)
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
09.03.2010, 22:41  [ТС]     Перевод кода из Турбо паскаля в С++ #6
ну все же я надеюсь, что кто-то поможет. или может у кого есть вариант на С++ нахождение интеграла методом Гаусса...
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
10.03.2010, 10:21  [ТС]     Перевод кода из Турбо паскаля в С++ #7
Неужели ни у кого не было такого задания (((
Не один день уже ищу хоть какой-нить исходник на решение интеграла по формуле Гаусса и ничего не нахожу. Меня б уже даже нерабочий бы устроил)
Алгоритм решения по идее такой, вот только не понятно как вводить
Перевод кода из Турбо паскаля в С++
Перевод кода из Турбо паскаля в С++
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
10.03.2010, 11:03     Перевод кода из Турбо паскаля в С++ #8
перевод с Turbo Pascal в С++ (без графики)
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
 
double aaa, bbb, kkk;
 
const double g10c1=0.9739065285/6.2012983932; 
const double g10c2=0.8650633667/6.2012983932; 
const double g10c3=0.6794095683/6.2012983932; 
const double g10c4=0.4333953941/6.2012983932; 
const double g10c5=0.1488743390/6.2012983932; 
const double g10x1=0.0666713443/6.2012983932; 
const double g10x2=0.1494513492/6.2012983932; 
const double g10x3=0.2190863625/6.2012983932; 
const double g10x4=0.2692667193/6.2012983932; 
const double g10x5=0.2955242247/6.2012983932; 
 
double F(double x)//интегрируемая функция
{
    return kkk*(exp(-aaa * x) - exp(-bbb * x)); 
}
 
double gauss_calc(double a, double b)//сам десятиточечный метод Гаусса
{
    double n,m,s,s1,s2,s3,s4,s5; 
 
    m =(b + a) /2; 
    n =(b - a) /2; 
    s1 = g10c1 * (F(m + n * g10x1) + F(m - n * g10x1)); 
    s2 = g10c2 * (F(m + n * g10x2) + F(m - n * g10x2)); 
    s3 = g10c3 * (F(m + n * g10x3) + F(m - n * g10x3)); 
    s4 = g10c4 * (F(m + n * g10x4) + F(m - n * g10x4)); 
    s5 = g10c5 * (F(m + n * g10x5) + F(m - n * g10x5)); 
    s = s1 + s2 + s3 + s4 + s5; 
    return s * (b - a); 
} 
//рекурсивная ф-ция подсчета с заданной точностью
// gc - ранее посчитаный интеграл на интервале (a,b) 
double gauss(double a, double b, double eps, double gc)
{
    double t, ga, gb; 
    t = (a + b) /2; //разбиваем интервал на две половинки
    ga = gauss_calc(a, t); //в каждой половинке считаем интеграл
    gb = gauss_calc(t, b); 
    if (abs(ga + gb - gc) > eps) //проверяем точность вычислений
    {
        ga = gauss(a, t, eps/2, ga); //рекурсия для первой половинки
        gb = gauss(t, b, eps/2, gb); //рекурсия для второй половинки
    } //при этом точность повышаем, чтобы 
    //при сложении ошибка не накапливалась
    return ga + gb; //интеграл = сумме интегралов половинок
} 
 
void inputnum(char* prm, double &num, double lb, double ub) //процедура ввода данных
{
    bool q = false;
    
    do
    {
        printf("Введите %s ",prm); 
        scanf("&lf", &num); 
        q = (lb >= num) || (num > ub); 
        if (q) 
            printf("Число должно быть от %5.0lf до %5.0lf", lb, ub); 
    }
    while (!q); 
}
 
int main_menu()//Главное меню
{
    int i; 
 
    printf("==========================================================\n"); 
    printf("Что будем делать? \n"); 
    printf("----------------------------------------------------------\n"); 
    printf("0 - выход\n"); 
    printf("1 - решать тестовый пример a=1,5 b=6 k=10 eps = 0.0001\n"); 
    printf("2 - решать пример с произвольными a, b, k, eps\n"); 
    printf("----------------------------------------------------------\n"); 
    printf("Выбор >>> "); 
    scanf("%d",&i); 
    printf("==========================================================\n"); 
    return i; 
} 
 
void equateit(double a, double b, double eps) //процедура подсчета значения интеграла и вывода графика на экран
{
    double integral;
    int i,j; 
 
    integral = gauss(a, b, eps, gauss_calc(a, b)); 
    printf("Интеграл = %5.7lf\n", integral); 
    getchar();
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int sel; 
    double eps; 
    printf("==========================================================\n"); 
    do
    {
        sel = main_menu(); 
        
        switch (sel)
        {
            case 1: 
                aaa = 1.5; 
                bbb = 6; 
                kkk = 10; 
                eps = 1e-4; 
                equateit(aaa,bbb,eps); 
                break;
            case 2:
                inputnum("a",aaa,0,1000); 
                inputnum("b",bbb,-1000,1000); 
                inputnum("k",kkk,-1000,1000); 
                inputnum("точность",eps,0.000000001,1); 
                equateit(aaa,bbb,eps); 
                break;
        }
    }
    while (sel==0); 
}
ПростоЯ
184 / 101 / 1
Регистрация: 30.05.2009
Сообщений: 746
10.03.2010, 11:44  [ТС]     Перевод кода из Турбо паскаля в С++ #9
При запуске программы и выбора последнего пункта (рещить пример с введенными данными) программа виснет, постоянно выводя на экран - введите b,введите b,введите b,введите b,введите b,.....
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
10.03.2010, 12:29     Перевод кода из Турбо паскаля в С++ #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void inputnum(char* prm, double &num, double lb, double ub) //процедура ввода данных
{
    bool q = false;
    do
    {
        printf("Введите %s ", prm); 
        scanf("%lf", &num); 
        q = (lb >= num) || (num > ub); 
        if (q) 
            printf("Число должно быть от %5.7lf до %5.7lf", lb, ub); 
    }
    while (q);
}
вот здесь ошибка была
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 16:52     Перевод кода из Турбо паскаля в С++
Еще ссылки по теме:

Перевод кода с паскаля в С++ C++
Перевод кода с Паскаля на С++ C++
Перевод кода из Паскаля в С++ C++

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

Или воспользуйтесь поиском по форуму:
кирилл0
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 5
30.11.2010, 16:52     Перевод кода из Турбо паскаля в С++ #11
const double g10c1=0.9739065285/6.2012983932;
const double g10c2=0.8650633667/6.2012983932;
const double g10c3=0.6794095683/6.2012983932;
const double g10c4=0.4333953941/6.2012983932;
const double g10c5=0.1488743390/6.2012983932;
const double g10x1=0.0666713443/6.2012983932;
const double g10x2=0.1494513492/6.2012983932;
const double g10x3=0.2190863625/6.2012983932;
const double g10x4=0.2692667193/6.2012983932;
const double g10x5=0.2955242247/6.2012983932;


а можно это все как то более культурно написать в виде массива ?
Yandex
Объявления
30.11.2010, 16:52     Перевод кода из Турбо паскаля в С++
Ответ Создать тему
Опции темы

Текущее время: 01:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru