TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

Приложение 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).

Логическая структура программы изменена и имеет следующий вид:

 

 

 Главная программа

WORK7.pas

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  Алгоритм решения задачи контрольной работы № 7 практически ничем НЕ отличается от алгоритма предыдущей работы. Но теперь последовательность может состоять из нескольких предложений, в которые входят любые буквы и символы - см. тестовые примеры. Мы читаем эти предложения из текстового файла, логическое имя которого F1, а физическое (внешнее) - вводится с клавиатуры и запоминается в переменной InName (этот файл должен существовать на диске). Предложения анализируются на предмет соответствия с условием задачи:

1)     предложение должно оканчиваться точкой (если таких предложений несколько, то к рассмотрению принимается первое из них);

2)     предложение должно содержать слова, состоящие из строчных букв латинского алфавита;

3)     между словами допускаются символы пробела.

Весь анализ и результат записываются в выходной файл, логическое имя которого F2, а физическое имя тоже вводится с клавиатуры и запоминается в переменной OutName (причем, физические имена входного и выходного файлов не должны совпадать).

Как видно из структурной схемы  и из листинга программа Work7.pas содержит две разные локальные подпрограммы с одним и тем же именем Control: одна входит в описание процедуры Text_Words, другая - Evaluate.

Анализируя тестовый пример №2 (выдержки из HELP по строковым подпрограммам на английском языке), мы видим, что предложения могут быть обычными, но они преобразуются в такие, какие нужны по условию задачи. Это и есть обеспечение корректного ввода информации для дальнейшей обработки.

ЛИСТИНГ ПРОГРАММЫ Work7.pas                                                                                                                                                            

program 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

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz