Пример: Сравнение строк

Введение

Типы данных

При решении задач в программировании выполняется обработка информации различного характера. Это могут быть целые и дробные величины, строки и другое. Соответственно константы и переменные должны быть описаны как целые, дробные, строковые и т.д.

Для описания множества допустимых значений величины и совокупности операций, в которых может участвовать данная величина, используется указание её типа данных. Тип данных (data type) – множество величин, объединенных определенной совокупностью допустимых операций. Каждый тип данных имеет свой диапазон значений и специальное зареверзированное слово для описания.

Строковый тип данных

Строка представляет собой последовательность символов кодовой таблицы персонального компьютера. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Идентификатор стро-кового типа данных – слово String. Примеры описания переменных типа String:

Var Str1: String [10];

Var Str2: String;

Var Str3: String [13];

В квадратных скобках указывается максимальный размер (длина) строки. Если он не указан (как в описании переменной Str2), то длина строки считается равной 255 символам. Заметим, что строку можно рассматривать как одномерный массив символов – к любому символу строки можно обращаться по его номеру. Первый символ строки (с индексом 0) содержит фактическую длину строки. Для ввода и вывода переменных типа String используются процедуры Read (Readln) и Write (Writeln).Строки вводятся и выводятся не поэлементно, как массивы, а сразу целиком. Следующий простой пример иллюстрирует сказанное.

Program My14_5;

Var s: String; w: String [10]; v: String [5]; i, j:Integer;

Begin

Readln (v); Writeln (v);

Writeln (Integer (v [0]));

Readln (w); Writeln (w); Writeln (Ord (w [0]));

Readln(s); Writeln(s);

Writeln (Integer(s [0]));

For i: =1 to Ord(s [0]) do Begin

For j: = to i-1 do Write (‘ ‘);

Writeln(s [i]);

End;

Readln;

End.

Если ввести строки v и w большей длины, чем указано в описании, они «обрезаются». Операторы Writeln(Integer(v[0])) и Writeln(Ord(w[0])) обеспечивают вывод значения длины строки. Если изменить первый оператор на Writeln(v[0]), то вместо цифрового значения на экран выводится «непонятный» символ. Попробуйте объяснить этот результат и понять смысл преобразования Integer(v[0]). Последние операторы этого примера демонстрируют обращение к элементам строки. Вывод символов строки s на экран осуществляется «лесенкой».

Сравнение строк

Сравнение строк производится посимвольно слева направо: сравниваются коды соответствующих символов до тех пор, пока не нарушится равенство, при этом сразу делается вывод о знаке неравенства. Две строки называются равными, если они равны по длине и совпадают посимвольно. 

 

Примеры

‘Balkon’ < ‘balkon’ (Ord (‘B’) < Ord (‘b’));

‘balkon’ > ‘balken’ (Ord (‘o’) > Ord (‘e’));

‘balkon’ > ‘balk’ (длина первой строки больше);

‘кошка’ > ‘кошка’ (длина первой строки больше);

‘Кот’» = ‘Кот’ (строки равны по длине и совпадают посимвольно).

Строковые константы, так же, как и отдельные символы, заключаются в апострофы. Например,

Str1: = 'У Егорки’; Str2: = ‘всегда отговорки’;

 

 

Процедуры и функции для работы с данными строкового типа данных приведены в таблице.

 

Тип Вызов Параметры Действие
Процедура Delete(s, p, n) Var s: String; P, n: Integer; Удаляются n символов из строки s, начиная с позиции p
Процедура Insert (w, s, p) W: String; Var S: String; P: Integer; В строку S, начиная с позиции p, вставляется строка w
Процедура Str (v, s) V: Integer или V: real; Var s: string; Число v преобразуется в строку s
Процедура Val(s, v, w) S: String; Var v: Integer или  Var v: Real; Var w: Integer; Если строка s представляет собой правильную запись числа, то это число записывается в переменную v, при этом значение w = 0. В противном случае строка состоит не только из цифр – преобразование не выполняется, w<>0 – признак ошибки
Функция Concat (s1, s2,…, sm), функция возвращает значение типа String S1, s2, … sm: String; Строки s1, s2, …, sm записываются одна за другой. Результат не превышает 255 символов. Можно просто складывать строки s1+s2+…+sm
Функция Copy(s, p, n) функция возвращает значение типа String S: String; P, n: Integer; Из строки S, начиная с позиции P, выбираются n символов.
Функция Length(s) функция возвращает значение типа Integer S: String; Определяется длина s, т.е. число символов, из которых она состоит
Функция Pos (w, s) функция возвращает значение типа Integer W, s: String; В строке s отыскивается первое вхождение строки w (номер позиции). Если вхождения нет, то функция возвращает значение 0.

 

 

Примеры.

В приведенных примерах переменные s1,s2,s3 имеют тип String, p,g – тип Integer.

s1: =’ У Егорки всегда отговорки ’;

Delete (s1, 9,7);

Результат: s1=’У Егора отговорки’.

s1: =’ У Егорки всегда отговорки ’;

s2:=’Матрены и’;

Insert (s2, s1, 3);

Результат:

S1=’У Матрены и Егорки всегда отговорки’.

p:=1234; q:=34.5;

Str (p, s1); Str (q, s2);

Результат: s1=’1234’, s2= =’34.5’.

s1: = ‘555’; s2:=’23.345’; s3:=’34rr2’;

Val (s1, p, w); Val (s2, q, w); Val (s3, p, w);

Результат: в первом случае p=555, w=0; во втором случае q=23,345, w=0; в третьем случае w<>0, значение p не определено.

s1: =’У Егорки всегда отговорки, ’; 

s2: =’У Миладки всегда шоколадки’;

s3: =Concat (s1, s2); (или s3: =s1+s2);

Результат: s3=’У Егорки всегда отговорки, у Миладки всегда шоколадки’;

s1=’У Егорки всегда отговорки, у Миладки всегда шоколадки’

s2: =Copy (s, 27, 26);

Результат: s2:=’У Миладки всегда шоколадки’.

s1: =’У Егорки всегда отговорки ’;

p: =Length (s1);

Результат: p=25.

s1:=’У Егорки всегда отговорки ’;

p: =Pos (‘0’, s);

Результат: p=5.

 

Продолжите примеры. Напишите программу для исследования работы перечисленных процедур и функций. Обратите особое внимание на граничные условия (например, выясните, что получается, если длина результата больше 255). В этой работе можно использовать приведенные ниже короткие примеры.

Подсчет количества вхождений данного символа (параметр q) в строку (параметр st).

 

Function QChar (q: Char; st: String): Byte;

Var I, k: Byte;

Begin

k: =0;

For i: =1 To Length (st) Do If st [i]=q Then Inc (k);

Qchar: =k

End;

Удалить среднюю букву при нечетной длине строки и две средние буквы при четной длине строки.

Procedure MiDel (Var st: String);

Var k: Byte;

Begin

k: =Length (st);

If k Mod 2=1 Then Delete (st, k Div 2+1, 1)

Else Delete (st, k Div 2, 2)

End;

Заменить все вхождения подстроки w в строке st на подстроку v.

Procedure Ins (w, v: String; Var st: String);

Var k: Byte;

Begin

While Pos (w, st)<>0 Do Begin

k: = Pos (w, st);

Delete (st, k, Length (w));

Insert (v, st, k)

End

End;

Подсчитать сумму цифр, встречающихся в строке.

Function Sum (st: String): Integer;

Var i, k, d, s:Integer;

Begin

s: =0;

For i: =1 To Length (st) Do Begin

Val (st [i], d, k);

If k=0 Then s: =s+d

Sum: =s

End;

Экспериментальный раздел занятия

1. Дана строка. Считаем ее отрывком текста. Группы символов, разделенных одним или несколькими пробелами, назовем словами. Пробелы могут находиться как в начале текста, так и в конце. Требуется выделить слова из текста и каждое слово записать в соответствующий элемент массива. Приведенная ниже программа решает эту задачу.

Program My14_6;

Const n=20; m=10; {Количество слов в тексте и количество букв в слове. Естественно, что эти параметры программы можно изменять}

Type TString=String [m];

Var A: Array [1..n] Of Tstring;

s: String;

k, i:Integer;

Procedure DelPr (Var s: String);

{Удаляем пробелы в начале текста.}

Begin

While (s [1]=’ ‘) And (s<>’ ‘) Do Delete (s, 1, 1)

End;

Function GetWord (Var s: String): Tstring;

{Выделяем слово, удаляем его из текста и убираем пробелы после слова.}

Begin

GetWord: =Copy (s, 1, Pos (‘ ‘, s)-1);

Delete (s, 1, Pos (‘ ‘, s));

DelPr (s)

End;

Begin

Writeln (‘Введите текст’);

Readln (s);

S: =s+’ ‘;

{Добавляем символ пробела в конец текста. Зачем?}

DelPr (s); {Удаляем пробелы в начале текста.}

k: =0;

While s<>’ ‘ Do Begin {Пока текст не пустой.}

Inc (k);

A [k]: =GetWord (s) {Берём слово из текста.}

End;

For i: =1 To k Do Writeln (A [i]);

Readln

End.

Удалите вызов процедуры DelPr(s) из основной программы, а функции GetWord переставьте этот вызов в ее начало. Что изменится в работе программы? На каких исходных данных она не будет правильно работать? Что произойдет, если в конец текста не добавлять символ пробела? В процедуре DelPr измените цикл

While (s[1]=’ ‘) And (s<>’ ‘) Do Delete (s, 1, 1)

на

While (s[1]=’ ‘) Do Delete (s, 1, 1).

 Продолжите эксперименты с программой.

2. По правилам машинописи после запятой в тексте всегда ставится пробел. Следующая программа вставляет недостающие пробелы.

Program My14_7;

Var i:Integer;

s: String;

Begin

Writeln (‘Введите текст’);

Readln (s);

i: =1;

While i<Length(s) Do Begin

If (s [i]=‘,’) And Not (s [i+1]=’ ‘)

Then Insert (‘ ‘, s, i+1);

Inc (i)

End;

Writeln (s);

Readln

End.

Задания для самостоятельной работы

1.Написать программу для вывода последовательностей символов:

а)ZYYXXX…AA..AA;

в)ABC…ZZBC…ZZZC…ZZ..ZZ.

2.Составить программу, которая выводит True, если в заданной строке буква ‘A’ встречается чаще, чем буква ‘B’, и False в противном случае.

3.Проверить, правильно ли в заданном тексте расставлены круглые скобки (т.е. находится ли справа от каждой открывающей скобки соответствующая ей закрывающая скобка, а слева от каждой закрывающей – соответствующая ей открывающая).

4.Подсчитать количество прописных латинских букв в строке.

5.Удвоить вхождение некоторой буквы в текст. Например, при удваивании буквы ‘а’ текст ‘ мама папа’ должен превратиться в текст ‘маамаа паапаа’.

6.Даны две строки. Вывести буквы, встречающиеся и в той и другой строках.

7.Дан текст. Вывести все слова, начинающиеся с прописных букв латинского алфавита.

8.Дан текст. Определить:

длину самого короткого и самого длинного слов;

количество слов, начинающихся и оканчивающихся одной и той же буквой;

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

количество слов, которые содержат заданную букву определенное количество раз;

количество слов, являющихся палиндромами.

9.Дан текст. Вывести слова, встречающиеся в тексте по одному разу.

10.Дан текст. Вывести различные слова.

Примечание. Термин ‘текст’ в условиях задач следует понимать в смысле первого примера экспериментальной части данного занятия.

 

РАБОТА СО СТРОКАМИ

 

Тип String (строка) в Турбо Паскале широко используется для обработки текстов. Этот тип является стандартным и во многом похож на одномерный массив символов Array [0..N] of Char. Значение N соответствует количеству символов в строке и может меняться от 0 до 255. Символы, входящие в строку, занимают позиции с 1 до N. Начальный байт строки с индексом 0 содержит информацию о ее длине, т.е. это символ с кодом, равным длине строки.

Можно также описывать переменные типа String [K], где K - целое число не больше 255. Так определяются строки с длиной не больше K. Этот тип уже не является стандартным. С символами строки можно работать как с элементами массива из символов, но в отличие от массивов, строки можно вводить целиком, сравнивать друг с другом и сцеплять операцией "+".

ПРИМЕР: Работа со строками.

var s,x,y,z:string;

Begin

x:='turbo';

y:='pascal';

z:=x+' '+y; { z='turbo pascal' }

s:=''; { пустая строка }

for c:='a' to 'z' do s:=s+c; { s='abcd..xyz' }

writeln (s);

end.

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

ПРИМЕР: Сравнение строк.

'abcd' > 'abcD' { 'd'>'D' }

'abcd' > 'abc' { 'd'>'' }

'abc' < 'axxc' { 'b'<'x' }

'abcd' = 'abcd'

Существует ряд стандартных функций и процедур для работы со строками.

· Функция Length (s) выдает длину строки s.

· Функция Concat (s1,s2,..,sn) возращает строку s1+s2+..+sn.

· Функция Copy (s,p,k) возвращает фрагмент строки s, который начинается в позиции p и имеет длину k.

· Функция Pos (s1,s) ищет первое вхождение подстроки s1 в строку s и возвращает номер первого символа s1 в строке s или 0 если не нашли.

· Процедура Delete (s,p,k) удаляет из строки s фрагмент, который начинается в позиции p и имеет длину k.

· Процедура Insert (s,s1,p) вставляет в строку s подстроку s1, начиная с заданной позиции p.

Турбо Паскаль позволяет производить преобразования числовых значений в строковые и наоборот. Для этого используются процедуры Str (X:n:d,S) и Val (S,X,e). Первая получает их числа X строку S с изображением этого числа, в которой не менее n символов и из них d знаков после запятой. Параметры n и d необязательные. Вторая процедура получает из строки S число X. При успешном результате e=0.

Урок 1

Вид урока: лекция.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: