Решение задачи № 2 из главы 15 -- Поиск двух максимумов в массиве

Решение задачи № 2 из главы 15

Пользователь вводит массив целых чисел из 7 элементов. Найдите из них два самых больших числа и выведите их на экран.
const
  n = 7;
type
  mass = array [1..n] of integer;
var
  A : mass;
  i , max, max1: integer;
begin
  randomize; // запускаем процедуру генератора случайных чисел
  for i := 1 to n do  // циклом заполняем массив данными
    begin
      A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10
      write(A[i], ' ');   // выводим в строку перечень данных массива через пробел
    end;

  max := 0; // не стал этому имени присваивать значение 1-го элемента массива
  max1 := 0;  // не стал этому имени присваивать значение i-го элемента массива, т.к. могут быть ошибки

  for i:= 1 to n do // цикл для нахождения макс. элемента массива
    begin
      if A[i] > max then
        max := A[i];
    end;
  for i:= 1 to n do // цикл для нахождения предпосл. макс. элем. массива
    begin
      if A[i] = max then
        //max := A[i]   //  при условии истинности при отсутствии действий оператор if работает
      else 
        if A[i] > max1 then
          max1 := A[i];               
    end;
  writeln;
  writeln('Макс элемент : ', max); // выводим результат
  writeln('Предпосл макс элемент : ', max1); // выводим результат   
end.
    

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

добавьте обратную ссылку на урок и исправьте ключевые слова

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

П.С. Для удобства, заполнение массива данными я использовал стандартную процедуру "randomize" и функцию"random" вместо ручного вводя, как по условию задачи.

уберите эту фразу из цитаты -- в цитате должно быть только то что написано кем-то или вами где-то выше (ранее)

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

не стал этому имени присваивать значение i-го элемента массива, т.к. могут быть ошибки

какие именно ошибки могут быть?

_____________
матфак вгу и остальная классика =)

При тестировании были неверные результаты при том, что остальная часть кода не менялась. Поэтому решил обнулить значение этих переменных на всякий случай. Хотя, итак, до этого, они имели значение "0".

Изначально в коде было написано так:

max := A[1]; 
max1 := A[2];

Почему были неверные результаты - пока не успел разобраться.

vedro-compota's picture

ноль приводит к тому, что есть у вас массив будет полностью отрицательным, то программа даст неверные ответ (понятно почему)?

_____________
матфак вгу и остальная классика =)

потому что нуль при отрицательных данных в массиве будет самым максимальным значением?

vedro-compota's picture

потому что нуль при отрицательных данных в массиве будет самым максимальным значением?

да, именно поэтому по умолчанию (при поиске максимума или минимума) берут реальные значения из множестве просматриваемых данных (в данном случае из массива)

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

if A[i] = max then
        //max := A[i]   //  при условии истинности при отсутствии действий оператор if работает
      else
        if A[i] > max1 then
          max1 := A[i];  
  1. Может и работает, но так писать не корректно (избыточно),
    перепишите под использование оператора if в неполной форме (без else)
  2. Далее, чем будет равен ваш второй максимум, если все элементы массива будут равны, скажем "5"?
    Вы так и не измените значение по умолчанию, а это неправильно.
    Т.е. вполне может быть так, что оба максимума будут одинаковыми, например, для набора чисел:
     1  23  45  14  8  45

_____________
матфак вгу и остальная классика =)

const
  n = 7;
type
  mass = array [1..n] of integer;
var
  A : mass;
  i , x, max, max1: integer;
begin
  randomize; // запускаем процедуру генератора случайных чисел
  for i := 1 to n do  // циклом заполняем массив данными
    begin
      A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10
      write(A[i], ' ');   // выводим в строку перечень данных массива через пробел
    end;
  max := A[1]; // 
  x := 1;
  max1 := A[1];  // 
  
  for i:= 1 to n do // цикл для нахождения макс. элемента массива
    begin
      if A[i] > max then // если текущее значение больше чем max, то
        begin
          max := A[i]; // max присваиваем это значение
          x := i;      // и заносим позицию этого элемента
        end;
    end;
    
  for i := x to n - 1 do // исключаем элемент с макс значением в массиве
    a[i] := a[i + 1];   // присваиваем содержание i+1 элемента массива содержанию i-ого элемента (заменяем значение массива)
    
  for i:= 1 to n - 1 do // цикл для нахождения макс. элемента массива
    begin
      if ((A[i] > max1) and (max <> A[i])) then // если текущее значение больше чем max1, то
          max1 := A[i]; // max1 присваиваем это значение         
    end;   
  writeln;
  writeln('Максимальный элемент : ', max); // выводим результат
  writeln('Предпосл макс элемент : ', max1); // выводим результат 
end.
vedro-compota's picture

  A : mass;
  i , x, max, max1: integer;

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

_____________
матфак вгу и остальная классика =)

const
  n = 7;
type
  mass = array [1..n] of integer;
var
  A : mass;
  i , x, max, max1: integer; // max - максимальное значения числового ряда, max1 - предпоследнее макс знач числ ряда

begin
  randomize; // запускаем процедуру генератора случайных чисел
  for i := 1 to n do  // циклом заполняем массив данными
    begin
      A[i] := random(11); // присваиваем очередному элементу значение из диапазона 0...10
      write(A[i], ' ');   // выводим в строку перечень данных массива через пробел
    end;
  max := A[1]; // присваиваем переменной max содержание первого элемента массива
  x := 1;          // присвоено значение на тот случай, если max = A[1]
  max1 := A[1];  // присваиваем переменной max1 содержание первого элемента массива
  
  for i:= 1 to n do // цикл для нахождения макс. элемента массива
    begin
      if A[i] > max then // если текущее значение больше чем max, то
        begin
          max := A[i]; // max присваиваем это значение
          x := i;      // и заносим позицию этого элемента
        end;
    end;
    
  for i := x to n - 1 do // исключаем элемент с макс значением в массиве
    a[i] := a[i + 1];   // присваиваем содержание i+1 элемента массива содержанию i-ого элемента (заменяем значение массива)
    
  for i:= 1 to n - 1 do // цикл для нахождения макс. элемента массива
    begin
      if ((A[i] > max1) and (max <> A[i])) then // если текущее значение больше чем max1, то
          max1 := A[i]; // max1 присваиваем это значение         
    end;   
  writeln;
  writeln('Максимальный элемент : ', max); // выводим результат
  writeln('Предпосл макс элемент : ', max1); // выводим результат 
end.
vedro-compota's picture

хорошо, это работает, но теперь попробуем без:

// исключаем элемент с макс значением в массиве

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

_____________
матфак вгу и остальная классика =)