Решение экономических задач компьютерными средствами > Информатика в экономике: Учебное пособие

Вид материалаРешение

Содержание


Решение задач с использованием типовых алгоритмов обработки данных
Разработка спецификаций.
Разработка алгоритмов
Модуль – это некоторый алгоритм или его блок, имеющий конкретное наименование, выполняющий определенную функцию и имеющий станда
Тестирование алгоритмов
Технологии программирования (модульное, структурное, объектно-ориентированное)
Подобный материал:
1   2   3   4
Формульное описание алгоритма

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

Задание алгоритмов с помощью блок-схем

Достаточно часто алгоритмы записываются в виде блок-схем, которые являются графическим представлением последовательности действий. В этом случае, они состоят из отдельных блоков. Их начертание определено российским стандартом ГОСТ 19.701-90 (единой системой программной документации), который разработан путем прямого применения международного стандарта ISO 5807-85.

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



Рис. 6.16. Основные графические изображения, используемые при описании алгоритмов.

Блоки могут связываться в одну из следующих конструкций:
  • линейная (последовательная);
  • простой выбор;
  • множественный выбор;
  • цикл.

Рассмотрим представление некоторых основных алгоритмических конструкций с помощью блок-схем.
  1. Линейный алгоритм

Блок схема рассмотренного ранее линейного алгоритма вычисления значения «F» в графической форме, представлена на рис.6.17)



Рис.6.17. Линейная конструкция алгоритма

Линейная структура указывает на последовательность операций, которые следует выполнить в определенной последовательности.
  1. Простой выбор

Конструкция «простой выбор» реализует правило: если выполняется ‹условие 1›, то производится Операция 1, иначе производится Операция 2 (см. рис.6.21).



Рис.6.18. Изображение алгоритма простого выбора на блок-схеме

Рис.6.19. Пример конструкции «простой выбор»
  1. Множественный выбор

Конструкция ”множественный выбор” используется в том случае, если имеется несколько вариантов условий, которые отражают взаимоисключающие случаи. Добавим в предыдущий пример дополнительные условия



Рис.6.20. Пример конструкции «множественный выбор»
  1. Цикл

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

Если условие проверяется в начале цикла - тогда речь идет о цикле с предусловием (Рис.6.21).



Рис.6.21 Фрагмент алгоритма цикла с предусловием

Если условие проверяется в конце цикла, то имеем дело с циклом с постусловием (рис.6.22).



Рис.6.22 Фрагмент алгоритма цикла с постусловием

Любой алгоритм, представленный блок-схемой, это образование из связанных между собой или вложенных друг в друга четырех конструкций перечисленных ранее. Описание алгоритма в виде блок-схемы хорошо обозримо и его легко модифицировать.

Существуют различные подходы к разработке алгоритмов. Большинство из них базируются на принципе «сверху – вниз» когда на начальных этапах разработки создается общая схема, содержащая основные крупные блоки. Далее производится их последовательная детализация, то тех пор, пока не станет возможным реализация алгоритма на языках программирования.

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

Сказанное выше можно проиллюстрировать следующей схемой (рис.6.23). На ней показано, что при нисходящем проектировании алгоритма (сверху-вниз), при создании модуля более высокого уровня (Модуль 1) нижестоящие подалгоритмы (в нашем случае Модуль 2 и Модуль 3) на первом этапе не детализируются.



Рис. 6.23. Схема, поясняющая разницу между двумя подходами при создании алгоритмов

Их разработкой занимаются уже после окончания работ над алгоритмом более высокого уровня.

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

Словесное описание алгоритма

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

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

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

Например, рассмотренный ранее алгоритм оформления счета на псевдокоде имеет следующий вид:

начало алгоритм оформления счета

нц для i:=1 до количество_строк делать

сумма_по_строке[i]:=количество_предметов[i]*цена[i];

кц;

сумма_счета:=0;

нц для i:=1 до количество_строк делать

сумма_счета:= сумма_счета + сумма_по_строке[i];

кц;

сумма_скидки :=0;

нц для i:=1 до количество_строк делать

если сумма_по_строке[i]<250000 и сумма_по_строке[i]>=100000 то

скидка[i]:= сумма_по_строке[i]*0.01;

сумма_скидки := сумма_скидки+ скидка[i];

конец_если;

если сумма_по_строке[i]<1000000 и сумма_по_строке[i]>=250000 то

скидка[i]:= сумма_по_строке[i]*0.025;

сумма_скидки := сумма_скидки+ скидка[i];

конец_если;

если сумма_по_строке[i]>=1000000 то

скидка[i]:= сумма_по_строке[i]*0.05;

сумма_скидки := сумма_скидки+ скидка[i];

конец_если;

кц;

сумма_счета:= сумма_счета- сумма_скидки;

затраты_на_доставку :=0;

нц для i:=1 до количество_строк делать

если срочность_доставки = истина то

затраты_на_доставку := затраты_на_доставку + вес[i]*10000;

иначе

затраты_на_доставку := затраты_на_доставку + вес[i]*1000;

конец если;

кц;

кц алгоритм оформления счета.


В этой записи начало алгоритма обозначено «начало алгоритм оформления счета», его конец «кц алгоритм оформления счета». Используется понятие оператора - наименьшей автономной исполняемой части языка псевдокода. Как правило, оператор заканчивается знаком «;», а весь алгоритм знаком «.».

В псевдокоде широко используются выражения: “:=” - операция присваивания, “+”, ”-“, “*” и “/” - операции сложения, вычитания, умножения и деления, соответственно, а также логические функции “и”, “или”, “не” (&, |, , and,or, not). Кроме численных, используются логические переменные, принимающие значения истина/ложь (true/false) и знаки “>”- больше, ”<”- меньше, “=”- равно.

Номера строк счета в описании алгоритма, обозначаются в квадратных скобках, как элементы массива с номером «i». Следует отметить, что ключевые слова в псевдокоде выделяются жирным шрифтом и/или подчеркиванием.


  1. Решение задач с использованием типовых алгоритмов обработки данных


Линейные алгоритмы в псевдокоде представляют простую последовательность операторов. Например,

сумма_счета:=0;

сумма_счета:= сумма_счета- сумма_скидки;

затраты_на_доставку :=0;

Простой выбор задается конструкцией «если»

если <условие> то <действие 1> иначе <действие 2> кц_если;

Здесь конец_если означает окончание действия условия. Например,

если срочность_доставки = истина то

затраты_на_доставку := затраты_на_доставку + вес[i]*10000;

иначе

затраты_на_доставку := затраты_на_доставку + вес[i]*1000;

конец если;


Множественный выбор при “n” условиях обычно записывают с помощью оператора «выбор»:

выбор

при <условие 1>: <действие 1>;

при < условие 2>: <действие 2>;

……………………..

при < условие n-1>: <действие n-1>;

при < условие n>: <действие n>;

конец_выбора

так для рассмотренного ранее примера можно записать

выбор

при сумма_по_строке[i]<250000 и сумма_по_строке[i]>=100000 :

скидка[i]:= сумма_по_строке[i]*0.01;

сумма_скидки := сумма_скидки+ скидка[i];

при сумма_по_строке[i]<1000000 и сумма_по_строке[i]>=250000 :

скидка[i]:= сумма_по_строке[i]*0.025;

сумма_скидки := сумма_скидки+ скидка[i];

при сумма_по_строке[i]>=1000000 :

скидка[i]:= сумма_по_строке[i]*0.05;

сумма_скидки := сумма_скидки+ скидка[i];

конец_выбора;


Циклические вычисления в псевдокоде записываются тремя основными способами.

Циклы с фиксированным числом повторений

нц для <переменная>:=<начальное значение> до <конечное значение> шаг <величина шага> делать

<тело цикла>

кц;


Здесь нц и кц – начало и конец цикла, шаг – величина, на которую увеличивается переменная, а тело цикла – набор выполняемых инструкций. По умолчанию шаг считается равным 1. Ключевое слово делать означает, что все инструкции вплоть до окончания цикла, будут повторяться многократно.

Эту конструкцию можно проиллюстрировать фрагментом примера, рассмотренного выше

нц для i:=1 до количество_строк делать

сумма_счета:= сумма_счета + сумма_по_строке[i];

кц;


Рис.6.10 Фрагмент алгоритма, иллюстрирующий запись цикла с фиксированным числом повторений на псевдокоде

Циклы с предусловием обычно записываются следующим образом

нц пока <условие> делать

<тело цикла>

кц

а циклы с постусловием

нц делать

<тело цикла>

пока <условие>

кц


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

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

В настоящее время наибольшее распространение получили технологии так называемого процедурного программирования, которые реализуются с помощью языков программирования FORTRAN, Pascal, Си и многих других. Они в наибольшей степени приспособлены для традиционной компьютерной архитектуры, основанной на схеме фон Неймана.

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

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

- анализ и постановка задач;

- проектирование - разработка спецификаций;

- проектирование – разработка алгоритмов;

- написание исходных текстов программ и их трансляция;

- тестирование и отладка программ;

- испытания и сдача программ;

- сопровождение программ.

Из них наиболее трудоемким является написание исходных текстов программы, а также их тестирование и отладка. Кратко рассмотрим содержание перечисленных этапов создания программного продукта.

Анализ и постановка задач

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

Разработка спецификаций.

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

Кроме того спецификации содержит и нефункциональные требования. Например, ограничения связанные с дизайном, производительностью, выбранными проектными решениями и т.д. Разработка спецификаций должна производиться в соответствии с существующими стандартами, в которых содержатся рекомендации к структуре и методам описания требований к программным продуктам. Хорошо выполненная спецификация позволяет на этапе написания текстов программ одновременно и эффективно работать целой команде программистов независимо друг от друга, тем самым, обеспечивая сокращение сроков работ.

Разработка алгоритмов

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

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

На структурном подходе основан модульный метод проектирования и разработки алгоритмов. Модуль – это некоторый алгоритм или его блок, имеющий конкретное наименование, выполняющий определенную функцию и имеющий стандартный вход и выход. Модуль должен обладать свойством структурной замкнутости и функциональной определенности. Структурная замкнутость означает независимость структуры программы от конструкции отдельного модуля. Функциональная определенность состоит в том, что модуль выполняет функции, свойственные ему одному.

При использовании модулей достигается:

- функциональная целостность и завершенность, так как каждый модуль реализует только одну функцию;

- автономность и независимость от других модулей;

- эволюционируемость, то есть отдельный модуль может быть модернизирован независимо от остального алгоритма;

- открытость перед другими пользователями и разработчиками для модернизации и использования;

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

Преимущества модульного проектирования алгоритмов заключается в том, что:

- разработка алгоритма большого объема может производиться различными исполнителями;

- создается библиотека наиболее часто используемых алгоритмов;

- облегчается тестирование алгоритмов и обоснование их правильности;

- упрощается проектирование и модификация алгоритмов;

- уменьшается сложность разработки алгоритмов и программных комплексов;

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

Тестирование алгоритмов

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

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

  1. Технологии программирования (модульное, структурное, объектно-ориентированное)


Технологии прграммирования реализуются с помощью систем программирования, под которыми понимается комплекс средств, предназначенный для создания и эксплуатации программ на конкретном языке программирования. Система программирования включает:
  • входной язык программирования;
  • редактор для написания и модификации текстов программ на алгоритмическом языке;
  • транслятор с входного языка на язык машины;
  • редактор связи;
  • библиотеку стандартных подпрограмм;
  • средства отладки.

Различные классы задач имеют свою специфику, и поэтому для своего решения требуют учета их особенностей, что достигается выбором соответствующего стиля и технологии программирования. Сегодня наиболее популярными являются следующие стили программирования:

а). Структурное.

b). Модульное.

c). Объектно-ориентированное.

d). Case – технологии (Computer-aided software engineering).

e). Функциональное.

f). Логическое.

g). Интернет-программирование (web-программирование).

а).Структурное программирование

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

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

Базовые элементы программы оформляются как подпрограммы - процедуры или функции. В тексте основной программы, используется инструкция вызова требуемой подпрограммы. После ее исполнения, программа продолжает работу со следующей инструкции.

Разработка программы ведётся пошагово, методом «сверху вниз». Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент.

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


Если будет получена правильная последовательность вызова программных модулей, то это означает, что общая структура программы верна. После этого, подпрограммы-заглушки последовательно заменяются на реально работающие подпрограммы. Разработка каждой из них ведётся тем же методом, что при создании основной программы. Разработка заканчивается тогда, когда не останется ни одной «заглушки», которая не была бы удалена, что представляется следующим текстом:

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

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

Структурное программирование иначе называют еще программированием без операторов безусловного перехода (GOTO). Неправильное, необдуманное, произвольное использование которых приводит к получению запутанных, плохо структурированных программ, которые практически невозможно понять.

Структурное программирование сделало тексты программ читабельными. Облегчилось их понимание, стало возможным разработка программ в промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты. Это позволяет разрабатывать и сопровождать крупные программные комплексы силами больших коллективов разработчиков, даже в условиях изменений в составе персонала. Следует отметить, что многие языки, например Pascal, специально ориентированы на структурное программирование.