Страницы

Уроки 27, 28 Решение задач с использованием строковых величин

Олимпиадные задачи со строковыми величинами


Задача 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.


Экспериментальная часть


1.  В заданном тексте перед  каждой буквой ‘с’ добавить буквы ‘ab’.
2. Во введенной строке заменить все вхождения подстроки 'дом' на подстроки 'house'.
3. Дана строка. Найдите и выведите на экран все пары одинаковых соседних символов, если такие пары существуют.


Задача 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.

       Тесты         Посмотреть решение       

Экспериментальная часть


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));
end.

Задания для самостоятельного решения


1.     Дан текст. Вывести слова, встречающиеся в тексте по одному разу.
2.         Дан текст. Вывести различные слова.
3.         Дан текст. Вывести все слова, предварительно преобразовав каждое из них по следующему правилу:
·        удалить из слова все предыдущие вхождения последней буквы;
·        оставить в слове только первые вхождения каждой буквы.