Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатики.doc
Скачиваний:
45
Добавлен:
13.11.2018
Размер:
1.53 Mб
Скачать

12.2.1.2. Методы проектирования алгоритмов

Методы проектирования алгоритмов включают: нисходящее проектирование, модульность, структурное программирование.

Нисходящее проектирование предполагает последовательное разбиение исходной задачи на подзадачи до такой конкретизации, когда подзадача сможет быть реализована одним оператором выбранного для программирования языка. По ходу нисходящего проектирования та или иная подзадача может сформировать самостоятельный модуль. Тогда может быть применен принцип модульного программирования. Он обеспечивает легкость составления алгоритмов и отладки программ, легкость сопровождения и модификации, а также возможность одновременной разработки различных модулей разными специалистами с использованием разных языков программирования.

При работе над модулем можно применить принцип структурного программирования. Его цель – повышение читабельности и ясности алгоритма (и программы), более высокой производительности программистов и упрощение отладки. В соответствии с этим принципом для построения любого алгоритма (программы) требуются три типовых блока:

  1. функциональный. Используется для представления линейных алгоритмов. Описывается языком графических символов следующим образом:

  1. циклический. Используется для представления циклических алгоритмов. Описывается языком графических символов одним из двух способов:

  1. конструкция принятия двоичного решения. Применяется для представления разветвляющихся алгоритмов. Описывается языком графических символов следующим образом:

Пример 12.3. Разработать блок-схему для задачи из примера 12.1, используя принципы нисходящего проектирования, модульности и структурного программирования.

Выделим в поставленной задаче три основных подзадачи и введем необходимые комментарии:

  1. ввод и размещение в памяти компьютера списка абитуриентов и их оценок по аттестату. При этом количество абитуриентов заранее неизвестно, поскольку документы принимаются у всех желающих;

  2. ввод и анализ оценок по каждому экзамену по каждому абитуриенту. В результате анализа возможно исключение абитуриента из списка. Число абитуриентов известно после решения первой подзадачи. Количество экзаменов известно заранее;

  3. упорядочение списка абитуриентов в зависимости от оценок. Здесь возможно использовать не сами оценки, а средний балл по аттестату и средний балл за вступительные экзамены;

  4. определение нужного подмножества абитуриентов для зачисления. Число студентов набора известно заранее.

В соответствии с выделенными подзадачами определим четыре модуля, взаимосвязь которых представлена на рис. 12.2

Рис. 12.2. Укрупненная блок-схема для примера 12.1

После такой декомпозиции исходной задачи, полученные укрупненные блоки являются модулями, которые могут быть реализованы независимо друг от друга. Единственным ограничением при реализации является необходимость согласования межмодульных связей, когда результат работы одного модуля служит входной информацией другого. Такими данными являются:

  1. от блока Ввод и размещение в блок Ввод и анализ передаются следующие данные: список абитуриентов (фамилии и инициалы), средний балл по аттестату, количество абитуриентов;

  2. от блока Ввод и анализ блоку Упорядочение передаются: список абитуриентов, средний балл по аттестату и средний балл за вступительные экзамены;

  3. от блока Упорядочение блоку Определение передается список абитуриентов и число тех, кто сдал вступительные экзамены.

После этих соглашений введем обозначения для требуемых переменных, придерживаясь принципа мнемоничности имен переменных, а также определим их тип:

  • фамилия и инициалы студента – FIO, тип - символьный;

  • начальное число абитуриентов – CHISLO, тип – целый;

  • число отчисленных абитуриентов – OTCHISL, тип – целый;

  • оценки по аттестату – ATTECTAT_OCENKI, тип – числовой одномерный массив;

  • оценки за вступительные экзамены – BCTUPIT_OCENKI, тип – числовой одномерный массив;

  • средний балл по аттестату – SR_ATTECTAT, тип - вещественная переменная;

  • средний балл по вступительным экзаменам – SR_BCTUPIT, тип - вещественная переменная;

  • число вступительных экзаменов – EXAMINE, тип - целая переменная;

  • объем набора – NABOR, тип - целая переменная.

Разработаем алгоритмы для выделенных четырех модулей и представим их графическими символами, т.е. блок-схемами. Результат показан на рис. 12.3 – 12.6.

Рассмотрим подробнее эти блок-схемы.

1. Модуль Ввод и размещение. В блоке 1 переменной CHISLO присваивается начальное нулевое значение – выполняется ее подготовка к накоплению числа абитуриентов,

1

2

3

Здесь вводятся FIO, ATTECTAT_OCENKI

ДА Для определения конца ввода вместо фамилии вводится условный знак

4

5

6

НЕТ

Расчет выполняется как определение

среднего арифметического всех оценок

в аттестате

В список помещаются FIO,

SR_ATTECTAT

Накопление числа абитуриентов

Рис. 12.3. Блок-схема модуля Ввод и размещение

1

2

3

4

5

6

7

8

9

Здесь вводится переменная EXAMINE

10

11

Здесь вводится

BCTUPIT_

OCENKI(i)

НЕТ

ДА

Рис. 12.4. Блок-схема для модуля Ввод и анализ

1

2

3

4

5

6

Здесь выполня-

ется анализ НЕТ

SR_BCTUPIT(j-1)

< SR_BCTUPIT(j)

ДА Здесь выполняется

анализ ДА

SR_BCTUPIT(j-1)

= SR_BCTUPIT(j)

НЕТ

Здесь выполняется

анализ SR_ATTECTAT(j-1) НЕТ

< SR_ATTECTAT(j)

7

ДА

Рис.12.5. Блок-схема для модуля Упорядочение

1

2

3

4

5

НЕТ

ДА

Рис. 12.6. Блок-схема модуля Определение

которое осуществляется в цикле в блоке 6. В блоке 2 вводятся исходные данные по одному абитуриенту – его фамилия, имя, отчество, список оценок по аттестату. Данные заносятся в соответствующие переменные (см. комментарий к блоку). Для прерывания цикла задаются специальным знаком, ввод которого свидетельствует об окончании ввода списка абитуриентов. Этот анализ выполняется в блоке 3. Если достигнут конец списка абитуриентов (выход ДА), алгоритм прекращает свою работу. Если конец цикла не достигнут (выход НЕТ), рассчитывается среднее арифметическое значение оценок в аттестате (блок 4). Затем фамилия, имя, отчество и средний балл по аттестату запоминаются на диске (блок 5).

2. Модуль Ввод и анализ. В блоке 1 вводится число вступительных экзаменов. В блоке 2 формируется начальное (равное нулю) значение числа отчисленных абитуриентов: эта переменная нужна для определения реального числа абитуриентов, сдавших экзамены и допущенных к зачислению. В блоке 3 организуется циклический процесс, позволяющий по каждому вступительному экзамену выполнить ввод соответствующих оценок по каждому абитуриенту. Обращение ко всем абитуриентам организуется с помощью блока 4. Если введенная оценка равна 2, абитуриент исключается из списка, размещенного на диске (блок 7). В противном случае оценка добавляется к списку оценок абитуриента (блок 9). Внутри цикла формируется также число отчисленных абитуриентов (блок 8). Таким образом, данный алгоритм является примером вложенной циклической структуры, когда один циклический процесс вложен в другой. По окончании цикла определяется число оставшихся абитуриентов (блок 10) и рассчитывается средний балл за вступительные экзамены по каждому абитуриенту (блок 11). Результат последнего расчета помещается в список абитуриентов на диск.

3. Модуль Упорядочение. В этом модуле реализован один из методов упорядочения списка по убыванию значений элементов (в нашем случае по убыванию средних баллов по вступительным экзаменам и по аттестату). Идея метода состоит в том, что последовательно, начиная с первого элемента списка, сравниваются два рядом стоящих элемента. Если последующий элемент больше предыдущего, они меняются местами. Таким образом, если в списке n элементов, указанное сравнение выполняется (n-1) раз по количеству различных пар. Чтобы учесть соотношение не только рядом стоящих, но и разнесенных по списку элементов, описанный анализ пар элементов выполняется (n-1) раз. Иначе говоря, этот метод представляется вложенным циклическим алгоритмом (блоки 1 и 2). В блоке 3 сравниваются два рядом стоящих элемента в списке своими средними оценками за вступительные экзамены: если последующий элемент (абитуриент) имеет средний балл больше, чем предыдущий элемент, выполняется блок 4 и элементы меняются местами; иначе выполняется блок 5. В этом случае определяется, равны ли средние баллы за вступительные экзамены у рядом стоящих элементов в списке. Если это так (выход ДА из блока 5), в расчет берутся средние баллы за аттестат (блок 6): преимущества имеет тот абитуриент, у которого больше средний балл по аттестату при равных оценках на вступительных экзаменах. Если же окажется, что средний балл за вступительные экзамены у последующего элемента списка меньше, чем у предыдущего (выход НЕТ у блока 5), элементы местами не меняются – они и так упорядочены по убыванию среднего балла за вступительные экзамены. В блоке 6 анализируются средние баллы за аттестат. Этот анализ выполняется только тогда, когда средние оценки по вступительным экзаменам одинаковые у рядом стоящих в списке абитуриентов. Если средний балл по аттестату у последующего элемента больше, чем у предыдущего (выход ДА блока 6), элементы меняются в списке местами (блок 7). Иначе (выход НЕТ у блока 6) никаких преобразований в списке не происходит.

4. Модуль Определение. В блоке 1 вводится значение набора студентов. В блоке 2 определяется, превышает ли требуемый набор количество абитуриентов, допущенных к зачислению. Если вступительные экзамены успешно сдало меньшее количество абитуриентов, чем требуется (выход ДА из блока 2), то значение набора уменьшается до этой величины (блок 3). Иначе (выход НЕТ из блока 2) управление передается блоку 4, в котором организуется циклический алгоритм просмотра списка абитуриентов и вывод данных по каждому абитуриенту (блок 5). На этом работа алгоритма заканчивается: сформирован список абитуриентов, которые могут быть зачислены по результатам вступительных экзаменов.

Анализ блок-схем показывает:

  1. при проектировании алгоритма использован принцип нисходящего проектирования, в соответствии с которым исходная задача декомпозирована на подзадачи (см. рис. 12.2);

  2. выделенные подзадачи реализованы как отдельные модули (см. рис. 12.3 – 12.6), т.е. применен принцип модульности;

  3. в структуре модулей можно выделить типовые конструкции, которые указывались ранее, т.е. алгоритмы выполнены с учетом принципов структурного программирования;

  4. каждый блок из блок-схем рис. 12.3 – 12.6 может быть закодирован одним оператором такого операторного языка, как, например, Турбо-Паскаль. Это означает, что блок-схемы разработаны с учетом требуемой степени детализации, а сама кодировка блок-схем может быть выполнена читателем самостоятельно.

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