- •2. Написание программ на языке cf-pascal
- •2.1. Введение в синтаксис языка cf-Pascal
- •2.1.1. Синтаксис Pascal-программы
- •2.1.2. Синтаксические деревья
- •2.1.3. Синтаксис блока.
- •2.2. Синтаксис операторов языка cf-Pascal
- •2.3. Проектирование и разработка программ.
- •2.3.1. Скачка Paul Rever
- •2.3.2. Разделы проекта и разработочные программы
- •2.3.3. Письмо Sarah Rever
- •Стадия разработки программы «Письмо Sarah Revere»
2.3.3. Письмо Sarah Rever
“Dear Paul: I have been to the Chelsea headland…”
BEGIN {сдвигаем окно}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4)
END
{Проверка на ‘land’}
IF W1 = ‘l’
THEN
IF W2 = ‘a’
THEN
IF W3 = ‘n’
THEN
IF W4 = ‘d’
THEN {‘land’ было найдено}
WHILE {‘land’ или ‘sea’ не найдены}
DO
BEGIN
{сдвигаем окно}
{проверка на ‘land’}
{проверка на 'sea'}
END
Looking |
Смысл |
Y |
Продолжаем искать |
L |
Британцы наступают с земли |
S |
Британцы наступают с моря |
N |
В конце ввода, ни land, ни sea не были найдены |
Раздел проекта 1
PROGRAM SarahRevere(INPUT,OUPUT)
{выводит сообщение о том, как наступают британцы, в зависимости от того, найдено ‘land’ или ‘sea’}
VAR
W1, W2, W3, W4, Looking : CHAR;
BEGIN {SarahRevere}
{инициализируем переменные W1, W2, W3, W4, Looking}
WHILE {‘land’ или ‘sea’ не найдены}
DO
BEGIN
{сдвигаем окно, проверяем на конец данных}
{проверка на ‘land’}
{проверка на 'sea'}
END
{Создаем письмо Сары}
END. {SarahRevere}
Раздел проекта 1.1
BEGIN {инициализируем переменные W1, W2, W3, W4, Looking}
W1 := ‘ ‘;
W2 := ‘ ‘;
W3 := ‘ ‘;
W4 := ‘ ‘;
Looking := ‘Y‘;
END
Раздел проекта 1.2
BEGIN {сдвигаем окно, проверяем на конец данных}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4);
IF W4 = ‘#’
THEN {конец данных}
Looking := ‘N’
END
Раздел проекта 1.3
BEGIN {Проверка на ‘land’}
IF W1 = ‘l’
THEN
IF W2 = ‘a’
THEN
IF W3 = ‘n’
THEN
IF W4 = ‘d’
THEN {‘land’ было найдено}
Looking := ‘L’
END
Раздел проекта 1.4
BEGIN {Проверка на ‘sea'}
IF W2 = ‘s’
THEN
IF W3 = ‘e’
THEN
IF W4 = ‘a’
THEN {‘sea’ было найдено}
Looking := ‘S’
END
Раздел проекта 1.4
BEGIN {Создаем письмо Сары}
IF Looking = ‘L’
THEN
WRITELN(‘The British are coming by land.’)
ELSE
IF Looking = ‘S’
THEN
WRITELN(‘The British are coming by sea.’)
ELSE
WRITELN(‘Sarah didn’’t say’)
END
Стадия разработки программы «Письмо Sarah Revere»
Разработочная программа 1А
PROGRAM SarahRevere(INPUT,OUPUT)
{выводит сообщение о том, как наступают британцы, в зависимости от того, найдено ‘land’ или ‘sea’}
VAR
W1, W2, W3, W4, Looking : CHAR;
BEGIN {SarahRevere}
BEGIN {инициализируем переменные W1, W2, W3, W4, Looking}
W1 := ‘ ‘;
W2 := ‘ ‘;
W3 := ‘ ‘;
W4 := ‘ ‘;
Looking := ‘Y‘;
END;
WHILE Looking = ‘Y’
DO
BEGIN
BEGIN {сдвигаем окно, проверяем на конец данных}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4);
IF W4 = ‘#’
THEN {конец данных}
Looking := ‘N’
END;
WRITE(W1,W2,W3,W4,‘,’); {тестовый оператор}
{проверка на ‘land’}
{проверка на 'sea'}
END
{Создаем письмо Сары}
END. {SarahRevere}
Результаты выполнения программы:
INPUT :#
OUTPUT: #,
INPUT :D#
OUTPUT: D, D#,
INPUT :De#
OUTPUT: D, De, De#,
INPUT :Dea#
OUTPUT: D, De, Dea,Dea#
INPUT :Dear Pau#
OUTPUT: D, De, Dea,Dear, ear ,ar P,r Pa, Pau,Pau#,
Разработочная программа 1B
PROGRAM SarahRevere(INPUT,OUPUT)
{выводит сообщение о том, как наступают британцы, в зависимости от того, найдено ‘land’ или ‘sea’}
VAR
W1, W2, W3, W4, Looking : CHAR;
BEGIN {SarahRevere}
BEGIN {инициализируем переменные W1, W2, W3, W4, Looking}
W1 := ‘ ‘;
W2 := ‘ ‘;
W3 := ‘ ‘;
W4 := ‘ ‘;
Looking := ‘Y‘;
END;
WHILE Looking = ‘Y’
DO
BEGIN
BEGIN {сдвигаем окно, проверяем на конец данных}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4);
IF W4 = ‘#’
THEN {конец данных}
Looking := ‘N’
END;
BEGIN {Проверка на ‘land’}
IF W1 = ‘l’
THEN
IF W2 = ‘a’
THEN
IF W3 = ‘n’
THEN
IF W4 = ‘d’
THEN {‘land’ было найдено}
Looking := ‘L’
END;
BEGIN {Проверка на ‘sea}
IF W2 = ‘s’
THEN
IF W3 = ‘e’
THEN
IF W4 = ‘a’
THEN {‘sea’ было найдено}
Looking := ‘S’
END
END;
WRITELN(‘Looking is ’, Looking); {тестовый оператор}
{Создаем письмо Сары}
END. {SarahRevere}
Результаты:
INPUT :Dear Paul: I have been #
OUTPUT:Looking is N
INPUT :Dear Paul: I have been to Chelsea #
OUTPUT:Looking is S
INPUT :Dear Paul: My land lies along the sea #
OUTPUT:Looking is L
Разработочная программа 1C
PROGRAM SarahRevere(INPUT,OUPUT)
{выводит сообщение о том, как наступают британцы, в зависимости от того, найдено ‘land’ или ‘sea’}
VAR
W1, W2, W3, W4, Looking : CHAR;
BEGIN {SarahRevere}
BEGIN {инициализируем переменные W1, W2, W3, W4, Looking}
W1 := ‘ ‘;
W2 := ‘ ‘;
W3 := ‘ ‘;
W4 := ‘ ‘;
Looking := ‘Y‘;
END;
WHILE Looking = ‘Y’
DO
BEGIN
BEGIN {сдвигаем окно, проверяем на конец данных}
W1 := W2;
W2 := W3;
W3 := W4;
READ(W4);
IF W4 = ‘#’
THEN {конец данных}
Looking := ‘N’
END;
BEGIN {Проверка на ‘land’}
IF W1 = ‘l’
THEN
IF W2 = ‘a’
THEN
IF W3 = ‘n’
THEN
IF W4 = ‘d’
THEN {‘land’ было найдено}
Looking := ‘L’
END;
BEGIN {Проверка на ‘sea}
IF W2 = ‘s’
THEN
IF W3 = ‘e’
THEN
IF W4 = ‘a’
THEN {‘sea’ было найдено}
Looking := ‘S’
END
END;
BEGIN {Создаем письмо Сары}
IF Looking = ‘L’
THEN
WRITELN(‘The British are coming by land.’)
ELSE
IF Looking = ‘S’
THEN
WRITELN(‘The British are coming by sea.’)
ELSE
WRITELN(‘Sarah didn’’t say’)
END
END. {SarahRevere}
Принципы проектирования и разработки программ
Фаза проектирования.
Решение задачи (выполняется совместно с проектированием программы)
Поймите дачу. В случае необходимости, напишите краткое изложение задачи и корректируйте его по мере обнаруживать путей решения проблемы.
Разработайте стратегию решения. Наметьте в общих чертах решение на русском языке с одним или несколькими уровнями детализации. Корректируйте стратегию решения по мере создания окончательного проекта программы.
Анализируйте и осуждайте свою стратегию решения. На каждом уровне детализации ищите простейшие пути решения задачи. Не является ли оно более сложным, нежели требуется?
Организуйте свое решение путем написания улучшенного проекта. Не требуется ли реорганизация отдельных разделов проекта для лучшей понятности? Могут ли быть обнаружены подобные операции и организованы в общих разделах проекта?
Проектирование программы (выполняется совместно с решением задачи)
Разработайте план написания путем преобразования вашей стратегии решения в иерархию разделов придуманного текста программы и комментариев. Эти описания задачи должны, в свою очередь, служить в качестве имен разделов проекта на следующем уровне детализации.
Как правило, разделы проекта не должны быть не более 15 строк, и должны иметь вразумительные и легко понимаемые комментарии. Удержание разделов проекта в таких маленьких размерах и тщательное комментирование требует дисциплинированности, но это впоследствии будет вознаграждено легкостью чтения исходных текстов.
Храните разделы вашего проекта физически отдельно для того, чтобы обеспечить гибкость их написания и переписывания, однако думайте об их иерархической структуре во время анализа и упрощения своей программы.
Пишите и переписывайте разделы вашего проекта и вашу стратегию решения. Решите задачу, отложите ее решение, и попытайтесь его улучшить.
Организация программ с процедурами (подпрограммами).
По мере роста программ, организация разделов проекта становится более важной при создании понятных программ.
Простые процедуры
PROCEDURE Copy;
BEGIN
READ(Ch);
WRITE(Ch);
END
PROGRAM UsingCopy(INPUT, OUTPUT);
{Копирует 2 символа из INPUT в OUTPUT. Выполнение программы прекращается, если INPUT пуст}
VAR
Ch: CHAR;
PROCEDURE Copy;
BEGIN
READ(Ch);
WRITE(Ch);
END;
BEGIN
Copy;
Copy;
WRITELN
END.
INPUT :ABCDE
OUTPUT:AB
SR6. <блок> ::= <оператор BEGIN>
| <раздел объявлений> ; <оператор BEGIN >
| <список процедур> ; <оператор BEGIN >
|<раздел объявлений> ; < список процедур> ; <оператор BEGIN >
SR11. <оператор> ::= <оператор READ>
| <оператор WRITE>
| <оператор присвоения>
| <пустой оператор>
| <оператор BEGIN>
| <оператор IF>
| <оператор WHILE>
| <оператор вызова процедуры>
SR26. <список процедур> ::= <описание процедуры>
| <список процедур> ; <описание процедуры>
SR27. <описание процедуры> ::= PROCEDURE <идентификатор> ; <оператор BEGIN>
SR28. <оператор вызова процедуры> ::= <идентификатор>
CR3. Любой идентификатор в операторе, не являющийся <оператором вызова процедуры>, отличный от стандартных идентификаторов вроде READ, WRITE и т.д. должен присутствовать в <списке идентификаторов> <раздела объявлений>.
CR4. Правило появления. <Идентификатор> <оператора вызова процедуры> должен появиться в роли идентификатора, следующего за словом PROCEDURE в <описании процедуры>, до своего появления в <операторе вызова процедуры>. Иными словами, процедура должна быть описана в тексте программы до своего первого использования.
Подсчет символов.
PROGRAM CountChars2(INPUT,OUTPUT);
VAR
Ch, Overflow, Ones, Tens, Hundreds: CHAR;
PROCEDURE BumpHundreds;
BEGIN
Tens := '0'
IF Hundreds = '0' THEN Hundreds := '1' ELSE
IF Hundreds = '1' THEN Hundreds := '2' ELSE
IF Hundreds = '2' THEN Hundreds := '3' ELSE
IF Hundreds = '3' THEN Hundreds := '4' ELSE
IF Hundreds = '4' THEN Hundreds := '5' ELSE
IF Hundreds = '5' THEN Hundreds := '6' ELSE
IF Hundreds = '6' THEN Hundreds := '7' ELSE
IF Hundreds = '7' THEN Hundreds := '8' ELSE
IF Hundreds = '8' THEN Hundreds := '9' ELSE
IF Hundreds = '9'
THEN
Overflow := 'Y'
END;
PROCEDURE BumpTens;
BEGIN
Ones := '0'
IF Tens = '0' THEN Tens := '1' ELSE
IF Tens = '1' THEN Tens := '2' ELSE
IF Tens = '2' THEN Tens := '3' ELSE
IF Tens = '3' THEN Tens := '4' ELSE
IF Tens = '4' THEN Tens := '5' ELSE
IF Tens = '5' THEN Tens := '6' ELSE
IF Tens = '6' THEN Tens := '7' ELSE
IF Tens = '7' THEN Tens := '8' ELSE
IF Tens = '8' THEN Tens := '9' ELSE
IF Tens = '9'
THEN
BumpHundrends
END;
PROCEDURE BumpOnes;
BEGIN
IF Ones = '0' THEN Ones := '1' ELSE
IF Ones = '1' THEN Ones := '2' ELSE
IF Ones = '2' THEN Ones := '3' ELSE
IF Ones = '3' THEN Ones := '4' ELSE
IF Ones = '4' THEN Ones := '5' ELSE
IF Ones = '5' THEN Ones := '6' ELSE
IF Ones = '6' THEN Ones := '7' ELSE
IF Ones = '7' THEN Ones := '8' ELSE
IF Ones = '8' THEN Ones := '9' ELSE
IF Ones = '9'
THEN
BumpTens
END;
PROCEDURE BumpCounter;
BEGIN
BumpOnes
END;
BEGIN
Overflow := 'N';
Ones := '0';
Tens := '0';
Hundreds := '0';
READ(Ch);
WHILE Ch <> '#'
DO
BEGIN
BumpCounter;
READ(Ch)
END;
IF Overflow = 'N'
THEN
WRITE('Number of characters is ', Hundreds, Tens, Ones)
ELSE
WRITE('Number of characters exceeds 999')
END.
Фаза разработки.
Разработка программ (совместно с тестированием программы)
Разработайте план сборки. Составьте части проекта (начав с простейшей программы) в последовательность все более сложных программ. План должен позволять выполнение программы на каждом шаге.
Как правило, на каждом шаге добавляйте не более 50 строк из проекта в разработку.
Не начинайте с первых 50 строк до тех пор, пока ваш проект не будет завершен. Записан должен быть ваш последний проект, а не первый.
Каждые 50 строк программы должны работать без ошибок с первого раза. Сосредоточенность в настоящем сохранит время и нервы в будущем.
Тестирование программы (совместно с разработкой программы)
Думайте серьезно о вашем плане сборки и о вашей конечной программе. Составьте правильную последовательность программ для получения положительной обратной связи на каждом этапе сборки программы.
Разработайте план тестирования. Создайте программы с временными операторами WRITE для получения выразительных результатов выполнения, несмотря на то, что это не окончательные результаты, необходимые вам.
Для каждого шага вашего плана сборки проведите тестовые испытания, и не забывайте об исключительных ситуациях, даже несмотря на их малую вероятность.
