(* Нисходящее программирование - организация процесса составления *) (* программы, предполагающая: *) (* -1- выделение из исходной задачи более простых подзадач; *) (* -2- оформление (заголовков) процедур, решающих подзадачи; *) (* -3- разработку алгоритма решения исходной задачи *) (* с использованием процедур, описанных на шаге -2-; *) (* -4- применение методики нисходящего программирования *) (* к каждой подзадаче, выявленной на шаге -1-. *) |
(* Соглашение. Если в некоторый текст, вместо строки S необходимо *) (* включить строки текста I, то будем записывать этот факт *) (* следующим образом: *)
|
(* Пример технологии нисходящего программирования *) (* Задача: Если в заданном тексте имеется предложение, *) (* содержащее два одниковых слова подряд, то вывести 'Дефект'. *) (* В противном случае вывести 'Нет дефекта'. *) (* *) (* 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 *)
|
(* NewSym : Перегрузить очередной символ текста в предложение S[1..N] *)
|
(* 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)) *)
|
(* DOU = true, если Слово(B,K) = Слово(K,K+(K-B)) *)
|
(* Окончательный текст программы 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 *) |