Паскаль и C: разные выходные данные

1-й вопрос по StackOverflow... У меня есть 2 программы, одна на C и одна на Pascal, которые должны давать одинаковый результат, но это не так.

Паскаль:

program ssgf108;
uses crt;
var n,q,r,s,i:integer;
var a:array[1..10] of integer;

begin
        a[1]:=3;
        a[2]:=-5;
        a[3]:=12;
        a[4]:=7;
        a[5]:=-4;
        a[6]:=-3;
        a[7]:=2;
        a[8]:=8;
        a[9]:=4;
        a[10]:=10;
        readln(n);
        q:=0;
        r:=0;
        s:=1;
        for i:=1 to n do
        begin
                q:=i*a[i];
                r:=i+a[i];
                s:=s+q*r;
        end;
        writeln(q,' ',r,' ',s);
end.

C:

#include <stdio.h>

int main(){
        int a[10],n,q,r,s,i;
        scanf("%d",&n);
        a[0]=3;
        a[1]=-5;
        a[2]=12;
        a[3]=7;
        a[4]=-4;
        a[5]=-3;
        a[6]=2;
        a[7]=8;
        a[8]=4;
        a[9]=10;
        q=0;
        r=0;
        s=1;
        for (i=0;i<=n-1;i++){
                q=i*a[i];
                r=i+a[i];
                s=s+q*r;
        }
        printf("%d %d %d",q,r,s);
        return 0;
}

При вводе 5 вместо n Pascal выводит -20 1 871, а C выводит -16 0 567. Где ошибка? Предыстория этого вопроса: я участвую в соревновании по решению задач в своей школе, следующее испытание близко, некоторые вопросы требуют программирования, я выполнил первые 2 задания на Bash и Pascal, теперь я изучаю C, поэтому я хотел бы делать их в C. Но я ДОЛЖЕН избегать неправильных результатов, так как они означают потерянные очки. Это тренировка на сайте конкурса, по конвертации псевдокода в код.


person user2179983    schedule 17.03.2013    source источник


Ответы (1)


Ценности

q = i * a[i];
r = i + a[i];

зависят от значений i внутри цикла, которые различаются для циклов индексации с отсчетом от единицы и от нуля. Вам нужно выполнить арифметику с i+1 внутри цикла C:

for (i = 0; i < n; i++) {
    int i1 = i + 1;
    q = i1 * a[i];
    r = i1 * a[i];
    s += q * r;
}
person Fred Foo    schedule 17.03.2013
comment
Я начал цикл с 0 в C и с 1 в Pascal, то же самое с массивами, так что проблем быть не должно... - person user2179983; 17.03.2013
comment
@ user2179983: есть проблема, заключающаяся в том, что значения i внутри цикла не совпадают в обеих программах, и вы выполняете арифметические действия с этими значениями. - person Fred Foo; 17.03.2013
comment
Да, ваши индексы выравниваются без проблем, но проблема заключается в том, что вы используете эти индексы не только для ссылки на элементы массива, а для добавления или умножения. a[1] в Pascal может быть идентичен a[0] в C, но 1*a[1] в Pascal явно не совпадает с 0*a[0] в C. - person Stuart; 17.03.2013
comment
Понял. Я официальный идиот. Я лучше проверю операции, а не просто скопирую их из псевдокода в следующий раз. - person user2179983; 17.03.2013