Количество известных остатков

Рейтинг: 0Ответов: 1Опубликовано: 11.05.2011

Я написал программу. Она должна получать количество известных остатков (при делении), сами эти остатки (по очереди, один за одним), числа, при делении на которые эти остатки получаются (последовательно, один за одним). Задача проги - найти наименьшее положительное число, которое при делении на введённые числа даёт введённые остатки соответственно (т.е. первый остаток при делении на первое число, второй - на второе и т.д.), используя китайскую теорему об остатках и особый способ её решения, который описать будет сложно. Вот код:

Program A0xCHIN;    
type    
    TMas1=array [Byte] of Integer;    
    TMas2=array [Byte] of Integer;    
function GetMult (B: TMas2; N: Integer): Integer;    
    var    
        Y, G, I: Integer;    
    begin    
        Y:=B[1];    
        for I:=2 to N do    
        begin    
            G:=B[I];    
            Y:=Y*G;    
        end;    
        GetMult:=Y;    
    end;    
procedure GetRemainders (N: Integer; A: TMas1); {procedure writes remainders to TMas1}    
    var    
        I: Integer;    
        begin    
        for I:=1 to N do    
            begin    
                WriteLn ('Input a remainder ', I);    
                Read (A[I])    
            end;    
        end;    
procedure GetModules (N: Integer; B: TMas2); {procedure writes modules to TMas2}    
    var    
        I: Integer;    
    begin    
        for I:=1 to N do    
            begin    
                WriteLn ('Input a module ', I);    
                Read (B[I])    
            end;    
        end;    
function FindNum (A: TMas1; B: TMas2; N: Integer): LongInt; {function finds number}    
    var    
        I, X: Integer;    
        Result, Res, PRes: LongInt;    
        Label    
             startloop;    
    begin    
        X:=0;    
        PRes:=A[1];    
    for I:=1 to N do    
        begin    
        startloop:    
            if (((PRes+(X*GetMult (B, I)) - A[I]) mod B[I])=0)then    
                begin    
                    Res:=PRes+(X*GetMult (B, I));    
                    PRes:=PRes+(X*GetMult (B, I));    
                    X:=0    
                end    
            else    
                begin    
                    X:=X+1;    
                    {GoTo startloop;}    
                end;    
        Result:=Res;    
        FindNum:=Result    
        end;    
    end;    
var    
    N: Integer;    
    A: TMas1;    
    B: TMas2;    
begin    
    WriteLn ('Input number of remainders: ');    
    Read (N);    
    GetRemainders (N, A);    
    GetModules (N, B);    
    WriteLn ('Result is ', FindNum (A, B, N));    
    Write ('Press ENTER to exit');    
    ReadLn;    
end.

Компилятор у меня обычный, вот такой: alt text

Вопросы по этому:

  • Программа присваивает PRes совсем не первый остаток, что я ввёл, а что-то другое. Почему?
  • Подходят ли типы в объявлении массива для следующих функций: в массиве должно храниться до нескольких сотен целых неотрицательных чисел?
  • Код:

    
    type
      TMas=array [1..10] of Integer;
    var
      A: TMas;
    
    Почему a[1]=12, а не что-то ещё?

  • Что хранится в массиве на месте тех элементов, которым не задали значения?

Ответы

▲ 2Принят

Вы забыли в параметрах функции указать var для переменных, которые должны быть возвращены через параметры:

procedure GetRemainders (N: Integer; var A: TMas1);

procedure GetModules (N: Integer; var B: TMas2);

На месте не заданных элементов может быть любая лабуда. Так как это паскаль, при создании массивов и т.п. "зверей" в программе, он не гарантирует, что они будут обнулены, поэтому, если это необходимо, делайте это самостоятельно.

И на вашем месте я бы пользовался списками, вместо массивов, это немного сложнее, но вы не будете сразу выделять память под массивы в сотни байт. Да и циклы у вас все без "завихрений" т.е. метод со списками весьма удобен. (имхо)

При этом:

TMas1=array [Byte] of Integer;

вы ограничены 256ю числами. Кроме того, при такой записи индексы начинаются с "0" А также -32768 <= Integer <= 32767

Использование меток goto не комильфо.