Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
23.03.2015
Размер:
461.31 Кб
Скачать

3.7.Заключение

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

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

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

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

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

Дополнительная литература

Abelson, Harold, and Gerald J. Sussman, with Julie Sussman, 1985. Strac' ture and Interpretation of Computer Programs, chap. 1. Cambrige, Mass.: MIT Press and New York: McGraw-Hill.

Dijkstra, Edgser \V., 1972. Notes on structured programming. In Structured Programming (New York: Academic Press), pp. 1—82.

Wirth, Nikiaus, 1971. Program development by stepwise refinement. Com­munications of the ACM 14 (4): 221—227. Reprinted in Programming Methodology, А -СЫМюп of Articles Ьц Members of IF IP WG2.3, edited by David Gries (New York: Springer-Verlag), f978.

Упражнения

3.1. Реализуйте

maxt == proc [t: type] (a: array [t]) returns (t) requires массив а не пуст и t имеет операцию

gt: proctype(t,t) returns(bool) которая определяет полное упорядочивание по t, effectsВозвращает наибольший элемент в а, определенный черезt^gt.

3.2.Определите и напишите процедуруis_prime, которая определяет, яв­ляется ля данное целое число простым.

3.3.Обобщите приведенную на рис. 3.3процедуруremove-dupisтак, чтобы она могла работать с массивом произвольного типа. Приведите спецификацию и реализацию.

3.4.Определите процедуру

key.sort = prec[etype:type] (a:ar)ar =array[recordIkeyl,key2:int,elem:etype]]

Процедураkey.sortмодифицирует входной массив а, упорядочивая элементы этого массива в возрастающем порядке согласно значениям двух полей ключей. 1\еу1 является первичным ключом. Он используется для предварительной сор­тировки массива а. Затем в качестве вторичного ключа используется key2.При этом сортируются те элементы, которые имеют то же самое значениеkeyl(т. е. элементы х и у такие, чтоx.keyl =у.keyl).Напишите спецификацию и реали­зацию этой процедуры.

3.5.Спецификация процедурыkey.sortможет требовать или не требовать обеспечения условия стабильности сортировки. Сортировка называется стабиль­ной, если все элементы, имеющие одинаковые ключи, сохраняют свои относи­тельные позиции в выходном массиве. Включает ли ваша спецификация из упраж­нения 4какие-либо положения на этот счет?

3.6.Вам предлагается сделать выбор между двумя процедурами, отыски­вающими минимальное значение в массиве из целых чисел. Одна из процедур возвращает наименьшее целее число, если ее аргумент массива пуст. Другая предполагает наличие непустого массива. Какую из процедур вы выберете и почему?

3.7.Предположим, что реализация процедуры сортировки слиянием, по­казанная на рис, 3.6,была изменена следующим образом: процедураmergeосталась без изменений, а процедураmerge,sortбыла исключена, так что работа выполнялась непосредственно процедуройsort. Является ли такое изменение хорошей идеей? Какой цели служит процедураmerge-sort? Проанализируйте.

Соседние файлы в папке Б. Лисков