Задачи с использованием строкового типа данных

В этом классе задач приходится оперировать таким типом данных, как строки, проводить преобразования строковых данных в числовые и наоборот.

Задача 3.1

Для заданной строки символов проверить, является ли она симметричной или нет. (Симметричной считается строка, которая одинаково читается слева направо и справа налево).

Задача 3.2

Для заданной строки символов проверить, является ли она палиндромом (симметричной с точностью до пробелов) или нет.
Например, палиндромами являются цепочки:
АРГЕНТИНА МАНИТ НЕГРА
А РОЗА УПАЛА НА ЛАПУ АЗОРА
(Предполагается, что все буквы строки - прописные).

Задача 3.3

Для заданной строки символов определить сумму всех входящих в неё цифр.

Задача 3.4

Для заданной строки символов вычислить произведение входящих в эту строку целых чисел (без учета их знаков). Например, для строки "kjjjkkj2.5jkjn,,,hfd45jgfvjlkfdii10,2hfhg" произведение 2*5*45*10*2=9000.

Задача 3.5

Для заданной строки символов вычислить сумму входящих в неё цифр, причем знак очередного слагаемого должен быть противоположным знаку предыдущего слагаемого.
Например:
Для строки "asdd1vnb24vnf63vbn,-5h-2kk"
Сумма S=1-2+4-6+3-5+2= -3.

Задача 3.6

Для заданной строки символов найти наибольшее записанное в этой строке целое число (без учета знака числа). Например, для строки "sdfvgsd1.9fdmjgvb-15.2dnj05" наибольшее целое число 15.

Задача 3.7

Для заданной строки определить все входящие в неё символы. Например: строка "abccbbbabba" состоит из символов "a","b" и "с".

Задача 3.8

Задана строка символов. Среди литер этого текста особую роль играет знак #, появление которого означает отмену предыдущей литеры текста; k знаков # отменяют k предыдущих литер (если такие есть) Напечатать строку с учетом роли знака #. Например, строка "VR#Y##HELO#LO" должна быть напечатана в виде: "HELLO".

Задача 3.9

Задана строка символов. Определить, какой символ встречается в этой строке подряд наибольшее число раз. В ответе указать символ, образующий самую длинную последовательность, длину последовательности и номер символа, с которого она начинается.
Например, в строке "asadddbbbbababaaaaaahhgg" символ a образует последовательность длиной в 6 символов, начиная с символа с номером 15.

Задача 3.10

Для заданной строки символов, состоящей из строчных букв и пробелов, определить слово наибольшей длины, которое начинается и заканчивается на одну и ту же букву. Например: строка - "револьвер системы наган", слово - "револьвер".

Задача 3.11

В символьной строке имеются круглые скобки. Проверить, правильно ли они расставлены.

Задача 3.12

Заданы две строки. Определить, являются ли они анаграммами, то есть одна строка получена из другой перестановкой букв.
Например:
строки "БУК" и "КУБ" или "СОЛЬ" и "ЛОСЬ" являются анаграммами.

Задача 3.13

Вспомним игру: "Придумай слово", в которой из букв слова-донора составляют другие слова. Например, из слова МОНИТОР можно получить МОТОР, РОТ, ТИР и др. Вхождение каждой буквы в новое слово допускается не более того числа раз, с каким она входит в слово-донор.
Пусть дана последовательность слов, разделенных пробелами в виде строки символов. Известно, что первое слово в этой строке является донором. Выбрать из оставшихся слов последовательности те, которые можно получить из заданного слова-донора.

Задача 3.14

Задана строка символов, содержащая два или более слов, разделенных пробелами. Написать программу, меняющую местами все четные и нечетные слова в строке, предполагая, что за один раз можно менять местами не более двух символов.

Решения задач

Задача 3.1

Проще всего в этой задаче определить длину строки n, организовать цикл по номеру символа в строке и сравнивать попарно первый символ с последним, второй - с предпоследним и т.д. Если хотя бы одна пара различна, то строка не симметричная. Так как просматривается сразу пара символов, то в цикле будет m = n div 2 повторений. Для запоминания результата просмотра введем переменную k (k будет равна 0, если строка симметрична и 1 иначе).
Программа, решающая эту задачу, будет иметь вид:

var s:string;i,k,n,m:integer;begin readln(s); n:=length(s); k:=0; m:=n div 2; for i:=1 to m do if s[i]<>s[n-i+1] then k:=1; if k=0 then writeln('Строка симметрична') else writeln('Строка несимметрична');end.

Задача 3.2

Если удалить из заданной строки все пробелы, то задача сведется к предыдущей.

Задача 3.3

Так как все цифры от 0 до 9 располагаются в таблице кодировки компьютера подряд, то проще всего проверить, является ли символ s[i] цифрой, можно с помощью неравенства '0'<=s[i]<='9' (на Паскале (s[i]>='0')and(s[i]<='9')). Для преобразования строки в число в Паскале используется процедура val(s,v,k), где s - строка (или символ), v - переменная числового типа, куда будет занесён результат преобразования, k - переменная целочисленного типа, которая принимает значение 0, если преобразование строки в число прошло успешно.

Задача 3.4

Пусть s - строка. Обозначим длину строки - l. Организуем цикл, в котором будем проверять, является ли очередной символ цифрой, если да, то организуем новый цикл, в котором будем формировать строку sn, состоящую из цифр (очередное целое число). Потом преобразуем sn в число и вычислим произведение. Программа на Паскале, реализующая данный алгоритм, будет иметь следующий вид (переменная p в этой программе используется для накапливания значения произведения, переменная kod - для хранения кода результата преобразования строки в число):

var sn,s:string; l,k,kod:integer; v,p:real;begin writeln('Введите строку'); readln(s); l:=length(s); p:=1; k:=1; repeat sn:=''; while (s[k]>='0')and(s[k]<='9')and(k<=l) do begin sn:=sn+s[k]; k:=k+1; end; if sn<>'' then begin val(sn,v,kod); p:=p*v; end; k:=k+1; until k>l; writeln(' p=',p);end.

Задача 3.8

Обозначим s - исходную строку, l - длину этой строки. Для решения создадим ещё одну строку s1(вначале пустую). Далее организуем цикл по номеру символа в строке s. Если очередной символ не #, то добавим его к строке s1, если это знак # и строка s1 не пустая, то удалим из неё последний символ.
Программа, реализующая данный алгоритм, будет иметь следующий вид:

var s,s1:string; dl,i,k:integer;begin writeln('Введите строку'); readln(s); dl:=length(s); s1:=''; k:=0; for i:=1 to dl do if (s[i]='#')and(k<>0) then begin delete(s1,k,1); k:=k-1; end else begin k:=k+1; s1:=s1+s[i]; end; writeln(s1);end.

Задача 3.10

Пусть s - заданная строка. Для решения данной задачи определим длину строки l и организуем цикл по номеру символа i. Символ строки является первым символом некоторого слова в том случае, когда он сам не является пробелом, и либо он - первый символ строки, либо слева от него стоит пробел. Если мы нашли первый символ некоторого слова, то запомним его номер и организуем цикл, в котором найдем номер последнего символа этого слова (символ будет последним в слове либо тогда, когда после него стоит пробел, либо когда он последний символ строки). Если последний символ слова совпадает с первым символом этого слова, и длина слова наибольшая из всех найденных, запомним эту длину и номер первого символа этого слова.
В приведенной программе введены следующие обозначения:
max - переменная, в которой запоминается текущая максимальная длина найденного слова; k - переменная, в которой поочередно запоминается номер первого символа каждого слова; koord - переменная, в которой хранится номер первого символа слова с максимальной длиной.

var s:string; koord,k,i,n,max:integer; fst:char;begin writeln('Введите строку'); readln(s); n:=length(s); max:=0; i:=1; while i<=n do if (s[i]<>' ')and((i=1)or(s[i-1]=' ')) then begin k:=i; while (i<n)and(s[i+1]<>' ') do i:=i+1; if (s[i]=s[k])and(i-k+1>max) then begin koord:=k; max:=i-k+1; i:=i+1; end; end else i:=i+1; if max<>0 then begin writeln(' max=',max); for i:=0 to max-1 do write(s[koord+i]); end else writeln('Такого слова нет') end.

Задача 3.11

Обозначим K - число левых скобок, M - число правых скобок, тогда, на каждом шаге подсчета скобок, должно выполняться условие: K>=M. После подсчета всех скобок должно выполниться условие K=M.

Задача 3.14

Имеется несколько путей решения этой задачи. Для упрощения предположим, что строка не начинается и не заканчивается пробелом и что между словами в строке стоит ровно по одному пробелу. Пусть известна пара слов, которую необходимо переставить, и - номера первой и последней букв в первом слове, и - номера первой и последней букв во втором слове. Рассмотрим способ, в котором для перестановки слов будем использовать следующий алгоритм:
Запишем буквы первого слова в обратном порядке (поменяв первую с последней, вторую с предпоследней и т.д.).
Например, из строки Задачи с использованием строкового типа данных - student2.ru получим dcba efghi.
Потом аналогичным образом переставим буквы второго слова:
из строки Задачи с использованием строкового типа данных - student2.ru получим dcba ihgfe.
Для получения окончательного результата необходимо записать буквы полученного словосочетания в обратном порядке:
Из строки Задачи с использованием строкового типа данных - student2.ru получим efghi abcd (что и требовалось получить).
Таким образом, для перестановки двух слов достаточно написать подпрограмму, которая меняет в заданной строке порядок букв на противоположный (инвертирует строку), и вызвать эту подпрограмму для первого слова, второго слова и всего словосочетания.
Обозначим invert(k,l) - процедуру, которая записывает в заданной строке s символы с k-того по l-й в обратном порядке, тогда программа, решающая задачу, будет иметь вид:

Наши рекомендации