Постановка задачи. Задан целочисленный одномерный массив 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.