Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВП - лекция 10.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
229.89 Кб
Скачать

10.2.4 Завершение MergeSort1

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

{присвоить переменной Sorted значение Y если Txt отсортирован, иначе - N}

будет оформлено в

CheckIfSorted(Txt, Sorted)

Процедура CheckIfSorted устанавливает Sorted в ‘Y’, если в файле существует только одна серия (т.е. если за первым встреченным символом # сразу же следует символ конца строки).

Design Part 2.3

PROCEDURE CheckIfSorted(VAR FileIn: TEXT; VAR Sorted: Char);

{присвоить переменной Sorted значение Y если Txt отсортирован, иначе - N}

VAR

Ch, EndRun: CHAR;

BEGIN {CheckIfSorted}

RESET(FileIn);

IF EOLN(FileIn)

THEN {пустой файл отсортирован по определению}

Sorted := ‘Y’

ELSE

{установить Sorted=’Y’, если в файле есть всего одна серия, и ‘N’ в противном случае}

END {CheckIfSorted}

И, наконец, для того, чтобы начать процесс разделения-слияния, Txt разделяется на односимвольные серии, разделенные символом #. С этой целью мы добавляем новую переменную Ch символьного типа к локальным переменным процедуры MergeSort1.

Design Part 2.4

BEGIN {разделить n символов в Txt на n серий единичной длины, разделенные символом ‘#’}

...

END

На этом процедура MergeSort1 будет закончена.

Задание 13. Проведите сборку процедуры MergeSort1, написав самостоятельно недостающие разделы проекта.

(20 баллов)

Задание 14. Составьте набор тестовых данных, которые бы структурными тестами следующих частей программы:

а) MergeRuns

б) SplitIntoRuns

в) CheckIfSorted

г) MergeSort1

(10 баллов за каждое подзадание)

Задание 15. Часть г) предыдущего упражнения включает в себя все остальные части. Какое преимущество в тестировании их по отдельности, если, в конце концов, они будут протестированы вместе?

(10 баллов)

Задание 16. Дайте формальное доказательство того, что CheckIfSorted делает то, что должна делать.

(20 баллов)

Задание 18. Рассмотрите разделение и слияние серий на три файла вместо двух.

а) Объясните, как процедура, подобная MergeSort1 будет сортировать с использованием трех файлов.

б) Объясните, почему такая сортировка будет быстрее, показав на примере.

в) Повторите пункт b) для четырех файлов.

(15 баллов за каждое подзадание)

Задание 19. Придумайте быстрый способ реверсирования файла, рассмотрев в качестве примера файл, отсортированный в обратном порядке и рассмотрите его сортировку при помощи MergeSort1. Используя этот пример, разработайте проект для реверсирования произвольного файла путем разделения и слияния.

(40 баллов)

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

(20 баллов)

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

if Ch1 < Ch2 …

на операторы вызова процедуры:

BEGIN

Compare(Ch1, Ch2, Result);

IF Result = ‘<’ …

END

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

(15 баллов)

Задание 22. Измените MergeSort1 таким образом, чтобы она сортировала слова вместо символов. Используйте схему предыдущего упражнения, но теперь напишите процедуры, которые вы бы вставили с соответствующими аргументами типа TEXT в качестве слов.

(20 баллов)

Задание 23. Измените MergeSort1 таким образом, чтобы она сортировала строки вместо символов (см. предыдущее упражнение).

(20 баллов)