
- •Часть V. Проектирование программ в o Pascal.
- •19. Составные типы данных в o Pascal.
- •19.1. Массивы.
- •Design Part 1
- •19.1.1. Синтаксис и семантика для массивов.
- •19.1.2. Параметры-массивы.
- •19.2. Реализация абстрактных типов данных с помощью массивов.
- •19.2.1. Текстовые файлы ограниченного размера.
- •19.2.1. Стек ограниченного размера.
Design Part 1
PROGRAM Encryption(INPUT, OUTPUT);
{Переводит символы из INPUT в код согласно Chiper
и печатает новые символы в OUTPUT}
CONST
Len = 20;
TYPE
Str = ARRAY [1 .. Len] OF ‘A’ .. ‘Z’;
Chiper = ARRAY [‘A’ .. ‘Z’] OF CHAR;
VAR
Msg: Str;
Code: Chiper;
BEGIN {Encryption}
{Инициализировать Code}
WHILE NOT EOF
DO
BEGIN
{читать строку в Msg и распечатать ее}
{дополнить Msg пробелами}
{распечатать кодированное сообщение}
END
END. {Encryption}
Инициализация массива шифра это длинная последовательность присваиваний, поэтому она объединяется в процедуру.
Design Part 1.1.
{Инициализировать Code}
Initialize(Code);
Design Part 1.1.1.
PROCEDURE Initialize(VAR Code: Chiper);
{Присвоить Code шифр замены}
BEGIN {Initialize}
Code['A'] := 'Z';
Code['B'] := 'Y';
Code['C'] := 'X';
Code['D'] := '#';
Code['E'] := 'V';
Code['F'] := 'U';
Code['G'] := 'T';
Code['H'] := 'S';
Code['I'] := 'I';
Code['J'] := 'Q';
Code['K'] := 'P';
Code['L'] := '!';
Code['M'] := 'N';
Code['N'] := 'M';
Code['O'] := '2';
Code['P'] := 'K';
Code['Q'] := '$';
Code['R'] := 'D';
Code['S'] := 'H';
Code['T'] := '*';
Code['U'] := 'F';
Code['V'] := 'E';
Code['W'] := 'T';
Code['X'] := 'C';
Code['Y'] := 'B';
Code['Z'] := 'A';
END; {Initialize}
Символы считываются в последовательные элементы Msg до тех пор, пока не встретится маркер конца строки.
Design Part 1.2.
{читать строку в Msg и распечатать ее}
I := 0;
WHILE NOT EOLN AND (I < Len)
DO
BEGIN
I := I + 1;
READ(Msg[I]);
WRITE(Msg[I])
END;
READLN;
WRITELN;
Индекс I теперь находится в позиции последнего символа в сообщении и для очистки оставшейся части строки необходимо заполнить ее пробелами.
Design Part 1.2.
{дополнить Msg пробелами}
FOR I := I+1 TO Len
DO
BEGIN
Msg[I] := ‘ ‘;
END
Поскольку шифрование Msg занимает несколько строк кода, они оформляются процедурой.
Design Part 1.4.
{распечатать кодированное сообщение}
Encode(Msg)
Элементы Msg с ‘A’ по ‘Z’ используются как индексы в массиве Code для получения их кодированных значений. Другие символы распечатываются без перевода.
Design Part 1.4.
PROCEDURE Encode(VAR S: Str);
{Выводит символы из Code, соответствующие символам из S}
VAR
Index: 1 .. Len;
BEGIN {Encode}
FOR Index := 1 TO Len
DO
IF S[Index] IN [‘A’ .. ‘Z’]
THEN
WRITE(Code[S[Index]])
ELSE
WRITE(S[Index]);
WRITELN
END; {Encode}
Ниже приведен финальный текст программы и примеры ввода/вывода.
PROGRAM Encryption(INPUT, OUTPUT);
{Переводит символы из INPUT в код согласно Chiper
и печатает новые символы в OUTPUT}
CONST
Len = 20;
TYPE
Str = ARRAY [1 .. Len] OF ‘A’ .. ‘Z’;
Chiper = ARRAY [‘A’ .. ‘Z’] OF CHAR;
VAR
Msg: Str;
Code: Chiper;
{Включить PROCEDURE Encode(VAR S: Str);}
{Включить PROCEDURE Initialize(VAR Code: Chiper);}
BEGIN {Encryption}
{Инициализировать Code}
Initialize(Code);
WHILE NOT EOF
DO
BEGIN
{читать строку в Msg и распечатать ее}
I := 0;
WHILE NOT EOLN AND (I < Len)
DO
BEGIN
I := I + 1;
READ(Msg[I]);
WRITE(Msg[I])
END;
READLN;
WRITELN;
{дополнить Msg пробелами}
FOR I := I+1 TO Len
DO
BEGIN
Msg[I] := ' ';
END
{распечатать кодированное сообщение}
Encode(Msg)
END
END. {Encryption}
Выполнение:
INPUT: NOW IS THE TIME
END
OUTPUT: NOW IS THE TIME
M2T IH *SV *INV
END
VM#