/ Материалы / Язык программирования: Паскаль / Дан целочисленный массив... Второй максимум...

Дан целочисленный массив... Второй максимум...

Задание:

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

const N=30; 
var a: array [1..N] of integer; 
    i, k, max, max2: integer; 
begin
  for i:=1 to N do readln(a[i]); 
  ...
end.

Си

#include<stdio.h> 
int main(void) { 
  const int N=30; 
  int a[N]; 
  int i, k, max, max2; 
  for (i=0; i<N; i++)
    scanf(″%d″, &a[i]); 
  ...
}

Естественный язык

Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, k, max, max2. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. 
...

Решение:

Сложность в том, что нужно найти не  максимальный элемент, а второй по величине. Можно, конечно, сначала найти максимум, а потом искать следующий за ним, но можно сделать это за один проход по массиву. Нам нужны две переменные, max (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max, а второй по величине записываем в max2:


if a[1] > a[2] then begin
  max:=a[1]; max2:=a[2]; 
end
else begin
  max:=a[2]; max2:=a[1]; 
end;
 

Затем в цикле перебираем все элементы, начиная с 3-го (первые два уже «задействованы»!) до последнего, 30-ого. Если очередной элемент a[i] больше, чем max, записываем значение max в max2 (предыдущий максимум становится вторым), а значение a[i] – в max. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2. Вот решение на Паскале

const N=30;
var a: array [1..N] of integer;
i, k, max, max2: integer;
begin
  for i:=1 to N do readln(a[i]);
  if a[1] > a[2] then begin
    max:=a[1]; max2:=a[2] 
  end
  else begin
    max:=a[2]; max2:=a[1] 
  end;
  for i:=3 to N do
    if a[i] > max then begin
      max2 := max;
      max := a[i]
    end
    else if a[i] > max2 then max2 := a[i];
  writeln(max2)
end.

Похожие материалы

Поделитесь в социальных сетях

Наверх