Опишите на Паскале метод вычисления разности наибольшего посреди частей,имеющих чётные
Опишите на Паскале алгоритм вычисления разности наибольшего посреди элементов,
имеющих чётные значения, и наибольшего посреди частей, имеющих нечётные значения, в данном целочисленном массиве из 30 положительных частей (в предположении, что в массиве есть и чётные, и нечётные элементы).
1 ответ
Lenka Shishlenin
Если в нашем распоряжении имеется современная версия PascalABC.Net 3.2, то есть минимум два способа решить такую задачу. Массив мы будем наполнять случайными числами из промежутка [1;98].
1-ый метод - использовать имеющуюся в этой версии паскаля возможность обретать максимумы и минимумы встроенными в язык средствами. Это очень прытко программируется и обычно страхyет от возможных ошибок при написании более детализированных программ.
// PascalABC.NET 3.2, сборка 1353 от 27.11.2016
// Внимание! Если программка не работает, обновите версию!
begin
var a:=ArrRandom(30,1,98); a.Println;
Writeln('D=',a.Where(x-gt;x.IsEven).Max-a.Where(x-gt;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 lt;gt; 0 then
begin if a1maxlt;a[i] then a1max:=a[i] end
else
if a2maxlt;a[i] then a2max:=a[i]
end;
Writeln;
Writeln('D=',a2max-a1max)
end.
Замечу, что данный вариант программки содержит кусок, в котором школьники (да и не только школьники) часто делают ошибку.
if a[i] mod 2 lt;gt; 0 then
begin if a1maxlt;a[i] then a1max:=a[i] end
else
if a2maxlt;a[i] then a2max:=a[i]
Выделенные мной begin и end на 1-ый взгляд не необходимы. Но в этом-то и ошибка!
По правилам языка паскаль когда снутри 1-го if встречается иной if и желая бы один из них неполный, т.е. не содержит else, последний else относится к самому заключительному из if, который без его будет неполным.
Запутанно? Объясню на нашем куске.
Его без этих begin ... end можно разуметь так:
if a[i] mod 2 lt;gt; 0 then
if a1maxlt;a[i] then a1max:=a[i]
else
if a2maxlt;a[i] then a2max:=a[i]
Но можно и так:
if a[i] mod 2 lt;gt; 0 then
if a1maxlt;a[i] then a1max:=a[i]
else
if a2maxlt;a[i] then a2max:=a[i]
И паскаль, как досадно бы это не звучало, разумеет как раз по заключительному варианту. Почему как раз begin ... end решают эту делему. Но... встречается она не очень нередко и о ней живо запамятывают. А позже нарываютcя и не могут понять предпосылки.
Что ж, выбор как решать - за вами!
1-ый метод - использовать имеющуюся в этой версии паскаля возможность обретать максимумы и минимумы встроенными в язык средствами. Это очень прытко программируется и обычно страхyет от возможных ошибок при написании более детализированных программ.
// PascalABC.NET 3.2, сборка 1353 от 27.11.2016
// Внимание! Если программка не работает, обновите версию!
begin
var a:=ArrRandom(30,1,98); a.Println;
Writeln('D=',a.Where(x-gt;x.IsEven).Max-a.Where(x-gt;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 lt;gt; 0 then
begin if a1maxlt;a[i] then a1max:=a[i] end
else
if a2maxlt;a[i] then a2max:=a[i]
end;
Writeln;
Writeln('D=',a2max-a1max)
end.
Замечу, что данный вариант программки содержит кусок, в котором школьники (да и не только школьники) часто делают ошибку.
if a[i] mod 2 lt;gt; 0 then
begin if a1maxlt;a[i] then a1max:=a[i] end
else
if a2maxlt;a[i] then a2max:=a[i]
Выделенные мной begin и end на 1-ый взгляд не необходимы. Но в этом-то и ошибка!
По правилам языка паскаль когда снутри 1-го if встречается иной if и желая бы один из них неполный, т.е. не содержит else, последний else относится к самому заключительному из if, который без его будет неполным.
Запутанно? Объясню на нашем куске.
Его без этих begin ... end можно разуметь так:
if a[i] mod 2 lt;gt; 0 then
if a1maxlt;a[i] then a1max:=a[i]
else
if a2maxlt;a[i] then a2max:=a[i]
Но можно и так:
if a[i] mod 2 lt;gt; 0 then
if a1maxlt;a[i] then a1max:=a[i]
else
if a2maxlt;a[i] then a2max:=a[i]
И паскаль, как досадно бы это не звучало, разумеет как раз по заключительному варианту. Почему как раз begin ... end решают эту делему. Но... встречается она не очень нередко и о ней живо запамятывают. А позже нарываютcя и не могут понять предпосылки.
Что ж, выбор как решать - за вами!
Syvan Tamara
Спасибо громадное! Все стало еще понятнее и проще.
, оставишь ответ?
Похожие вопросы
-
Вопросы ответы
Новое
NEW
Статьи
Информатика
Статьи
Последние вопросы
Игорь 14 лет назад был на 8 лет моложе, чем его
Математика.
Два тела массами m1 и m2 находящие на расстоянии R друг
Физика.
В сосуде 4целых одна пятая литр воды что бы заполнить сосуд
Математика.
Двум малярам Диме И Олегу поручили выкрасить фасад дома они разделили
Разные вопросы.
найти порядковый номер 41Э если в ядре 20 нейтронов
Разные вопросы.
в ряду натуральных чисел 3, 8, 10, 24, … 18 одно
Математика.
Предприятие по производству с/хоз продукции на производство затратило 3527000 руб Валовый
Разные вопросы.
Математика, задано на каникулы. ВАРИАНТ 1004
НОМЕР 1,2,3,4,5,6,7,8.
Математика.
Имеются три конденсатора емкостью С1=1мкФ, С2=2мкФ и С3=3мкФ. Какую наименьшую емкость
Физика.
Из точки м выходят 3 луча MP MN и MK причём
Геометрия.
Облако тегов