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




Вопросы:

· Символьная строка и её описание на языке Pascal.

· Хранение строк в оперативной памяти компьютера.

· Операции функции и процедуры для обработки строк.

Строка – это последовательность символов. Количество символов в строке называется её длиной. Строковые значения в языке Паскаль записываются, как и символы, замкнутыми между апострофами.

Строковые переменные в языке Pascal имеют тип string. Рассмотрим, как объявить такую переменную. Вначале как у любой другой переменной указывается имя, после которого следует двоеточие. После него, через пробел, следует тип переменной – string. Через пробел после этого слова, в индексных скобках, следует число – максимальная длина строки. Максимальную длину строки указывать необязательно, в этом случае она по умолчанию указывается максимально возможной, то есть равной 255 символам.

<имя>: string [<максимальная длина>];

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

Рассмотрим, как строка хранится в оперативной памяти компьютера. Строку можно разделить на 2 части. Вторая часть представляет собой массив символьных величин. Эти величины имеют индексы – порядковые номера символов в строке. Первая часть строки – это её нулевой байт. В нём хранится длина строки, то есть количество занятых символьных позиций. Таким образом, чтобы узнать какое количество оперативной памяти занимает строка, нужно её максимальную длину, указанную в описании, умножить на 2 байта – размерность одного символа в кодовой таблице Unicode-16, после чего к полученному числу прибавить 1 байт, в котором храниться длина строки. Таким образом строка, максимальная длина которой не указана при описании будет занимать 511 байт оперативной памяти.

V = <максимальная длина> × 2 байта + 1 байт

Расчёт оперативной памяти, необходимой для хранения строки

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

<имя строки>[<порядковый номер символа>]

Обращение к символу строки

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

Рассмотрим операции, применяемые для обработки строк. Прежде всего это сцепление строк или конкатенация. Это бинарная операция. Она обозначается знаком арифметического сложения. Её результатом является строка, которая состоит из исходных, записанных слева направо. Длина результирующей строки не должна превышать 255 символов.

Также для строк реализованы все операции отношения. Как и для числовых величин, их результатом будет логическая величина, то есть «Истина» или «Ложь». Строки при этом сравниваются последовательно, от первого символа к последнему, до первого отличного символа. Большей будет та строка, в которой первый отличный символ будет иметь больший код в кодовой таблице.

Задача: Написать программу, которая формирует строку, состоящую из n звёздочек. n вводится с клавиатуры. Это положительное число, не превышающее 255.

Напишем программу для решения задачи. Назовём её звёздочки. Для работы программы нам потребуется строка, которую назовём s, так как по условию задачи её максимальная длина будет 255 символов - её указывать не требуется. Также нам потребуются переменные для хранения заданной и текущей длины строки. Назовём их соответственно n и i. По условию задачи они будут принадлежать к вещественному типу byte.

Напишем логические скобки. Тело программы будет начинаться с оператора writeln, выводящего на экран сообщение о том, что это программа, формирующая строку из n звёздочек. Дальше будет следовать оператор write, выводящий запрос на ввод n и оператор read, для считывания его значения. Дальше присвоим строке s значение пустой строки, которое задаётся двумя апострофами, между которыми нет символов. Дальше напишем цикл для заполнения строки звёздочками. Это будет цикл для i, изменяющегося от 1 до n. В нём будет оператор, присваивающий строке s склейку её текущего значения и символа звёздочка. После цикла будет следовать оператор write, выводящий на экран сообщение о том, что получившаяся строка равна значению s.

program zvezdochki;

Var

s: string;

n, i: byte;

Begin

writeln ('Программа, формирующая строку из n звёздочек.');

write ('n=');

readln (n);

s:='';

for i:=1 to n do

s:=s+'*';

write ('Получившаяся строка: ', s);

end.

Исходный код программы

Запустим программу на выполнение и зададим n = 7. Программа вывела строку из 7 звёздочек.

Программа работает правильно. Задача решена.

Рассмотрим функции, применяемые для обработки строк. Первая из них выделение подстроки. Она записывается служебным словом copy и принимает на вход 3 аргумента: исходную строку и 2 числа – порядковый номер символа с которого начинается выделяемая подстрока и количество символов, которое содержит подстрока. Она возвращает строковое значение заданной подстроки.

Следующая функция – определение текущей длины строки. Она записывается служебным словом length, после которого в скобках следует единственный аргумент – строка, длину которой нужно определить. Функция возвращает целое число – количество символов в заданной строке.

Последняя функция, применяемая для обработки строк – поиск первого вхождения подстроки в строку. Она записывается служебным словом pos, сокращённо от английского «position». После этого слова, через пробел, в скобках следует 2 строковых аргумента: искомая подстрока и строка в которой производится поиск. Эта функция возвращает одно целое число – номер символа, с которого начинается искомая подстрока в строке.

Также для обработки строк используется несколько процедур. Первая – это удаление подстроки из строки. Она записывается служебным словом delete, после которого в скобках указывается 3 параметра: исходная строка, позиция с которой начинается удаляемая подстрока и количество символов в удаляемой подстроке. По окончании работы процедуры длина исходной строки уменьшится на количество символов в подстроке.

Также есть и противоположная процедура вставки подстроки в строку. Она записывается служебным словом insert. После него, через пробел, в скобках следует 3 параметра: вставляемая подстрока, исходная строка и целое число – позиция, начиная с которой в исходной строке будет следовать вставляемая подстрока. По окончании работы процедуры длина исходной строки увеличится на количество символов в подстроке, итоговая длина должна быть не больше указанной в описании исходной строки.

Также при работе со строками бывают полезны ещё 2 процедуры. Первая из них преобразует число в строку. Она записывается служебным словом str, после которого, через пробел, в скобках указываются 2 параметра: целое или вещественное число и строка, в которой по окончании работы процедуры будет сохранено строковое представление числа.

Не менее полезна и обратная процедура – преобразование строки в число. Она записывается служебным словом val, сокращённо от английского «value». После него, через пробел, в скобках следует 3 параметра: преобразуемая строка, числовая переменная для хранения полученного числа и ещё одна целочисленная переменная, в которую будет возвращён номер некорректного символа в исходной строке, если её невозможно преобразовать в число или 0 в случае успешного преобразования.

Задача: Заданная строка состоит из слов и целых чисел, разделённых одиночными пробелами. Сохранить отдельно слова и числа, которые встречаются в строке и вывести их на экран. Количество слов и чисел не превышает 50, длина каждого слова – не более 20 символов, а каждое число – не больше 2 000 000 000.

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

Напишем программу для решения задачи. Назовём её slova_i_chisla. Для работы программы нам потребуются 2 строки: исходная строка, которую так и назовём – stroka, а также для хранения подстроки – строка s из 20 символов. Так же нам потребуется 2 массива из 50 элементов для хранения слов и чисел. Первый массив назовём sloava. Он будет состоять из строк по 20 символов. Второй массив назовём chisla, его элементами будут целые числа, принадлежащие к типу integer. Также понадобится несколько числовых переменных: для количества слов – переменная kol_slov, для количества чисел – kol_chisel, для позиции первого пробела – space и номер текущего элемента массива – i. По условию задачи они будут принадлежать к целочисленному типу byte. Ещё нам понадобятся две переменные для перевода подстроки в число. Назовём их соответственно chislo и code и укажем принадлежащими к целочисленному типу integer.

Напишем логические скобки. Тело программы будет начинаться с оператора writeln, выводящего на экран сообщение о том, что это программа выделения слов и чисел из строки, и запрос на ввод строки. Дальше будет следовать оператор readln, считывающий значение исходной строки. Присвоим переменным kol_slov и kol_chisel значения 0, так как мы ещё не выделили ни одного слова или числа. Дальше запишем цикл для выделения слов и чисел из строки. Это будет цикл с предусловие. Условием продолжения его работы будет то, что в исходная строка не пуста. В логических скобках запишем тело цикла. В начале найдём пробел в исходной строке. Для этого переменной space присвоим значение функции pos, которая будет искать первый пробел в исходной строке. Если пробела в строке не найдено, то в строке всего одно слово или число. Поэтому мы установим указатель пробела после него. Для этого присвоим переменной space значение равное сумме длины исходной строки – length (stroka) и 1. Дальше в строку s, с помощью функции Копи выделим первое слово или число из исходной строки. Нам нужна подстрока, начиная с первого символа до первого пробела, позиция которого хранится в переменной space, не включая сам пробел. Дальше с помощью процедуры val попробуем преобразовать строку s в число, если преобразование не удастся – номер ошибочного символа сохраним в переменной code. Дальше запишем условный оператор, который проверяет, удалось ли преобразование. Его условием будет: code = 0. Если это условие выполняется, то преобразование числа удалось, поэтому после слова then, в логических скобках, запишем операторы для сохранения числа. Это будут операторы увеличения kol_chisel на 1, и сохранения числа в массиве числа с индексом, равным kol_chisel. Если преобразование подстроки в число не удалось, значит это слово, поэтому после слова else, в логических скобках напишем операторы для сохранения подстроки s в массиве slova. Это будут операторы увеличения kol_slov на 1 и сохранения строки s в массиве slova с индексом равным kol_clov. Дальше нам нужно удалить выделенную подстроку из исходной строки для этого вызовем процедуру delete, которая будет удалять из исходной строки подстроку, начиная с первой позиции до первого пробела space, включая пробел. На этом описание цикла выделения слов и чисел завершено. После окончания работы нам будет достаточно вывести на экран элементы массивов слов и чисел, через пробел, с соответствующими поясняющими сообщениями.

program slova_i_chisla;

Var

stroka: string;

s: string [20];

slova: array [1..50] of string [20];

chisla: array [1..50] of integer;

kol_slov, kol_chisel, space, i: byte;

chislo, code: integer;

Begin

writeln ('Программа, выделяющая слова и числа из строки. Введите строку.');

readln (stroka);

kol_slov:=0;

kol_chisel:=0;

while stroka <>'' do

Begin

space:=pos(' ', stroka);

if space=0

then space:=length(stroka)+1;

s:=copy (stroka, 1, space-1);

val (s, chislo, code);

if code=0

Then begin

kol_chisel:=kol_chisel+1;

chisla [kol_chisel]:=chislo;

End

Else begin

kol_slov:=kol_slov+1;

slova[kol_slov]:=s;

end;

delete (stroka, 1, space);

end;

write ('Слова:');

for i:=1 to kol_slov do

write (' ', slova[i]);

writeln ();

write ('Числа:');

for i:=1 to kol_chisel do

write (' ', chisla[i]);

end.

Исходный код программы

Запустим программу на выполнение и зададим строку «на полке 33 карандаша и 10 фломастеров». Программа действительно выделила все числа и слова из строки. Программа работает правильно. Задача решена.

Важно запомнить:

· Строкой называется последовательность символов.

· В языке Pascal строки описываются так: <имя>: string [<максимальная длина>];

· Для обработки строковых величин определён ряд операций, функций и процедур.

 

 



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-12 Нарушение авторских прав и Нарушение персональных данных


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