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

Перевод кода с паскаля на C++. Не могу найти ошибку - C++

Восстановить пароль Регистрация
 
Roukff
 Аватар для Roukff
1 / 1 / 0
Регистрация: 05.06.2011
Сообщений: 35
19.08.2012, 14:02     Перевод кода с паскаля на C++. Не могу найти ошибку #1
Есть такая ситуация. Сделал перевод из паскаля в C++
Вроде бы все правильно. но при автоматической проверке кода паскаля система выдает, что все круто и все работает, а когда закидываю код С++, выдает, что на одном из тестов неправильный ответ. не могу найти ошибку вообще никак. Может быть она в выводе (хотя я сомневаюсь), мб из процедуры какая-то переменная не сохраняется (тоже сомнения). Помогите!

Насчет вывода: нужно выводить дабл 2 знака после запятой. если знаков больше, надо округлить по математическим правилам

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
Var X,Y,Z:Array[0..51]of DoubLe;
ii,jj,i,j,n:LongInt;
Ans,Ans1:DoubLe;
 
 
Procedure SWEP(Var a,b:DoubLe);
Var tmp:DoubLe;
Begin
tmp:=a;a:=b; b:=tmp;
End;
 
Procedure Crash;
Begin
i:=0;
i:=5 Div i;
End;
 
 
Procedure Go(x1,y1,x2,y2:DoubLe);
Var i:LongInt;
Last,S:DoubLe;
Begin
If x2<=x1 Then Crash;
If y2<=y1 Then Crash;
 
S:=(x2-x1)*(y2-y1);
If S*Z[n]<=Ans Then Exit;
 
Last:=0;
For i:=1 To N Do
 If (X[i]>x1)And(X[i]<x2)And(Y[i]>y1)And(Y[i]<y2) Then
  Begin
   If Ans<S*(Z[i]-Last) Then Ans:=S*(Z[i]-Last);
   Last:=Z[i];
   If S*(Z[n]-Last)<=Ans Then Exit;
  End;
 
If Ans<S*(Z[N]-Last) Then Ans:=S*(Z[N]-Last);
End;
 
 
Begin
ReadLn(X[0],Y[0],Z[0]);
ReadLn(N);
If n=0 Then Crash;
If N>50 Then Crash;
For i:=1 To N Do 
begin
ReadLn(X[i],Y[i],Z[i]);
if (X[i] > X[0]) or (Y[i] > Y[0]) or (Z[i] > Z[0])
then begin
X[i]:=0;Y[i]:=0;Z[i]:=0;
end;
end;
 
Inc(N);
X[n]:=0;Y[n]:=0;Z[n]:=0;
 
For i:=0 To N-1 Do
 For j:=i+1 To N Do
   If Z[i]>Z[j] Then
     Begin
      SWEP(X[i],X[j]);
      SWEP(Y[i],Y[j]);
      SWEP(Z[i],Z[j]);
     End;
 
Ans:=0;
For i:=0 To N Do
 For j:=0 To N Do
  For ii:=0 To N Do  If X[ii]>X[i] Then
    For jj:=0 To N Do
     If Y[jj]>Y[j] Then Go(X[i],Y[j],X[ii],Y[jj]);
 
Write(Ans:2:2);
End.
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
#include <stdio.h>
 
double X[51],Y[51],Z[51];
int n;
double ans;
 
void swap(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}
 
void Go(double x1,double y1,double x2,double y2)
{
    double Last = 0.0, S;
    S = (x2 - x1) * (y2 - y1);
    if (S * Z[n] <= ans)
        return;
    for (int i = 1; i <= n; i++)
    {
        if ( (X[i] > x1) && (X[i] < x2) && (Y[i] > y1) && (Y[i] < y2) )
        {
            if (ans < (S * (Z[i] - Last)))
                ans = S * (Z[i] - Last);
            Last = Z[i];
            if ((S * (Z[n] - Last)) <= ans)
                return;
        }
    }
    if (ans < (S * (Z[n] - Last)))
        ans = S * (Z[n] - Last);
}
 
int main()
{
    scanf("%lf%lf%lf", &X[0], &Y[0], &Z[0]);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lf%lf%lf", &X[i], &Y[i], &Z[i]);
        if ((X[i] > X[0]) || (Y[i] > Y[0]) || (Z[i] > Z[0]))
        {
            X[i] = 0;
            Y[i] = 0;
            Z[i] = 0;
        }
    }
    n++;
    X[n] = 0;
    Y[n] = 0;
    Z[n] = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = i+1; j <= n; j++)
        {
            if (Z[i] > Z[j])
            {
                swap(X[i],X[j]);
                swap(Y[i],Y[j]);
                swap(Z[i],Z[j]);
            }
        }
    }
    ans = 0;
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            for (int ii = 0; ii <= n; ii++)
            {
                if (X[ii] > X[i])
                {
                    for (int jj = 0; jj <= n; jj++)
                    {
                        if (Y[jj] > Y[j])
                        {
                            Go(X[i],Y[j],X[ii],Y[jj]);
                        }
                    }
                }
            }
        }
    }
    ans = long long(ans*100 + 0.5)/100.0;
    printf("%.2f",ans);
    return 0;
}
Добавлено через 8 минут
Все. нашел ошибку. ошибку была в размере массива. в паскале с 0..51 а в С++ я указал 51, т.е. с 0..50...
Идиот невнимательный =)))
Тему можно закрыть.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2012, 14:02     Перевод кода с паскаля на C++. Не могу найти ошибку
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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