СТРОКИ
Строка в языке Паскаль — это, в общем-то, то же самое,
что и в «обыденной» жизни. То есть последовательность букв, цифр, знаков
препинания и т.д. (иначе говоря, символов) в любом порядке и в любом
количестве.
Например, строкой является
В жизни всё закономерно
Следует знать, что Паскаль налагает на использование строк некоторые
ограничения. Во-первых, их длина не может превышать 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).
Формулировка задачи:
Как найти пробел в строке и удвоить его?
Код к задаче: «Как найти пробел в строке и удвоить его?»
textual
Листинг программы
for i:=Length(s) downto 1 do if s[i]=' ' then Insert(' ',s,i);
Полезно ли:
7 голосов , оценка 4.000 из 5
Похожие ответы
- Найти минимальный элемент матрицы, вывести его значение, номер строки и номер столбца
- Дана строка, содержащая пробелы. Найдите, сколько в ней слов
- Как определить множество включающее в себя др множества?
- Удалить все лишние пробелы, оставив по одному между словами
- Распечатайте введенную строку в обратном порядке
- Рекурсивная процедура, переставляющая символы строки в обратном порядке
- Вычислить сумму и найти число слагаемых, которые вошли в сумму
- Как сделать, чтобы пользователь вводил размер рисунка произвольно?
- Из сумм элементов строк матрицы сформировать вектор
- Найти сумму неповторяющихся элементов массива a(20)
I tried the following code which supposed to check if a string contains spaces but I get an error.
How else can I check that
if Index('some string',' ')>1 then begin
Result:= False;
end
else begin
Result := True;
end;
asked Feb 26, 2014 at 16:39
1
You can use pos function. From documentation:
The
pos
function returns the position of a substring in a main string.
If the substring does not exist in the main string, then the returned
value will be 0.
s:='note-book';
x:=pos('book',s); {x will be 6}
All this information, and other useful tips you can find here
answered Feb 26, 2014 at 16:45
Farkhat MikhalkoFarkhat Mikhalko
3,5253 gold badges23 silver badges36 bronze badges
2
As an alternative one, AnsiContainsStr can be used for string containing operations.It return True if the string contains the given substring, False otherwise. As an example code:
if AnsiContainStr(mainText, subText) then begin
//enter here if mainText contains subText.
//write code for doing needed operations here
end
answered Feb 11, 2016 at 12:09
Как найти позицию второго пробела в строке S (в pascal) ?
Вы открыли страницу вопроса Как найти позицию второго пробела в строке S (в pascal) ?. Он относится к категории
Информатика. Уровень сложности вопроса – для учащихся 10 — 11 классов.
Удобный и простой интерфейс сайта поможет найти максимально исчерпывающие
ответы по интересующей теме. Чтобы получить наиболее развернутый ответ,
можно просмотреть другие, похожие вопросы в категории Информатика,
воспользовавшись поисковой системой, или ознакомиться с ответами других
пользователей. Для расширения границ поиска создайте новый вопрос, используя
ключевые слова. Введите его в строку, нажав кнопку вверху.
Сомневаетесь в ответе?
Найдите правильный ответ на вопрос ✅ «Как найти позицию второго пробела в строке S (в pascal) ? …» по предмету 📘 Информатика, а если вы сомневаетесь в правильности ответов или ответ отсутствует, то попробуйте воспользоваться умным поиском на сайте и найти ответы на похожие вопросы.
Смотреть другие ответы