TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

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

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

FAQ

Ссылки

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

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

Спонсор

От автора

 

ПРИЛОЖЕНИЕ  2

пример выполнения контрольной работы № 6

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

Program Work6;

              { Вычислить  вар. 28}

Uses CRT;

const ColWord=50;   {Максимальное количество слов}

          LenWord=8;     {Максимальное количество букв в слове}

          Line         =255; {Максимальная длина последовательности}

          alf             ='abcdefghijklmnopqrstuvwxyz'; {строчные буквы латинского алфавита}

Type

     Words      =1..ColWord;

     MasWord=Array [Words] of string [LenWord];

     Strok       =string[Line];

Var

  Word : MasWord;

      Str : Strok;

       i, f : Byte;

    Flag : boolean;

      ch  : Char;

 

          {Ввод последовательности}

Procedure InputText(Var Str:Strok);

Var text : strok;

Begin

   text:='';   {Пустая строка}

   Writeln('Введите текст');

   Repeat

      ch:=ReadKey;

      {============== Анализ введенного символа. ==============

       Может быть только (см. Прил. 6):

             символ пробел                                             - код 32;

             символ точка                                               - код 46;

             строчные буквы латинского алфавита - коды 97..122}

      if not(ord(ch)in[0..31, 33..45, 47..96, 123..255])then

           begin

              write(ch);   {Эхо-вывод символа на экран}

              text:=text+ch;  {Формирование последовательности символов}

           end;

   Until ch='.';   {Признак окончания ввода}

   Str:=text;

   Writeln

End;

        {Анализ количества f полученных слов}

Function Control(var f:Byte):boolean;

Begin

   Control:=false;

   if f>ColWord then

     begin

        Writeln('Количество полученных слов БОЛЬШЕ допустимого ',ColWord);

        Writeln('Дальнейший анализ прекращается.......');

        f:=f-1;

        Control:=true

     end;

End;

{Выделение слов Word из последовательности Str и анализ их длины}

Procedure Text_Words(Str:Strok; Var Word:MasWord; Var f:Byte;

                                Var Flag:boolean);

Var p, pt, i : Byte;

       text      : strok;

Label L1;

Begin

   f:=0;

   Flag:=True;

   text:=Str;

         {Поиск и удаление пробелов. Формирование слов}

   Repeat

      p:=pos(' ',text);  {Ищем пробел}

      While p=1 do   {Удаление всех лишних пробелов}

          Begin

              Delete(text,1,p);     {по одному пробелу в цикле}

              p:=pos(' ',text);

          End;

      if(p>1)then

         begin

               {Анализ длины слова [2..LenWord]}

            if (p-1>LenWord)or(p-1=1) then

               Begin

                  Writeln('Слово ',Copy(Text,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(text,1,p); {Удаление этого слова с пробелом}

         end;

   Until (p = 0);

   pt:=pos('.',text);

          {Обработка последнего слова с анализом его длины [2..LenWord]}

   if (pos(' ',text)=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('НЕ найдено ни одного слова, удовлетворяющего условию');

        Flag:=False;

     end

End;

procedure Report (f:Words; Word:MasWord);

Var i,j:integer;

Begin

   j:=0;

   Writeln('Всего слов ',f);

   Writeln('Слова, отличные от ',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(Word[i],'  ');

          end;

       Writeln;

       Writeln('Всего таких слов ',j);

End;

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

begin

  Repeat

    ClrScr;

    Writeln('                                            Вариант 28');

    Writeln('Дана последовательность, содержащая от 2 до 50 слов, в каждом ');

    Writeln('из которых от 2 до 8 строчных латинских букв; между словами не');

    Writeln('менее одного пробела, за последним словом - точка. Напечатать');

    Writeln('те слова последовательности, которые отличны от ПОСЛЕДНЕГО слова');

    Writeln('           и их буквы упорядочены ПО АЛФАВИТУ');

    Writeln;

    InputText(Str);

    Text_Words(Str,Word,f,Flag);

    if Flag then

      begin

         Writeln('============= Итого выделены слова =============');

         for i:=1 to f do

            Write(Word[i],'  ');

         Writeln;

         Report(f,Word);

      end;

    Writeln('Опять? (y/n)');

    ch:=ReadKey;

  Until (ch='n') or (ch='N');

end.

 

В контрольной работе №6  необходимо сделать ввод последовательности, содержащей до 50 слов, каждое из которых состоит из не более 8 строчных (малых) букв латинского алфавита, разделенных хотя бы одним пробелом. Последовательность заканчивается точкой. Затем нужно выдать на дисплей те слова последовательности, которые отличаются от последнего слова, и  их буквы упорядочены по алфавиту.

Например, пусть задана последовательность:

                         asdf    xyz  abc defgh stu   abc     abc  xyz.

Тогда решением данной задачи будут следующие слова:

                       abc   defgh    stu   abc    abc

В программе для решения поставленной задачи использованы стандартные процедуры и функции обработки строк (модуль System) см. прил. 4 (П.4.1.6):

function Pos(Substr: String; S: String): Byte; - производит поиск подстроки Substr в строке S. Substr и S - выражения типа String. Функция возвращает целочисленное значение, которое является номером (индексом) первого символа подстроки Substr внутри S. Если Substr не найден, Pos возвращает ноль.

procedure Delete(var S: String; Index: Integer; Count:Integer); - удаляет подстроку, начиная с символа номер Index длиной Count  из строки S. S - переменная типа String. Index и Count - выражения целочисленного типа. Если значение Index больше, чем длина строки S, никакие символы не удаляются. Если значение Count больше, чем оставшихся символов, начиная с позиции Index, в строке S, то удаляются все эти символы до конца строки. Результат записывается в ту же строку S.

function Copy(S: String; Index: Integer; Count: Integer): String; - копирует подстроку из строки S, начиная с символа номер Index длиной Count. S - переменная типа String. Index и Count - выражения целочисленного типа. Если значение Index больше, чем длина строки S, то возвращается пустая строка. Если значение Count больше, чем оставшихся символов, начиная с позиции Index, в строке S, то копируются все эти символы до конца строки.

function Length(S: String): Integer; - возвращает значение динамической (фактической) длины строки S.

Программа имеет имя Work6:

v    В фигурных скобках (комментарий) записан номер варианта 28.

v    В поле вызова библиотечных модулей USES записан модуль CRT.

v    В поле задания констант Const определены значения следующих констант:

          ColWord=50;   {Максимальное количество слов в последовательности}

          LenWord=8;     {Максимальное количество букв в слове}

          Line         =255; {Максимальная длина последовательности в Turbo Pascal}

v                       alf     ='abcdefghijklmnopqrstuvwxyz';   {строчные латинские буквы, упорядоченные по алфавиту}

v    В поле типов Type описаны следующие типы:

v                        интервальный тип Words=1..ColWord;

                 массив слов MasWord =Array [Words] of string [LenWord];

                     строка последовательности Strok длиной Line: Strok  =string[Line];

v    В поле описания переменных Var описаны переменные:

v                       массив слов Word типа MasWord; 

v                       последовательность слов Str  типа Strok;

v                       переменные i, f : Byte; Flag : Boolean; ch : char.

v    Далее следуют описания  процедур InputText, Control, Text_Words, Report.

v    Записана главная программа, которая вызывает нужные процедуры и функции, согласно алгоритму решения задачи.

Процедура InputText (Var Str:Strok) реализует ввод символа, его анализ и формирование последовательности Str из нужных символов, согласно поставленной задаче. В теле функции используется локальная переменная - рабочая строка Text.

Алгоритм выполнения процедуры InputText

1.     Сначала строка Text пустая, т.е.  Text := ’’;

2.     Затем  следует приглашение ввести текст последовательности.

3.     В цикле Repeat ... Until ch=’.’ посимвольно (до точки) формируется рабочая последовательность Text:

Ø       Вводится символ ch, используя стандартную функцию ReadKey.

Ø       Этот символ анализируется на допустимый. Если он НЕ соответствует допустимому, то он игнорируется (на экране при этом ничего НЕ видно), иначе символ выводится на экран (эхо-сопровождение) и присоединяется (через операцию конкатенации + ) к последовательности Text.

1.     Далее сформированная последовательность Text присваивается параметру-строке Str, и на экран выводится пустая строка - Writeln.

 

Потом описана процедура выделения слов из последовательности  и анализа  их длины Text_Words(Str:Strok; Var Word:MasWord; Var f:Byte; Var Flag:boolean);. В заголовке описаны формальные параметры:

входная последовательность Str;

выходной массив слов Word;

количество этих слов f;

логический  признак  успешного решения задачи Flag.

В теле процедуры используются локальные переменные p, pt, i : Byte и Text : strok, в поле описания меток определена метка L1.

Алгоритм выполнения процедуры Text_Words

2.     Устанавливаем начальные значения для переменных f, Flag и Text.

3.     В цикле Repeat ... Until (p=0) производим поиск и удаление пробелов, а также формирование слов:

Ø       Выделяем позицию пробела, используя стандартную функцию Pos.

Ø       В цикле While p=1 удаляем несколько пробелов, если они есть, используя стандартную процедуру Delete (по одному пробелу в цикле).

Ø       Теперь анализируем длину слова: если она больше LenWord или равна 1 (один символ), то выдается соответствующее сообщение, такое слово выделяется из последовательности (стандартная функция Copy), выводится на экран и управление передается на метку L1).

Ø       Количество слов f увеличивается на единицу: f + 1.

Ø       Если количество слов f  превышает допустимое ColWord (за этим «следит» логическая функция Control), то выдается соответствующее сообщение и выделение слов прекращается.

Ø       В противном случае формируется слово и запоминается в массиве Word под номером f.

Ø       Это слово удаляется из последовательности Text (процедура Delete).

3.     Аналогичным образом обрабатываем последнее слово (перед точкой).

4.     Анализируем количество полученных слов f. Если оно равно нулю, выдаем сообщение и присваиваем  логическому  признаку  успешного решения задачи Flag значение False.

 

Процедура Report (f:Words; Word:MasWord) определяет нужные по условию задачи слова, считает их количество и выводит на экран. В теле процедуры используются локальные целочисленные переменные  i, j : integer. Слова эти:

1)    не должны совпадать с последним словом, т.е. со словом номер f (Word[i]<>word[f]), поэтому организован цикл  for по параметру i от 1 до f -1, 

2)    должны содержать последовательность букв (более одной (length(Word[i])>1)), упорядоченных по латинскому алфавиту (POS(Word[i],alf)<>0).

Целиком это условие на языке Паскаль может быть записано следующим образом:

(Word[i]<>word[f]) and (POS(Word[i],alf)<>0) and (length(Word[i])>1)

Количество таких слов считается и запоминается в переменной j.

Описание главной программы

1.     В цикле REPEAT ... UNTIL очищается экран (ClrScr), выводится на экран вид исходного задания, через процедуру InputText вводится последовательность Str, далее из последовательности Str выделяются слова Word, вычисляется их количество f и логический  признак  успешного решения задачи Flag (процедура Text_Words (Str, Word, f, Flag)).

Ø       Если значение признака Flag равно TRUE,  то выводится результат: выделенные из последовательности слова Word и те из них, которые удовлетворяют условию задачи (процедура Report (f, Word)).

Ø       Если значение функции Flag равно False, то управление передается на пункт 2 для повторного решения задачи.

1.     На экране появляется Опять? (Y/N)’.

2.     Переменной присваивается ch:=ReadKey и в зависимости от ответа  управление передается на начало цикла (ch:=Y’)  или программа заканчивает выполнение (ch:= ‘N’).

 

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

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

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

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

Hosted by uCoz