ВВЕРХ
ВНИЗ
  • Home
  • Minmax
  • Minmax 12 - 15

Нахождение минимумов и максимумов при условии

Здравствуйте! Чтобы найти экстремальный (т.е. минимальный или максимальный) элемент при некотором условии, необходимо сначала прописывать данное условие, а потом уже находить "по стандарту" обычный минимум или максимум, как на странице Minmax 1 - 5.

Так, решим сначала такую простую задачку: Среди набора случайных положительных чисел вывести максимальный из тех, которые при делении на 5 дают в остатке 2. Здесь условие понятно: нас интересуют именно числа, дающие остаток 2 при делении на 5. Вот как выглядит наш код:

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
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.

Символ #13 в конце — это перевод строки.

А дальше, собственно, решаем примеры minmax12-15 из задачника Абрамяна.

Minmax12. Дано целое число N и набор из N чисел. Найти минимальное положительное число из данного набора. Если положительные числа в наборе отсутствуют, то вывести 0.

В переменной x будем хранить вводимый элемент, а качестве искомого минимального положительного элемента массива возьмем m. Поскольку речь идет о минимальном положительном элементе, нас будут интересовать только положительные числа последовательности. На это указывает условие в строке 12 кода.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
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.

Minmax13. Дано целое число N и набор из N целых чисел. Найти номер первого максимального нечетного числа из данного набора. Если нечетные числа в наборе отсутствуют, то вывести 0.

Будем находить максимум только среди нечетных элементов. Для этого используем функцию odd(x), возвращающую true при нечетном x (строка 16 кода). Но для начала инициализуем номер самого максимума нулем (строка 9), и само начальное значение максимума (комментарий в коде, строка 10). Потом, если находим нечетный элемент x, больший предыдущего максимума, то x становится новым максимумом, а также запоминаем его номер NumFirstMax.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
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.

Рекомендую посмотреть задачу minmax7, или другие примеры на той же странице.

Minmax14. Дано число B (> 0) и набор из десяти чисел. Вывести минимальный из тех элементов набора, которые больше B, а также его номер. Если чисел, больших B, в наборе нет, то дважды вывести 0.

Здесь обычный максимум, только при условии, что элемент должен быть больше наперед заданного числа В (все комментарии в коде программы.

Не пугайтесь, кто не понимает символа #13 в конце при выводе значений – это код клавиши Enter, обозначающий перевод строки. Его удобно иногда использовать при выводе, чтобы несколько раз не писать оператор вывода write(). Только нужно добавлять знак "плюс" между выводимыми элементами.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
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.

Ещё было бы правильным перед заходом в цикл номер минимума NumMinB инициализировать нулем: NumMinB:=0, хотя здесь это не обязательно, так как в PascalABC.Net все переменные в начале равны 0 по умолчанию.

Minmax15. Даны числа B, C (0 < B < C) и набор из десяти чисел. Вывести максимальный из элементов набора, содержащихся в интервале (B, C), и его номер. Если требуемые числа в наборе отсутствуют, то дважды вывести 0.

Отличие этой задачи от предыдущей minmax14 только в немножко другом условии: вводимое число надо проверять на попадание в открытый интервал (В, С). Все комментарии в коде программы.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
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.

Посмотрите ещё пример Найти минимальный и максимальный элемент с четными номерами. Если что не понятно, то задавайте вопросы.


Яндекс.Метрика