Лабораторная работа Рекурсия
.DOCСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра МОЭВМ
Лабораторная работа по программированию
«Рекурсия»
ОТЧЕТ
Факультет КТИ
группа 3341
студент Марьяскин Е.
Санкт-Петербург
2004 г.
Постановка задачи:
Вывести количество вхождений в строку всех встречающихся в ней символов
Анализ решения:
Задача решена с помощью вспомогательного одномерного массива записей, состоящих из двух полей: символ и количество его вхождений в строку. При прочтении строки этот массив просматривается и либо в него добавляется новый элемент (если символ ранее не встречался) с начальным количеством вхождений равным 1, либо увеличивается количество вхождений этого символа в той ячейке массива, в которой хранятся сведения о нем. После этого массив просматривается и для каждого символа строки на экран выводится сам этот символ и количество его вхождений в строку, равное одному из полей данных, хранящихся в одном из полей соответствующей ячейки массива.
Строки реализованы как запись из двух полей: массив символов и один обособленный символ – так называемый «маркер конца строки». За маркер принимается символ с номером 13 – «перевод строки». Использование этого символа как маркера конца строки не повредит корректности работы программы поскольку введение этого символа и обозначает, что строка закончена.
Текст программы:
Uses Crt;
Type
TStr = record
Str: array [1..255] of char;
Mar: char
end;
ElMas = record
Sym: Char;
Col: Integer
end;
var
Str:TStr;
Exit:Boolean;
C:Char;
I:Integer;
procedure Statistic(S:TStr);
var
I,Y,N,J:Integer;
Mas: array [1..256] of ElMas;
Ex: Boolean;
begin
WriteLn;
If S.Str[1]<>S.Mar then
WriteLn('В строку входят следующие символы: ')
else
WriteLn('Строка пуста!');
N:=0;
WriteLn;
Y:=1;
I:=1;
While S.Str[I]<>S.Mar do
begin
Ex:=false;
J:=1;
while (J<=N)and(not(Ex)) do
If Mas[J].Sym=S.Str[I] then
Ex:=true
else
J:=J+1;
If J=N+1 then
begin
Mas[J].Sym:=S.Str[I];
Mas[J].Col:=1;
N:=N+1
end
else
Mas[J].Col:=Mas[J].Col+1;
I:=I+1
end;
For I:=1 to N do
begin
If Y mod 3 <> 0 then
Write('"',Mas[I].Sym,'": ',Mas[I].Col:3,' раз(а). ')
else
begin
WriteLn('"',Mas[I].Sym,'": ',Mas[I].Col:3,' раз(а).');
WriteLn
end;
Y:=Y+1
end;
readkey;
end;
begin
Exit:=false;
While not Exit do
begin
C:='A';
While (C<>'y') and (C<>'Y') and (C<>'N') and (C<>'n') do
begin
clrscr;
WriteLn('Анализировать строку? (y/n)');
WriteLn;
ReadLn(C)
end;
If (C='y') or (C='Y') then
begin
clrscr;
Write('Введите строку: ');
Str.Mar:=Chr(13);
I:=1;
C:='A';
While C<>Str.Mar do
begin
C:=readkey;
write(C);
Str.Str[I]:=C;
I:=I+1
end;
WriteLn;
Statistic(Str)
end
else
Exit:=true;
end;
end.
Тестирование работы программы:
В этом разделе приведены 2 теста, которых достаточно на взгляд разработчика программы для того, чтобы проверить корректность ее работы. Оба они пройдены успешно. Тесты оформлены в виде нескольких пронумерованных абзацев, где верхняя строка, заключенная в кавычки – введенные данные, а остальные – результат работы программы. Напомним, что вывод результата осуществляется в три колонки для удобства анализа его пользователем.
-
«»
Строка пуста!
-
«abc abc fgr 234 f {»
В строку входят следующие символы:
“a”: 2 раз(а). “b”: 2 раз(а) “c”: 2 раз(а).
“ ”: 5 раз(а). “f”: 2 раз(а). “g”: 1 раз(а)
“r”: 1 раз(а). “2”: 1 раз(а). “3”: 1 раз(а).
“4”: 1 раз(а). “{”: 1 раз(а).