Примеры решения задач с данными строкового типа
Glasn: symbol:=; stroka: string; {Обрабатываемая строка) stroka_temp:string; {Переменная для хранения временных строковых данных) si, s2: string; {Искомая и заменяемая строки) count_glasn, count_word:integer; {Количество гласных букв и слов соответственно) i, j: integer; {Счетчики циклов) l_sl: integer; {Длина строки si) max_letter: integer; {Максимальное количество букв). Буквы палиндрома должны… Читать ещё >
Примеры решения задач с данными строкового типа (реферат, курсовая, диплом, контрольная)
Пример 7.1.
У пользователя запрашивается текстовая строка, содержащая только буквы кириллического и латинского алфавитов, символ пробела и знаки препинания.
- 1. Подсчитать количество гласных букв в строке.
- 2. Подсчитать количество слов в строке.
- 3. Сделать первую букву каждого слова прописной.
- 4. Выяснить, является ли строка палиндромом (одинаково читается как справа налево, так и слева направо).
- 5. Запросить два слова. Все вхождения первого слова в строке заменить вторым.
- 6. Выяснить, какая из букв встречается в строке наибольшее число раз. Если таких букв несколько, вывести каждую из них. При подсчете не различать строчные и прописные буквы.
Решение
Пусть вводимая пользователем строка имеет идентификатор stroka. Строковые переменные — это, прежде всего, совокупность символов типа char, поэтому в заголовке программы логично определить пользовательский тип данных symbol в виде множества элементов типа char. В разделе описания переменных определены две переменные типа symbol. Первая принимает значения всех возможных гласных русского и английского языков (переменная glasn), вторая — значения всевозможных букв этих языков (переменная letter).
Общий заголовок и раздел описаний программы для решения всех поставленных задач приведен в листинге 7.3. Пояснения необходимости конкретных переменных приводятся при решении той или иной задачи.
Листинг 7.3
Program string_example;
Type
symbol=set of char;
Var
glasn:symbol:=['a','o','y','ы','э',' я','ё', letter: symbol:=['a,.'H'/'A'.'n,/,a'.,z,/'A,.'Z']; stroka: string; {Обрабатываемая строка) stroka_temp:string; {Переменная для хранения временных строковых данных) si, s2: string; {Искомая и заменяемая строки) count_glasn, count_word:integer; {Количество гласных букв и слов соответственно) i, j: integer; {Счетчики циклов) l_sl: integer; {Длина строки si) max_letter: integer; {Максимальное количество букв).
palin:boolean; {Переменная для проверки, является ли фраза палиндромом) eng: array['а'.'z'] of integer; {Массив латинских букв).
rus: array['а'.'я'] of integer; {Массив кириллических букв) tmp_ch:char; {Переменная для хранения временного символа) Для хранения количества гласных букв введена целочисленная переменная count_glasn. Программный код запроса строковой переменной st г ока и решения первой задачи приведен в листинге 7.4.
Листинг 7.4
write ('Введите текстовую строку: ');
Readln (stroka);
count_glasn:=0; {Задание начального значения количества гласных букв} for i:=l to length (stroka) do
if stroka[i] in glasn then inc (count_glasn); {Если символ с номером i является гласной буквой, то счетчик гласных увеличить на 1} writeln ('Количество гласных: ', count_glasn);
Для хранения количества слов используется целочисленная переменная count_word. Программный код и пояснения решения второй задачи приведены в листинге 7.5.
Листинг 7.5
count_word:=0; {Задание начального значения количества слов} for i:=2 to length (stroka) do
if not (stroka[i] in letter) and (stroka[i-1] in letter) then inc (count_word); {Если символ с номером i не является буквой, а предшествующий ему символ является, то счетчик слов увеличить на 1} if stroka[length (stroka)] in letter then inc (count_word); {В предыдущем цикле не учитывался случай, когда строка заканчивается не буквой. Здесь производится проверка этого случая} writeln ('Число слов: ', count_word);
Программный код решения третьей задачи с пояснениями приведен в листинге 7.6.
Листинг 7.6
for i:=2 to length (stroka) do
if (stroka[i] in letter) and not(stroka[i-1] in letter) then stroka[i]:uppercase (stroka[i]); {Если символ с номером i является буквой, а предшествующий ему символ не является, то изменить регистр символа с индексом i на верхний}.
if stroka[l] in letter then
stroka[1]: =uppercase (stroka[1 ]); {В предыдущем цикле не учитывался случай, когда строка начинается буквой. Здесь производится проверка этого случая} writeln ('Измененная строка: ', stroka);
Для определения, является ли введенная строка stroka палиндромом, введена вспомогательная переменная stroka_temp, которая в итоге содержит только тс символы, которые являются буквами (не буквы удаляются процедурой delete). Переменная palin содержит булевское значение: true, если stroka является палиндромом, и false — в противном случае.
Буквы палиндрома должны быть симметричны относительно «центра» строки. Если количество букв в stroka четное, то сравниваются символы и индексы 1 и length (stroka), 2 и length (stroka)-1 и т. д. до length (stroka_temp) div 2. Если количество букв в stroka нечетное, то сравниваются символы до пары length (stroka_temp) div 2 и (length (stroka_temp) div 2))+2.
Программный код и пояснения решения четвертой задачи приведены в листинге 7.7.
Листинг 7.7
stroka_temp:=stroka; (Инициализация значения вспомогательной переменной}.
i: =1; {Инициализация значения счетчика индексов переменной stroka}.
while i<=length (stroka_temp) do {Пока значение счетчика не превысит длину stroka}.
begin
if not (stroka_temp[i] in letter) then
delete (stroka_temp, i,1) else inc (i);{Ecnn символ с индексом i не является буквой, то удалить его из строки stroka_temp}.
end;
palin:=true; {Предполагается, что строка является палиндромом}.
for i:=l to trunc (length (stroka_temp) div 2) do if stroka_temp[i] stroka_temp.
[length (stroka_temp)-i+1] then palin:=false; {Если имеется хотя бы одна пара неодинаковых символов, изменить значение palin на false}.
if palin=true then writeln ('Строка является палиндромом!') else writeln ('Строка не является палиндромом!');
Для решения пятой задачи введена переменная l_sl, содержащая длину строки si («что заменять»). Это было сделано для уменьшения объема программного кода. Программный код и пояснения решения пятой задачи приведены в листинге 7.8.
Листинг 7.8
write ('Что заменять: '); Readln (sl);
write ('На что заменять: '); Readln (s2);
l_sl:^length (si); {Для уменьшения объема программы}.
for i:=l to length (stroka)-l_sl+l do {Если размер слова, которое надо заменить, равен i_sl, то нет смысла пытаться искать это слово после length (stroka)-l_sl+l символа}.
if copy (stroka, i, l_sl)=sl then {Если подстрока строки stroka совпадает c si} begin
delete (stroka, i, l_sl); {Удалить искомую подстроку}.
insert (s2,stroka, i); {Вставить новую подстроку, начиная с позиции i).
end;
writeln ('Строка после замены: ', stroka);
Для решения шестой задачи определена переменная tmp_char символьного типа для хранения символов только в нижнем регистре (по условию задачи регистр не важен), а также два массива:
- 1) массив rus, индексами которого являются строчные символы русского алфавита;
- 2) массив eng, индексами которого являются строчные символы английского алфавита.
В программе используется переменная max_letter, хранящая количество повторений самого частого символа в строке.
Программный код и пояснения решения шестой задачи приведены в листинге 7.9.
Листинг 7.9
for i:=l to length (stroka) do begin
tmp_ch:^lowercase (stroka[i]); {Преобразование символа в нижний регистр} if tmp_ch in ['а'.'я'] then inc (rus[tmp_ch]); {Если какая-то буква встречается в stroka, то значение соответствующего элемента массива увеличивается на 1}.
if tmp_ch in ['a '.. ' z ' ] then inc (eng[tmp_ch]); {Если какая-то буква встречается в stroka, то значение соответствующего элемента массива увеличивается на 1}.
end;
max_letter:=0; {Предполагается, что максимальное число вхождений самого частого символа равно 0}.
foreach tmp_ch in ['а'.'я'] do
if rus[tmp_ch]>max_letter then
max_letter:=rus[tmp_chj; {Если количество вхождения символа tmp_ch равно максимальному количеству вхождений, то вывести этот символ}.
foreach tmp_ch in [1 а 1.'z'] do
if eng[tmp_ch]>max_letter then
max_letter:=eng[tmp_chl; {Если количество вхождения символа tmp_ch равно максимальному количеству вхождений, то вывести этот символ}.
{Вывод на экран самих букв и количества раз, которые они встречаются}.
writeln ('Максимальное число раз в строке встречаются буквы:');
foreach tmp_ch in ['а'.'я'] do
if rus[tmp_ch]=max_letter then writeln (tmp_ch,1
— ', rus[tmp_ch],1 раз'); foreach tmp_ch in [1 a 1.'z'] do.
if eng[tmp_ch]=max_letter then writeln (tmp_ch,1
— ', eng[tmp_ch],1 раз');