Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Что за bug?

7.2K
29 января 2005 года
MFOB
40 / / 25.01.2005
Деллал тут задачу из форума и вот что наделал!
Прога неработающая - это сразу говорю.
Но вот после нескольких компиляции и изменения
const n=3;
вытворяет чудеса вывода на экран.
Может это только у меня с нею что то не так??
uses crt;
const n=3;
var
h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
writeln;
end;
writeln;writeln('>>>>>>>>>>>>>>>');writeln;

i1:=1;j1:=1; i2:=1;j2:=2;
for i:=1 to n*n-1 do begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
inc(j1);inc(j2);
inc(j2);
if j2>n then begin
j2:=1;
inc(i2);
end;
end;

for i:=1 to n do begin
for j:=1 to n do begin write(a[i,j]:3);end;
writeln;
end;
end.
301
29 января 2005 года
lord Kelvin
897 / / 08.11.2004
Код:
uses crt;
const n=3;
var
h,i,j,i1,j1,i2,j2:integer;
a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
writeln;
end;
writeln;writeln('>>>>>>>>>>>>>>>');writeln;

i1:=1;j1:=1; i2:=1;j2:=2;
for i:=1 to n*n-1 do begin
if a[i1,j1]>a[i2,j2] then begin
h:=a[i1,j1];
a[i1,j1]:=a[i2,j2];
a[i2,j2]:=h;
end;
inc(j1);inc(j2);
[color=RED]{inc(j2);}[/color]
if j2>n then begin
j2:=1;
inc(i2);
end;
end;

for i:=1 to n do begin
for j:=1 to n do begin write(a[i,j]:3);end;
writeln;
end;
end.

После этого изменения чудеса прекратились.
Если не тяжело, можешь описать алгоритм сортировки? Словами.
7.2K
30 января 2005 года
MFOB
40 / / 25.01.2005
Цитата:

Если не тяжело, можешь описать алгоритм сортировки? Словами.


Это недаработаный вариант сортировки двухмерного массива, сделаный как ответ, по теме "сортировка 2-го массива" :), но вот перерасказывать это нет уж - она неправельная,и не рабочая.
Просто хотелось узнать другие мнения :D
Может быть Вы сможите обьяснить на "техническом уровне" что она делает не так (hB800 - например меняется)??(Если не трудно:)
Вот и доработаная прога, прошу указывать на мои ошибки нестеснясь:D

Код:
uses crt;  const n=5;
var h,i,j,i1,j1,i2,j2:integer;
    a:array[1..n,1..n]of integer;
begin
randomize;clrscr;
for i:=1 to n do begin
  for j:=1 to n do begin a[i,j]:=random(50);write(a[i,j]:3);end;
                 writeln;
                 end;
 writeln;writeln('>>>>>>>>>>>>>>>');writeln;
 i1:=1;j1:=1;i2:=1;j2:=2;
 for i:=1 to n*n do
   for j:=1 to n*n do
                      begin
                      if a[i1,j1]>a[i2,j2] then begin
                         h:=a[i1,j1];
                         a[i1,j1]:=a[i2,j2];
                         a[i2,j2]:=h;
                         end;
                      j1:=j2;
                      i1:=i2;
                      inc(j2);
                      if j2>n then begin
                                   j2:=1;
                                   inc(i2);
                                   end;
                      if i2>n then begin i1:=1;j1:=1;i2:=1;j2:=2;end;
                   end;
for i:=1 to n do begin
  for j:=1 to n do begin write(a[i,j]:3);end;
                 writeln;end;
end.
301
30 января 2005 года
lord Kelvin
897 / / 08.11.2004
Сортировка работает, что тебе еще не нравиться? Только в том топе надо было написать не сортировка двумерного массива, а пердставление двуумерного массива одномерным, с последующей сортировкой. Вот.
7.2K
30 января 2005 года
MFOB
40 / / 25.01.2005
Цитата:
Originally posted by lord Kelvin
..., а пердставление двуумерного массива одномерным, с последующей сортировкой. Вот.



Извените - немного не понятно?
Ладно спасибо за ответы.

368
30 января 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by MFOB

Вот и доработаная прога, прошу указывать на мои ошибки нестеснясь:D

Нормально. Единственный минус, что несмотря ни на что, будет выполнено n*n*n*n сравнений. Даже если матрица будет отсортирована после n*n сравнений, прога произведет еще n*n*n*n-n*n сравнений. Нужна бы лог. переменная, которой присвоить true, если была перестановка. И при достижении i2 n не автоматически сбрасывать в 1, а только если эта перменная равна true(иначе выход из цикла). Кроме этого, достаточно только одного цикла while true do begin ... end;

7.2K
31 января 2005 года
MFOB
40 / / 25.01.2005
Цитата:
Originally posted by rostyslav
... будет выполнено n*n*n*n сравнений....
... Кроме этого, достаточно только одного цикла while true do begin ... end;



Имеется ввиду чтото вроде этого?
Или я опять непонял? :(

Код:
var col:integer;
....
i1:=1;j1:=1;i2:=1;j2:=2;
repeat
if a[i1,j1]>a[i2,j2] then begin
   h:=a[i1,j1];
   a[i1,j1]:=a[i2,j2];
   a[i2,j2]:=h;
   end;
j1:=j2;i1:=i2;inc(j2);
if j2>n then begin j2:=1;inc(i2);end;
if i2>n then begin i1:=1;j1:=1;i2:=1;j2:=2;end;
inc(col);
until col>=n*n;

Этого не будет мало? может нужно n*n*n;
368
31 января 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by MFOB

Имеется ввиду чтото вроде этого?

не совсем. задавать наперед число сравнений не стОит. что-то типа

Код:
uses crt;  const n=5;
var h,i,j,i1,j1,i2,j2:integer;
    a:array[1..n,1..n]of integer;
    flag: Boolean;
begin
  randomize;clrscr;
  for i:=1 to n do begin
    for j:=1 to n do begin
      a[i,j]:=random(50);
      write(a[i,j]:3);
    end;
    writeln;
  end;
  writeln;
  writeln('>>>>>>>>>>>>>>>');
  writeln;
  flag := false;
  i1:=1;j1:=1;i2:=1;j2:=2;
  while true do begin
    if a[i1,j1]>a[i2,j2] then begin
      h:=a[i1,j1];
      a[i1,j1]:=a[i2,j2];
      a[i2,j2]:=h;
      flag := true;
    end;
    j1:=j2;
    i1:=i2;
    inc(j2);
    if j2>n then begin
      j2:=1;
      inc(i2);
    end;
    if i2>n then begin
      if flag = true then begin
        i1:=1;j1:=1;i2:=1;j2:=2;
        flag := false; end
      else
        break;
    end;
  end;
  for i:=1 to n do begin
    for j:=1 to n do begin
      write(a[i,j]:3);
    end;
    writeln;
  end;
end.
Проход заново по массиву выполняется, только если при предыдущем проходе была перестановка. Но есть еще оптимизированный вариант бубликовой сортировки, при которой по массиву проход с 1 по n делается только раз.
7.2K
31 января 2005 года
MFOB
40 / / 25.01.2005
Цитата:
Originally posted by rostyslav
Проход заново по массиву выполняется, только если при предыдущем проходе была перестановка. Но есть еще оптимизированный вариант бубликовой сортировки, при которой по массиву проход с 1 по n делается только раз.


Спасибо кажется понял!
Перестановка элементов продолжается пока при полном проходе через массив [1,1]..[n,m] не случится перестановок!!
Надеюсь правельно? :D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог