Как исправить код?

Asae

Program sortitovka;
var
i,n:integer;
a:array [1..1000] of integer;
 
procedure bubble(var q:array of integer);
var x, y, z : integer;
begin
for x := 1 to n-1 do
for y := 1 to n-x do
if q[y] > q[y+1] then
begin
z :=q[y];
q[y] := q[y+1];
q[y+1] := z
end;
end;
begin
writeln('vvedite kolvo elementov');
Readln(n);
writeln('vvedite elemeti massiva');
For i:=1 to n do
Readln(a[i]);
bubble(a);
writeln;
writeln('otsortirov masiv: ');
for i:=1 to n do
write(a[i]:4);
end.
Сортировка пузырьком, но когда ввожу элементы массива то стабильно второй элемент =0 и сортировка не продолжается. Как исправить?
3 ответа

Asae

program sortitovka;
 
type
  vector = array [1..1000] of integer;
 
var
  i, n: integer;
  a: vector;
 
procedure bubble(var q: vector);
var
  x, y, z: integer;
begin
  for x := 1 to n - 1 do
    for y := 1 to n - x do
      if q[y] > q[y + 1] then
      begin
        z := q[y];
        q[y] := q[y + 1];
        q[y + 1] := z;
      end;
end;
 
begin
  writeln('vvedite kolvo elementov');
  Readln(n);
  writeln('vvedite elemeti massiva');
  for i := 1 to n do
    Readln(a[i]);
  bubble(a);
  writeln;
  writeln('otsortirov masiv: ');
  for i := 1 to n do
    write(a[i]:4);
end.


Asae

procedure bubble(var q:array of integer);
Это означает, что индексы в q от 0 до n-1. А у вас циклы от 1, поэтому крайний левый элемент не попадает в сортировку, а следующий за ним 0 -- лишний элемент за последним, который не был введен и равен 0 (для глобального массива).ZX Spectrum-128, не-не, это как слон в посудной лавке В оригинале универсальный открытый массив, а у вас фиксированный...


Asae

Asae, завязывать код на глобальные переменные -- плохая идея... Завязывать на глобальные переменные универсальный код -- вдвойне плохая идея.
procedure bubble(var a: array of Integer; n: Integer);
var i, j, t: Integer;
begin
  for i:=n-2 downto 0 do for j:=0 to i do
    if a[j]>a[j+1] then begin
      t:=a[j+1]; a[j+1]:=a[j]; a[j]:=t;
    end;
end;