Помогите пожалуйста програму на паскале записать на с++

  • Автор темы quickdeath
  • Дата начала
Q

quickdeath

Гость
#1
Код:
TYPE VEC=ARRAY [0..100] OF REAL;
VAR N:INTEGER; A,B,H,S:REAL; X,F,C:VEC;
FUNCTION Y(X:REAL):REAL
BEGIN Y:=SIN(X) END;
PROCEDURE TAB(N:INTEGER;A,H:REAL; FUNCTION Y:REAL;VAR X,F:VEC);
VAR I:INTEGER;
BEGIN
FOR I:=0 TO N DO BEGIN X[I]:=A+I*H; F[I]:=Y(X[I]) END
END;
PROCEDURE CS(N:INTEGER; VAR X,F,C:VEC);
VAR I,J,M:INTEGER; A,B,R:REAL; K:VEC;
BEGIN K[1]:=0.0; C[1]:=0.0;
FOR I:=2 TO N DO BEGIN J:=I-1; M:=J-1;
A:=X[I]-X[J]; B:=[J]-X[M]; R:=2*(A+B)- B*C[J]; C[I]:=A/R;
K[I]:=(3.0*((F[I]-F[J])/A-(F[J]-F[M])/B)-B*K[J])/R
END;
C[N]:=K[N];
FOR I:=N-1 DOWNTO 2 DO C[I]:=K[I]-C[I]*C[I+1]
END;
PROCEDURE SSP(N:INTEGER; H:REAL;VAR F,C:VEC; VAR S:REAL);
VAR I:INTEGER; R:REAL;
BEGIN S:=(F[0]+F[N])/2; R:=0.0;
FOR I:=1 TO N-1 DO BEGIN S:=S+F[I]; R:=R+C[I+1] END;
S:=(S-R*H*H/6.0)*H
END;
BEGIN
REPEAT WRITE('N,A,B?'); REALN(N,A,B);; H:=(B-A)/N;
TAB(N,A,H,Y,X,F); CS(H,X,F,C); SSP(N,H,F,C,S);
WRITELN('S=',S)
UNTIL FALSE
END.
 
A

AlexanderClubLife

Гость
#2
У тебя масив Риал, а можеш точнее сказать? В С++ десятичные дроби разные бывают: бывают с 2мя цифрами после запятой, бывают больше...
вместо begin, end пиши {,} переменные обьявляються немного по-другому:вместо VAR I:INTEGER; пиши
int i
цыкл FOR I:=0 TO N DO записывается так for(i=0;i<=n;i++)
 
I

ierofant

Гость
#3
Лучше бы ты сказал, что должна программа делать. Я вот вообще уже очень плохо помню паскаль.
 
Q

quickdeath

Гость
#4
У тебя масив Риал, а можеш точнее сказать? В С++ десятичные дроби разные бывают: бывают с 2мя цифрами после запятой, бывают больше...
вместо begin, end пиши {,} переменные обьявляються немного по-другому:вместо VAR I:INTEGER; пиши
int i
цыкл FOR I:=0 TO N DO записывается так for(i=0;i<=n;i++)
мне не так важно сколько цыфр после запятой.. я просто паскаль вообще не учил...
 
A

AlexanderClubLife

Гость
#5
аааа! ну из того, что я знаю в Пасале - то всю эту прогу перевести не смогу! Могу кусочками написать!
Просто в паскале real может быть double, float в Си
 
I

ierofant

Гость
#6
Попроси кого-нибудь из Pascal Team объяснить, что программа делает. А мы потом напишем её на С++.
 
I

ierofant

Гость
#8
OKEN ,
TAB судя по всему процедура, такая же как CS и SPP, описание которой нам не потрудились предоставить.

quickdeath ,
Ты, наверно, первую строчку в программе забыл.
PROCEDURE TAB(....
 

hosm

* so what *
18.05.2009
2 442
9
#9
наверно, как-то так в паскале, где Y:Funct (мб, Var и не надо) - функциональный тип
function(x:real):real;
Думаю, вместо real в с++ можно double поюзать.
Код:
PROCEDURE TAB(N:INTEGER; A,H:REAL; Var Y:Funct; VAR X,F:VEC);
VAR I:INTEGER; BEGIN FOR I:=0 TO N DO BEGIN X[I]:=A+I*H; F[I]:=Y(X[I]) END END;
основная программа зациклена - ввод параметров и вычисления:
Код:
BEGIN REPEAT WRITE('N,A,B?'); REALN(N,A,B);; H:=(B-A)/N; TAB(N,A,H,Y,X,F); CS(H,X,F,C); SSP(N,H,F,C,S); WRITELN('S=',S) UNTIL FALSE END.
Попроси кого-нибудь из Pascal Team объяснить, что программа делает.
какие-то вычисления =) TAB - табулирование, т.е. вычисляет ф-цию Y(X) на интервале A,B, разбитом на N отрезков с шагом H.
A,B, и N вводятся в основной программе, вычисляется шаг H, вызывается TAB, а потом считаются в CS массивы каких-то коэффициентов, и в SPP - какая-то S, которая и выводится на экран.
 
I

ierofant

Гость
#10
quickdeath , ты что поиздеваться решил :) ?? Что это за псевдо-вычисления?

Я перевёл код на C++, не стал на отдельные функции разносить, и так меня эти непонятные вычисления достали

C++:
#include <iostream>

typedef double (*Func)(double); // это тип для Y в твоей проге

int main ()
{
int n;
double a, b;
std::cout << "Введите n", std::cin >> n;
std::cout << "Введите a", std::cin >> a;
std::cout << "Введите b", std::cin >> b;

double h = (a - b) / 2, x [n], f [n];

Func func = &y;  // функция Y; в твоей проге она тоже неизвестно откуда берётся, вот и у меня также

for (int i = 0; i < n; i++)
{
x [i] = a + i * h;
f [i] = (*func) (x [i]);
}

double k [n], c [n];
k [0] = 0;
c [0] = 0;

for (int i = 1; i < n; i++)
{
a = x [i] - x [i - 1];
b = x [i - 1] - x [i - 2];

double r = 2 * (a + b) - b * c [i - 1];
c [i] = a / r;
k [i] = (3 * ((f [i] - f [i - 1]) / a - (f [i - 1] - f [i - 2]) - b * k [i- 1] / r //это строка у тебя незакрыта
}
c [n - 1] = k [n - 1];
for (int i = n - 2; i > 1; i--) c [i] = k [i] - c [i] * c [i + 1];

double s = (f [0] + f [n - 1]) / 2, r = 0;
for (int i = 0; i < n - 1; i++)
{
s = s + f [i];
r = r + c [i + 1];
}
s = (s - r * h * h / 6) * h  // эта строка у тебя так же незакрыта

std::cout << "S = "<< s << std::endl;

return 0;
}
 
Q

quickdeath

Гость
#11
спасибо, за росписаный код, дальше я думаю сам запишу, мне главное было понять, что делают функции...
ВСЕМ ОГРОМНОЕ СПАСИБО
 
Q

quickdeath

Гость
#12
Извените пожалуйста.. я не весь текст программы загрузил, посмотрите если не сложно отредактированый текст......
 
I

ierofant

Гость
#13
Посмотрел, глаза бы мои его не видели... :)
Там где у меня строка:
C++:
Func func = &y;
Измени на:
C++:
Func func = &std::sin;
И не забудь сделать:
C++:
#include <cmath>
 
I

ierofant

Гость
#16
Лучше-то не стало. Где закрывающая скобка, для самой первой скобочки?

Добавлено: Виноват, теперь заметил. Как же она спряталась...