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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2008, 09:51   #1
Makarov
Форумчанин
 
Аватар для Makarov
 
Регистрация: 03.01.2008
Сообщений: 102
По умолчанию Найти два наибольших отрицательных числа

Задание: найти в массиве два наибольших отрицательных числа.
Код:
program f1;
uses crt;
const N=10;
var
  ar:array[1..N] of real;
  i,nom,j:word;
  max:real;
begin
  clrscr;
  randomize;
  for i:=1 to N do
  begin
    ar[i]:=random(20)/8-1.5;
    write(ar[i]:5:2,' ');
  end;
  for i:=1 to N do
  begin
    max:=ar[i];
    for j:=i to N do
    begin
      if max<ar[j] then
      begin
        max:=ar[j];
        nom:=j;
      end;
    end;
    ar[nom]:=ar[i];
    ar[i]:=max;
  end;
  writeln;
  i:=1;
  while (ar[i]>0) do i:=i+1;
  writeln(ar[i]:5:2,' ',ar[i+1]:5:2);
  readln;
end.
Вот отправляю преподавателю такую работу, а он пишет что слишком большой перебор. Прав ли преподаватель, что можно прогу сократить.
P.S. Задание на сортировку.
Теория без практики мертва и бесплодна, практика без теории невозможна и пагубна.

Последний раз редактировалось Makarov; 14.06.2008 в 10:15.
Makarov вне форума Ответить с цитированием
Старый 14.06.2008, 10:38   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

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

-0.13 -0.50 -0.72 -1.38 0 0.25 0.75 ...

тогда нужные нам числа будут в начале массива.
Для этого нужно изменить условие сравнения:

Код:
  var b:boolean;
  ...
  for i:=1 to N do begin 
    max:=ar[i];
    for j:=i to N do begin
      if (max < 0) and (ar[j] < 0)
      then b := abs(max) > abs(ar[j])
      else b := max > ar[j];

      if b then begin
         max:=ar[j];
         nom:=j;
      end;
    end;
    ar[nom]:=ar[i];
    ar[i]:=max;
  end;
  writeln;
  for i:=1 to N do write(ar[i]:5:2,' ');
  writeln;
  writeln(ar[1]:5:2,' ',ar[1+1]:5:2);
  readln;
В этом случае массив можно не сортировать полностью
достаточно цикла
for i:=1 to 2
-------------------------------
Хм.. Понятней явно не стало.
alexBlack вне форума Ответить с цитированием
Старый 14.06.2008, 11:25   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

1.Сортируем массив по убыванию.
2. for i:=1 to n do
if (a[i]>=0)and(a[i+1]<0) then
writel(a[i+1]:6:2,a[i+2]:6:2);
puporev вне форума Ответить с цитированием
Старый 14.06.2008, 12:05   #4
Makarov
Форумчанин
 
Аватар для Makarov
 
Регистрация: 03.01.2008
Сообщений: 102
По умолчанию

Да направление сортировки можно изменить. Но надо найти 2 наибольших числа из отрицательных, как это проще сделать, после сортировки или во время?
Теория без практики мертва и бесплодна, практика без теории невозможна и пагубна.
Makarov вне форума Ответить с цитированием
Старый 14.06.2008, 12:09   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Конечно проще после сортировки, как я и написал.
Сразу за положительными и нулевыми элементами пойдут отрицательные и первые два из них будут наибольшими.
puporev вне форума Ответить с цитированием
Старый 14.06.2008, 13:04   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Makarov Посмотреть сообщение
Да направление сортировки можно изменить. Но надо найти 2 наибольших числа из отрицательных, как это проще сделать, после сортировки или во время?
Имелось в виду изменить порядок так, чтобы первыми были максимальные отрицательные числа. Обратите внимание как расположены числа после сортировки:

-0.13 -0.50 -0.72 -1.38 0 0.25 0.75 ...

Искать их не нужно - они будут первыми в массиве. Именно поэтому можно не сортировать до конца, а прерывать сортировку, как только первые два числа встали на свое место.

Последний раз редактировалось alexBlack; 14.06.2008 в 13:24.
alexBlack вне форума Ответить с цитированием
Старый 14.06.2008, 16:27   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Придумают же... сортировки какие-то

Код:
const
    N = 30;
var
    max1,
    max2,
    max1idx,
    max2idx,
    i       : integer;
    arr     : array [1 .. N] of integer;
begin

    max1 := - maxint - 1;
    max2 := max1;
    max1idx := -1;
    max2idx := -1;

    randomize;
    for i := 1 to N do begin
        arr [i] := random (maxint) - (maxint div 2);
        writeln ('| ', arr [i] : 10, ' |');
    end;

    write(#13#10#13#10);

    for i := 1 to N do begin
        if arr[i] < 0 then begin
            if arr [i] > max1 then begin
                max2 := max1;
                max2idx := max1idx;

                max1 := arr [i];
                max1idx := i;
            end
            else if arr[i] > max2 then begin
                max2 := arr [i];
                max2idx := i;
            end;
        end;
    end;

    writeln('Max1 : ', max1 : 10, ', Index : ', max1idx);
    writeln('Max2 : ', max2 : 10, ', Index : ', max2idx);

    readln;
end.

Последний раз редактировалось B_N; 14.06.2008 в 17:55. Причина: чуть исправил
B_N вне форума Ответить с цитированием
Старый 14.06.2008, 17:53   #8
Makarov
Форумчанин
 
Аватар для Makarov
 
Регистрация: 03.01.2008
Сообщений: 102
По умолчанию

Всем большое спасибо разобрался.
Теория без практики мертва и бесплодна, практика без теории невозможна и пагубна.
Makarov вне форума Ответить с цитированием
Старый 14.06.2008, 17:57   #9
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

А почему не написать так:

Код:
Var i, min1, min2 : integer;
      mass : array [1..20] of Integer;

Begin

// Заполнение массива
Randomize;
For i := 1 To 20 Do
  Begin
    mass[i] := Random(80) - 40;
    Write(mass[i], ' ');
  End;

// Поиск.
min1 := mass[1]; min2 := 0;
For i := 2 To 20 Do
  If mass[i] < min1 Then
  Begin
    min2 := min1;
    Min1 := mass[i];
  End;

// Вывод результата.
Writeln;
Writeln(min1, '  ', min2);
Readln;
End.
Правда надо ещё проверять отрицательно ли число....
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. найти все числа кратные трем и посчитать их количество __k1ll3r__ Помощь студентам 6 02.04.2008 16:37
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49
Найти количество различных цифр данного натурального числа. stalker Паскаль, Turbo Pascal, PascalABC.NET 10 22.05.2007 17:45
как найти корень из числа $Дмитрий Общие вопросы Delphi 7 26.04.2007 13:40