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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 16:25   #1
deceiver
Пользователь
 
Аватар для deceiver
 
Регистрация: 08.03.2009
Сообщений: 12
Стрелка 3 максимальных элемента массива (pascal)

найти 3-и наибольших елемента массива (а1;а2;....а30)
deceiver вне форума Ответить с цитированием
Старый 17.03.2009, 16:29   #2
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Можно отсортировать элементы по убыванию и выписать три первых.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 17.03.2009, 18:15   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
program pascall;
const
 n = 5;
var
 a : array [1..n] of integer;
 max : integer;
 i,k,j : byte;
begin
  randomize;
  for i:=1 to n do a[i]:=random(10)-5;
  a[1]:=5;
  for i:=1 to n do write (a[i],'|');
  writeln;
  max:=a[1];
  k:=1;
  for i:=2 to n do
   if a[i]>max then
   begin
     max:=a[i];
     k:=i
   end;
  writeln ('max1= ',max);
  if max<>a[2] then
               begin
                 max:=a[2];
                 j:=2
               end
               else
               begin
                 max:=a[1];
                 j:=1
               end;
  for i:=1 to n do
   if i=k then continue
   else
    if a[i]>max then
    begin
      max:=a[i];
      j:=i
    end;
  writeln ('max2= ',max);
  if max<>a[3] then max:=a[3]
               else
                if max<>a[1] then max:=a[1]
                             else max:=a[2];
  for i:=1 to n do
   if (i=k) or (i=j) then continue
   else
    if a[i]>max then max:=a[i];
  writeln ('max3= ',max);
  readln
end.

Последний раз редактировалось capta1n; 17.03.2009 в 19:52.
capta1n вне форума Ответить с цитированием
Старый 17.03.2009, 18:54   #4
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Если первый элемент будет максимумом то неправильно работает. Объяснить почему?
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 17.03.2009, 19:15   #5
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

да да - ошибка, спасибо сейчас пофиксю : просто инициализацию счетчиков изменил с 2 на 1
capta1n вне форума Ответить с цитированием
Старый 17.03.2009, 19:28   #6
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

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

P.S. Проще всего сделать сортировку и не мучаться ИМХО
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 17.03.2009, 19:37   #7
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

в ну вот да, согласен, сейчас сделаем. PS: мучений не было, просто заменил все остальные на a[2] и a[3]
все сделал, правда распоясал код Но все же без сортировки

Последний раз редактировалось capta1n; 17.03.2009 в 19:52.
capta1n вне форума Ответить с цитированием
Старый 17.03.2009, 20:39   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не-а.. мучения продолжаются... :-)
попробуйте для такого исходного набора :-)
Код:
  a[1]:=2;
  a[2]:=12;
  a[3]:=2;
  a[4]:=0;
  a[5]:=-5;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2009, 13:12   #9
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
program pascall;
const
 n = 5;
var
 a : array [1..n] of integer;
 max : integer;
 i,k,j,f : byte;
begin
  randomize;
  for i:=1 to n do a[i]:=random(10);
  for i:=1 to n do write (a[i],'|');
  writeln;
  max:=a[1];
  j:=1;
  for i:=1 to n do
   if a[i]>max then
   begin
     max:=a[i];
     j:=i
   end;
  writeln ('max1=',max);
  if j<>n then k:=j+1
          else k:=1;
  max:=a[k];
  for i:=1 to n do
   if i=j then continue
          else
           if a[i]>max then
           begin
             max:=a[i];
             k:=i
           end;
  writeln ('max2=',max);
  if k<>n then
          begin
            f:=k+1;
            if (f=j) and (j<>n) then inc(f)
                                else f:=(j+k) mod n
          end
          else f:=(j+k) mod n;
  max:=a[f];
  for i:=1 to n do
   if (i=k) or (i=j) then continue
                     else
                      if a[i]>max then max:=a[i];
  writeln ('max3=',max);
  readln
end.

Последний раз редактировалось capta1n; 21.03.2009 в 18:04.
capta1n вне форума Ответить с цитированием
Старый 21.03.2009, 14:12   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

уже лучше. в данном случае всё работает.
но стоит чуть изменить содержимое массива, и всё! алгоритм даёт сбой - будет неверный результат
что ваша программа даст для массива с отрицательными числами? :
Код:
  a[1]:=0;
  a[2]:=-1;
  a[3]:=-2;
  a[4]:=-3;
  a[5]:=-4;
и, честно говоря, мне абсолютно непонятно Ваше желание обойтись без простого, эффективного, красивого и понятного алгоритма, предложенного alex_fcsm в сообщении #2 - отсортировать массив и взять нужное число чисел с начала (хоть три максимума надо, хоть 4, хоть 5 - алгоритм НЕ меняется. да и проще программа получается:
Код:
const
 n = 5;
 HowMax = 3;
var
 a : array [1..n] of integer;
 z : integer;
 i,k : byte;
begin
  randomize;
  for i:=1 to n do a[i]:=random(10);

  for i:=1 to n do write (a[i],'|');
    writeln;

  for k:=1 to n-1 do
    for i:=1 to n-k do
        if a[i]<a[i+1] then begin
          z:=a[i+1];
          a[i+1]:=a[i];
          a[i]:=z;
    end;

  for i:=1 to HowMax do
    WriteLn(i:1,'-й max = ',a[i]);

  readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP: использование элемента массива как массива Sudia Помощь студентам 1 20.02.2009 20:48
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21
Удаление элемента динамического массива Dogmat Помощь студентам 6 13.07.2008 14:33
Удаление элемента массива chiffa Общие вопросы Delphi 1 03.01.2008 19:24