В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 24
Текст из файла (страница 24)
Эти идеи как раз и появились из осознания того факта, что "программы пишутся для людей — на машине онитолько обрабатываются". Смысл сформулированного положения состоитв том, что обработка программы на машине, т.е. ее трансляция и выполнение, трудностей практически не вызывает. А вот работу по проверке правильности программы, внесению в нее различного рода исправлений и изменений приходится выполнять человеку. А потому программа должнабыть составлена и написана так, чтобы максимально облегчить и упростить эту работу.
Поэтому суть концепции структурного программирования Г. Майерс, например, формулирует следующим образом (М а й е р с Г.Надежность программного обеспечения/Пер. с шгл. под ред. Кауфмана В.Ш. - М.: Мир, 1980. - 360 с.) :"Я предпочитаю определять структурное программирование как программирование, ориентированное на общение с людьми, а не с машиной".Это и означает, что запись программы должна быть максимально удобна для ее восприятия и понимания людьми (в том числе и людьми, не являющимися ее авторами).Идеи структурного программирования базируются на наблюдении тогофакта, что человек гораздо легче читает и понимает какой-либо текст в томслучае, если он читает фразы в порядке их следования в этом тексте. Еслиже по ходу чтения его будут довольно часто отсылать на фрагменты текста,находящиеся, например, на других страницах, то это резко затрудняет восприятие и понимание читаемого текста. Что касается программы, то припрослеживании логики ее работы такие "скачки" по тексту вызывают операторы перехода, которые сами определяют своих преемников и поэтомумогут "отбрасывать" как вперед, так и назад по тексту программы, в достаточно произвольные ее места.
Поэтому структурное программированиеиногда называют "программированием без операторов перехода" (или"программированием без GO Т О " ) , хотя это название отражает экстремальную точку зрения в этом отношении. На самом деле речь идет о том,чтобы не использовать операторы перехода без особой на то необходимости, и чем реже мы будем прибегать к их помощи, тем лучше. Так чтоструктурное программирование является методом составления хорошоструктурированных программ, удобных для их чтения и понимания человек о м , прослеживания логики их работы, внесения в них исправлений и других изменений.На чем же основывается реализация этих идей? Как известно,для подавляющего большинства реально используемых алгоритмов характерны широкая разветвляемость и цикличность определяемых ими вычислительныхпроцессов. Поэтому в записи алгоритма наряду с правилами обработки данных должны содержаться и указания о порядке их выполнения.
В связи сэтим отдельные фрагменты программы представляют собой некоторыелогические (управляющие) структуры, которые определяет условия и по90рядок выполнения содержащихся в них правил обработки данных. Получение хорошо структурированных программ, обладающих указанными выше свойствами в отношении простоты их чтения и понимания, при структурном программировании достигается за счет того, что любую программупредлагается строить из стандартных логических структур, число типовкоторых весьма невелико.В качестве основных принимаются три следующие структуры, суть каждой из которых объясняется соответствующей блок-схемой (прямоугольником обозначается некоторый блок обработки данных, ромбом — разветвление процесса в зависимости от истинности указанного в нем логического выражения В, а стрелки указывают возможных преемников каждого элемента блок-схемы).1) Следование:S1S2•-»-{ SK |—»-Эта структура представляет собой последовательность блоков S 1 , S 2 , ......,Sk, которые выполняются друг за другом, в порядке их следования втексте программы.2) Ветвление:ложьЭто управляющая структура, которая в зависимости от выполнениязаданного условия (значения истинности логического выражения В) определяет выбор для исполнения одного из двух заданных в этой структуреблоков S1 и S2.3) Повторение типа "делать, пока":истиналожьДанная структура представляет собой цикл, в котором заданный блокS исполняется повторно, пока заданное условие выполняется (логическоевыражение В принимает значение истина); в тот момент, когда условиевпервые окажется невыполненным, циклический процесс заканчивается.В частности, если заданное условие окажется невыполненным при первойже его проверке, то входящий в эту структуру блок S вообще не будетисполняться.Существенная особенность всех этих структур состоит в том, что каждаяиз них имеет только один вход и только один выход, что и обеспечиваетхорошую — в указанном выше смысле — структуру программы.91о•о-оРис.
5.1 Вложенность управляющих структурВ теории программирования доказана теорема о том, что любая программа, не содержащая "зацикливаний" и недостижимых операторов (для реальных программ это ограничение вполне естественно) , может быть построена только из указанных выше логических структур. При этом важно отметить, что все эти структуры определяются рекурсивно. Это означает, чтокаждый из входящих в них блоков (которые изображены прямоугольник о м ) может быть не только отдельным оператором, задающим правилапереработки данных, но и любой из допустимых структур, т.е.
допускаетсявложение структур (см. например, рис. 5.1).Именно это обстоятельство и позволяет записывать любую программу сиспользованием небольшого количества типов логических структур.Из уже рассмотренных нами операторов паскаля видно, что в этомязыке действительно имеются все возможности для написания хорошоструктурированных программ.
В самом деле, операторы присваивания,условный оператор и оператор цикла с предусловием к а к раз и представляют собой рассмотренные выше стандартные управляющие структуры,а наличие составного оператора и синтаксис условного оператора и оператора цикла обеспечивают возможность вложения управляющих структурдруг в друга. Чтобы упростить написание программ, в паскале предусмотрены и дополнительные типы управляющих структур в виде операторовцикла с постусловием и с параметром. Эти управляющие структуры тожеимеют один вход и один выход, так что их использование отнюдь не нарушает хорошей структурированности программ и позволяет обеспечить этуструктурированность даже в тех случаях, когда использование толькотрех стандартных типов структур могло бы вызвать определенные трудности для программиста при формулировании некоторых алгоритмов.Конечно, использование только типовых управляющих структур иногдазатрудняет формулирование алгоритмов или приводит к снижению эффективности программы — в таких случаях бывает все же целесообразно использовать и операторы перехода.
Однако следует помнить, что это ухудшает структурированность программы и затрудняет ее понимание, а следовательно, снижает ее надежность и удобство ее сопровождения, поэтому92следует избегать использования операторов перехода без особой на тонеобходимости.Пусть, например, для каждого из десяти задаваемых вещественных чисел требуется вьиислить значение у по правилу:[1*1у = \ех11/ (2х + 1)'при x < О,при 0 < х < 1,прих>1.В принципе на паскале можно составить и такую программу, предназначенную для решения поставленной задачи:{Родин В.И.
Ф—т ВМиК МГУ12.11.86.Использование операторов перехода}program СЧЕТ(input, output);label 4,5,6,7,10;var i: integer; x,y: real;begin i:=1;4: i-f i >10 then goto 10;read<x); if x<0 then cioto 5;if x>l then goto 6;y:=exp(x); goto 7;5:уs =abs(x); goto 7; 6:y: = 1/<2*x + l>;7: writeln('_ x=', x,'_ y=', y>; i:=i+l; goto 4;10:end.Видимо, читатель согласится с тем, что понять такую программу и проверить ее, прослеживая все возможные пути вычислений, не так уж просто,несмотря на тривиальность решаемой задачи — именно потому, что этапрограмма плохо структурирована.Между тем по сути дела тот же самый алгоритм можно представить вгораздо более наглядной, легко понимаемой и проверяемой форме:СКИРО С .
Н .ОГУ23.2.87г.Структурированнаяпрограмма}program С.ЧЕТСТРУКТ (i nput, output);const n~10;var i: integer; x,y: real;beginfor i:=1 to n dobegin read(x);if x<0 then y:=abs(x> elseif x<l then y:=exp(x) else y:=1/(2*x+l);w r i t e l n ( x = " , x,_ y=', y)end.Чтобы приучить себя к написанию хорошо структурированных программ, можно порекомендовать читателю на этапе обучения действительно93не прибегать к использованию операторов перехода — до тех пор, пока непоявится практическая необходимость изготовлять достаточно эффективные программы, и когда операторы перехода позволят реально повыситьэту эффективность.5.2.
Разработка программыПрограмма — это запись алгоритма решения той или иной задачи на выбранном языке программирования, например на паскале. Однако прежде чемзаписывать алгоритм, надо его знать (иметь). На практике очень редкислучаи, когда приходится записывать уже известные алгоритмы — такиеслучаи встречаются разве что на самых ранних этапах обучения программированию, и то когда речь идет не столько о программировании, сколькооб овладении языком, который будет использоваться в качестве рабочегоинструмента программиста. Так что умение пользоваться алгоритмическимя з ы к о м и умение программировать — это вовсе не одно и то же.
На самомделе написание программы является всего лишь одним из этапов в ееизготовлении, причем далеко не самым трудным, а скорее наоборот. Идалеко не случайно этот этап часто называют не "программирование",а "кодирование" — подчеркивая тем самым, что эта работа носит в основном технический характер, хотя качественное его исполнение, разумеется,имеет немаловажное значение.В самом деле, непосредственное написание фраз на алгоритмическомязыке (операторов, описаний и т.д.) — это как бы укладывание кирпичейили других строительных блоков в строящееся здание, каковым в данномслучае является программа. Однако известно, что строители никогда неначинают непосредственного строительства здания, пока не будет разработан достаточно детальный его проект, т.е.
не будет определено его назначение, общая архитектура, назначение и взаимное расположение отдельныхпомещений и т.д. Нетрудно представить себе, что получилось бы, еслибы вопросы проектирования здания решались параллельно с его строительством.Аналогично обстоит дело и при изготовлении программы. К началунепосредственного написания ее текста должны быть четко определеныназначение программы, ее исходные данные и требуемые результаты еевыполнения, разработана структура программы, т.е. четко выделены составные части (блоки) будущей программы, точно определено назначениекаждого из них и их взаимодействие, т.е.