Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа Рекурсия

.DOC
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
38.91 Кб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

кафедра МОЭВМ

Лабораторная работа по программированию

«Рекурсия»

ОТЧЕТ

Факультет КТИ

группа 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 теста, которых достаточно на взгляд разработчика программы для того, чтобы проверить корректность ее работы. Оба они пройдены успешно. Тесты оформлены в виде нескольких пронумерованных абзацев, где верхняя строка, заключенная в кавычки – введенные данные, а остальные – результат работы программы. Напомним, что вывод результата осуществляется в три колонки для удобства анализа его пользователем.

  1. «»

Строка пуста!

  1. «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 раз(а).