Одномерные Массивы

Тема в разделе "Pascal and Delphi", создана пользователем Izekil, 17 дек 2012.

Статус темы:
Закрыта.
  1. Izekil

    Izekil Гость

    Помогите пожалуйста с данной задачкой:
    Одномерный массив а длиной М. Переместить нулевые элементы массива в конец, сдвинув остальные элементы влево.
    Приведу то, что я сделал на данный момент:
    настроил 2 стрингрида и
    var
    k:integer;
    a:array[1..30] of integer;


    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    k:=strtoint(edit1.Text);
    if (k>0) and (k<=30) then
    s1.ColCount:=k
    else
    ShowMessage('Введи размер массива >0 и <=30 ')

    end;

    procedure TForm1.Button3Click(Sender: TObject);
    var
    i,j,n:integer;
    begin
    for i:=1 to k do
    a:=strtoint(S1.Cells[i-1,0]);

    end;
     
  2. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    два цикла
    1) с постусловием проверяет что элементы (хотя бы один) были перемещены (флаг=1), флаг при каждом проходе цикла=0 (т.е. в начале цикла)
    2) с предусловием от начала до конца цикла перебор элементов, в теле условие элемент=нуль и если попали по условию перестановку местами и флаг=1
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Я не понял что там у Вас стриггриды делают и какое они вообще отношение к Вашему вопросу имеют... :)
    Что касается сдвига ненулевых элементов влево - это проще всего (и быстрее) сделать через вспомогательный временный массив.
    Код (Delphi):
    var
    a:array[1..30] of integer;
    implementation

    {$R *.dfm}

    procedure MoveZeroAtEnd(var a: array of Integer);
    var
    temp: Array of Integer;
    i,n, Len: Integer;
    begin
    Len := Length(a);
    SetLength(temp,Len); // выставляем длину временного массива "temp" равной длине массива "a"
    n := 0;
    for i := 0 to Len-1 do
    begin
    if (a[i] > 0) then // выкладываем в "temp" последовательно все ненулевые элементы
    begin
    temp[n] := a[i];
    Inc(n);
    end;
    end;

    for i := 0 to n-1 do // возвращаем в "a" ненулевые элементы (со сдвигом влево)
    a[i] := temp[i];

    for i := n to Len-1 do // заполяем остаток нулями
    a[i] := 0;

    SetLength(temp,0); // освобождаем память занятую "temp"
    end;


    procedure TForm1.Button2Click(Sender: TObject);
    var
    i: Integer;
    s: string;
    begin
    { заполнение массива }
    Randomize;
    s := '';
    for i := 1 to 30 do
    begin
    if (Random(2) > 0) then
    a[i] := Random(100)+1
    else
    a[i] := 0;
    s := s + IntToStr(a[i])+ #13;
    end;
    ShowMessage('Несортированный массив'+#13+s);

    { "выталкивание" нолей в конец массива }
    MoveZeroAtEnd(a);

    s := '';
    for i := 1 to 30 do
    s := s + IntToStr(a[i])+ #13;

    ShowMessage('Cортированный массив'+#13+s);

    end;
     
  4. Izekil

    Izekil Гость

    Спасибо большое! Разберусь =)
     
  5. gpatron

    gpatron Active Member

    Регистрация:
    13 авг 2009
    Сообщения:
    26
    Симпатии:
    0
    можно и без вспомогательного массива.
    да и как-то побыстрее будет работать чем с доп. массивом
    :)

    Код (Delphi):
    b:=true;
    for i:=1 to M do
    begin
    if b and (a[i]=0) then begin
    i1:=i;
    b:=false;
    end;
    if not b and (a[i]<>0) then begin
    a[i1]:=a[i];
    a[i]:=0;
    i1:=i1+1;
    end;
    end;
     
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Да? :) Ну... это... ну да! :)
     
Загрузка...
Похожие Темы - Одномерные Массивы
  1. Lizzz
    Ответов:
    1
    Просмотров:
    1.241
  2. Fazer77777
    Ответов:
    1
    Просмотров:
    1.659
  3. 203
    Ответов:
    2
    Просмотров:
    1.384
  4. 203
    Ответов:
    0
    Просмотров:
    948
  5. 203
    Ответов:
    2
    Просмотров:
    2.168
Статус темы:
Закрыта.

Поделиться этой страницей