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.
"Второй максимум" массива(паскаль), помогите разобрать программу
Объясните procedure mas2max, как она работает?
Код:
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;
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;
Ну и не работает процедурка, введите что-то вроде 5 5 5 5 1 4 5 2 1 4
но и с N=10 тоже все верно считается ;)
а если вам нужно вычислить второй максимальный элемент, который не равен первому, то надо бы добавить одно условие:
Код:
for i:=2 to N do
if (A>A[k]) and (y<>i) and (a[y]<>a) then
k:=i;
if (A>A[k]) and (y<>i) and (a[y]<>a) then
k:=i;
но при этом я не вижу логики в строке:
Код:
if (y=1) then k:=2;
значит наверное я неправильно понял вашу задачу =)
Код:
#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;
}
#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 и тот же :)