TURBO PASCAL |
Новости |
ПРИЛОЖЕНИЕ 2пример выполнения контрольной работы № 6ЛИСТИНГ ПРОГРАММЫ Work6.pasProgram 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. Алгоритм выполнения процедуры InputText1. Сначала строка 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_Words2.
Устанавливаем начальные значения для
переменных 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’). |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |