Практические примеры работы со строковыми данными

Задача 14. Определить, сколько раз в тексте встречается заданная буква.

 

С помощью функции Сopy копируем в переменную а по одному последовательно все символы из текста t. В случае а = х, где х исходная буква, необходимо включить счетчик. Длину текста определим с помощью функции length.

 

Программа:

 

program bukva;

var

t,a : string;

x : char; i,k : integer;

begin

write(‘Введите исходный текст’);

readln(t);

writeln(‘Введите букву’);

readln(x);

k := 0;

for i := 1 to length (t) do

begin

a := copy (t, i, 1);

if a = x then k := k + 1;

end;

write (‘Буква ‘,x,’ встречается ‘, k, ‘ раз.’)

end.

 

В этой задаче функцию Copy использовать не обязательно. Возможно и такое решение:

 

for i := 1 to length (t) do

if t(i) = x then k := k + 1;

 

Задача 15. Подсчитать, сколько слов в тексте начинается на заданную букву. Слова в тексте разделены пробелами.

 

Первая буква каждого слова в тексте следует после пробела. Определив позицию пробела и выделив фрагмент текста от пробела и до конца, определим является ли первая буква фрагмента заданной по условию.

 

Программа:

 

program bukslova;

var

t,a : string;

x : char; i,k : integer;

begin

write(‘Введите исходный текст’);

readln(t);

writeln(‘Введите букву’);

readln(x);

i := 1; k := 0;

while i <> 0 do

begin

a := copy (t, 1, 1);

if a = x then k := k + 1;

i := pos(‘ ‘,t);

t := copy (t, i + 1, length(t)–i);

end;

write (‘Количество слов на букву ‘,x,’ = ‘, k)

end.

 

В переменную a копируем первую букву фрагмента текста; i – номер позиции пробела; t – исходный текст и текущий фрагмент текста от пробела и до конца. Цикл продолжается до тех пор, пока текущий фрагмент t содержит пробелы.

 

Задача 16. В заданном тексте осуществить замену одного слова на другое.

 

Программа:

 

program slovo;

var

t,a,b,c,s : string;

i : integer;

begin

write(‘Введите исходный текст’);

readln(t);

writeln(‘Введите слово, которое нужно заменить’);

readln(a);

writeln(‘Введите слово, для замены’);

readln(b);

t := t + ‘ ‘;

writeln (‘Исходный текст ‘); writeln (t);

i := 1; s := ‘’;

while i <> 0 do

begin

i := pos(‘ ‘,t);

c := copy (t, 1, i – 1);

if c = a then s := s + b + ‘ ‘ else s := s + c + ‘ ‘;

t := copy (t, i + 1, length(t) – i)

end;

writeln (‘Новый текст ‘); writeln (s)

end.

 

Выделяем из текста каждое слово с помощью функции Copy. Выделенное слово “с” сравниваем с заданным “а”: если они равны, то в новый текст следует записать слово для замены “b”, иначе в новый текст записываем старое слово “с”. Текст должен заканчиваться пробелом, иначе не будет возможности выделить последнее слово. На всякий случай запишем в конец исходного текста пробел (t := t + ‘ ‘;).

 

Задача 17. Составить программу, которая по заданной дате отображает на экране название соответствующего знака Зодиака.

 

Астрологи делят год на 12 периодов и каждому из них ставят в соответствие знак Зодиака. Граничные даты периодов зададим типизированной константой в виде одномерного массива вещественных чисел, а название каждого периода типизированной константой – одномерным массивом строк. При вводе даты необходимо предусмотреть правильный ввод месяца и числа. Номер месяца должен находиться в интервале от 1 до 12 , а число в интервале от 1 до 31. Чтобы не усложнять задачу, более точную проверку опустим.

 

Программа:

 

program zodiak;

uses crt;

label 1;

const

dt : array[1..12] of real = (01.19,2.18,3.20,4.19,5.20,

6.21,7.22,8.22,9.22,10.22,11.22,12.21);

zod : array[1..12] of string[10] = (‘Водолей’,’Рыбы’,’Овен’,

‘Телец’,’Близнецы’,’Рак’,’Лев’,’Дева’,

‘Весы’,’Скорпион’,’Стрелец’,’Козерог’);

var

s:string[10];

x,i:integer;r,y:real;sem:char;

begin

repeat

1: clrscr;

write(‘Введите дату рождения, например: 01.22 или 12.28’);

readln(r);

{Проверка правильности ввода месяца рождения}

x := trunc(r);

if (x < 1) or (x > 12) then begin

write(‘Месяц введен неверно’);

delay(1000); goto 1

end;

{Проверка правильности ввода числа рождения}

y := frac(r);

if (y < 0.01) or (y > 0.31) then begin

write(‘Число введено неверно’);

delay(1000); goto 1

end;

{Определение знака Зодиака}

s := zod[12];

for i := 1 to 11 do

if(r > dt[i]) and (r <= dt[i+1]) then s := zod[i];

{Вывод результатов}

writeln(‘Вы родились ‘, r:5:2);

writeln(‘под знаком Зодиака ‘,s);

writeln(‘Если хотите прервать работу, нажмите Y’);

sem := readkey;

until upcase(sem) = ‘Y’

end.

 

Все основные действия в программе выполняются в цикле (repeat ... until) до тех пор, пока не будут введены символы Y или y. При вводе прописной буквы y функция Upcase превратит ее в заглавную. Процедура delay(t) модуля crt приостанавливает выполнение программы на t мс.

Записные типы

Во многих экономических и информационных задачах обрабатываются ведомости, документы, каталоги, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке Паскаль введено понятие записи. Запись - это структура данных, состоящая из фиксированного числа компонентов разного типа. Составляющие запись компоненты называется полями записи. В отличие от массива компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются. Записной тип еще называют комбинированным типом.

Записной тип данных предоставляет программисту возможность объединить в одну связанную структуру различные по типу и смыслу элементы. Элементами записи могут быть и структурированные типы данных, например массивы и другие подчиненные записи. Для обработки доступна как вся запись целиком, так и отдельные ее поля.

Понятие записи рассмотрим на примере ведомости списка учащихся с их оценками.

 

Каждая строка в этой ведомости состоит из отдельных элементов данных различного типа:

а) порядковый номер – целое десятичное число;

б) Фамилия И. О. – массив символов;

в) оценки – массив целых чисел.

Эти данные можно объединить в одну группу и считать записью. Введем следующие обозначения: В – имя всей записи; n – порядковый номер; fio – фамилия, имя, отчество; mark – оценки.

Обращение к элементу записи в программе выполняется с помощью уточненного (составного) имени. Уточненное имя содержит имя записи и имя элемента и записывается в следующем виде:

имя записи.имя элемента

Например,

 

B.n

B.fio

B.mark

 

Записи, как и другие данные, объявляются в разделе описаний и используются в разделе операторов.

Структура объявления типа записи такова:

<имя типа> = record <список полей> end

Здесь <имя типа> – правильный идентификатор; record, end – зарезервированные слова (запись, конец); <список полей> – последователь­ность разделов записи, между которыми ставится точка с запятой. Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей).

Для представленной ведомости объявление записи выглядит следующим образом:

 

type

list = record

n : integer;

fio : array [1..20] of char;

mark : array [1..3] of integer

end;

var B : list;

 

Возможно объявление записи в разделе переменных:

 

var B : record

n : integer;

fio : array [1..20] of char;

mark : array [1..3] of integer

end;

 

Элемент записи используется в программе в том же самом смысле, как и обычная переменная. Элемент записи можно указывать как в левой части оператора присваивания, так и в выражениях. Над элементом записи можно выполнять действия, допустимые для данных его типа. Если тип элемента записи – целый, то выполняются все операции, допустимые для целых данных. Для рассмотренной ведомости над элементами записи можно произвести, например, следующие операции:

 

порядковому номеру n записи B присвоить значение 2:

B.n := 2;

найти сумму трех оценок:

s := B.mark [1] + B.mark [2] + B.mark [3];

ввести значения порядкового номера:

read (B.n).

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

Объявим тип birthday, содержащий три поля с именами day, month и year; переменные а и b содержат записи типа birthday; c – запись, содержащая в качестве элемента подчиненную запись.

 

type

birthday = record

day,month : byte;

year : word

end;

var a,b : birthday;

c : record

name : string;

bd : birthday

end;

 

В этом случае возможно a := b; a.day := 27; b.year := 1939; для вложенных полей необходимо продолжать уточнения: с.bd.year, c.bd.day, c.bd.month.

Синтаксичекая диаграмма записного типа представлена на рис. 14.

 

Рис. 14

 

Синтаксичекая диаграмма списка полей (рис. 15):

 

Рис. 15