Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упорядочить массив по возрастанию без сортировки 
V
    Опции темы
Alexey91
  Дата 6.11.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



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

Код

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.

PM   Вверх
darkart
Дата 6.11.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: нет
Всего: 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;


PM MAIL WWW ICQ Skype GTalk   Вверх
Alexey91
Дата 6.11.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



И что вы предлагаете? smile

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

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

Это сообщение отредактировал(а) Alexey91 - 6.11.2008, 17:00
PM   Вверх
volvo877
Дата 6.11.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(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;


Это сообщение отредактировал(а) volvo877 - 6.11.2008, 17:44
PM MAIL   Вверх
Alexey91
Дата 6.11.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Volvo877

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

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

Я так на бумажке цикл проэмулировал, работает.. не понятно. 
Переменная p до последнего момента равняется 1, поэтому цикл не закрывается, но когда нет никаких операций сравнения p=0 и все ок, почему тут в проге виснет?
PM   Вверх
volvo877
Дата 6.11.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Alexey91 @  6.11.2008,  17:25 Найти цитируемый пост)
Только непонятно, а почему мой цикл сортировки не работает?
Потому что в какой-то момент X (или Y) становится больше, чем N, и сравнение с C[X] (или D[Y]) перестает иметь смысл...
PM MAIL   Вверх
Alexey91
  Дата 6.11.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Цитата

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


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

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

Это сообщение отредактировал(а) Alexey91 - 6.11.2008, 20:59
PM   Вверх
mr.Anderson
Дата 6.11.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



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


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexey91
Дата 6.11.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Мое сообщение оказалось выше вашего ответа
PM   Вверх
volvo877
Дата 6.11.2008, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(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

Это сообщение отредактировал(а) volvo877 - 6.11.2008, 21:42
PM MAIL   Вверх
Alexey91
Дата 6.11.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



 smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.