Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Упорядочить массив по возрастанию без сортировки


Автор: Alexey91 6.11.2008, 15:21
Прога компилируется, но не выводится новый массив Е (прога виснет).
Не понимаю из-за чего.

Код

uses crt;

var
i,n,p,j,temp,x,y,z : integer;
     c : array [1..30] of integer;
     d : array [1..30] of integer;
     e : array [1..60] of integer;

begin clrscr; randomize;

 write('Enter n: '); readln(n);

 for i := 1 to n do begin
  c[i] := random(50)-20;
  d[i] := random(60)-30;
 end;

 write('C: ');
 for i := 1 to n do
  write(c[i],' ');

 writeln;

 write('D: ');
 for i := 1 to n do
  write(d[i],' ');

 for i := 1 to n do
  for j := i+1 to n do
   if c[i] > c[j] then begin
    temp := c[i]; c[i] := c[j]; c[j] := temp;
   if d[i] > d[j] then begin
    temp := d[i]; d[i] := d[j]; d[j] := temp;
   end;
   end;


 writeln; writeln;

 write('C: ');
 for i := 1 to n do
  write(c[i],' ');

 writeln;

 write('D: ');
 for i := 1 to n do
  write(d[i],' ');

 writeln;
  x := 1 ; y := 1 ; z := 1;
  repeat
   p := 0;

   if c[x] <= d[y] then begin
    e[z] := c[x]; x := x+1; z := z+1; p := p+1;
   end

   else begin
    e[z] := d[y]; y := y+1; z := z+1; p := p+1;
   end;

 until p = 0;

  for i := 1 to n*2 do
   write(e[i],' ');


readln; end.

Автор: darkart 6.11.2008, 16:31
Цитата(Alexey91 @  6.11.2008,  15:21 Найти цитируемый пост)
Прога компилируется, но не выводится новый массив Е (прога виснет).
Не понимаю из-за чего.


В коде:

Цитата(Alexey91 @  6.11.2008,  15:21 Найти цитируемый пост)
  
Код

repeat
   p := 0;
   if c[x] <= d[y] then begin
    e[z] := c[x]; x := x+1; z := z+1; p := p+1;
   end
   else begin
    e[z] := d[y]; y := y+1; z := z+1; p := p+1;
   end;
 until p = 0;


при проверке p не будет равно 0, так как в условном операторе внутри цикла - в обеих ветках:

Код

  p := p+1;


Автор: Alexey91 6.11.2008, 16:53
И что вы предлагаете? smile

Мы же должны прекратить цикл в том случае, если не будет сделано ни одной операции сравнения. 
Если в одной части условие сравнения не выполняется, то в другой оно будет выполнено точно. Поэтому я поставил p двух местах, чтобы зафиксировать, что оно произошло.

Если мы даже уберем p с одной ветки от этого программа правильно работать не будет 

Автор: volvo877 6.11.2008, 17:43
Цитата(Alexey91 @  6.11.2008,  15:53 Найти цитируемый пост)
И что вы предлагаете?

Я бы тебе предложил сначала сделать корректное упорядочивание массива D, потому что не всегда он упорядочен по возрастанию... Вот, например, что мне сказала однажды твоя программа:

Код

Enter n: 7
C: -16 -19 17 2 12 16 -18
D: 6 3 -15 18 15 16 -11

C: -19 -18 -16 2 12 16 17
D: 3 -11 -15 6 15 16 18
...
При таких делах ничего тебе не поможет...

А уж как добьешься того ,что и C и D нормально упорядочены - то "сливать" оба массива:

Код
  x := 1 ; y := 1 ; z := 1;
  repeat
    while (x <= n) and (c[x] <= d[y]) do begin
      e[z] := c[x]; inc(x); inc(z);
    end;
    if x > n then break;

    while (y <= n) and (d[y] < c[x]) do begin
      e[z] := d[y]; inc(y); inc(z);
    end;
    if y > n then break;
  until z >= 2*n;

  while (x <= n) do begin
    e[z] := c[x]; inc(x); inc(z);
  end;
  while (y <= n) do begin
    e[z] := d[y]; inc(y); inc(z);
  end;

Автор: Alexey91 6.11.2008, 18:25
Volvo877

Спасибо большое, я бы плюс бы поставил, но не могу  smile 

Массивы я отсортировал (поставил begin'ы) Только непонятно, а почему мой цикл сортировки не работает?

Я так на бумажке цикл проэмулировал, работает.. не понятно. 
Переменная p до последнего момента равняется 1, поэтому цикл не закрывается, но когда нет никаких операций сравнения p=0 и все ок, почему тут в проге виснет?

Автор: volvo877 6.11.2008, 18:44
Цитата(Alexey91 @  6.11.2008,  17:25 Найти цитируемый пост)
Только непонятно, а почему мой цикл сортировки не работает?
Потому что в какой-то момент X (или Y) становится больше, чем N, и сравнение с C[X] (или D[Y]) перестает иметь смысл...

Автор: Alexey91 6.11.2008, 20:17
Цитата

Alexey91, брейки следят за X и Y, а за Z следит цикл.


Так Z зависит от X и Y. Сколько было операций сравнение, такое численное значение Z.
Не могу представить ситуацию, когда Z будет больше n*2.
Отладчик уже раз 10 запускал, еще такого не было.

Кстати, почему переменная e[z] в отладчике постоянно равна 0?

Автор: mr.Anderson 6.11.2008, 20:42
Alexey91, брейки следят за X и Y, а за Z следит цикл.

Автор: Alexey91 6.11.2008, 21:00
Мое сообщение оказалось выше вашего ответа

Автор: volvo877 6.11.2008, 21:41
Цитата(Alexey91 @  6.11.2008,  19:17 Найти цитируемый пост)
Кстати, почему переменная e[z] в отладчике постоянно равна 0?

Потому что
1) Z - это позиция, куда БУДЕТ записываться очередное значение. Понимаешь, не записалось, а только будет, естественно, что записываться очередной элемент должен в пустую ячейку.
2) отладчик работает ПОСТРОЧНО. Поскольку у тебя (вернее, у меня) и изменение e[Z] и изменение Z - в одной строке, то отловить тот момент, когда e[Z] не ноль, ты не можешь... Разбей строку так:

Код

    while (x <= n) and (c[x] <= d[y]) do begin
      e[z] := c[x];
      inc(x); inc(z); 
    end;
, и пробеги отладчиком, ты поймешь о чем я...


Цитата(Alexey91 @  6.11.2008,  19:17 Найти цитируемый пост)
Не могу представить ситуацию, когда Z будет больше n*2.
А этого и не должно быть... Просто надо задать граничное условие для выхода из цикла. И вместо того, чтобы задавать Until False я предпочитаю сделать Until Z >= 2*n

Автор: Alexey91 6.11.2008, 21:57
 smile 

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