Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Раsсаl] Массивы


Автор: koshkarjov 31.3.2010, 11:25
Добрый день!
Подскажите пожалуйста где ошибка в программе

Код

рrogram lab4;
const n=10;
var a:array [1..n] of integer;
i,j:integer;
begin
writeln ('Введите число [',i,']=');
readln(a[i]);
end;
for i:=1 to n do
for j:=1 downto i+1 do
if a[j]=0 then
begin
a[j]:=a[j-1];
a[j-1]:=0;
end;
for i:=1 to n do write (a[i]:3);
writeln;
readln;
end.


Задание:
Ввести массив из целых чисел n элементов (задано константой). Переместить все нулевые элементы в начало массива. Вывести массив на экран

Автор: Rodman 31.3.2010, 11:52
 
Код

рrogram lab4;
const n=10;
var a:array [1..n] of integer;
i,j:integer;
begin
for i:=1 to n do{ввод такой должен быть}
begin
  writeln ('Введите число [',i,']=');
  readln(a[i]);
end;
for i:=1 to n do
  for j:=1 downto i+1 do
    if a[j]=0 then
    begin {сортировка не дозакончена}
      a[j]:=a[j-1];
      a[j-1]:=0;
   end;
for i:=1 to n do 
    write (a[i]:3);
writeln;
readln;
end.

Автор: koshkarjov 1.4.2010, 09:43
А как доделать сортировку? Никак понять не могу :(

Автор: t_gran 1.4.2010, 10:05
koshkarjov, неужели так сложно?
Код

   // ...
   for i:= 1 to n-1 do
      for j:= i+1 to n do
         if a[j] = 0 then
         begin
            buff:= a[j];
            a[j]:= a[i];
            a[i]:= buff;
            break;
         end;
   // ...

Хотя это не самый эффективный подход, более правильно, на мой взгляд будет так:
Код

   // ...
   i:= 1;
   j:= n;
   while (i < j) do
   begin
      while (a[i] = 0) and (i < j) do
         inc(i);
      while (a[j] <> 0) and (i < j) do
         dec(j);
      if (i < j) then
      begin
         buff:= a[j];
         a[j]:= a[i];
         a[i]:= buff;
      end;
   end;
   // ...

Т.е. по i позиции начиная сначала ищем не нулевой элемент. По j позиции, наоборот, с конца, ищем нулевой элемент и если i с j не пересеклись, значит нужные элементы были найдены и их можно поменять. Иначе выходим из цикла.

P.S.: Но это так, с потолка. Если немного ещё подумать, наверное ещё можно чего-нить до оптимизировать. 

Автор: volvo877 1.4.2010, 13:29
Цитата(t_gran @  1.4.2010,  09:05 Найти цитируемый пост)
более правильно, на мой взгляд будет так:

Был массив <1, 3, 6, 0, 4, 7, 0, 2, 4, 5> , стал - <  0  0  6  3  4  7  1  2  4  5>
То есть, кроме нулей еще и другие элементы меняются местами.

Чтобы сделать только перенос нулей в начало - ну нужна никакая сортировка:
Код
  for i := n downto 1 do
  begin
    if a[i] = 0 then
    begin
      for j := i downto 2 do a[j] := a[j - 1]; { Можно заменить на Move }
      a[1] := 0;
    end;
  end;

Автор: koshkarjov 1.4.2010, 20:10
Всем большое спасибо!  smile 
   
Готовая программка, если кому надо будет smile
Код

program lab4;
const n=10;
var a:array [1..n] of integer;
    i,j:integer;
begin
for i:=1 to n do
begin
writeln ('Введите число [',i,']=');
readln(a[i]);
end;
for i:=n downto 1 do
begin
if a[i]=0 then
begin
for j:=i downto 2 do a[j]:=a[j-1];
a[1]:=0;
end;
end;
for i:=1 to n do write (a[i]:3);
writeln;
readln;
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)