Формулировка задачи:
Дано: Ряд целых чисел,где каждый член>=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; |
Си |
#include<stdio.h> |
Естественный язык |
Объявляем массив 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 и тот же