C.Ю.Соловьев

Методические материалы
по курсу
"Алгоритмы и алгоритмические языки"

Программа курса
Программирование в машинных кодах
Примеры-1
Примеры-2
Пример "большой" программы
Нисходящее программирование
Ссылочные типы
Структуры данных
Очереди и стеки
Деревья поиска
AVL-деревья
Таблицы
Хеш-таблицы
Динамические страницы

Нисходящее программирование (Пошаговая детализация)

(* Нисходящее программирование - организация процесса составления *)
(*                               программы, предполагающая:       *)
(* -1- выделение из исходной задачи более простых подзадач;       *)
(* -2- оформление (заголовков) процедур, решающих подзадачи;      *)
(* -3- разработку алгоритма решения исходной задачи               *)
(*              с использованием процедур, описанных на шаге -2-; *)
(* -4- применение методики нисходящего программирования           *)
(*                    к каждой подзадаче, выявленной на шаге -1-. *)
(* Соглашение. Если в некоторый текст, вместо строки S необходимо *)
(* включить строки текста I, то будем записывать этот факт        *)
(* следующим образом:                                             *)

S
1-я строка текста I
2-я строка текста I
...
последняя строка текста I
(* Пример. *) Исходный текст: program TEST; (* переменные *) begin (* тело программы *) end. Замена:
(* переменные *)
var A,B : real;
      I : integer;
Новый текст: program TEST; var A,B : real; I : integer; begin (* тело программы *) end. (* Конец примера *)
(* Пример технологии нисходящего программирования               *)
(* Задача: Если в заданном тексте имеется предложение,          *)
(* содержащее два одниковых слова подряд, то вывести 'Дефект'.  *)
(* В противном случае вывести 'Нет дефекта'.                    *)
(*                                                              *)
(* 1). Предложение - последовательность литер, ограниченная     *)
(*                   справа точкой.                             *)
(* 2). При сравнении слов игнорируем символы '.'  ','  ';'  ':' *)
 
program T171(F);
var     F : text;
       W2 : boolean;
(* переменные *)
(* процедуры  *)
begin   Reset(F);
        W2:=false;
(* алгоритм *)
        if W2 then writeln('Дефект')
              else writeln('Нет дефекта');
end.
(* Подход: NewSym: F -> предложение S[1..N]                     *)
(*                      VERIFY: Два-слова-в S[1..N] -> W2:=true *)
 
(* переменные *)
        S : array [1..30000] of char;
        N : integer;
        A : char;
(* процедуры *)
procedure NewSym(A : char); begin end;
procedure VERIFY; begin end;
(* алгоритм *)
         N:=0;
        while (not eof(F)) and (not W2) do begin
           A:=' ';
           if eoln(F) then Readln(F)
                      else read(F,A);
           NewSym(A);
           if A = '.' then begin
              VERIFY;
              N:=0
           end
        end;
(* NewSym : Перегрузить очередной символ текста в предложение S[1..N] *)
procedure NewSym(A : char); begin end;
procedure NewSym(A : char);
begin   if A in ['.',',',';',':'] then A:=' ';
             if   A <> ' ' then begin N:=N+1; S[N]:=A end
        else if   N  =  0  then
        else if S[N] = ' ' then
        else                    begin N:=N+1; S[N]:=A end
end;
(* VERIFY: Проверить на повторяемость слова предложения S[1..N]    *)
(* Пара целых B,K - слово, если (S[B] =  ' ' или B = 0        ) и  *)
(*                              (S[I] <> ' ', I=B+1,..., K-1  ) и  *)
(*                               S[K] =  ' '                       *)
(* DOU = true, если Слово(B,K) = Слово(K,K+(K-B))                  *)

procedure VERIFY; begin end;
function  DOU(B,K : integer) : boolean; begin end;
procedure VERIFY;
   var B,K : integer;
begin   B:=0;
        for K:=1 to N do
        if S[K] = ' ' then begin
           if DOU(B,K) then W2:=true;
           B:=K
        end
end;
(* DOU = true, если Слово(B,K) = Слово(K,K+(K-B))                  *)

function  DOU(B,K : integer) : boolean; begin end;
function  DOU(B,K : integer) : boolean;
   var I,R : integer;
begin   R:=K-B;
        (* K+R - номер последнего символа второго слова *)
        if K+R <= N then for I:=1 to R do
                         if S[B+I] = S[K+I] then R:=R-1;
        DOU:=(R = 0)
end;
(* Окончательный текст программы T171 *)
 
program T171(F);
var     F : text;
        S : array [1..30000] of char;
        N : integer;
       W2 : boolean;
        A : char;
 
procedure NewSym(A : char);
begin   if A in ['.',',',';',':'] then A:=' ';
             if   A <> ' ' then begin N:=N+1; S[N]:=A end
        else if   N  =  0  then
        else if S[N] = ' ' then
        else                    begin N:=N+1; S[N]:=A end
end;
 
function  DOU(B,K : integer) : boolean;
   var I,R : integer;
begin   R:=K-B;
        (* K+R - номер последнего символа второго слова *)
        if K+R <= N then for I:=1 to R do
                         if S[B+I] = S[K+I] then R:=R-1;
        DOU:=(R = 0)
end;
procedure VERIFY;
   var B,K : integer;
begin   B:=0;
        for K:=1 to N do
        if S[K] = ' ' then begin
           if DOU(B,K) then W2:=true;
           B:=K
        end
end;
 
begin   Reset(F);
        W2:=false;
         N:=0;
        while (not eof(F)) and (not W2) do begin
           A:=' ';
           if eoln(F) then Readln(F)
                      else read(F,A);
           NewSym(A);
           if A = '.' then begin
              VERIFY;
              N:=0
           end
        end;
        if W2 then writeln('Дефект')
              else writeln('Нет дефекта');
end.
 
(*     Порядок порождения процедур и функций                *)
(*     program T171 -> procedure NewSym                     *)
(*     program T171 -> procedure VERIFY                     *)
(*                     procedure VERIFY -> function DOU     *)
 

Вопросы?