Здравствуйте! Чтобы найти экстремальный (т.е. минимальный или максимальный) элемент при некотором условии, необходимо сначала прописывать данное условие, а потом уже находить "по стандарту" обычный минимум или максимум, как на странице Minmax 1 - 5.
Так, решим сначала такую простую задачку: Среди набора случайных положительных чисел вывести максимальный из тех, которые при делении на 5 дают в остатке 2. Здесь условие понятно: нас интересуют именно числа, дающие остаток 2 при делении на 5. Вот как выглядит наш код:
var
a, max, i: integer;
begin
max := -1; { <-- начальное значение максимума должно быть
минимальным из возможных вводимых чисел – это гарантия того,
что первое вводимое число станет первым значением максимума }
for i := 1 to 30 do
begin
a := random(100);
write(' ', a);
if a mod 5 = 2 then { <-- условие }
if a > max then { <-- нахождение "обычного" максимума }
max := a
end;
writeln(#13 + ' max = ', max);
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).A **mod** B
- остаток при целочисленном делении А на В Символ#13
в конце — это перевод строки.
А дальше, собственно, решаем примеры minmax12-15 из задачника Абрамяна.
Minmax12. Дано целое число N и набор из N чисел. Найти минимальное положительное число из данного набора. Если положительные числа в наборе отсутствуют, то вывести 0.
В переменной x будем хранить вводимый элемент, а качестве искомого минимального положительного элемента массива возьмем m. Поскольку речь идет о минимальном положительном элементе, нас будут интересовать только положительные числа последовательности. На это указывает условие в строке 12 кода.
var
N, i: byte;
x, m: integer;
begin
write('N = ');
readln(N);
writeln('Введите ', N, ' целых чисел:');
m := 0; { <-- начальное значение положительного минимума }
for i := 1 to N do begin
read(x);
if x > 0 then { <-- проверяем только положительные элементы }
if (m = 0) or (m > x) then m := x { <-- элемент х присваивается
минимуму, только если предыдущий минимум равен 0, или больше
введенного элемента }
end;
writeln('Ответ: ', m);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Minmax13. Дано целое число N и набор из N целых чисел. Найти номер первого максимального нечетного числа из данного набора. Если нечетные числа в наборе отсутствуют, то вывести 0.
Будем находить максимум только среди нечетных элементов. Для этого используем функцию odd(x), возвращающую true при нечетном x (строка 16 кода). Но для начала инициализуем номер самого максимума нулем (строка 9), и само начальное значение максимума (комментарий в коде, строка 10). Потом, если находим нечетный элемент x, больший предыдущего максимума, то x становится новым максимумом, а также запоминаем его номер NumFirstMax.
var
N, i, NumFirstMax: byte;
x, max: integer;
begin
write('N = ');
readln(N);
writeln('Введите ', N, ' целых чисел:');
NumFirstMax := 0;
max := -maxint-1; { <-- начальное значение максимального
числа max возьмем равным -MaxInt-1 – минимальному возможному
значению в рамках типа integer. Это гарантия того, что любое
другое введенное число будет большим начального max }
for i := 1 to N do begin
read(x); { <-- Вводим число }
if odd(x) then { <-- проверяем только нечетные элементы }
if max < x then begin
max := x; { <-- Запоминаем новый максимум }
NumFirstMax := i { <-- Номер первого максимума }
end
end;
writeln('Ответ: ', NumFirstMax);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**function** Odd(i: integer): boolean;
: Возвращает True, если i нечетно Рекомендую посмотреть задачу minmax7, или другие примеры на той же странице.
Minmax14. Дано число B (> 0) и набор из десяти чисел. Вывести минимальный из тех элементов набора, которые больше B, а также его номер. Если чисел, больших B, в наборе нет, то дважды вывести 0.
Здесь обычный максимум, только при условии, что элемент должен быть больше наперед заданного числа В (все комментарии в коде программы.
Не пугайтесь, кто не понимает символа #13
в конце при выводе значений – это код клавиши Enter, обозначающий перевод строки. Его удобно иногда использовать при выводе, чтобы несколько раз не писать оператор вывода write()
. Только нужно добавлять знак "плюс" между выводимыми элементами.
var
N, i, NumMinB: byte;
x, B, minB: integer;
begin
N := 10; { <-- по условию 10 чисел, но можно менять }
write('B = ');
readln(B);
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do begin
read(x); { <-- Вводим число }
{ Введенный элемент х, больший В, становится минимальным
в двух случаях:
а) это первый введенный элемент;
б) предыдущий минимум minB больший введенного числа x. }
if x > B then
if (NumMinB = 0) or (minB > x) then begin
minB := x; { <-- перезаписываем минимум... }
NumMinB := i; { <-- и его номер }
end
end;
if NumMinB > 0 then writeln(#13+' Минимальный элемент: ',
minB, #13 + ' Его нормер: ', NumMinB)
else writeln(0:2, 0:2);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Ещё было бы правильным перед заходом в цикл номер минимума NumMinB инициализировать нулем:NumMinB:=0
, хотя здесь это не обязательно, так как в PascalABC.Net все переменные в начале равны 0 по умолчанию.
Minmax15. Даны числа B, C (0 < B < C) и набор из десяти чисел. Вывести максимальный из элементов набора, содержащихся в интервале (B, C), и его номер. Если требуемые числа в наборе отсутствуют, то дважды вывести 0.
Отличие этой задачи от предыдущей minmax14 только в немножко другом условии: вводимое число надо проверять на попадание в открытый интервал (В, С). Все комментарии в коде программы.
var
N, i, NumMaxBC: byte;
x, B, C, maxBC: integer;
begin
N := 10; { <-- по условию 10 чисел, но можно менять }
NumMaxBC := 0;
writeln('Введите числа В и С (0 < B < C):');
write('B = ');
readln(B);
write('С = ');
readln(C);
writeln('Введите ', N, ' целых чисел:');
for i := 1 to N do begin
read(x); { <-- Вводим число }
{ Введенный элемент х, больший В и меньший C, становится
максимальным в двух случаях:
а) это первый введенный элемент – тогда он и есть
максимальным, поскольку не с чем сравнивать;
б) предыдущий максимум maxBC меньший введенного числа x –
тогда данный элемент х становится новым максимумом. }
if (x > B) and (x < C) then
if (NumMaxBC = 0) or (maxBC < x) then begin
maxBC := x; { <-- перезаписываем максимум... }
NumMaxBC := i; { <-- запоминаем его номер }
end
end;
{ Если в нашей последовательности мы не встретили ни одного числа
с промежутка (В, С), тогда номер максимального элемента NumMaxBC
так и останется равным 0 (после инициализации в строке 7 кода),
поскольку он перезаписывается только в случае обнаружения элемента
с указанного диапазона: строка 22 – условие попадания х в интервал
(B, C), строки 23-26 — перезапизывание максимума и его индекса: }
if NumMaxBC > 0 then
writeln(#13+' Максимальный элемент между ', B, ' и ',
C, ': ', maxBC, #13 + ' Его нормер: ', NumMaxBC)
else writeln(0:2, 0:2);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Посмотрите ещё пример Найти минимальный и максимальный элемент с четными номерами. Если что не понятно, то задавайте вопросы.