Олимпиадные задачи со строковыми величинами
Задача 1. Дан текст (до 255 символов), состоящий из слов. Слово - это набор английских букв, не содержащий пробелов. Слова друг от друга отделены пробелами. После слов может стоять запятая, точка с запятой, двоеточие. В конце текста стоит точка. В словах, которые заканчиваются на ing заменить ing на ed.
Пример
Ввод
|
Вывод
|
He is moving in the
dance.
|
He is moved in the
dance.
|
program z1;
const d=[',',';',':','.',' '];
var s,t:string;
i:integer;
begin
readln(s);
i:=1;
while s[i]<>'.' do
begin
t:=copy(s,i,3);
if (t='ing') and (s[i+3] in d)
then begin delete(s,i,3); insert('ed',s,i);i:=i+2; end
else i:=i+1;
end;
writeln(s);
end.
Экспериментальная часть
2. Во
введенной строке заменить все вхождения подстроки 'дом' на подстроки 'house'.
3. Дана строка. Найдите и выведите на экран все
пары одинаковых соседних символов, если такие пары существуют.
Задача 2. Текст состоит только из латинских букв. Например, рассмотрим строку AAABCCCDDDD. Удалить повторяющиеся символы (количество повторяющихся символов не превышает 9) и заменить их числами, определяющими количество повторений с данным символом. Таким образом, данная строка может быть представлена как 3AB3C4D. Описанный метод мы назовем упаковкой строки. Напишите программу, которая упаковывает заданный текст.
Задача 2. Текст состоит только из латинских букв. Например, рассмотрим строку AAABCCCDDDD. Удалить повторяющиеся символы (количество повторяющихся символов не превышает 9) и заменить их числами, определяющими количество повторений с данным символом. Таким образом, данная строка может быть представлена как 3AB3C4D. Описанный метод мы назовем упаковкой строки. Напишите программу, которая упаковывает заданный текст.
program z2;
var s,s1:string; c:char;
i,n,k,kol:integer;
begin
readln(s);
i:=1;
while i<=length(s) do
begin
c:=s[i]; k:=i+1; while (s[k]=c) and (k<=length(s)) do k:=k+1; kol:=k-i;
if kol>1
then begin str(kol,s1); insert(s1,s,i);
delete(s,i+1,kol-1); i:=i+2 end
else i:=i+1;
end;
writeln(s);
end.
Тесты Посмотреть решение
var s,s1:string; c:char;
i,n,k,kol:integer;
begin
readln(s);
i:=1;
while i<=length(s) do
begin
c:=s[i]; k:=i+1; while (s[k]=c) and (k<=length(s)) do k:=k+1; kol:=k-i;
if kol>1
then begin str(kol,s1); insert(s1,s,i);
delete(s,i+1,kol-1); i:=i+2 end
else i:=i+1;
end;
writeln(s);
end.
Тесты Посмотреть решение
Экспериментальная часть
1. Напишите программу, которая берет упакованную строку и восстанавливает по ней исходную строку.
В строке могут встречаться только конструкции вида nA, где n — количество повторений символа (натуральное число от 2 до 9), а A — заглавная латинская буква, либо конструкции вида A, то есть символ без числа, определяющего количество повторений.
2. Дан текст, записанный на русском языке. Замените все гласные буквы на соответствующий номер этой буквы в строке "аеиоуыэюя".
Задача 3. Дан текст, состоящий из русских слов. Текст не содержит знаков препинания. Упорядочить последовательность этих слов в алфавитном порядке.
Ввод
|
Вывод
|
монитор сканер мышь клавиатура принтер
|
клавиатура монитор мышь принтер сканер
|
Program z3;
var a : Array[1..10] of String;
s,t : String;
i, j, N : Integer;
begin
readln(s); s:=s+' '; n:=0; i:=1;
while i <= length(s) do
begin
t:=''; while s[i]<>' ' do begin t:=t+s[i]; i:=i+1 end;
i:=i+1; n:=n+1; a[n]:=t;
end;
for i := 1 to n-1 do
for j := i+1 to n do
If a[i]>a[j] then
begin
t := a[i]; a[i]:=a[j]; a[j]:=t
end;
for i := 1 to n do Write(a[i], ' ');
end.
Тесты Посмотреть решение
Экспериментальная часть
Дан текст, состоящий из слов, разделенных пробелами. Найти символ, который встречается в наибольшем количестве слов. Если таких символов несколько, вывести их в порядке возрастания.
Ввод
|
Вывод
|
дом тир ток мир от кто
| о т |
program z3_1;
uses crt;
var s,t:string; sim:char;
a:array[1..255] of integer;
i,j,n,n1,max,k:integer;
begin
readln(s);
n:=length(s);
i:=1;
while i<=n do
begin
j:=i;
while (i<=n) and (s[i]<>' ') do i:=i+1;
t:=copy(s,j,i-j);
i:=i+1;
if length(t)>0 then
begin
n1:=length(t);
while t<>'' do
begin
sim:=t[1];
inc(a[ord(sim)]);
k:=1;
while k<=n1 do
if t[k]=sim then begin delete(t,k,1); n1:=n1-1 end
else k:=k+1;
end;
end;
end;
max:=0;
for i:=1 to 255 do
if a[i]>max then max:=a[i];
for i:= 1 to 255 do
if a[i]=max then write(chr(i));
Задания для самостоятельного решения
1.
Дан текст. Вывести слова, встречающиеся в тексте по одному разу.
2. Дан текст. Вывести различные слова.
2. Дан текст. Вывести различные слова.
3.
Дан текст. Вывести все слова, предварительно преобразовав
каждое из них по следующему правилу:
·
удалить из слова все предыдущие вхождения последней буквы;
·
оставить в слове только первые вхождения каждой буквы.