АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

ОБРАБОТКА СТРОК

Читайте также:
  1. Cкоростная автоматическая обработка
  2. А Порядок работы на станции при тахеометрической съемке. Вычислительная и графическая обработка результатов съемки.
  3. А. Термическая обработка
  4. Аналіз ефективності роботи основних засобів та довгострокових інвестицій
  5. Атор строк: «Я - царь, я - раб, я - червь, я - бог»
  6. Бухгалтерская обработка документов
  7. В основном вторичная обработка заключается в статистическом анализе итогов первичной обработки.
  8. Валютний ринок та види валютних операцій ( касові (СПОТ) і строкові)
  9. Вибір обсягів виробництва у короткостроковому періоді
  10. Витрати в довгостроковому періоді.
  11. Витрати виробництва в довгостроковому періоді.
  12. Витрати виробництва у короткостроковому періоді

Для обработки текстовых данных используется строковый тип данных String. Строка - это последовательность символов из кодовой таблицы, заключенная в апострофы.

Символьным константам можно присваивать имена.

const st = ‘строка’;

Символьные переменные описываются в разделе описания переменных с описателем string.

var st1, st2: string [10];

st3: string;

Переменные st1, st2 могут содержать до 10 символов, причем в самом начале областей st1, st2, в отличие от одномерного символьного массива, помещается дополнительная ячейка st1[0], st2[0], в которой хранится текущее значение строки, доступное программисту. Переменная st3 занимает max+1 байт, где max - максимальное число символов в строке, которое равно 255 символам.

Пример.

var st: string [10];

a: array [0..10] of char;

Рассмотрим, как будет размещена строка ‘program’ в строке st

и массиве a

 

К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива, т.е. указав имя строки и индекс символа в этой строке. Например, st[5] = ‘r’. При этом для элемента строки разрешены те же операции и функции, что и для типа char.

Строки вводят и выводят с помощью операторов readln, writeln без организации циклов.

Строки можно сравнивать. Сравнение осуществляется лексикографически по коду, т.е. последовательно слева направо сравниваются первые символы, вторые и т.д. до несовпадающего символа, какой из несовпавших символов больше, та строка и больше. Например, ‘рак’ > ‘мак’; ‘раки’ > ‘рак’. Две строки равны, если они равны по длине и совпадают посимвольно.

К строкам можно применять операцию сцепления “+”. Например,

st1:= ‘шок’; st2:= ‘лад’;

 

st:= st1 + ‘o’ + st2; {в st строка ‘шоколад’}

Если в результате сцепления получается строка длиннее, чем объявлено, то лишние символы будут утеряны.

Для строк разрешены следующие функции:

* concat (str1, str2,...) - сцепление

st1:= ‘вор’; st2:= ‘на’;

st:= concat(st1, ‘o’, st2); {в st строка ‘ворона’}

* copy (str, m, k) - копировать из строки str k символов, начиная с позиции m, при этом исходная строка не меняется. Результат можно присваивать другой строковой переменной или выводить на экран.

st:= ‘шоколад’;

st1:= copy (st, 2, 3); {в st1 строка ‘око’}

st2:= copy (st, 6, 2); {в st2 строка ‘ад’}

* pos (str1, str2) - определяет позицию подстроки str1 в строке str2. Результат этой функции - целое число, которое определяет номер первого символа, с которого начинается первое вхождение подстроки str1 в строку str2. Если такой подстроки нет, то значение функции равно 0.

st:= ‘шоколад’;

k:= pos (‘кол’, st); {k = 3}

k1:= pos (‘кока - кола’, st); {k = 0}

· length (str) - определяет длину строки str (количество символов). Это целое число.

st:= ‘шоколад’;

k:= length (st); {k = 7}

Для строк определены следующие процедуры:

* insert (str1, str2, k) - вставляет строку str1 в строку str2, начиная с позиции k. При этом строка str1 остается без изменения, а вторая раздвигается и получает новое значение.

st:= ‘гора’;

insert (‘k’, st, 4); {в str строка ‘горка’}

* delete (str, n, m) - удаляет из строки str m символов, начиная с n - ого символа.

st:= ‘шоколад’;

delete (st, 1, 2); {в str строка ‘колад’}

delete (st, 2, 1) {в str строка ‘клад’}

* str (n, st) - преобразует число n в строку и результат присваивает st. Переводит как целые, так и вещественные числа.

str (12345, st); {в st строка цифр ‘12345’}

* val (str, n, k) - преобразует строку str в число n, если данная строка являлась записью целого или вещественного числа, при этом к = 0, а в n - само число. В противном случае в k будет записан номер позиции, где было нарушение цифровой записи.

val (‘123’, n, k); {n = 123, k = 0}

val (‘12.3’, n, k); {n = 12.3, k = 0}

val (‘12.3e-3’, n, k); {n = 12.3e-3, k = 0}

val (‘12,3’, n, k); {k = 3}

val (‘1+23’, n, k); {k = 2}

 

Задача 1. Подсчитайте, сколько раз в строке встречается заданный символ.

Решение. Будем перебирать все символы строки и сравнивать с заданным символом, при совпадении - увеличивать счетчик на единицу.

var st: string;

ch: char;

i, k: integer;

begin

writeln (‘задайте строку’);

readln (str);

writeln (‘задайте символ’);

readln (ch);

k:= 0;

for i:= 1 to length (st) do

if st[i] = ch then k:= k + 1;

write (‘таких символов ’, k)

end.

Задача 2. Замените первое вхождение символа ch на символ ‘a’.

Решение. Замена осуществляется следующим образом: сначала удалить заданный символ, затем вставить необходимый символ.

к:= pos (ch, st);

if k <> 0 then begin delete (st, k, 1);

insert (‘a’, st, k)

end;

Задача 3. Замените все вхождения ‘лето’ на ‘зима’.

Решение. Используется предыдущее решение до тех пор, пока не останется сочетний ‘лето’ в строке.

repeat

к:= pos (‘лето’, st);

if k <> 0 then begin delete (st, k, 4);

insert (‘зимa’, st, k)

end;

until k = 0;

Задача 4. Дана текстовая строка, состоящая из нескольких слов, разделенных одним и более пробелами, заканчивающаяся точкой. Выведите на экран все слова, заменив первую букву слова последней.

Решение. Сначала преобразуем строку таким образом, чтобы между соседними словами стояло по одному пробелу, т.е. удалим все лишние пробелы и заменим точку пробелом. Тогда слово будет представлять собой последовательность символов до первого пробела, после чего преобразуем его по указанному правилу и выведедем преобразованную строку на экран.

var st: string;

i, k, l: integer;

begin

writeln(‘задайте строку’);

readln (st);

delete (st, length (st), 1);

st:= st + ‘ ‘;

repeat

k:= pos (‘ ‘, st); {ищем два рядом стоящие пробела}

if k <> 0 then delete (st, k, 2); {и удаляем их}

until k = 0;

repeat

k:= pos (‘ ‘, st); {ищем пробел: все, что до пробела - слово}

insert (st[k-1], st, 1); {вставляем последнюю букву в первую позицию слова}

write (copy (st, 1, k)); {выводим на экран преобразованное слово}

delete (st, 1, k) {и удаляем его из строки}

until k = 0;

end.

Задача 5. Дана текстовая строка, состоящая из нескольких слов, разделенных одним или более пробелами, заканчивающаяся точкой. Выведите на экран все слова, отличные от последнего, в которых ровно три буквы “а”.

Решение. Сформируем массив, состоящий из слов строки, считая словом все, что расположено до первого пробела. Затем сравниваем каждый элемент массива строк с последним элементом, в случае несовпадения считаем количество символов “а” в этом слове. Если их количество равно трем, выводим на экран.

var st: string;

a: array [1..30] of string [20];

i, k, kk, j, l: integer;

begin

writeln(‘задайте строку’);

readln (st);

delete (st, length (st), 1); {заменяем точку на пробел}

st:= st + ‘ ‘;

l:= 0; {обнуляем счетчик слов}

repeat

k:= pos (‘ ‘, st); {ищем позицию пробела}

if k <> 0 then begin

l:= l + 1;

a[l]:= copy (st, 1, k - 1); {копируем очередное слово в массив}

delete (st, 1 k); {и удаляем его из строки}

while st[1] = ‘ ‘ do delete (st, 1, 1); {удаляем пробелы}

until k = 0;

for i:= 1to l - 1 do

if a[i] <> a[l] then begin {сравниваем очередное слово с последним}

kk:= 0; {обнуляем счетчик “а” в слове}

for j:= 1 to length (a[i]) do

if a[i, j] = ‘a’ then kk:= kk + 1;

if kk = 3 then write (a[i], ‘ ‘);

end;

end.

Задача 6. Задано слово. Проверьте, можно ли переставить в нем гласные и согласные буквы так, чтобы они чередовались.

Решение. Если количество гласных и согласных букв совпадает (в случае четной длины строки) или отличается на единицу (если длина строки - нечетное число), то можно переставить буквы так, чтобы они чередовались. Таким образом, задача сводится к отысканию количества гласных и согласных букв.

var s: string;

kgl, ksgl: integer; {количество гласных и согласных букв}

i: integer;

begin

write (‘введите строку’);

readln (s);

if (length (s) = 0) or (length (s) = 1)

then writeln (‘переставить нельзя’)

else begin

kgl:= 0; ksgl:= 0;

for i:=1 to length(s) do

if pos(copy(s, i, 1), 'аоуэыяёюеи') <>0 {принадлежит ли буква множеству гласных букв}

then kgl:=kgl+1

else if pos(copy(s, i, 1), 'бвгджзйклмпрстфхцчшщьъ') <>0

then ksgl:= ksgl + 1

else writeln (‘обнаружена нерусская буква ’, s[i]);

if length (s) mod 2 = o

then if kdl = ksgl then writeln (‘можно переставить’)

else writeln (‘нельзя’)

else if abs (kgl - ksgl) = 1 then writeln (‘можно переставить’)

else writeln (‘нельзя’); end;

end.

Задача 7. Задано предложение, состоящее из слов, разделенных одним или несколькими пробелами. Переставьте слова предложения в алфавитном порядке.

Решение. Перепишем слова предложения по одному в элементы одномерного массива. Отсортируем массив по возрастанию и перепишем слова из массива в строку.

const nn=100; {максимальное количество слов в предложении}

type mas=array[1..nn]of string; {тип массива строк}

var a:mas; {массив слов предложения}

i,j, {индексы массивов, i - номер обрабатываемого символа}

k:integer; {количество слов в предложении, индекс массива слов}

s, {исходное предложение и результат}

r:string; {текущее слово предложения, переменная для обмена слов}

begin

write ('Введите строку ');

readln(s);

s:= s + ' '; {добавили пробел в конце для однотипной обработки

всех слов}

k:= 0; {количество слов в предложении}

r:= ''; {текущее слово}

for i:= 1 to length (s) - 1 do {просмотр предложения по два символа}

if (copy (s, i, 1) <> ' ') and (copy (s, i+1, 1) = ' ')

{если текущий символ не пробел, а следующий пробел}

then begin r:= r + copy(s, i, 1); {дописать символ к слову}

k:= k + 1; {увеличить количество слов}

a[k]:=r; {записать слово в массив}

r:= '' {подготовить место для следующего слова}

end

else if copy (s, i, 1) <> ' ' then r:= r + copy (s, i, 1);

{если текущий символ не пробел, то записать его в слово}

{три следующих оператора сортируют массив}

for i:= 1 to k - 1 do

for j:= i + 1 to k do

if a[i] > a[j] then begin r:= a[i]; a[i]:= a[j]; a[j]:= r end;

{сцепление слов из массива в новое предложение}

s:= '';

for i:= 1 to k do s:= s + a[i] + ' ';

write (s);

end.

Задача 8. В первый день Незнайка написал одну единицу. Во второй - приписал к ней две двойки. В третий приписал три тройки и т.д. всего n дней. Выведите на экран запись Незнайки в несколько строк по m цифр в одной строке, за исключением, быть может, последней.

Решение. Организуем цикл по дням до n. Номер дня будем переводить в строку и посимвольно печатать, при этом считая количество символов. Если количество напечатанных символов кратно m, то переходим на следующую строку.

var s: string;

i, j, n, m, k, l: integer;

begin

write (‘введите n и m ’);

readln (n, m);

l:= 0;

for i:= 1 to n do

begin

str (i, s); {перевод номера дня в строку}

for j:= 1 to i do {печатаем s i раз}

for k:= 1 to length (s) do

begin

write (s[k]); l:= i + 1;

if l mod m = 0 then writeln;

end;

end;

end.

Задача 9. В первой строке двумерного массива записаны названия животных, во второй строке - континенты, где они водятся. Например:

Слон Слон Кенгуру
Африка Азия Австралия

Укажите названия животных, которые водятся более, чем на одном континенте.

Решение. Будем просматривать массив, и находить животных, которые встречаются несколько раз, записываем их в массив для печати, предварительно проверив, нет ли там этого животного.

const nn = 50;

type mas2 = array [1..2, 1..nn] of string;

mas1 = array [1..nn] of string;

var a: mas2;

b: mas1;

i, j, k, l, n, m: integer;

f: boolean;

begin

write (‘введите количество животных и континентов’);

readln (n);

for i:= 1 to n do

begin write (‘введите животное ’); readln (a[1, i]);

write (‘введите континент ’); readln (a[2, i]);

end;

j:= 0;

for i:= 1 to n do

begin k:= i + 1; f:= false;

while (k <= n) and not f do {поиск повторяющихся животных}

if a[1, k] = a[1, i]

then f:= true

else k:= k + 1;

if f

then begin l:= 1; f:= false;

while (l < = j) and not f do {формирование массива} if a[1, i] = b[l] {печати}

then f:= true

else l:= l + 1;

if not f

then begin j:= j + 1; b[j]:= a[1,i] end;

end;

end;

for i:= 1 to j do writeln (b[i]);

end.

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

Решение. Выделяем слова, переписываем их в первую строку двумерного массива, во вторую записываем ‘0’ для уникального слова и ‘1’ - для повторяющегося слова. Затем формируем строку, состоящую из элементов первой строки массива, у которых во второй строке записано ‘0’ и распечатываем строку.

const nn = 10;

type mas = array [1..2, 1..nn] of string;

var a: mas;

n: integer;

s, ss: string; {исходная и вспомогательная строки}

i, j, k: integer;

begin

write (‘введите строку’); readln (s);

s:= s + ‘ ‘;

j:= o; ss:= ‘ ‘;

for i:= 1 to length(s) - 1 do

if (s[i] <> ‘ ‘) and (s[i + 1] = ‘ ‘) {выделение слов}

then begin ss:= ss + s[i];

j:= j + 1; a[1, j]:= ss; a[2, j]:= ‘0’; { в первую строку}

ss:= ‘ ‘ {записываем слово}

end {‘0’ во второй строке означает, что слово встретилось

впервые}

else if s[i] <> ‘ ‘ then ss:= ss + s[i];

for i:= 1 to j - 1 do

for k:= i + 1 to j do

if (a[2, i] <> ‘1’) and (a[2, k] <> ‘1’) and (a[1, i] = a[1, k])

then a[2, k]:= ‘1’; {нашли совпавшие слова}

s:= ‘ ‘;

for i:= 1 to j do

if a[2,i] <> ‘1’ then s:= s + a[1, i] + ‘ ‘;

writeln (‘результат ’, s);

end.

Упражнения.

1. Пусть x - строка. Укажите, для каких значений х справедливо равенство: x=’x’.

2. Пусть x и y - строки, причем длина x равна 1. Укажите условие, при котором x + y = y + x.

3. Пусть а - строка. Найдите строку х, удовлетворяющую условию: а + х = а.

4. Пусть a, b, x - строки и a - начальная часть b. Найдите x из условия: a + x = b + a.

5. Даты вводятся в соответствии с шаблоном: одна или две цифры дня месяца, точка, три буквы названия месяца (янв, фев, мар, апр, май, июн, июл, авг, сен, окт, ноя, дек), точка, две цифры номера года двадцатого века. Запишите выражение на Паскале, истинное, если введенная дата принадлежит летнему или осеннему месяцу.

6. Задан список литературных героев. Они перечислены через запятую. Например, Чебурашка, Семь гномов, Буратино, Красная Шапочка. Получите два массива. В первом запишите имена героев, которые состоят из одного слова. Во втором - все остальные.

7. Задано слово. Проверьте, можно ли из него образовать новое слово, состоящее из четырех символов: согласной, гласной, другой согласной и другой гласной.

8. Дано русское слово. Проверьте, можно ли буквы этого слова переставить так, чтобы все они следовали в алфавитном порядке, когда каждая следующая буква стояла бы в алфавите ближе к концу, чем предыдущая.

9. Задано предложение без предлогов, слова в котором разделены одним или несколькими пробелами. Напечатайте все возможные перестановки слов в этом предложении. Например, “Он учит уроки”, “Он уроки учит”, “Уроки он учит”, “Уроки учит он”, “Учит он уроки”, “Учит уроки он”.

10. Задан список слов и еще одно слово. Проверьте, все ли слова списка можно образовать из букв заданного слова.

11. Машинистка напечатала немецкий текст. Выясните, какой артикль: der, die или das машинистка печатала чаще всего.

12. Выписаны подряд годы с 1950 по 1997. Найдите цифру, стоящую на к-ом месте.

13. В языке племени “ОДОДО” две буквы: О и Д. Две фразы считаются эквивалентными, если они получены вычеркиванием сочетаний “ОД” или “ООД” или вставкой в любое место фразы сочетаний “ДДО”. Найдите фразу минимальной длины, эквивалентную заданной.

14. В строке русских символов два рядом стоящих согласных заменяются символом “а”, а два рядом стоящих гласных заменяются символом “б”. Дана сторока. Требуется определить, каких символов после ее преобразования останется больше, гласных или согласных.

15. Алфавит языка ТАУ1 состоит из трех гласных a, o, u и трех согласных p, q, s букв. Слово в языке ТАУ1 всегда заканчивается гласной. В слове не могут стоять две гласные рядом. Задается сптсок слов, перечисленных через запятую. Необходимо напечатать слова языка ТАУ1.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.025 сек.)