Как найти два максимальных числа в паскале

Формулировка задачи:

Дано: Ряд целых чисел,где каждый член>=2, найти 2 наибольших элемента
Текст программы:

 Var p,i,max1,max2,x:integer;
 Begin
  write('введите кол-во чисел в последовательности-');
  readln(p);
  readln(x);
  max1:=x;
  readln(x);
  max2:=x;
   for i:=1 to p-2 do begin
                          readln(x);
                          if (x>max2) and (x<max1) then max2:=x;
                          if x>max2
                          then max1:=x;
                      
                    end;
  writeln(max1,' ',max2);
  End.

Что нужно изменить,чтобы программа работала не только для возрастающей последовательности?

Код к задаче: «Найти 2 наибольших числа»

textual

Var p,i,max1,max2,x:integer;
 Begin
  write('введите кол-во чисел в последовательности-');
  readln(p);
  max1:=-maxint;
  max2:=-maxint;
   for i:=1 to p do 
   begin
    readln(x);
   if (x>max1) and (x>max2) then 
   begin
   max2:=max1;
   max1:=x;
   end
   else
   if x>max2 then max2:=x
   end;
  writeln(max1,' ',max2);
  End.

Полезно ли:

12   голосов , оценка 4.250 из 5

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

Задание:

Дан целочисленный массив из 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.

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

Аналогичные функции можно написать для поиска минимального из чисел. Для этого достаточно сменить знак сравнения в функции с двумя аргументами(в первой из рассмотренных).

Для реализации сначала нужно написать функцию, которая находит максимальное из двух чисел.

Функция определения максимального из двух чисел

function Max(x1, x2 : integer) : integer;
begin
  if x1 > x2 then
    Max := x1
  else
    Max := x2;
end; 

Теперь у нас есть код, который возвращает наибольшее из двух чисел. Для того, чтобы расширить количество аргументов до трех, достаточно написать ещё одну функцию, которая будет дважды вызывать предыдущую.

Функция поиска наибольшего из трех чисел

function Max(x1, x2, x3 : integer) : integer;
begin
  Max := Max(Max(x1, x2), x3);
end;

А что если нужно сравнить четыре, пять и больше чисел, и найти максимальное из них?

Без проблем, мы можем писать столько перегруженных функций, сколько нам нужно.

Максимум из четырех чисел

function Max(x1, x2, x3, x4 : integer) : integer;
begin
  Max := Max(Max(x1, x2, x3), x4);
end; 

Эта функция использует вызов двух предыдущих.

Программа для поиска и вывода максимальных чисел

все приведенные выше функции должны быть размещены в том же порядке над телом основной программы

В зависимости от количества аргументов, компилятор выбирает какую из функций вызывать.

begin
  writeln(Max(1, 4));
  writeln(Max(9, 2, 7));
  writeln(Max(8, 3, 6, 5));
  readln;
end. 

Если предполагается сравнивать много чисел, то лучше всего представить их в виде массива, и искать минимальный или максимальный элемент в массиве.

Смотрите также:

Написать программу в Паскале С клавиатуры ваодится 10 чисел опередить два максимальных числа и вывести их по порядку например max1 = 8 Max2 = 9 Массив не использовать!

Сделать с помощью оператора if Срочно очень прошу.

На странице вопроса Написать программу в Паскале С клавиатуры ваодится 10 чисел опередить два максимальных числа и вывести их по порядку например max1 = 8 Max2 = 9 Массив не использовать? из категории Информатика вы найдете
ответ для уровня учащихся 10 — 11 классов. Если полученный ответ не
устраивает и нужно расшить круг поиска, используйте удобную поисковую
систему сайта. Можно также ознакомиться с похожими вопросами и ответами
других пользователей в этой же категории или создать новый вопрос. Возможно,
вам будет полезной информация, оставленная пользователями в комментариях, где
можно обсудить тему с помощью обратной связи.

«Второй максимум» массива(паскаль), помогите разобрать программу

Объясните procedure mas2max, как она работает?

Код:

uses crt;
const N=5;
type mas=array[1..N] of integer;
var A:mas;

procedure mas_w(var A:mas);
var i:1..N;
begin
for i:=1 to N do
    begin
    write (‘A[‘,I,’]=’);
    readln (A);
    end;
end;

procedure mas2max(A:mas);
var y,k:integer;
i:1..N;
begin
y:=1;
k:=1;
for i:=2 to N do
   if (A>A[y]) then y:=i;

if (y=1) then k:=2;
for i:=2 to N do
        if (A>A[k]) and (y<>i) then
         k:=i;
writeln (a[k]);
end;

begin
clrscr;
mas_w(A);
mas2max(A);

readln
end.

4 ответа

1.9K

08 июня 2008 года

max_dark

256 / / 11.11.2005

Код:

procedure mas2max(A:mas);
    var
        y,k:integer; { Номера максимальных элементов: y — 1-й, k — 2-й }
        i:1..N;      { Счетчик }
begin
    y:=1;
    k:=1;
    { В данном цикле ищется индекс(номер) максимального элемента массива }
    for i:=2 to N do
        if (A>A[y]) then { Если текущий элемент больше максимального, }
            y:=i; { то запоминаем его номер }
    { Теперь A[y] — максимальный элемент }

    if (y=1) then { если максимальный элемент является первым элементом массива, то }
        k:=2; { считаем, что второй максимум находится на второй позиции }

    { В данном цикле ищется индекс второго максимума массива }
    for i:=2 to N do
        if (A>A[k]) and (y<>i) then { Если текущий элемент больше второго максимума и номер первого максимума не равен номеру текущего элемента, то }
            k:=i; { запоминаем его }

    { Теперь в A[k] находится второй максимум. Выводим его }
    writeln (a[k]);
end;

50K

01 апреля 2010 года

postal2

1 / / 31.05.2009

Ну и не работает процедурка, введите что-то вроде 5 5 5 5 1 4 5 2 1 4

8.4K

01 апреля 2010 года

z0rch

275 / / 02.09.2008

ну учитывая что константа N=5, то ввести мы можем только первые 5 цифр — и все работает верно =)
но и с N=10 тоже все верно считается ;)

а если вам нужно вычислить второй максимальный элемент, который не равен первому, то надо бы добавить одно условие:

Код:

for i:=2 to N do
  if (A>A[k]) and (y<>i) and (a[y]<>a) then
    k:=i;

но при этом я не вижу логики в строке:

Код:

значит наверное я неправильно понял вашу задачу =)

392

03 апреля 2010 года

cronya

421 / / 03.01.2009

Код:

#include<iostream>
#include<cstdlib>
using namespace std;
#define SIZE 10
int main(int argc, char *argv[])
{
int *mas=(int *)malloc(SIZE);
for(int idx=0;idx<SIZE;idx++)
mas[idx]=rand()%100;
cout<<«Array:»<<endl;
for(int idx=0;idx<SIZE;idx++)
cout<<mas[idx]<<» «;
int max1=0, max2=0;
for(int idx=0;idx<SIZE;idx++)
if(mas[idx]>mas[max1])max1=idx;//ищем 1-й максимальный  во всем массиве и запоминаем его индекс
cout<<«nПервый максимум массива — «<<mas[max1]<<endl;
for(int idx=0;idx<SIZE;idx++)
if((mas[idx]>mas[max2])&&(mas[idx]<mas[max1]))max2=idx;//ищем 2-й максимальный  во всем массиве следующим образом(ищиться максималный в массиве, потом проверяем если он меньше 1 максимального, значит это 2 максимум массива)
cout<<«Второй максимум массива — «<<mas[max2]<<endl;
cout<<endl;
free(mas);
return 0;
}

Проще некуда, хотя тут вариант на си написан, думаю отличий не будет так как алгоритм 1 и тот же :)

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как составить расценки на работу
  • Как составить договор на покупку дома по материнскому капиталу
  • Как составить акт выполненных работ бесплатно
  • Как найти eeprom на плате
  • Как найти на карте защитный код

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии