В симфонический оркестр приняли на работу трёх музыкантов: Дину, Артура и Султана, умеющих играть на скрипке, флейте, альте, кларнете, гобое и трубе. Известно, что: 1. Артур самый высокий. 2. Когда между альтистом и трубачом возникает ссора, Артур мирит их. 3. Дина не умеет играть ни на трубе, ни на гобое. 4. Музыкант, играющий на скрипке, меньше ростом играющего на флейте. 5. Музыканты, играющие на скрипке и флейте, и Дина любят пиццу. На каких инструментах играет каждый из музыкантов, если каждый играет на двух инструментах?
Первый использовать имеющуюся в этой версии паскаля возможность находить максимумы и минимумы встроенными в язык средствами. Это очень быстро программируется и обычно страхyет от возможных ошибок при написании более детальных программ.
// PascalABC.NET 3.2, сборка 1353 от 27.11.2016
// Внимание! Если программа не работает, обновите версию!
begin
var a:=ArrRandom(30,1,98); a.Println;
Writeln('D=',a.Where(x->x.IsEven).Max-a.Where(x->x.IsOdd).Max)
end.
Пример
29 52 58 75 13 77 63 13 17 6 67 17 53 51 14 93 83 30 81 17 93 58 13 71 78 96 42 66 4 91
D=3
Второй не привязан к упомянутой выше версии языка, т.е. может быть использован в школах, исповедующих "доисторический стиль программирования" ))) Естественно, он длиннее и можно будет сравнить количество строк кода. Алгоритм основан на последовательном переборе элементов массива и одновременном получении максимума среди четных и нечетных его элементов.
const
n=30;
var
a:array[1..30] of integer;
i,a1max,a2max:integer;
begin
Randomize;
a1max:=0; a2max:=0;
for i:=1 to n do begin
a[i]:=Random(98)+1;
Write(a[i],' ');
if a[i] mod 2 <> 0 then
begin if a1max<a[i] then a1max:=a[i] end
else
if a2max<a[i] then a2max:=a[i]
end;
Writeln;
Writeln('D=',a2max-a1max)
end.
Замечу, что данный вариант программы содержит фрагмент, в котором школьники (да и не только школьники) часто делают ошибку.
if a[i] mod 2 <> 0 then
begin if a1max<a[i] then a1max:=a[i] end
else
if a2max<a[i] then a2max:=a[i]
Выделенные мной begin и end на первый взгляд не нужны. Но в этом-то и ошибка!
По правилам языка паскаль когда внутри одного if встречается другой if и хотя бы один из них неполный, т.е. не содержит else, последний else относится к самому последнему из if, который без его будет неполным.
Запутанно? Поясню на нашем фрагменте.
Его без этих begin ... end можно понимать так:
if a[i] mod 2 <> 0 then
if a1max<a[i] then a1max:=a[i]
else
if a2max<a[i] then a2max:=a[i]
Но можно и так:
if a[i] mod 2 <> 0 then
if a1max<a[i] then a1max:=a[i]
else
if a2max<a[i] then a2max:=a[i]
И паскаль, увы, понимает как раз по последнему варианту. Посему как раз begin ... end решают эту проблему. Но... встречается она не очень часто и о ней быстро забывают. А потом нарываютcя и не могут понять причины.
Что ж, выбор как решать - за вами!
const n=10;
var
min,i: integer;
a: array[1..n] of integer;
begin
randomize;
min:=11;
for i:=1 to n do begin
a[i]:=random(1,10);
write (a[i],' '); // для наглядности. можно удалить
if (i mod 2 =1) and (a[i]<min)
then min:=a[i];
end;
writeln;
writeln ('min = ',min)
end.
Пример:
5 4 7 8 6 2 10 4 9 9
min = 5
2 задача:
const n=10;
var
max,count,i: integer;
a: array[1..n] of integer;
begin
randomize;
max:=0;
count:=0;
for i:=1 to n do begin
a[i]:=random(1,10);
write (a[i],' '); // для наглядности. можно удалить
if a[i]>max
then max:=a[i];
end;
for i:=1 to n do
if max=a[i] then count:=count+1;
writeln;
writeln ('max = ',max);
writeln ('count = ',count);
end.
Пример:
8 5 3 2 2 10 10 9 3 10
max = 10
count = 3