Обработка строк - Pascal (93272)
Формулировка задачи:
Всем привет. Помогите плз решить данную задачу.
Задача:
Рассматривается непустая строка, состоящая из не более, чем 80 символов. Каждый символ строки может быть малой английской буквой, цифрой или одним из символов +, -, *. Группой букв будет называться такая совокупность последовательно расположенных букв, которой непосредственно не предшествует и за которой непосредственно не следует буква. Аналогично определяется группа знаков и цифр. Требуется написать программу, которая находит и печатает все такие группы букв, которые начинаются и заканчиваются одной и той же буквой. Группа букв, состоящая из одной буквы, принадлежит множеству искомых групп букв. Если в строке нет ни одной группы букв, которая начинается и кончается одной и той же буквой, то напечатать сообщение "В строке нет ни одной искомой группы букв". Если в строке нет ни одной группы букв, то напечатать сообщение "В строке нет ни одной группы букв". Исходная строка вводится с клавиатуры.
Преподаватель сказал что нужно задать постоянную в которой перечислить весь англ.алфавит и потом только находить нужные группы букв. В общем я не понял, как в итоге решить эту задачу. Прошу помощи *help*
Небольшое вознаграждение.
Решение задачи: «Обработка строк»
textual
Листинг программы
uses crt; const ds=['a'..'z','0'..'9','+','-','*']; lb=['a'..'z']; var s,s1:string[80]; i,k,j,f1,f2:byte; begin clrscr; repeat k:=0; writeln('Введите строку из малых латинских букв, цифр и знаков + - *'); writeln(' длиной до 80 символов'); readln(s); for i:=1 to length(s) do if not(s[i] in ds) then begin writeln('Строка введена неверно, повторите ввод.'); k:=1; break; end; until k=0; writeln('Группы букв, начинающиеся и оканчивающиеся на одну букву:'); i:=1;f1:=0;f2:=0; while i<=length(s) do if (s[i] in lb)and (not(s[i-1] in lb)or(i=1)) then{если буква, а перед ней не буква, или она первая} begin f1:=1; k:=i;s1:=''; while (s[k] in lb)and(k<=length(s))do {пока буква и не конец строки} begin s1:=s1+s[k]; k:=k+1;{идем вперед} end; if s1[1]=s1[length(s1)] then begin f2:=1; write(s1,' '); end; i:=i+length(s1);{перепрыгиваем} end else i:=i+1; if f1=0 then write('В строке нет ни одной группы букв') else if f2=0 then write('В строке нет ни одной искомой группы букв'); readln end.
Объяснение кода листинга программы
- Установка начального значения переменной ds равным ['a'..'z','0'..'9','+','-','*'] - это набор символов, которые допустимы в строке.
- Установка начального значения переменной lb равным ['a'..'z'] - это набор символов, которые должны начинаться и заканчиваться группой.
- Объявление переменных s, s1: string[80] - это строки, которые используются в коде.
- Объявление переменных i, k, j, f1, f2: byte - это булевые переменные, используемые для контроля в цикле.
- Ввод строки с помощью readln(s) - пользователь вводит строку, которая сохраняется в переменной s.
- Проверка длины строки с помощью length(s) - это используется в цикле для контроля длины строки.
- Проверка каждого символа строки с помощью if not(s[i] in ds) then - это проверяет, что текущий символ не является допустимым символом.
- Если текущий символ не является допустимым, программа выводит сообщение об ошибке и прерывает цикл.
- Проверка каждой буквы в строке с помощью if (s[i] in lb)and (not(s[i-1] in lb)or(i=1)) then - это проверяет, что текущий символ является буквой и не является предыдущим символом.
- Если текущий символ является буквой и не является предыдущим символом, программа начинает новую группу.
- Цикл while проверяет каждую букву в группе, пока не достигнет конца строки.
- Если группа имеет длину больше 1 и является самообратной, программа добавляет ее в переменную s1.
- Если переменная f1 равна 0, программа выводит сообщение о том, что в строке нет групп.
- Если переменная f2 равна 0, программа выводит сообщение о том, что в строке нет искомой группы.