русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

П Р И М Е Р Ы О Б Р А Б О Т К И С Т Р О К


Дата добавления: 2014-11-27; просмотров: 507; Нарушение авторских прав


 

Пример 1. В строке задан текст. Слова текста разделены между собой одним или несколькими пробелами. В начале и в конце строки также могут быть пробелы. Сжать текст, оставив между словами лишь один пробел. Удалить также пробелы в начале и в конце строки.

 

Удаление из строки пробелов аналогично удалению нулей из одномерного массива (см. раздел "Удаление элементов из массива"). При этом сдвиг символов строки влево и уменьшение ее текущей длины выполняет процедура Delete.

 

Program TextDel;

Var i : byte;

S : string;

Begin

Read(S); Writeln('S= ',S);

For i:=length(S) downto 2 do

If (S[I]=’ ‘) and (S[I-1]=’ ‘) then

Delete(S,i,1);

IfS[1]=’ ‘ then

Delete(S,1,1);

If S[length(S)]=’ ‘ then

Delete(S,length(S),1);

Writeln('S ',S);

End.

 

Пример 2. В строке задан текст. Слова текста разделены между собой одним или несколькими пробелами. В начале и в конце строки также могут быть пробелы. Определить количество слов в тексте и среднее количество букв в слове.

 

Предположим, что строка S имеет следующий вид (символ "-" использован здесь для обозначения пробела):

 

---abcde----fghijklmn----n-opq--xy—

 

Признаком начала слова является символ, отличный от пробела (непробел), признаком окончания слова - ближайший к нему пробел. Будем присваивать номера позиций, определяющих положение слова в строке, переменным k1 и k2:

 

---abcde----fghijklmn----n-opq--xy--

­ ­ ­ ­

k1 k2 k1 k2 ...

 

Следовательно, при анализе строки в программе требуется многократно определять местоположения слов или, другими словами, позицию ближайшего пробела или непробела, начиная с заданной позиции k. Для выполнения такой работы целесообразно написать отдельные подпрограммы, оформив их в виде функции, поскольку выходом подпрограммы является одно значение - позиция пробела или непробела.



 

Поиск ближайшего пробела:

 

Function Space(S:string; k:byte):byte;

Var i : byte;

Begin

Space:=0;

For i:=k tolength(S) do

IfS[i]=' ' then

Begin

Space:=i; Exit

End;

End{ Space };

Если в строке S, начиная с позиции k, пробела не обнаружено, то выходное значение Space = 0.

 

Поиск ближайшего непробела:

 

Function NotSpace(S:string; k:byte):byte;

Var i : byte;

Begin

NotSpace:=0;

For i:=k tolength(S) do

If S[i]<>' ' then

Begin

NotSpace:=i; Exit

End;

End{ NotSpace };

 

Будем считать, что в программе Slovo, реализующей решение поставленной задачи, после раздела Var записаны функции Space и NotSpace.

 

ProgramSlovo;

VarS : string; { анализируемый текст }

NumWords, { количество слов }

NumLetters, { количество букв }

k1,k2, { левая и правая границы слова }

l : byte; { длина слова }

MiddleLet : real; { среднее количество букв в слове }

Cond : boolean; { управляющая переменная }

{ --------------------------------------------------- }

Begin

Readln(S); Writeln('S=',S);

NumWords:=0; NumLetters:=0; MiddleLet:=0;

k2:=0; Cond:=true;

While Cond do

Begin

k1:=NotSpace(S,k2+1);

Ifk1=0 then

Cond:=false

Else

Begin

k2:=Space(S,k1+1);

Ifk2=0 then

Begin

k2:=length(S)+1; Cond:=false;

End;

l:=k2-k1;

Inc(NumWords); Inc(NumLetters,l);

End;

End;

Writeln('Кол-во слов=',NumWords,' Кол-во букв=',

NumLetters);

IfNumWords>0 then

MiddleLet:=NumLetters/NumWords;

Writeln('Средняя длина слова=',MiddleLet:6:1);

End.

 

В программе производится последовательное выделение слов текста путем определения границ слова k1 и k2. Стартовое значение k2 принимается равным нулю. Цикл поиска слов продолжается до тех пор, пока истинно значение переменной Cond.

В каждом цикле поиска определяются значения k1 и k2. Значение k1 - это позиция ближайшего непробела, начиная с позиции k2+1 (в первом цикле k2+1 = 1 ). Если при обращении к функции NotSpace получено k1=0, то это означает, что до конца строки больше слов не обнаружено. Тогда переменной Cond присваивается значение false, что ведет к прекращению работы цикла While.

Если k1>0, определяется значение k2, т.е. номер позиции ближайшего пробела, начиная с k1+1. Если при обращении к функции Space получено k2=0, то это означает, что до конца строки нет больше пробелов. Тогда правой границей слова является байт length(S)+1, т.е. номер байта, расположенного после последней буквы слова. Одновременно значение k2=0 указывает, что в тексте найдено последнее слово. Тогда переменной Cond присваивается значение false, что ведет в дальнейшем к прекращению цикла поиска.

 

Пример 3. В строке содержатся слова, состоящие из русских букв, и целые десятичные числа. Перед числом может стоять знак "+" или "-". В качестве разделителей слов и чисел в тексте используются пробел, запятая, точка, точка с запятой и двоеточие. Определить:

- количество чисел в тексте;

- сумму десятичных цифр, содержащихся в этих числах.

 

Поиск конца числа в тексте в основном аналогичен поиску конца слова в предыдущем примере но искомым признаком является ближайший разделитель, что реализовано в функции SignEnd. Признаком начала числа является цифра или символы "+","-". Поэтому вместо функции NotSpace для поиска начала числа будем использовать функцию Number.

 

ProgramNumbers;

Var S : string; { анализируемый текст }

i, { параметр цикла }

NumNumbers, { количество чисел }

k1,k2, { левая и правая границы числа }

Dig : byte; { числовое значение цифры }

Code : integer; { код преобразования }

Sum : longint; { сумма цифр }

Cond : boolean; { управляющая переменная }

{ --------------------------------------------------- }

FunctionNumber(S:string; k:byte):byte;

Const Digits = '+-0123456789';

Vari : byte;

Begin

Number:=0;

Fori:=k to length(S) do

If Pos(S[i],Digits)>0) then

Begin

Number:=i; Exit

End;

End{ Number };

{ --------------------------------------------------- }

FunctionSignEnd(S:string; k:byte):byte;

Const Separs = ' ,.;:';

Vari : byte;

Begin

SignEnd:=0;

Fori:=k to length(S) do

If Pos(S[i],Separs)>0) then

Begin

SignEnd:=i; Exit

End;

End{ SignEnd };

{ --------------------------------------------------- }

Begin

Readln(S); Writeln('S=',S);

NumNumbers:=0; Sum:=0;

k2:=0; Cond:=true;

While Cond do

Begin

k1:=Number(S,k2+1);

Ifk1=0 then

Cond:=false

Else

Begin

k2:=SignEnd(S,k1+1);

If k2=0 then

Begin

k2:=length(S)+1; Cond:=false;

End;

If (S[k1]='+') or(S[k1]='-') then

Inc(k1);

Fori:=k1 tok2-1 do

Begin

Val(S[i],Dig,Code); Inc(Sum,Dig);

End;

Inc(NumNumbers);

End;

End;

Writeln('Кол-во чисел=',NumNumbers,' Сумма цифр=',Sum);

End.

 

Выделяемый из состава числа элемент S[i] является символом, а не цифрой. Поэтому для преобразования его в численное значение в программе используется процедура Val.

 

Пример 4. В массиве строк содержатся фамилии студентов. Сгруппировать массив по алфавиту.

В таблице ASCII русские буквы записаны по алфавиту. Пробел имеет порядковый номер 32, значительно меньший порядкового номера любой буквы. Поэтому программа группировки текстовых строк по алфавиту отличается от программы группировки одномерного массива по возрастанию лишь тем, что здесь вместо сравнения и обмена местами элементов числового массива сравниваются и обмениваются местами элементы массива строк.

 

ProgramStudGroup;

ConstNmax = 100;

Type string30 = string[30];

StringAr = array[1..Nmax] of string30;

Var i,m,n : byte;

Cond : boolean;

S : string30;

Stud : StringAr;

Begin

Ввод n, Stud

Cond:=true; m:=n-1;

While Cond do

Begin

Cond:=false;

Fori:=1 tom do

If Stud[i]>Stud[i+1] then

Begin

S:=Stud[i]; Stud[i]:=Stud[i+1];

Stud[i+1]:=S; Cond:=true;

End;

Dec(m);

End;

Печать Stud

End.

 



<== предыдущая лекция | следующая лекция ==>
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ОБРАБОТКИ СТРОК | П О И С К О Д Н О Р О Д Н О Й Г Р У П П Ы В М А С С И В Е


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.