Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2009, 18:39   #1
fatoldsun
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию [pascal]Сортировка массива методом прямого выбора, работает неадекватно.

Сортировка массива методом прямого выбора, работает неадекватно.
Требовалось реализовать следующую задачу:

6. В массиве а[5,5], введенном с клавиатуры, найти сумму первого и последнего столбца. Затем выполнить следующие действия::
6.1. Если сумма первого больше суммы последнего столбца, то найти минимальное число в массиве и удалить строку с этим элементом из массива.
6.2. Если сумма первой меньше суммы последнего столбца, то рассортировать исходный массив методом перебора (прямого выбора) в порядке возрастания.
6.3. Если суммы столбцов равны, то все нечетные числа массива возвести в квадрат.

в результате чего написал следующий код
Код:
uses crt;
var a,b,min,min1,buf,nomi,nomj,c,e,i,j,n:integer;
r:real;
d,w,o,u:array[1..10,1..10] of integer;
p:array[1..25] of integer;
begin
randomize;
clrscr;
{vvod massiva}
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
d[i,j]:=random(100);
write(d[i,j]:4);
end;
writeln;
end;
{--------------}
min:=d[1,1];
nomi:=1;
nomj:=1;
{osnovnoe telo}
writeln;
{nahodim summu stolbcov}
for c:=1 to 5 do
begin
b:=b+d[c,1];
e:=e+d[c,5];
end;
writeln(b,' ',e);
writeln;
{deistvie}
if b=e then
begin
{p1}
 for i:=1 to 5 do
 begin
 for j:=1 to 5 do
 begin
 r:=d[i,j] mod 2;
  if r=1 then
  begin
   d[i,j]:=sqr(d[i,j]);
   write(d[i,j]:4);
   end
   else
   write(d[i,j]:4);
 end;
 writeln;
 end;
{_}
end
else
begin
 if b>e then
 begin
  {p2}
   for i:=1 to 5 do
    for j:=1 to 5 do
     begin
      if min>d[i,j] then
       begin
       min:=d[i,j];
       nomi:=i;
       nomj:=j;
       end;
      end;
  if nomi=1 then
 begin
  for i:=1 to 4 do
  for j:=1 to 5 do
  begin
   w[i,j]:=d[i+1,j];
  end;
 end
else
begin
for i:=1 to nomi-1 do
for j:=1 to 5 do
begin
w[i,j]:=d[i,j]
end;
for i:=nomi to 4 do
for j:=1 to 5 do
w[i,j]:=d[i+1,j];
end;
for i:=1 to 4 do
begin
for j:=1 to 5 do
begin
write(w[i,j]:4)
end;
writeln;
end;
{_}
 end
 else
 begin
 {p3}
c:=1;
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
p[c]:=d[i,j];
c:=c+1;
end;
end;
writeln;
     for i:=1 to 24 do
     begin
          min1:=i;
          for j:=i+1 to 25 do begin
               if p[j]<p[min1] then min1:=j;
               buf:=p[i];
               p[i]:=p[min1];
               p[min1]:=buf;
     end;
     end;
     writeln;
c:=1;
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
u[i,j]:=p[c];
c:=c+1;
end;
end;
writeln;
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
write(u[i,j]:4)
end;
writeln;
end;

{* okonchanie poslednei chasti**********************************************}
{_}
 end;
end;
readln;
end.
Сортировка начинается от {p3}
Вся проблема заключается в том, что сортируется массив не совсем правильно, т.е проскакивают неуместные числа.
Т.е проблема в задаче возникает только при выполнении п.6.2, в остальном задача работает правильно.

Пожалуйста, проверьте правильность написания задачи. Заранее спасибо.

Последний раз редактировалось fatoldsun; 22.04.2009 в 18:49.
fatoldsun вне форума Ответить с цитированием
Старый 22.04.2009, 18:40   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
Радость

Оформите, пожалуйста, код правильно!
Levsha100 вне форума Ответить с цитированием
Старый 22.04.2009, 18:46   #3
fatoldsun
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

правильно ?
fatoldsun вне форума Ответить с цитированием
Старый 22.04.2009, 18:56   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
правильно ?
Правильно )
Цитата:
Вся проблема заключается в том, что сортируется массив не совсем правильно, т.е проскакивают неуместные числа.
Честно говоря, что-то не замечаю.
Пример работы:

Код:
  32  77   8  68  89
  91  94  83  83  27
  18  77  38  97  29
  11  65  80  80  89
   8  87  68  34  19

160 253




   8   8  11  18  19
  27  29  34  32  38
  65  68  68  77  77
  80  80  83  83  87
  89  89  91  94  97
Вроде, все правильно.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 22.04.2009, 19:01   #5
fatoldsun
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

а вы точно этот код проверяли?
на своем паскале каждое выполнение этого пункта неправильно проходит, т.е выводится массив некорректно отсортированный.
Код:
 271 333 243 332 250
 118 154 492 437 325
 240   8 133 310 367
  25  10  90 278 442
 335 180 383 303 244

989 1628

  10   8  25 118 133
 154 240 243 244  90
 180 250 271 278 303
 310 325 332 333 335
 367 383 437 442 492
а при правильной работе хочется видеть то, что получается у вас.
fatoldsun вне форума Ответить с цитированием
Старый 22.04.2009, 19:28   #6
fatoldsun
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

по-моему проблема в этом участке кода, который отвечает за сортировку.
пожалуйста, помогите пофиксить
Код:
for i:=1 to 24 do
     begin
          min1:=i;
          for j:=i+1 to 25 do begin
               if p[j]<p[min1] then min1:=j;
               buf:=p[i];
               p[i]:=p[min1];
               p[min1]:=buf;
     end;
     end;
fatoldsun вне форума Ответить с цитированием
Старый 22.04.2009, 19:41   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а вы точно этот код проверяли?
на своем паскале каждое выполнение этого пункта неправильно проходит, т.е выводится массив некорректно отсортированный.
Да, этот. Правда, после того, как вы написали этот пост, у меня тоже перестало работать ))

Собственно, проблема нашлась. И решается крайне просто. Удалите выделенное:
Код:
for i:=1 to 24 do
     begin
          min1:=i;
          for j:=i+1 to 25 do begin
               if p[j]<p[min1] then min1:=j;
               buf:=p[i];
               p[i]:=p[min1];
               p[min1]:=buf;
     end;
     end;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 22.04.2009, 19:42   #8
fatoldsun
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

уфф, большое человеческое спасибо.
fatoldsun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка методом выбора на С++, возможно ошибка Graf Xandr Помощь студентам 4 09.05.2009 15:06
Сортировка массива методом вставок Pascal bpystep Помощь студентам 5 22.04.2009 01:13
Сортировка массива методом прямого выбора(Дельфи) Onza Помощь студентам 20 25.01.2009 12:05
сортировка методом двухпроходного пузырька. Net* Общие вопросы C/C++ 3 26.05.2008 07:17