TURBO PASCAL |
Новости |
Приложение 3пример выполнения контрольной работы № 7Прежде, чем анализировать листинг программы Work7.pas, нужно ознакомиться с основными понятиями ввода-вывода (см. П4.2. - модуль SYSTEM) и текстовыми файлами (см. П.4.2.2), а также с процедурами обработки файлов (см. П5.2.4. - модуль DOS). До этого контрольного задания
мы работали со стандартными
текстовыми файлами INPUT и OUTPUT (клавиатура
и дисплей) - см. П.4.2.1. Обработка дисковых
текстовых файлов практически ничем не
отличается (те же операторы Read, Readln, Write, Writeln), но при этом может
возрасти объем перерабатываемой
информации и, кроме того, необходимо
указывать внешние (файловые) имена при
открытии файлов (стандартные процедуры Assign, Reset,
Rewrite). Чтобы информация не исчезла,
внешние файлы нужно всегда закрывать (стандартная
процедура Close). Логическая структура программы
изменена и имеет следующий вид:
1) предложение должно оканчиваться точкой (если таких предложений несколько, то к рассмотрению принимается первое из них); 2) предложение должно содержать слова, состоящие из строчных букв латинского алфавита; 3) между словами допускаются символы пробела. Весь анализ и результат записываются в выходной файл, логическое имя которого F2, а физическое имя тоже вводится с клавиатуры и запоминается в переменной OutName (причем, физические имена входного и выходного файлов не должны совпадать). Как видно из структурной схемы и из листинга программа Work7.pas содержит две разные локальные подпрограммы с одним и тем же именем Control: одна входит в описание процедуры Text_Words, другая - Evaluate. Анализируя тестовый пример №2 (выдержки из HELP по строковым подпрограммам на английском языке), мы видим, что предложения могут быть обычными, но они преобразуются в такие, какие нужны по условию задачи. Это и есть обеспечение корректного ввода информации для дальнейшей обработки. ЛИСТИНГ ПРОГРАММЫ Work7.pasprogram
Work7; { Вычислить вар. 28. Текстовые файлы: F1- входной, F2 - выходной} Uses
DOS, CRT; Const ColWord=50; {Максимальное количество слов} LenWord=8; {Максимальное количество букв в слове} Line =255; {Максимальная длина последовательности} alf ='abcdefghijklmnopqrstuvwxyz'; FileL =12; {Максимальная длина имени файла в MS DOS, включая расширение} Type Words
=1..ColWord; MasWord=Array
[Words] of string [LenWord]; Strok
=string[Line]; FileName=String[FileL]; var Word:MasWord; Str :Strok; i,f :Byte; Flag:boolean; ch : Char; F1,F2:Text; {Выделение из последовательности слов и анализ их длины} Procedure
Text_Words(Str:Strok; Var Word:MasWord; Var f:Byte;
Var Flag:boolean; var F2:Text); Var p,pt,i:Byte; txt:strok; Label L1; {Анализ количества полученных слов f }
Function
Control(var f:Byte):boolean; Begin Control:=false; if
f>ColWord then begin Writeln(F2,'Количество полученных слов БОЛЬШЕ допустимого ',ColWord); Writeln(F2,'Дальнейший анализ прекращается.......'); f:=f-1;
Control:=true
end; End; Begin f:=0; Flag:=True; txt:=Str; {Поиск и удаление пробелов} Repeat p:=pos(' ',txt); {Ищем пробел} While p=1 do {Удаление нескольких лишних пробелов, если они есть} Begin
Delete(txt,1,p);
p:=pos(' ',txt);
End; if(p>1)then
begin
{Анализ длины слова [2..LenWord]}
if (p-1>LenWord)or(p-1=1) then
Begin
Writeln(F2,'Слово
',Copy(txt,1,p-1),' содержит
',p-1,
' символов!!!! Оно игнорируется....' );
goto L1;
End;
f:=f+1;
if Control(f) then exit;
word[f]:=Copy(txt,1,p-1); L1: Delete(txt,1,p); {Удаление этого слова с пробелом} end; Until (p = 0); pt:=pos('.',txt); {Обработка последнего слова с анализом его длины [2..LenWord]}
if (pos(' ',txt)=0)
and (pt>1) and (pt-1<=LenWord) and(pt-1>1) then begin
f:=f+1;
if Control(f) then exit;
word[f]:=Copy(txt,1,pt-1); end; if f=0 then begin Writeln(F2,'НЕ найдено ни одного слова, удовлетворяющего условию'); Flag:=False; end End; procedure
Report(f:Words; Word:MasWord; Var F2:Text); Var i,j:integer; Begin j:=0; Writeln(F2,'Всего
слов ',f); Writeln(F2,'Слова, отличные от ',word[f], ', и буквы их упорядочены по алфавиту:');
for i:=1 to f-1 do if Word[i]<>word[f]
then if
(POS(Word[i],alf)<>0) and (length(Word[i])>1) then
begin
j:=j+1;
Write(F2,Word[i],' ');
end; Writeln(F2); Writeln(F2,'Всего таких слов ',j); End; {Ввод последовательностей из файла F1, запись результата в файл F2} Procedure
Evaluate(var F1,F2:Text); Var txt,Str: strok; i,s,L
: Byte; InName,OutName
: FileName; Label L1; {----------------------- Внутренние (локальные) процедуры -----------------------} {Выдача имен всех файлов из текущей директории}
Procedure Control; Var
DirInfo:SearchRec; Begin
FindFirst('*.*', AnyFile, DirInfo);
while DosError = 0 do
begin
Write(DirInfo.Name,' ');
FindNext(DirInfo);
end;
Writeln End;
{Инициализация файлов F1, F2} Procedure AssignFile(Var F1,F2:Text;
Var InName:FileName); Label 1,2; Begin 1: Write('Имя файла для исходной последовательности символов========>'); Readln(InName);
Assign(F1,InName); {$I-} {Отключаем контроль ошибок ввода-вывода} reset(F1); {Открываем файл на ввод} {$I+} {Включаем контроль ошибок ввода-вывода} if IOResult <>0 Then {Проверяем существование файла} begin Writeln('Указанный файл ',InName,' НЕ существует!!!!'); Control; Writeln('Введите имя существующего файла....'); Goto 1; end; 2: Write('Имя выходного файла (для искомых слов)========>'); Readln(OutName);
if InName<>OutName then
begin
Assign(F2,OutName);
Rewrite(F2);
end
else begin Writeln('Имя выходного файла НЕ должно совпадать с именем входного!!!'); Writeln('Повторите....');
Goto 2;
end; End; {----------------------- Конец описания внутренних процедур -----------------------} Begin AssignFile(F1,F2,InName); s:=0; Writeln(F2,'............... Анализируем файл ',InName,'............');
while not EOF(F1) do begin
Readln(F1,Str); s:=s+1; Writeln(F2,'--------------- Исходное предложение # ',s,'---------------'); Writeln(F2,Str);
L:=length(Str); i:=0; txt:=''; {Пустая строка} Repeat
i:=i+1;
if i>L then begin Writeln(F2,'Предложение НЕ кончается точкой - оно игнорируется');
goto
L1 end;
ch:=Str[i]; {============== Анализ введенного символа. ============== Может быть только: символ пробел - код 32; символ точка - код 46; строчные буквы латинского алфавита - коды 97..122} if
not(ord(ch)in[0..31, 33..45, 47..96, 123..255])then txt:=txt+ch; {Формирование последовательности символов} Until ch='.'; {Признак окончания анализа предложения} Str:=txt;
Text_Words(Str,Word,f,Flag,F2);
if Flag then
begin Writeln(F2,'============= Итого выделены слова ============='); for
i:=1 to f do
Write(F2,Word[i],' ');
Writeln(F2);
Report(f,Word,F2);
end; L1: end; close(F1); close(F2); End; {Главная программа} begin Repeat ClrScr; Writeln(' Вариант 28'); Writeln('Дана последовательность, содержащая от 2 до 50 слов, в каждом '); Writeln('из которых от 2 до 8 строчных латинских букв; между словами не'); Writeln('менее одного пробела, за последним словом - точка. Напечатать'); Writeln('те слова последовательности, которые отличны от ПОСЛЕДНЕГО слова'); Writeln(' и их буквы упорядочены ПО АЛФАВИТУ.'); Writeln(' Эта последовательность образует предложение длиной НЕ более'); Writeln(' одной строки (255 символов) текстового файла. Если предложение'); Writeln('НЕ заканчивается точкой, то оно игнорируется. Если на одной строке'); Writeln('находится несколько таких предложений, то к рассмотрению принимается'); Writeln(' первое, остальные игнорируются. Таких строк в текстовом файле может'); Writeln(' быть достаточно много - это зависит от размера предоставляемой дисковой'); Writeln(' памяти. Все строки анализируются в соответствии с поставленной задачей'); Writeln(' и результат анализа выводится тоже в текстовый файл.');
Writeln; Evaluate(F1,F2); Writeln('Опять?
(y/n)'); ch:=ReadKey; Until (ch='n') or (ch='N'); end. тестовые примеры пример № 1 Исходный
файл f: fghfg hgjh hgkggkj gkkgkgk kgjkkj jkkjkjjk. iooyoi hukuu gkukjgkgj kukkj. uigugu
hjkh 6877070 7070790 79079079 79079790 790790 uiguiuti. abc
def abc abc ABC. xyz
abc defgh defgh abc. fghfg d
h k hgjh hgkggkj abc k t gkkgkgk kgjkkj jkkjkjjk k l n. Результат - выходной файл FF: ............... Анализируем файл f............ --------------- Исходное предложение # 1--------------- fghfg hgjh hgkggkj gkkgkgk kgjkkj jkkjkjjk. ============= Итого выделены слова ============= fghfg hgjh hgkggkj gkkgkgk kgjkkj jkkjkjjk Всего слов 6 Слова, отличные от jkkjkjjk, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 2--------------- iooyoi hukuu gkukjgkgj kukkj. Слово gkukjgkgj содержит 9 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= iooyoi hukuu kukkj Всего слов 3 Слова, отличные от kukkj, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 3--------------- uigugu hjkh 6877070 7070790 79079079 79079790 790790 uiguiuti. ============= Итого выделены слова ============= uigugu hjkh uiguiuti Всего слов 3 Слова, отличные от uiguiuti, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 4--------------- abc def abc abc ABC. ============= Итого выделены слова ============= abc
def abc
abc Всего слов 4 Слова, отличные от abc, и буквы их упорядочены по алфавиту: def Всего таких слов 1 --------------- Исходное предложение # 5--------------- xyz abc defgh defgh abc. ============= Итого выделены слова ============= xyz
abc defgh
defgh abc
Всего слов 5 Слова, отличные от abc, и буквы их упорядочены по алфавиту: xyz defgh defgh Всего таких слов 3 --------------- Исходное предложение # 6--------------- fghfg d h k hgjh hgkggkj abc k t gkkgkgk kgjkkj jkkjkjjk k l n. Слово d содержит 1 символов!!!! Оно игнорируется.... Слово h содержит 1 символов!!!! Оно игнорируется.... Слово k содержит 1 символов!!!! Оно игнорируется.... Слово k содержит 1 символов!!!! Оно игнорируется.... Слово t содержит 1 символов!!!! Оно игнорируется.... Слово k содержит 1 символов!!!! Оно игнорируется.... Слово l содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= fghfg hgjh hgkggkj abc gkkgkgk kgjkkj jkkjkjjk Всего слов 7 Слова, отличные от jkkjkjjk, и буквы их упорядочены по алфавиту: abc Всего таких слов 1 пример № 2 Исходный файл helpstr.txt (выдержки из HELP по строковым подпрограммам): function
Pos(Substr: String; S: String): Byte; Searches
for a substring in a string. Substr
and S are string-type expressions.Pos searches for Substr within S, and
returns an integer value that is the index of the first character of Substr
within S. If Substr is not found, Pos returns zero.
procedure Delete(var S: String; Index: Integer; Count:Integer); Deletes
a substring from a string. S is a
string-type variable. Index and Count are integer-type expressions. Delete
deletes Count characters from S starting at the Indexth position. If Index is
larger than the length of S, no characters are deleted. If Count specifies
more characters than remain starting at the Indexth position, the remainder
of the string is deleted.
function Copy(S: String; Index: Integer; Count: Integer): String; Returns
a substring of a string. S is a
string-type expression. Index and Count are integer-type expressions. Copy
returns a string containing Count characters starting with the Indexth character
in S. If Index
is larger than the length of S, Copy returns an empty string. If Count
specifies more characters than remain starting at the Indexth position,
only the remainder of the string is returned. function
Length(S: String): Integer; Returns
the dynamic length of a string. Результат - выходной файл H: ............... Анализируем файл helpstr.txt............ ---------------
Исходное предложение
# 1---------------
function Pos(Substr: String; S: String): Byte; Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 2--------------- Searches
for a substring in a string. Слово a содержит 1 символов!!!! Оно игнорируется.... Слово substring содержит 9 символов!!!! Оно игнорируется.... Слово a содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= earches
for in
string Всего слов 4 Слова, отличные от string, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 3--------------- Substr and
S are string-type expressions.Pos searches for Substr within S, Слово stringtype содержит 10 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= ubstr
and are
Всего слов
3 Слова, отличные от are, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 4--------------- and returns
an integer value that is the index of the first character of Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 5--------------- Substr
within S. If Substr is not found, Pos returns zero. ============= Итого выделены слова ============= ubstr within Всего слов 2 Слова, отличные от within, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 6--------------- Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 7---------------
procedure Delete(var S: String; Index: Integer; Count:Integer); Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 8--------------- Deletes a
substring from a string. Слово a содержит 1 символов!!!! Оно игнорируется.... Слово substring содержит 9 символов!!!! Оно игнорируется.... Слово a содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= eletes
from string
Всего слов
3 Слова, отличные от string, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 9--------------- S is a
string-type variable. Index and Count are integer-type expressions. Слово a содержит 1 символов!!!! Оно игнорируется.... Слово stringtype содержит 10 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= is
variable Всего слов
2 Слова, отличные от variable, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 10--------------- Delete deletes Count characters from S starting at the Indexth position. If Слово characters содержит 10 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= elete
deletes ount
from starting
at the ndexth position
Всего слов 9 Слова, отличные от position, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 11--------------- Index is larger than the length of S, no characters are deleted. If Count Слово characters содержит 10 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= ndex
is larger
than the
length of
no are
deleted Всего слов 10 Слова, отличные от deleted, и буквы их упорядочены по алфавиту: no Всего таких слов 1 ---------------
Исходное предложение
# 12--------------- specifies
more characters than remain starting at the Indexth position, the Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 13--------------- remainder
of the string is deleted. Слово remainder содержит 9 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= of
the string
is deleted
Всего слов 5 Слова, отличные от deleted, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 14--------------- Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 15---------------
function Copy(S: String; Index: Integer; Count: Integer): String; Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 16--------------- Returns a
substring of a string. Слово a содержит 1 символов!!!! Оно игнорируется.... Слово substring содержит 9 символов!!!! Оно игнорируется.... Слово a содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= eturns
of string
Всего слов
3 Слова, отличные от string, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 17--------------- S is a
string-type expression. Index and Count are integer-type expressions. Слово a содержит 1 символов!!!! Оно игнорируется.... Слово stringtype содержит 10 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= is Всего слов 1 Слова, отличные от is, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 18--------------- Copy
returns a string containing Count characters starting with the Indexth Предложение НЕ кончается точкой - оно игнорируется --------------- Исходное предложение # 19--------------- character in S. Слово character содержит 9 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= in Всего слов 1 Слова, отличные от in, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 20--------------- Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 21--------------- If Index is larger than the length of S, Copy returns an empty string. If Слово f содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= ndex
is larger
than the
length of
opy returns
an empty
string Всего слов 12 Слова, отличные от string, и буквы их упорядочены по алфавиту: Всего таких слов 0 ---------------
Исходное предложение
# 22--------------- Count
specifies more characters than remain starting at the Indexth Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 23--------------- position,
only the remainder of the string is returned. Слово remainder содержит 9 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= position
only the
of the string
is returned
Всего слов 8 Слова, отличные от returned, и буквы их упорядочены по алфавиту: Всего таких слов 0 --------------- Исходное предложение # 24--------------- Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 25--------------- function
Length(S: String): Integer; Предложение НЕ кончается точкой - оно игнорируется ---------------
Исходное предложение
# 26--------------- Returns
the dynamic length of a string. Слово a содержит 1 символов!!!! Оно игнорируется.... ============= Итого выделены слова ============= eturns
the dynamic
length of
string Всего слов 6 Слова, отличные от string, и буквы их упорядочены по алфавиту: Всего таких слов 0 |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |