Песни о Паскале - [30]
К) Дорожная служба запланировала ремонт трассы на участке с R1 по R2 (R1 • Будут ли ремонтировать весь платный участок P1–P2 ? • Будут ли ремонтировать хотя бы часть платного участка P1–P2 ? Если да, то определить длину ремонтируемой платной части. • Будут ли ремонтировать хотя бы часть бесплатного участка? Если да, то определить длину ремонтируемой бесплатной части.
Глава 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» – шестую.
Оказывается, что по этим номерам можно обращаться к отдельным символам строки, применяя операцию индексации. Она записывается с помощью пары квадратных скобок, расположенных за символьной переменной или константой. Внутрь скобок помещают числовое выражение, указывающее позицию символа в строке. Например, для извлечения 3-го символа строки можно написать
> c1:= S[3];
Выражение, что внутри квадратных скобок, называется индексом. Повторяю, индексом может быть не только число, но и числовое выражение, например:
> c1:= S[2*N+1];
Если N равно двум, то в символьную переменную c1 будет помещен пятый символ строки S.
Разумеется, что значение индекса не должно превышать количество символов в строке. Но как избежать таких ошибок? Если строка перед глазами, вы посчитаете символы, тыча в строку пальчиком. А если это строковая переменная?
В Паскале есть функция, определяющая количество символов в строке, или, иначе говоря, длину строки. Эта функция так и называется – Length – «длина». Вызвать её можно, например, так:
> K:= Length(S);
Здесь переменной K целого типа присваивается значение длины строковой переменной S. Вот ещё примеры (в комментариях указаны результаты).
> S:= ’’; K:= Length(S); { К=0 }
> S:= ’PAS’ K:= Length(S); { К=3 }
> K:= Length(S+’CAL’); { К=6 }
> K:= Length(’Привет, Мартышка!’); { К=17 }
Теперь мы достаточно подкованы, чтобы решить поставленную задачу – разбить строку на отдельные символы. Вот как выглядит один из вариантов решения.
>{ P_18_1 – распечатка отдельных символов строки }
>var S: string;
> C: char;
> k, L : integer;
>begin
> repeat
> Write(’Введите строку: ’); Readln(S);
> L:= Length(S); { определяем длину строки }
> for k:=1 to L do begin
> C:= S[k]; { выбираем очередной символ }
> Writeln(C); { и печатаем его в отдельной строке }
> end;
Сегодня пятница, 20 ноября 2038 года. Я лежу на земле и смотрю в небо. Там наверху, далеко, темно так, что хоть глаз выколи. Хоть оба вырви, а ничего нет. Представьте, что вы закрыли глаза — и пусто. Выпили чай, пустая кружка, открытые настежь окна дома — и холодно. Холодно, снег шел уже много раз. В этом году холодно, и в следующем будет также, если не пошевелитесь. Если не включите чайник, не закроете окна, не заставите сигнализацию работать, не проверите детей, жену, собаку… Никакого тебе больше чая, жены.
Главный герой — полицейский под прикрытием. Он под личиной обычного взломщика внедрился в банду грабителей и теперь должен вычислить их босса, который с помощью этой и еще нескольких банд совершает одно ограбление за другим. Но судьба имеет на главного героя другие планы.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Трясет Перу, и Яву, и Бермуды И тонет Русь в дешевеньком вине А я живу, живу с мечтой о чуде, "Сосновых башнях"* в дивной той стране...