
- •Некоторые методы решения типовых задач Поиск экстремальных значений (максимума, минимума) в одномерном массиве
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •Поиск элемента, удовлетворяющего заданному условию
- •2. Входные данные
- •6. Метод
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •Задача со сложной логикой
2. Входные данные
цел n - число элементов массива; простая переменная; ...
<тип> а - заданный одномерный массив; .....
3. Выходные данные
истина, если искомый элемент есть,
ложь, в противном случае.
лог y1 – результат проверки; y1 =
цел k1– номер искомого элемента; . . .
<тип> ak1 – его значение; …
6. Метод
Пусть i - текущий номер элемента.
Используем y1 следующим образом: пусть y1 сохраняет значение "ложь", пока не найден нужный элемент, и меняет значение на "истина", как только элемент найден.
Тогда до начала поиска следует положить y1=ложь (элемент пока не найден).
Просматриваем элементы, пока они не удовлетворяют условию и не исчерпаны:
если
текущий элемент удовлетворяет условию,
то
Обработка элемента
- k1:=i;
- ak1:=a(i);
кесли;
конец просмотра.
Задача «Проверка условия»
1. Условие. Проверить, все ли элементы заданного одномерного массива a[n] удовлетворяют условию В2.
Если нет, то найти значение и номер первого элемента, не удовлетворяющего условию.
2. Входные данные
цел n - число элементов массива; простая переменная; ...
<тип> а - заданный одномерный массив; .....
3. Выходные данные
л
истина, если все элементы удовлетворяют
условию,
ложь, в противном случае (хотя бы один
элемент нарушает условие).
y2 =
цел k2– номер искомого элемента; . . .
<тип> ak2 – его значение; …
6. Метод
Пусть i - текущий номер элемента.
Используем y2 следующим образом: пусть y2 сохраняет значение "истина", пока все элементы удовлетворяют условию, и меняет значение на "ложь", как только условие нарушается.
Тогда до начала поиска следует положить y2=истина (условие пока не нарушено).
Просматриваем элементы, пока они удовлетворяют условию и не исчерпаны:
если
текущий элемент не удовлетворяет
условию, то
Обработка элемента
- k2:=i;
- ak2:=a(i);
кесли;
конец просмотра.
Указания к кодированию
В С++ логический тип описывается как bool, константы истина и ложь как true и false, отрицание как (!).
В логике вместо y=истина записывается y, вместо y =ложь – отрицание y (¬y, читается «не-y»). При кодировании в С++ можно использовать обе формы: y=true то же, что y; y=false то же, что !y.
Задача со сложной логикой
Предлагаемая задача объединяет в себе несколько важных и поучительных моментов.
Простое объединение поиска максимума с поиском по условию приводит к неожиданному на первый взгляд усложнению логики решения. В итоге (по опыту решения этой задачи студентами) оказывается, что самый простой путь анализа всех возможных ситуации и получения верного решения – тщательная спецификация и нисходящая разработка!
Таким образом, задача проста по условию и структуре данных, но сложна по логике ровно настолько, чтобы быть прекрасным учебным, но полноценным примером нисходящей разработки.
1. Задача Cond_2, или "поиск по 2-м условиям".
Найти номер первого максимального значения из всех элементов одномерного целого массива a[n], удовлетворяющих условию c1 и расположенных до первого элемента, удовлетворяющего условию c2.
Уточнение: элемент, удовлетворяющий с2, по желанию и смыслу задачи можно включать или не включать в рассмотрение.
В данном случае он рассматривается.
Иллюстрация.
Пусть – элементы, удовлетворяющие условию с1, – элементы, удовлетворяющие условию с2.
Возможные варианты расположения элементов:
Есть элементы, удовлетворяющие обоим
условиям, и есть область поиска.
Схематическое описание ситуаций
№ |
Элемент, удовлетворяющий |
Что делаем
|
|
с1 |
с2 |
||
1 |
есть |
есть, как надо |
ищем результат |
2 |
есть |
есть, не как надо |
искать негде |
3 |
есть |
нет |
уточняем, что делать: ищем до конца |
4 |
нет |
есть |
искать негде |
5 |
нет |
нет |
искать негде |
2. Входные данные
цел n - число элементов массива; простая переменная; ...
цел а - заданный одномерный массив; .....
3. Выходные данные
цел km – искомый номер; ....
4. Аномалии не рассматриваем
5. Функциональные тесты составить самостоятельно. Предусмотреть тесты для каждой из возможных ситуаций расположения элементов.
6. Метод
Пусть k1 - номер первого элемента, удовлетворяющего с1,
истина, если такой элемент есть,
ложь, в противном случае.
лог р1 =
истина, если такой элемент есть,
ложь, в противном случае.
лог р2=
Соотношениями значений этих переменных описываются все перечисленные ситуации.
Схема решения
Поиск значений p1 и k1
Вх.: n, a;
вых.: p1, k1
A1
задача типа
«Поиск
по условию»
Вх.: n, a;
вых.: p2, k2
Поиск значений p2 и k2
A2
{сит.1} если p1 & p2 & (k1<=k2) то
Вх.: n,
a,
k1,
k2;
вых.: km
Поиск номера максимального элемента,
начиная с № k1 до № k2,
c проверкой условия с1
A3
вывод (km) по обр4;
кесли;
{сит.2} если p1 & p2 & (k1>k2) то
вывод по обр5;
кесли;
{сит.3} если p1 & ¬p2 то
Вх.: n,
a,
k1,
k2;
вых.: km
Поиск номера максимального элемента,
начиная с № k1 до № k2,
c проверкой условия с1
A4
вывод (km) по обр6;
кесли;
{сит.4} если ¬p1 & p2 то
вывод по обр7;
кесли;
{сит.5} если ¬p1 & ¬p2 то
вывод по обр8;
кесли;
Замечание. Видно, что задачи А3 и А4 схожи по постановке (и даже совпадают). Тем не менее каждая из них должна быть представлена в программе, поэтому они имеют разные имена. Очевидно, для их решения будет использован один и тот же алгоритм, который будет записан дважды.
Далее такие «одинаковые» задачи мы будем оформлять в виде процедур, и тогда описание процедуры будет представлять собой обобщенный алгоритм решения, а две задачи будут решаться двумя вызовами одной процедуры, т.е. А3 и А4 будут соответствовать отдельным вызовам одной процедуры. Не путать!