Введение

Линейные алгоритмы

Алгоритмы с ветвлением

Алгоритмы с повторением

Одномерный массив (вектор)

Двумерный массив (матрица)

Пользовательские процедуры и функции

Строки

маркированный список

справочные материалы

маркированный список

теоретические вопросы

маркированный список

задачи,  решения, программы

Множества

Записи

Файлы

Графика

На главную
              

СТРОКИ
 

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

Например, строкой является
В жизни всё закономерно

Следует знать, что Паскаль налагает на использование строк некоторые ограничения. Во-первых, их длина не может превышать 255 символов. Во-вторых, все строки в программе должны быть заключены в апострофы. Т.е.
'Быть или не быть, вот в чем вопрос!'

И наоборот, все, что стоит между двумя апострофами, является строкой Например
'a := sin(x) + 5.65'
тоже строка, а не оператор присваивания.

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

Тип строка в Паскале имеет два названия. Исторически первое выглядит так:
var s: packed array [1..50] of char;

(т.е. упакованный символьный массив). Впоследствии его заменили на более короткое и понятное:
var s: string[50];

( string в переводе строка). Можете пользоваться любым. Объявление строки максимальной (255) длины еще короче:
var s: string;

Тип string - уникальный в том смысле, что им можно пользоваться одновременно и как единым значением (так, как мы используем целую переменную), и как массивом. Этим строка отличается от простого (неупакованного) символьного массива. Такой массив - обыкновенный, и все ниже сказанное к нему не относится, хотя формально он тоже последовательность символов.
В типе string (но не packed array) элемент с номером 0 используется для хранения длины строки. Сами символы-элементы строки имеют номера от 1 до последнего.

В строке, объявленной как string[50], можно хранить строки любой длины, лишь бы она не превосходила 50-ти.
 

Работа со строками.
 

Строки как единое значение можно:
- присваивать
- складывать
- вводить
- выводить
- сравнивать

В отличие от всех других массивов строки вводятся/выводятся одним оператором, без цикла!
Разберем эти действия.

1. Присваивание строк. Присваивать можно любую строку любой, независимо от объявления. Необходимо только следить за тем, чтобы строка "влезла" в строковую переменную. Другими словами, если строковая переменная объявлена как string[50], нельзя запихнуть в нее строку из 100 символов. Также можно присвоить строковой переменной символьную (символ можно назвать строкой из 1-го элемента), но не наоборот. Пример присваивания:
s := 'String переводится как строка';

2. Сложение строк. Такое сложение называется конкатенацией или катенацией и применяется для соединения нескольких строк в одну. Например, после выполнения оператора
s := 'Иван' + ' Васильевич';

в переменной s будет содержаться строка 'Иван Васильевич'. Как, надеюсь, Вы уже поняли, операция сложения строк обозначается +. Операция сложения применима только к строкам типа string.

3. Ввод/вывод строк. Для того, чтобы ввести строку s, достаточно написать
readln(s);
А чтобы вывести:
writeln(s);

4. Сравнение строк. К строкам применимы все операции сравнения: = (на равенство), <> (на неравенство) и т.п.

С другой стороны, строка - это массив, и каждый элемент ее - символ. Строку можно обрабатывать поэлементно, иначе говоря, с ней можно обращаться как с обыкновенным символьным массивом. И выполнять любые операции, разрешенные в данном случае (см. Одномерные массивы). В частности, 5-тый символ строки s имеет имя s[5], как обычно.
Впрочем, есть одно очень важное отличие строковых переменных - это массивы переменной длины. Их длина заранее неизвестна, она зависит от того, какую строку мы присвоили строковой переменной. Длина эта хранится в 0-м элементе строковой переменной. Сами символы хранятся в элементах начиная с 1-го. Таким образом, если мы напишем
s := 'abc'
то s[0] = 3, s[1] = 'a', s[2] = 'b', s[3] = 'c'. Остальные элементы строки (4-ый, 5-ый и т.д.), если они есть, неопределены. Скорее всего, там хранится всякий мусор.

Однако не рекомендуется получать длину строки s как s[0]. Для этого в Паскале существует специальная функция length(s). Она возвращает длину строки, переданной ей в качестве параметра. Такой способ безопасней и надежней.
Например, так можно перебрать всю строку по символам (операция, которая часто встречается в задачах):
var s: string[50];
i: integer;
...
begin
...
readln(s);
...
for i := 1 to length(s) do
begin
{что-то сделать с символом s[i]}
end;
...
end.
Так как элемент строки имеет тип char, над ним можно производить все операции, разрешенные для этого типа данных.
 

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

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

1. Функция Length( <строка> ) : integer
Возвращает длину строки-параметра в символах. Например, length('abc') будет равно 3-м.

2. Функция Concat( <строка> [,<строка>, <строка> ...] ) : string

Возвращает строку, являющуюся объединением (конкатенацией) всех параметров функции. Эта функция является аналогом операции сложения.
Параметров - произвольное число. Все параметры должны иметь тип
string. Например, concat('a', 'bc', '!!') будет 'abc!!'.

3. Функция Copy( <строка>, <позиция>, <сколько> ) : string

В качестве результата возвращает подстроку <строки>, начинающуюся с символа номер <позиция> длиной <сколько> символов (как бы вырезает часть <строки>). Параметры <позиция> и <сколько> должны быть целыми выражениями. Например, результатом вызова copy('1234567890',3,4) будет строка '3456'.

4. Функция Pos( <подстрока>, <строка> ) : byte

Определяет, содержится ли <подстрока> в <строке>. Если да, возвращает номер символа, с которого начинается <подстрока> в <строке>. Если нет, возвращает 0. Например, результатом pos('123', 'ab123cde') будет 3, т.к. строка '123' в строке 'ab123cde' содержится и начинается с позиции 3.

5. Процедура Delete( var <строка>, <позиция>, <сколько> )

Удаляет из <строки> <сколько> символов, начиная с символа номер <позиция>. По действию похожа на Copy, но вырезанная часть исчезает из <строки>. Параметр <строка> должен быть переменной строкового ти-
па, параметры <позиция> и <сколько> - выражениями целого типа. Например, пусть строка s = '123456789'. Тогда после выполнения процедуры delete(s,5,2) строка s будет равна '1234789'.

6. Процедура Insert( <строка>, var <строка-куда>, <позиция> )

Вставляет <строку> в <строку-куда>, начиная с символа номер <позиция>. Противоположна по действию процедуре Delete. Параметр <строка-куда> должен быть строковой переменной, параметр <позиция> -
целым выражением. Например, пусть строка s = 'abcde'. Тогда после выполнения процедуры Insert('12', s,3) строка s будет равна 'ab12cde'

7. Процедура Val( <строка>, var <ариф. перем.>, var <код ошибки> )

Преобразует <строку> в числовое значение, которое помещается в переменную <ариф. перем.>. Параметр <ариф. перем.> должен быть целой или вещественной переменной (в зависимости от того, какого типа число содержится в <строке>). Конечно же, <строка> должна содержать правильную запись числа. Если при преобразовании возникла ошибка, позиция символа, на котором 'споткнулись', заносится в <код ошибки>.

Если <код ошибки> равен 0, преобразование прошло успешно. Параметр <код ошибки> должен быть целой переменной. Например, пусть i и c целые переменные. Тогда после вызова Val('123', i, c) переменная i = 123, а с = 0. После вызова Val('1a2', i, c) значение переменной i не определено, а c = 2 (вторым символом встретилась буква).

8. Процедура Str( <ариф. выраж.>, var <строка> )

Преобразует числовое значение <ариф. выраж.> в строковое и помещает его в <строку>. Старое значение строки теряется. Параметр <строка> должен быть строковой переменной, а параметр <ариф. выраж.> - выражением целого либо вещественного типа. В <ариф. выраж.> можно задать формат преобразования (как в операторе вывода). Примеры преобразования (s - строка):
Str(4.14, s) s = '4.14'
i = 5 Str(i+12, s) s = '17'
f = 3.1415926 Str(f:5:2, s) s = '3.14'

Таковы стандартные функции работы со строковыми переменными. Однако практически все эти действия можно произвести без применения стандартных функций и процедур.

 

Пример решения задачи со строками.
 

Разберем  задачу на применение строк.
Ввести строку и заменить в ней все пробелы на троеточия.

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

Вариант A. С применением стандартных функций.

Как найти пробел? Для этого есть функция поиска подстроки pos (ничто не мешает считать пробел подстрокой, хотя и маленькой). Когда pos находит подстроку, она возвращает позицию ее начала - что нам и нужно. А если не находит - возвращает 0. Тогда мы должны закончить преобразование строки (пробелов не осталось!). Вырезать пробел можно с помощью процедуры delete, вставить - с помощью insert. Получаем следующий алгоритм:

1. Ввести строку.
2. Найти первый пробел в строке при помощи функции pos.
3. Пока результат pos не равен 0, выполнять шаги:
3.1. Удалить найденный пробел
3.2. Вставить на место пробела троеточие
3.3. Найти следующий пробел
4. Вывести получившуюся строку.

Вариант B. С использованием строки как символьного массива.

Строка - это символьный массив. Значит, найти пробелы можно просто проверяя все символы строки друг за другом. Если символ не пробел - переносим его в строку-результат. Если пробел - заносим в строку-результат троеточие, а пробел игнорируем. И так до конца исходной строки.

В отличие от первого варианта во втором потребуется две строки (дополнительная строка используется для конструирования результата). Алгоритм этого решения можно записать так:

1. Ввести исходную строку.
2. Записать в строку-результат пустую строку.
3. Для i от 1 до конца исходной строки выполнять:
если i-тый символ исходной строки - пробел то добавить к строке-результату троеточие, иначе добавить к строке-результату сам этот символ.
4. Вывести строку-результат.

Почти любая задача на строки допускает решение типа A и типа B. Вам выбирать, какое применить в Вашей программе. Программы на Паскале для этой же задачи выглядят так:

program prim1; { вариант A }
uses crt;
var s: string;
k: byte; { это номер очередного символа-пробела }
begin
clrscr;
textcolor(lightgreen);
writeln('Замена в строке пробелов на ...');
write('Введите строку: ');
readln(s);
k := pos(' ', s);
while k <> 0 do
begin
delete(s, k,1);
insert('...', s, k);
k := pos(' ', s);
end;
writeln('Результат: ', s);
readkey;
end.
program prim_6a1b; { вариант B }
uses crt;
var s, res: string;
i: byte; { это номер очередного символа }
begin
clrscr;
textcolor(lightgreen);
writeln('Замена в строке пробелов на ...');
write('Введите строку: ');
readln(s);
res := '';
for i := 1 to length(s) do
if s[i] = ' ' then res := res + '...'
else res := res + s[i];
writeln('Результат: ', res);
readkey;
end.
 

ПОЛЕЗНЫЕ СОВЕТЫ.
 

1. Пустая строка обозначается '', а не ' '.
2. Строки ( string) можно складывать с символами ( char) - результат будет типа string.
3. Длина строки s хранится в ее элементе номер 0 (т.е. s[0]), однако безопаснее использовать функцию length(s).

Сайт создан в системе uCoz