Лабораторная работа Обработка текста
.DOCСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра МОЭВМ
Лабораторная работа по программированию
«Обработка текста»
ОТЧЕТ
Факультет КТИ
группа 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.
Тестирование работы программы:
В этом разделе приведены тесты, которых достаточно на взгляд разработчика программы для того, чтобы убедиться в корректности ее работы.
-
Входной файл: «»
Экран:
Файл не содержит слов…
Выходной файл: «»
-
Входной файл: «{/.. »
Экран:
Файл не содержит слов…
Выходной файл: «»
-
Входной файл: «aa a a b»
Экран:
Текст обработан…
Выходной файл: «
Номер Слово Кол Номер Слово Кол
1 “a” 2 | 3 “b” 1
2 “aa” 1 |
»
-
Входной файл: «qwertyuiopasdfghjklz»
Экран:
Слово «qwertyuiopasdfghjklz» слишком велико…
Не удалось обработать текст…
Выходной файл: «»