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

Лабораторная работа Обработка текста

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

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

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

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

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

«Обработка текста»

ОТЧЕТ

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

группа 3341

студент Марьяскин Е.

Санкт-Петербург

2004 г.

Постановка задачи:

Задан произвольный текст. Слова в тексте могут разделяться одним или несколькими пробелами, знаками пунктуации и перехода на следующую строку. Каждое слово размещается в одной и той же строке.

- Упорядочить слова в порядке убывания количества вхождений

- Распечатать упорядоченные слова в виде таблицы, содержащей три графы: номера по порядку, обнаруженные слова, количества вхождений.

Анализ решения:

Решение задачи основано на следующих принципах: Создается массив указателей на запись вида слово и количество его вхождений. Использование массива позволяет быстро проводить для каждого нового слова поиск для определения, не входило ли оно раньше в текст и добавления либо слова в массив, либо единицы в количество его вхождений.

С начала работы программы исходный текст из файла «aaa.txt» читается следующим образом: поочередно запускаются функция «GetWord» и процедура «PutWord», из которых первая выделяет из текста очередное слово, а вторая определяет, встречалось ли оно ранее и либо заносит его в массив, либо увеличивает для него количество вхождений. Затем работает процедура «ReSortMas» сортировки по убыванию массива по количеству вхождений. После этого результат выводится в файл «res.txt» с помощью процедуры «PrintMas». Вывод осуществляется в два столбца.

Ввиду отсутствия в задании определения знаков препинания, ими в тексте считается все, кроме цифр и букв алфавита.

Текст программы:

Uses Crt;

const

cStrSize = 20;

cMasSize = 1000;

type

tStr = record

S: array [1..cStrSize] of Char;

Col: Integer

end;

tpStr = ^tStr;

tWord = record

Word: tStr;

Num: Longint

end;

tpWord = ^tWord;

tMas = record

Mas: array [1..cMasSize] of tpWord;

N:Integer

end;

function Letter(C:Char):Boolean;

begin

Letter:=

( (C >= 'a') and (C <= 'z') ) or

( (C >= 'A') and (C <= 'Z') ) or

( (C >= '0') and (C <= '9') );

end;

function GetWord(var F:Text; var S:tStr):boolean;

var

C:Char;

Exit:Boolean;

Y:integer;

begin

S.Col:=0;

Exit:=false;

while not Eof(F) and not (Exit) do

begin

Read(F,C);

If Letter(C) then

Exit:=true

end;

if not Exit then

GetWord := false

else

begin

S.S[1]:=C;

S.Col:=1;

Exit:=false;

while (not(Eof(F))) and (not(Exit)) do

begin

read(F,C);

If not(Letter(C)) then

Exit:=true

else

begin

S.Col:=S.Col+1;

if S.Col > cStrSize then

begin

WriteLn;

write('Слово "');

For Y:=1 to S.Col do

write(S.S[Y]);

WriteLn('" слишком велико...');

WriteLn('Не удалось обработать текст...');

readkey;

halt(1)

end;

S.S[S.Col]:=C

end

end;

GetWord := true;

end

end;

function Compare(A,B: tpStr):Integer;

var

I,MinLen:Integer;

Exit:Boolean;

begin

I:=1;

If A^.Col<B^.Col then

MinLen:=A^.Col

else

MinLen:=B^.Col;

exit:=false;

while (I<=MinLen) and (not(Exit)) do

If A^.S[I]=B^.S[I] then

I:=I+1

else

exit:=true;

If exit then

If A^.S[I]<B^.S[I] then

Compare:=-1

else

Compare:=1

else

If A^.Col<B^.Col then

Compare:=-1

else

If A^.Col>B^.Col then

Compare:=1

else

Compare:=0

end;

procedure PutWord(var Mas:tMas; var Str:tStr);

var

Left,Right,I,Med:Integer;

begin

Left:=1;

Right:=Mas.N+1;

while Left<>Right do

begin

Med:=(Left+Right) div 2;

If Compare(@Mas.Mas[Med]^.Word,@Str)=-1 then

Left:=Med+1

else

Right:=Med

end;

If Mas.N=0 then

begin

Mas.N:=1;

New(Mas.Mas[1]);

Mas.Mas[1]^.Word:=Str;

Mas.Mas[1]^.Num:=1

end

else

If Left= Mas.N+1 then

begin

if Left > cMasSize then

begin

writeln('Текст содержит слишком много различных слов...');

writeLn('Не удалось обработать текст...');

readkey;

halt(1)

end;

New(Mas.Mas[Left]);

Mas.N:=Left;

Mas.mas[Left]^.Word:=Str;

Mas.Mas[Left]^.Num:=1

end

else

If (Compare(@Mas.Mas[Left]^.Word,@Str)=0) then

Mas.Mas[Left]^.Num:=Mas.Mas[Left]^.Num+1

else

begin

Mas.N:=Mas.N+1;

if Left > cMasSize then

begin

writeln(' Текст содержит слишком много различных слов...');

writeLn(' Не удалось обработать текст...');

readkey;

halt(1)

end;

For I:=Mas.N downto Left+1 do

Mas.Mas[I] :=Mas.Mas[I-1];

New(Mas.Mas[Left]);

Mas.Mas[Left]^.Word:=Str;

Mas.Mas[Left]^.Num:=1

end

end;

procedure ReSortMas(var Mas:tMas);

var

max,I,J:Integer;

P:tpWord;

begin

For I:=1 to Mas.N - 1 do

begin

Max:=I;

For J:=I+1 to Mas.N do

If Mas.Mas[J]^.Num>Mas.Mas[Max]^.Num then

Max:=J;

If Max<>I then

begin

P:=Mas.Mas[Max];

Mas.Mas[Max]:=Mas.Mas[I];

Mas.Mas[I]:=P;

end

end

end;

procedure PrintWord(var F:Text;I:Integer;P:tpWord);

var

X,Y:Integer;

begin

Write(F,I:5);

Write(F,' "');

For Y:=1 to P^.Word.Col do

write(F,P^.Word.S[Y]);

write(F,'"');

For Y:=P^.Word.Col+1 to cStrSize+1 do

write(F,' ');

write(F,P^.Num:5)

end;

procedure PrintMas(var F:Text; Mas:tMas);

var

Mid,Y:Integer;

begin

If Mas.N=0 then

begin

writeLn('Текст не содержит слов...');

readkey;

halt(1);

end

else

begin

Mid:=Trunc(Mas.N/2+0.5);

WriteLn(F,'Номер Слово Кол Номер Слово Кол');

Writeln(F,'');

For Y:=1 to Mid do

begin

PrintWord(F,Y,Mas.Mas[Y]);

write(F,' | ');

If Mid+Y<=Mas.N then

PrintWord(F,Mid+Y,Mas.Mas[Mid+Y]);

writeLn(F,'');

end

end

end;

procedure Main(var F:Text);

var

Fout:Text;

W:tStr;

M:tMas;

I,J:Integer;

begin

M.N:=0;

Assign(Fout,'Res.txt');

Reset(F);

Rewrite(Fout);

While not (Eof(F)) do

if GetWord(F,W) then

PutWord(M,W);

ReSortMas(M);

PrintMas(Fout,M);

writeLn('Текст обработан...');

readkey;

Close(Fout);

end;

var

F:Text;

C:Char;

begin

clrscr;

C:='A';

while (C<>'N')and(C<>'n')and(C<>'Y')and(C<>'y') do

begin

clrscr;

Write('Анализировать aaa.txt? (y/n) ');

Readln(C);

WriteLn;

If (C='Y')or(C='y') then

begin

assign(F,'aaa.txt');

reset(F);

main(F);

close(F);

end

end

end.

Тестирование работы программы:

В этом разделе приведены тесты, которых достаточно на взгляд разработчика программы для того, чтобы убедиться в корректности ее работы.

  1. Входной файл: «»

Экран:

Файл не содержит слов…

Выходной файл: «»

  1. Входной файл: «{/.. »

Экран:

Файл не содержит слов…

Выходной файл: «»

  1. Входной файл: «aa a a b»

Экран:

Текст обработан…

Выходной файл: «

Номер Слово Кол Номер Слово Кол

1 “a” 2 | 3 “b” 1

2 “aa” 1 |

»

  1. Входной файл: «qwertyuiopasdfghjklz»

Экран:

Слово «qwertyuiopasdfghjklz» слишком велико…

Не удалось обработать текст…

Выходной файл: «»