Показать сообщение отдельно
  #2  
Старый 18.12.2012, 21:52
Аватар для DelphiM0ZG
DelphiM0ZG DelphiM0ZG вне форума
Новичок
 
Регистрация: 22.10.2011
Сообщения: 62
Репутация: 666
По умолчанию

Решил Вашу задачу 2-мя способами, но в консоли (я надеюсь, что не составит труда вывести массив в StringGrid, а не в консоль). И ещё кое что: приучайтесь сразу нумеровать элементы массива с нуля, поскольку в Си-подобных языках нумерация элементов с нуля.

Код:
program Forum2Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Var  // основной и дополнительный массивы
  Mas, Mass: Array[0..29] Of Integer;
  i, k, N: Byte; // переменные

begin
  Repeat
    Write('Vvedi razmer (2 <= N <= 30): N = ');
    ReadLn(N);  // ввод размера
  Until ((N >= 2) And (N <= 30)); // проверка границ размера

  N:=N-1;
  Randomize; // инициализация генератора СЧ
  WriteLn('Ishodnii massiv:');
  For i:=0 To N Do
    Begin // генерация элементов массива и вывод на экран
      Mas[i]:=Random(5);
      WriteLn(Mas[i]); // так вывод производится в столбик
     // Write(Mas[i], ';  '); а так - в строчку
    End;

  WriteLn;
  WriteLn('Poluchennii massiv:');
  WriteLn;

  // этот закоментированный код тоже работает
  // этот код использует дополнительный массив
  {k:=0; // начальное значение количества ненулевых элементов
  For i:=0 To N Do
    If (Mas[i]<>0) Then // если элемент ненулевой
      Begin
        Mass[k]:=Mas[i]; // он попадает в массив
        k:=k+1; // индекс массива ненулевых элементов +1
      End;

  For i:=0 To N Do
    Begin // если i меньше кол-ва ненулевых эл-тов
      If (i<k) Then
        Mas[i]:=Mass[i]  // беру элемент из массива
      Else  // иначе, присваиваю ему нуль
        Mas[i]:=0;
      WriteLn(Mas[i]); // вывод на экран
    End;}

  // этот код не использует дополнительный массив
  For i:=0 To N-1 Do // мотаю цикл от 0 до кол-ва эл-тов массива -1
    For k:=i+1 To N Do // мотаю цикл, который перемещает эл-ты
      If ((Mas[i]=0) And (Mas[k]<>0)) Then
        Begin // если левый элемент нуль, а правый нет, то:
          Mas[i]:=Mas[k]; // левому присвоил значение правого
          Mas[k]:=0; // а правому нуль
        End;

  // для закомментированного метода этот цикл НЕ нужен!
  For i:=0 To N Do // просто вывод массива на экран
    WriteLn(Mas[i]);

  WriteLn;
  WriteLn('Press ENTER!');
  ReadLn;
end.

З. Ы. Ннаписал в консоли, т. к. рисовать форму мне было неохота!
__________________
Чем больше знаешь, тем сильнее осознаёшь, что знаешь гораздо меньше, чем не знаешь!..
Ответить с цитированием