Главная » Basic » РАЗРАБОТКА ПРОГРАММЫ

0

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

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

гораздо больше места, чем мы располагаем в этой книге. Заинтересованные программисты  могут обратится к прекрасно излагающей данный предмет книге М. A. Jackson Principles of Program Design, выпущенной издательством Academic Press в 1975 году.

5.3.1.  МЕТОД ПОШАГОВОЙ ДЕТАЛИЗАЦИИ

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

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

В методе пошаговой детализации можно выделить следующие существенные этапы:

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

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

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

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

(г)    Разработка завершена: в модульном виде получено описание требуемой программы.  Перевод этого описания в программу на Бейсике должен быть достаточно простой задачей.

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

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

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

Уровень 1

Ввести число учеников. Вычислить средний рост. Вычислить средний возраст. Вычислить средний вес.

Теперь применим этап (б) к каждому из описанных выше шагов:

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

Детализации 1.2 и 1.3 аналогичны приведенной выше, но применяются к возрасту и весу  вместо роста. В результате получен

Уровень 2

ВВОД "Число учеников"; N.

(1.1)  для роста (1.2)  для возраста (1.3)  для веса

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

Детализация 2.1. Ввести рост каждого ученика. ПЕЧАТЬ приглашения к вводу значений.  ВВОД значений в массив с помощью цикла или оператора MAT INPUT.

Детализация 2.2 Вычислить с помощью цикла средний рост.

Организовать цикл, пробегая N значений и накапливая сумму в S. Поделить S на N для получения среднего роста.

Детализация 2.3. Изобразить результаты.

ПЕЧАТЬ названия показателя (например, "ВОЗРАСТ") и среднего значения.

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

Уровень 3:

ВВОД "Число учеников"; N

Присвоить переменной значение "РОСТА". Вызвать детализации (2.1), (2.2) и (2.3). Присвоить переменной значение "ВОЗРАСТА". Вызвать детализации (2.1), (2.2) и (2.3). Присвоить переменной значение "ВЕСА". Вызвать детализации (2.1), (2.2) и (2.3).

КОНЕЦ

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

         500 REM ПОДПРОГРАММА ВВОДА ЗНАЧЕНИЙ

510 PRINT ‘ВВЕДИТЕ";N;"ЗНАЧЕНИЙ ";А$

520 FOR I=1 ТО N

530        INPUT А(I).

540   NEXT I

550   RETURN

         400  REM ПОДПРОГРАММА ВЫЧИСЛЕНИЯ СРЕДНЕГО

410 S=0

420   FOR I=1 ТО N

430   S=S+A(I)

440   NEXT I

450   S=S/N

460  RETURN

         700  REM ПОДПРОГРАММА ВЫВОДА ЗНАЧЕНИЙ

710 PRINT "СРЕДНЕЕ ЗНАЧЕНИЕ ";A$;" РАВНО";S

720 RETURN

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

200   REM ПОДПРОГРАММА ПРОЦЕССА

210  GOSUB 500

220  GOSUB 400

230  GOSUB 700

240  RETURN

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

Основная программа получается как перевод в операторы Бейсика уровня 3: 10 REM ОСНОВНАЯ ПРОГРАММА 20 DIM A(100)

30 INPUT "ЧИСЛО УЧЕНИКОВ";N 40 А$="РОСТА" 50 GOSUB 200 60 А$="ВОЗРАСТА"

70 GOSUB 200                                                      ,

80 A$="ВЕСА" 90 GOSUB 200 100 STOP

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

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

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

Рис. 5.2. Структура вызовов модулей и возвратов управления для примера программы из подразд. 5.3.1

для модулей высоких уровней, так как модули нижних уровней выполняют простые  специфичные действия.  А  при  описанном  выше  методе  Вы  можете  планировать  проведение   определенных расширений структур программы прежде, чем узнаете в точности, как действуют  модули нижнего уровня.  Однако  при  этом  Вам  потребуется  принять  некоторые  решения,  которые  повлияют  на структуру  модулей  нижних  уровней,  а  Вам  необходимо  знать,   можно   ли  будет  эти  модули преобразовать  в  программу  на  Бейсике  для  Вашей  ЭВМ.   Например,  нет  никакого  смысла предполагать, что эти модули могут использовать матричные (МАТ) функции, если таковые в Вашей системе не предусмотрены. Поэтому применение метода детализации "сверху вниз" требует умения прогнозировать выполнимость принимаемых решений.

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

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

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

(а)   Для изображения уровня 1 нарисуйте большой прямоугольник на всю страницу. Он  должен изображать программу в целом. Начните заполнять его шагами, требуемыми для  решения задачи. Изображения шагов, как правило, будут прямоугольниками с  описанием  действий общего вида, однако иногда может потребоваться символ цикла.

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

(г)    Изучение разработки в целом, независимо от того, умещается она в прямоугольнике на одной странице или распределена по нескольким прямо-

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

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

Ввести число учеников

(1.1) Вычислить средний рост (1.2) Вычислить средний возраст (1.3) Вычислить средний вес Конец

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

(1.1)

         Ввести N значений

         Цикл для вычисления среднего

         Распечатать результаты

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

(2.3)

ПЕЧАТЬ результатов ВОЗВРАТ

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

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии