Задача «Поиск экстремального элемента,
удовлетворяющего нескольким условиям»

Постановка задачи. Задан целочисленный одномерный массив a из n элементов. Найти номер последнего минимального элемента среди положительных элементов, начиная с первого элемента, большего t. Если нет элементов, больших t, искать с начала массива. При поиске элементов, удовлетворяющих условию, необходимо использовать досрочный выход из цикла. Ввод всех данных осуществляется из файла, вывод – в файл. Для передачи имён файлов должны использоваться параметры программы. Выходной файл открывать для добавления, вывести в файл результаты нескольких тестов.

Шаг 1. Общая структура программы

Программа на процедурном языке программирования состоит из данных и действий по их обработке. program Cond2; { Описание данных – констант, типов и переменных } begin { Обработка данных } end.

Шаг 2. Разработка структуры данных

Из постановки задачи следует, что на вход программы подаётся целочисленный одномерный массив a из n элементов и значение t, которое должно целочисленным, как и элементы массива.

Из постановки задачи также следует, что надо найти imin – номер последнего минимального положительного элемента.

Для задания массива введём константу, ограничивающую максимально возможное количество элементов массива, и тип для массива. program Cond2; const nmax = 10; type mas = array [1..nmax] of integer; var { Входные данные } a: mas; { цел a[1..n] – исходный массив } n: integer; { цел n – количество элементов массива } t: integer; { цел t – значение для сравнения } { Выходные данные } imin: integer; { цел imin – номер последнего минимального положительного элемента } begin { Обработка данных } end.

Шаг 3. Разработка тестов

№ теста Входные данные Ожидаемые результаты Смысл теста
1 n = 8
a = {1, -3, 4, -2, 3, 2, -7, 5}
t = 3
imin = 6 Есть элемент, больший t. Есть положительный элемент. Его номер равен номеру первого элемента, большего t. Минимальный элемент один, расположен в середине массива.
2 n = 11
a = {-5, -7, -2, -5, 5, 24, 0, 11, -7, 9, 12}
t = -3
imin = 5 Есть элемент, больший t. Есть положительный элемент. Его номер больше номера первого элемента, большего t. Минимальный элемент один, его номер равен номеру первого положительного элемента.
3 n = 11
a = {2, 0, -3, 5, 4, 3, 28, 0, 4, -9, 3}
t = 4
imin = 11 Есть элемент, больший t. Есть положительный элемент. Его номер равен номеру первого элемента, большего t. Минимальных элементов несколько, последний минимальный элемент является последним элементом массива.
4 n = 8
a = {1, -5, 5, 4, 2, -6, 3, 7}
t = 3
imin = 5 Есть элемент, больший t. Есть положительный элемент. Его номер равен номеру первого элемента, большего t. До элемента, большего t, есть элемент, наименьший в массиве, который, однако, не рассматривается при поиске.
5 n = 11
a = {2, 0, -3, 5, 2, 3, 28, 0, 2, -9, 3}
t = 44
imin = 9 Нет элементов, больших t – поиск с начала массива. Есть положительный элемент. Минимальных элементов несколько, последний минимальный элемент расположен в середине массива.
6 n = 11
a = {8, 0, -3, 5, 2, 3, 28, 0, 2, -9, 2}
t = 55
imin = 11 Нет элементов, больших t – поиск с начала массива. Есть положительный элемент. Минимальных элементов несколько, последний минимальный элемент является последним элементом массива.
7 n = 5
a = {-2, -3, -5, -1, 0}
t = -7
  Есть элемент, больший t. Нет положительных элементов.
8 n = 5
a = {-2, -3, -5, -1, 0}
t = 7
  Нет элементов, больших t. Нет положительных элементов.

Шаг 4. Разработка общей структуры программы

Программа должна состять из трёх основных частей – ввод исходных данных, получение результатов, вывод полученных результатов. program Cond2; const nmax = 10; type mas = array [1..nmax] of integer; var { Входные данные } a: mas; { цел a[1..n] – исходный массив } n: integer; { цел n – количество элементов массива } t: integer; { цел t – значение для сравнения } { Выходные данные } imin: integer; { цел imin – номер последнего минимального положительного элемента } begin { Ввод исходных данных } { Нахождение номера последнего минимального положительного элемента } { Вывод результатов } end.

Шаг 5. Разработка ввода и вывода

Организуем ввод из файла и вывод в файл с использованием параметров программы, проверкой правильности передачи параметров и существования входного файла, как уже было сделано в лабораторной работе № 4. Выходной файл надо открывать для добавления, но для этого он должен существовать. Поэтому при отсутствии выходного файла будем открывать его для записи, а при наличии – для добавления.

Также желательно вывести номер первого элемента, большего t, и номер первого положительного элемента, расположенного после t. Но такие элементы могут и не существовать, поэтому нам потребуются промежуточные данные – целочисленные переменные nt и np и логические переменные t_exists и p_exists.

В качестве заглушки для обработки данных напишем пока присваивание значения ложь переменнsv t_exists и p_exists. В этом случае будут выводится сообщения, что в массиве нет элемента, большего t, и нет положительных элементов.

Входная форма

Выходная форма

program Cond2; const nmax = 10; type mas = array [1..nmax] of integer; var { Входные данные } a: mas; { цел a[1..n] – исходный массив } n: integer; { цел n – количество элементов массива } t: integer; { цел t – значение для сравнения } { Выходные данные } imin: integer; { цел imin – номер последнего минимального положительного элемента } { Промежуточные данные } nt, np: integer; { цел nt – номер элемента, большего t; цел np – номер первого положительного элемента } t_exists, p_exists: boolean; { лог t_exists, p_exists – признак наличия элементов, больших t, и положительных элементов } f: TextFile; { файловая переменная } begin if ParamCount < 2 then { Проверяем количество параметров } writeln('Недостаточно параметров!'); else begin if not FileExists(ParamStr(1)) then { Проверяем существование файла } writeln('Невозможно открыть файл ''', ParamStr(1), ''' для чтения'); else begin { Ввод исходных данных } AssignFile(f, ParamStr(1)); { Открываем файл } Reset(f); readln(f, n); for i: integer := 1 to n do read(f, a[i]); readln(f, t); CloseFile(f); { Закрываем файл } { Нахождение номера последнего минимального положительного элемента – заглушка } t_exists := false; p_exists := false; { Вывод результатов } AssignFile(f, ParamStr(2)); if FileExists(ParamStr(2)) then Append(f) else Rewrite(f); writeln(f, 'Массив A из ', n:2, ' элементов'); for i: integer := 1 to n do write(f, a[i]:6, ' '); writeln(f); writeln(f); writeln(f, 'Значение для сравнения = ', t); writeln(f); if t_exists then writeln(f, 'Номер первого элемента, большего ', t:3, ' = ', nt:2) else writeln(f, 'Нет элементов, больших ', t:3, ', - поиск с начала массива'); if p_exists then begin writeln(f, 'Номер первого положительного элемента после элемента с номером ' , nt:2, ' = ', np:2); writeln(f, 'Номер последнего минимального положительного элемента = ', imin:2); end else writeln(f, 'В массиве нет положительных элементов'); CloseFile(f); end; end; end.

Шаг 6. Разработка вычислительной части программы

Алгоритм для данной задачи должен разрабатываться методом нисходящего проектирования. Для этого выделим сначала крупные подзадачи, правильно их организуем, и на следующем шаге раскроем эти подзадачи.

Для решения данной задачи сначала надо проверить существование элемента, большего t, и найти номер первого такого элемента. Если такого элемента нет, присвоим переменной nt значение 1, чтобы начать поиск с начала массива. Затем проверим существование положительного элемента и найдём номер первого положительного элемента. Если положительный элемент есть, то можно первый положительный элемент использовать для инициализации минимума и дальше искать номер последнего минимального элемента обычным образом.

program Cond2; const nmax = 10; type mas = array [1..nmax] of integer; var { Входные данные } a: mas; { цел a[1..n] – исходный массив } n: integer; { цел n – количество элементов массива } t: integer; { цел t – значение для сравнения } { Выходные данные } imin: integer; { цел imin – номер последнего минимального положительного элемента } { Промежуточные данные } nt, np: integer; { цел nt – номер элемента, большего t; цел np – номер первого положительного элемента } t_exists, p_exists: boolean; { лог t_exists, p_exists – признак наличия элементов, больших t, и положительных элементов } f: TextFile; { файловая переменная } begin if ParamCount < 2 then { Проверяем количество параметров } writeln('Недостаточно параметров!'); else begin if not FileExists(ParamStr(1)) then { Проверяем существование файла } writeln('Невозможно открыть файл ''', ParamStr(1), ''' для чтения'); else begin { Ввод исходных данных } AssignFile(f, ParamStr(1)); { Открываем файл } Reset(f); readln(f, n); for i: integer := 1 to n do read(f, a[i]); readln(f, t); CloseFile(f); { Закрываем файл } { Нахождение номера последнего минимального положительного элемента } { Поиск элемента, большего t } if not t_exists then { Если элемента, большего t, нет, } nt := 1; { начинаем поиск с начала массива } { Поиск положительного элемента } if p_exists then { Поиск номера последнего минимального положительного элемента } { Вывод результатов } AssignFile(f, ParamStr(2)); if FileExists(ParamStr(2)) then Append(f) else Rewrite(f); writeln(f, 'Массив A из ', n:2, ' элементов'); for i: integer := 1 to n do write(f, a[i]:5, ' '); writeln(f); writeln(f); writeln(f, 'Значение для сравнения = ', t); writeln(f); if t_exists then writeln(f, 'Номер первого элемента, большего ', t:3, ' = ', nt:2) else writeln(f, 'Нет элементов, больших ', t:3, ', - поиск с начала массива'); if p_exists then begin writeln(f, 'Номер первого положительного элемента после элемента с номером ' , nt:2, ' = ', np:2); writeln(f, 'Номер последнего минимального положительного элемента = ', imin:2); end else writeln(f, 'В массиве нет положительных элементов'); CloseFile(f); end; end; end.