Песни о Паскале | страница 60
Глава 18
Аз, Буки
Вот вам новая задача: побуквенная распечатка строки. Программа должна запросить строку и напечатать ее по буквам, например:
>Введите строку: PASCAL
>P
>A
>S
>C
>A
>L
Да будь я хоть семи пядей во лбу, спасовал бы перед этой задачей, если бы… если бы не знал внутреннего устройства строки.
Строковые данные, которыми мы так запросто орудуем, не так уж просты, и нам следует разобраться в этом. Вспомните первый класс, с чего все началось? С освоения букв. Строки тоже складываются из букв, точнее из символов. Символы – это не только буквы, но и цифры, знаки препинания, и даже пробел. Существуют и невидимые, так называемые управляющие символы, но о них мы поговорим в другой раз. Рассмотрим следующую строковую константу:
> ’Привет, Мартышка!’
Сколько символов в этой строке? Здесь 14 букв, к ним надо прибавить запятую, восклицательный знак и пробел, и тогда получится 17.
Для представления отдельных символов в Паскале имеется тип данных CHAR – от английского CHARACTER, что значит «символ». Так же, как и строковые, символьные данные могут быть константами и переменными. Переменные символьного типа объявляют так:
>var c1, c2, c3 : char;
Тут объявлены три переменные, которым можно присваивать значения символьных констант или других символьных переменных, например:
> c1:= ’A’; c2:= ’B’; c3:= c1;
Символьные константы, как и строковые, заключают в апострофы. Но, в отличие от строк, они могут содержать ровно один символ, – не больше и не меньше! Для острастки я покажу ошибочные операторы, компилятор их обязательно забракует.
> c1:=’ABBA’; { нельзя присвоить более одного символа }
> c2:=’’; { и менее одного тоже! }
Но строковым переменным разрешено присваивать значения символьных данных, например:
>var c1 : char; S: string;
>...
> S:= c1;
Это и понятно, ведь строка может вмещать много символов! Строковые и символьные данные можно «склеивать» операцией сложения, результат получится строковым, например:
> c1:= ’A’; c2:= ’B’; c3:= ’A’;
> S:= c1 + c2 + ’B’ + c3; { результат равен ’ABBA’ }
> S:= ’pascal’+ c1 + S; { «склеивание» символов и строк }
Подобно строкам, отдельные символы вводятся процедурой Readln, и печатаются процедурами Write и Writeln, например:
> Readln(c1);
> Writeln(c1);
Ясно, что «склеить» символы в строку немудрено, но ведь для решения поставленной задачи требуется обратное – разобрать строку на отдельные символы. Взглянем на строку с иной стороны – как на стройный ряд символов. Каждый символ в этом строю, подобно солдатам, занимает свою позицию. Позиции нумеруются слева направо, начиная с единицы. Например, в слове «PASCAL» символ «P» занимает первую позицию, а «L» – шестую.