Строковый тип данных. Работа с символами и строками

После того, как мы прошли массивы, мы теперь сможем понять, что такое текст как определённая структура данных языка программирования: текст – это набор символов, или массив, элементами которого является символьный тип данных Char. Например, если наш текст состоит из 100 символов, то объявить его мы могли бы следующим образом:

Type

Text=array[1..100] of char;

Во многих языках программирования с текстом и работают как с массивом из символов, обрабатывая каждый символ по-отдельности. Но язык программирования TurboPascal предусматривает для работы с текстом более удобные средства, чем некоторые другие языки, предоставляя пользователю производить основные операции над текстом – объединение фраз, предложений или фрагментов текста, удаление слов, подсчёт длины текста, поиск и вставку в заданную позицию некоторого фрагмента и другие операции прямо с помощью предусмотренных в самом языке средств, функций и процедур. Эти средства совмещают, с одной стороны, понятие о тексте как о массиве символов и, с другой стороны, позволяют работать со всем текстом, заданным с помощью специально объявляемой строковой переменной, как с одной целой структурой, одной целой частью.

Строковый тип данных объявляется с помощью зарезервированного слова Shortstring:

Var

a: shortstring;

b: shortstring[80];

Переменная a – это строковая переменная, которая предназначена для ввода и произведения операций над строками, имеющими длину до 255 символов (с 1-го до 255-го). Нулевой байт строки всегда хранит значение её текущей длины. Если строка содержит менее 255-ти символов, то нулевой байт будет содержать двоичный код её текущей длины, и обратиться к незаполненным символам по номерам, превышающим длину строки, будет невозможно. Текущую длину строки можно всегда узнать с помощью специальной функции Length, о которой будет рассказано позже, либо обратившись напрямую к её нулевому байту.

Длина строки максимальная обозначена в 80 символов. Реальная строка может быть и меньше этого значения, но превышать 80 символов она уже не может. Ограничивать строку целесообразно в том случае, если мы знаем, что наша строковая переменная может хранить любые свои значения, никогда не превышающие некоторого определённого размера. Например, если она хранит однозначный ответ («да», «нет» или «не знаю»), то в данном случае желательно в целях экономии памяти компьютера использовать строковую переменную, состоящую из [7] символов (по самой длинной фразе «не знаю»: 6 букв и ещё один пробел).

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

a:=’когда в кабинет зашли ученики’;

a:=’весенний БАЛ';

b:=’экипаж сформирован, сэр';

b:=’фУтбоЛ’;

a:=’#4$& *&^’;

b:=‘15478 564 22; jdjjk’;

a:=’2547’;

b:=’true’;

Следует различать строки от реальных чисел и значений. Например, со строкой a мы не можем производить никаких арифметических операций, так как a (2547) в данном случае – только набор символов, а не число. Также и значение b не является логической переменной, а только словом “true”.

Когда мы вначале программы инициализировали переменные, мы придавали им какое-то значение, как правило, 0. Строки инициализируют пустым оператором ‘’. Эта процедура записывает в нулевой байт значение длины строки, равное 0. Обратите внимание, что запись пробела ‘ ‘ и нулевой строки ‘’ – это разные действия. Иными словами, после проведения операций a:=’ '; b:=’’; строка a будет содержать пробел, а строка b будет пустой, не содержащей никаких символов.

Чтобы ввести строку с клавиатуры, можно воспользоваться привычным оператором read() без организации цикла по её длине (в отличие от ввода массивов):

read(a);

readln(b);

Вывод строк на экран аналогичный:

write(a);

writeln(b);

К символов строки можно обратиться напрямую. В этом случае строка выступает в роли массива:

a[10]:=’ы’;

write(b[3]);

В первом случае 10-ый символ строки aпринимает значение буквы «ы», а во втором случае мы выводим 3-ий символ строки b. Только будьте внимательны: если строки не будут содержать этих символов (их текущая длина будет меньше или строка будет пустой), то выполнение программы будет прервано из-за возникшей ошибки, поэтому предусматривайте различные варианты и всегда проверяйте текущую длину строки программными средствами (с помощью Length)!

К строкам применима операция объединения, в терминах называемая конкатенацией. Эта операция объединяет несколько строк в одну большую. Для того, чтобы сложить несколько строк, мы должны воспользоваться обычным суммирующим оператором «+». Вот как это выглядит на примерах:

a:=’Сложение’ + ‘строк’; //a=Сложение строк

a:=’Сложение ‘+’первой ‘+’и’+’второй’+’ строки’;

//a=сложение первой и второй строки

Можно объединять и сами строковые переменные, например:

a:=a+b;

Для работы со строковыми переменными в языке Pascal предусмотрены следующие специальные процедуры и функции:

1. Функция Length:

Length(s: string): integer;

Эта функция возвращает текущую длину строки s в переменную типа integer.

Вот пример использования этой функции:

Var

n: integer;

a: shortstring;

Begin

a:=’1-ястрока’;

n:=Length(a); //n=10

End.

2. Функция Pos:

Pos(Подстрока, s:string): byte;

Функция Pos возвращает целочисленное значение типа Byte, соответствующее индексу первого символа подстроки, которая входит в строку s. Если подстрока не содержится в строке s, то функция возвращает 0.

Пример:

n:=Pos(‘строка’, a); //n=5; (значения взяты из первого примера)

3. Функция Copy:

Copy(s: string; Index, Count: integer): string;

Функция Copy копирует часть строки s, начиная с символа с номером index на количество Count символов.

Пример:

Var

b: shortstring;

Begin

a:= ’1-я строка’;

b:=Copy(a, 3, 5); //b содержит ‘я стр’

End.

4. Функция Concat:

Concat(s1; s2; …; sn): string;

Эта функция объединяет несколько строк, совершая операцию конкатенации над своими аргументами. Эту операцию можно совершить и с помощью оператора сложения «+», как мы увидели это выше.

5. Процедура Val:

Val(s: string; Var v; Var Code: integer;);

s – строка цифр, v – переменная типа integer или real

Процедура, в отличие от функции, не возвращает никакого значения, а просто изменяет свои параметры. Если переменной можно присвоить значение функции, то значение процедуры присвоить нельзя.

Функция Val возвращает в переменной v число, найденное в строке. При этом вся строка должна содержать только число. В противном случае, если преобразование выполнить не удалось, значение code содержит номер позиции в строке, в которой произошла ошибка при преобразовании, а иначе возвращает значение 0.

Пример:

Var

a: shortstring;

y, m: integer;

Begin

a:=’2356’;

Val(a, y, m); //y=2356, m=0

End.

6. Процедура Str:

Str(y; s: string);

Переменная y – это число, принадлежащее некоторому из числовых типов данных.

Процедура Str преобразует число в строку s.

Пример:

Str(10254, a); //строка а стала содержать ‘10254’

7. Процедура Insert:

Insert(s1: string; Var s2: string; index: integer);

Процедура Insert вставляет строку s1 в строку s2, начиная с позиции index. Если получаемая строка s2 становится длиннее 255-ти символов, то не вошедшие с конца символы просто отбрасываются.

Пример:

Var

s1, s2: shortstring;

ind: integer;

Begin

s1:=’1-я’;

s2:=’строка’;

Insert(s1, s2, 7); //s2=’строка1-я’

End.

8. Процедура Delete:

Delete(Var s: string; Index: integer; Count: integer);

Процедура Delete удаляет из строки s её часть, начинающуюся с позиции index и продолжающуюся на count элементов.

Пример:

Var

a: shortstring;

p, m: integer;

Begin

a:=’строка’;

Delete(a, 2, 3); //строка a стала содержать ‘ска’

End.

Примеры программ на использование строкового типа данных.

1) Написать программу, которая находит количество букв “k”, встречающихся в тексте.

program Pr_1;

{$APPTYPE CONSOLE}

uses

SysUtils;

Var

a, a_save: shortstring;

sch: byte;

Const bukva='k';

Begin

Writeln('Vvedite tekst');

Readln(a); //ввод текста

a_save:=a; //сам текст будет изменяться, поэтому мы сохраняем его копию

sch:=0; //инициализация счётчика букв "K"— запись первоначального

//значения

While Pos('k',a)>0 do //пока "K" встречается в тексте

begin

Delete(a,Pos('k',a),1); //удаляем букву "K" (чтобы найти новые буквы "K")

sch:=sch+1; //и увеличиваем счётчик на 1

end;

Writeln('Vash tekst: ',a_save, ' soderjit ',sch, ' bukv "k"'); //вывод теста и

Readln; //количества букв 'K", встретившихся в нём

End.

2) Посмотрим, как можно выделить какие-то слова или группы слов в тексте. Если мы с помощью алгоритма программы сможем определять, где находятся слова текста, мы сможем и производить над этими словами и текстом в целом необходимые операции (копирования, изменения, удаления, добавления символов между словами и многие другие операции).

Длину нашего текста можно определить с помощью функции Length(s). Таким образом, цикл, который будет пробегаться по всем символам нашего текста, записывается следующим образом (i – переменная целого типа, s– наш текст):

While i<Length(s) do

begin

end;

Каждое слово в тексте заканчивается определённым символом, например, пробелом, точкой, двоеточием или каким-то знаком (восклицательным, вопросительным, кавычками и другими). Для упрощения нашей задачи примем, что все слова в тексте разделяются пробелами, а сам текст заканчивается точкой. Как было сказано в уроке про символьный тип данных Char, у каждого символа есть свой уникальный код. Список всех кодов содержится в таблице ASC2, в которой коду пробела соответствует номер 32. Для обращения к любому символу нужно указать либо непосредственно сам этот символ в апострофах, либо задать его код после знака решётки #. Символ пробела – неотображаемый символ, поэтому обращаемся к этому символу так: #32.

Для того, чтобы выделить какое-либо слово текста, мы должны найти окончание этого слова: пробел или точку (для последнего слова). Цикл, находящий каждое слово текста, записывается следующим образом:

inach:=i;

while (S[i]<>#32) and (S[i]<>'.') do

begin

St:=St+S[i]; inc(i);

end;

Переменная i хранит номер текущего символа текста, inach хранит номер первого символа слова (словом применительно к нашей задаче можно считать и цифру, и любой набор отображаемых символов). Переменная S– содержит наш текст, а в St побуквенно формируется наше выделяемое слово.

Если мы хотим удалить найденное слово, например, если это слово содержит более 8-ми букв, мы должны записать следующий фрагмент программы:

inach:=i;

while (S[i]<>#32) and (S[i]<>'.') do

begin

St:=St+S[i]; inc(i);

end;

If i>8 then

Delete(S, I nach, i-1);

else inach:=inach+i-1;

Теперь давайте напишем программу, которая будет формировать новый текст, содержащий из исходного текста только слова, начинающиеся и оканчивающиеся на одну и ту же букву:

program Tekst2z;

{$APPTYPE CONSOLE}

uses

SysUtils;

Var S,St: string;

z: 0..50;

inach,i: byte;

b: char;

Begin

Writeln('Napishite predlogenie');

Readln(S);

i:=1; z:=0; St:=''; inach:=1; //начальная инициализация

Whilei<length(S) do //общий цикл (пока не закончился весь текст)

begin

b:=S[i]; //выделяем первый символ

while (S[i]<>#32) and (S[i]<>'.') do //цикл выделяет слово

begin

St:=St+S[i]; inc(z); inc(i);

end;

Ifb<>S[i-1] then //если первая и последняя буквы слова не равны, то

delete(St,inach,z) //нужно удалить это слово из формируемого //текста

else begin inach:=inach+z+1; St:=St+#32; end; //иначе можно идти дальше, //добавив после слова пробел

ifS[i]<>'.' theninc(i); z:=0; //если не достигнут конец текста, то обнуляем счётчик числа символов в слове (z) и увеличиваем номер текущего символа на 1

end;

Writeln('Trebuemoe predlogenie:');

Writeln(St); //выводим получившийся текст

Readln;

End.


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



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