Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Некоторые методы решения типовых задач одномерн...doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
181.25 Кб
Скачать

2. Входные данные

цел n - число элементов массива; простая переменная; ...

<тип> а - заданный одномерный массив; .....

3. Выходные данные

истина, если искомый элемент есть,

ложь, в противном случае.

лог y1 – результат проверки; y1 =

цел k1– номер искомого элемента; . . .

<тип> ak1 – его значение; …

6. Метод

Пусть i - текущий номер элемента.

Используем y1 следующим образом: пусть y1 сохраняет значение "ложь", пока не найден нужный элемент, и меняет значение на "истина", как только элемент найден.

Тогда до начала поиска следует положить y1=ложь (элемент пока не найден).

Просматриваем элементы, пока они не удовлетворяют условию и не исчерпаны:

если текущий элемент удовлетворяет условию, то

Обработка элемента

- меняем y1 на истина (y1:=истина);

- k1:=i;

- ak1:=a(i);

кесли;

конец просмотра.

Задача «Проверка условия»

1. Условие. Проверить, все ли элементы заданного одномерного массива a[n] удовлетворяют условию В2.

Если нет, то найти значение и номер первого элемента, не удовлетворяющего условию.

2. Входные данные

цел n - число элементов массива; простая переменная; ...

<тип> а - заданный одномерный массив; .....

3. Выходные данные

л

истина, если все элементы удовлетворяют условию,

ложь, в противном случае (хотя бы один элемент нарушает условие).

ог y2 – результат проверки;

y2 =

цел k2– номер искомого элемента; . . .

<тип> ak2 – его значение; …

6. Метод

Пусть i - текущий номер элемента.

Используем y2 следующим образом: пусть y2 сохраняет значение "истина", пока все элементы удовлетворяют условию, и меняет значение на "ложь", как только условие нарушается.

Тогда до начала поиска следует положить y2=истина (условие пока не нарушено).

Просматриваем элементы, пока они удовлетворяют условию и не исчерпаны:

если текущий элемент не удовлетворяет условию, то

Обработка элемента

- меняем y2 на ложь (y2:= ложь);

- k2:=i;

- ak2:=a(i);

кесли;

конец просмотра.

Указания к кодированию

В С++ логический тип описывается как bool, константы истина и ложь как true и false, отрицание как (!).

В логике вместо y=истина записывается y, вместо y =ложь – отрицание yy, читается «не-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 =

истина, если такой элемент есть,

ложь, в противном случае.

k2 - номер первого элемента, удовлетворяющего с2,

лог р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

k2:=n;

Поиск номера максимального элемента, начиная с № k1 до № k2,

c проверкой условия с1

A4

вывод (km) по обр6;

кесли;

{сит.4} если ¬p1 & p2 то

вывод по обр7;

кесли;

{сит.5} если ¬p1 & ¬p2 то

вывод по обр8;

кесли;

Замечание. Видно, что задачи А3 и А4 схожи по постановке (и даже совпадают). Тем не менее каждая из них должна быть представлена в программе, поэтому они имеют разные имена. Очевидно, для их решения будет использован один и тот же алгоритм, который будет записан дважды.

Далее такие «одинаковые» задачи мы будем оформлять в виде процедур, и тогда описание процедуры будет представлять собой обобщенный алгоритм решения, а две задачи будут решаться двумя вызовами одной процедуры, т.е. А3 и А4 будут соответствовать отдельным вызовам одной процедуры. Не путать!