Песни о Паскале - [31]

Шрифт
Интервал

>      until L=0;       { L=0, если строка пуста }

>end.


После ввода запрошенной строки определяем её длину, а затем, пробегая по строке, выбираем и печатаем символы. Программа работает, пока пользователь не введет пустую строку; тогда длина строки L станет равной нулю, и цикл завершится.

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


>{ P_18_2 – распечатка отдельных символов строки, краткий вариант }

>var S: string; k : integer;

>begin

>      repeat

>      Write(’Введите строку: ’); Readln(S);

>      for k:=1 to Length(S) do Writeln(S[k]);

>      until Length(S)=0;

>end.


Здесь функция Length вставлена в оператор FOR, а параметром процедуры Writeln является текущий символ строки S[k]. В цикле FOR выполняется теперь лишь один оператор, поэтому отпала нужда в блоке BEGIN-END. Обратите внимание на условие завершения цикла UNTIL, – оно записано с применением функции Length.

На этом прервем изучение символов и строк. Однако тема не исчерпана, и к ней мы ещё вернемся.

Итоги

• Строки – это цепочки символов. Для работы с отдельными символами в Паскале предусмотрен тип данных CHAR.

• Данные типа CHAR можно «склеивать» друг с другом и со строковыми данными, в результате получаются строки.

• Доступ к отдельным символам строки возможен путем индексации. Эта операция обозначается парой квадратных скобок, следующих за строкой; внутрь скобок помещают числовое выражение – индекс.

• Доступ по индексу применяется как для чтения символов строки, так и для их изменения.

• Для обработки строки необходимо знать её длину. С этой целью в Паскале применяется функция Length.

• Для последовательной обработки символов строки обычно используют цикл со счетчиком FOR-TO-DO.

А слабо?

A) Напишите программу для подсчета букв «А» во введенной пользователем строке. Или слабо?

Б) Напишите программу, меняющую символы «А» строки на символы «Б». Подсказка: изменение символа строки делается оператором присваивания вида S[i]:=…

В) Что делают со строкой S следующие операторы?


>      for i:=1 to Length(S) do S:= S + S[i];

>      for i:=Length(S) downto 1 do S:= S + S[i];


Проверьте свои предположения на практике.

Г) Записи телефонных номеров обычно содержат дополнительные символы: скобки, черточки, пробелы, например: 8(123)45-67-89. Предположим, что пользователь их так и вводит. Пусть ваша программа удалит из такой строки все символы, кроме цифр. Например, после ввода указанного выше номера она должна напечатать: 8123456789.

Д) Пусть ваша программа напечатает введенную пользователем строку вразрядку, добавляя подчёркивание либо пробел после каждого символа, например: 'Pascal' преобразует в 'P_a_s_c_a_l'.

Глава 19

Процедуры и функции: разделяй и властвуй



Снежный ком

Чем дальше в лес, тем больше дров, – наши программы становятся все замысловатей! Чем измеряют сложность программ? – усилиями, что потребны на их осмысление. С ростом размера программы её сложность растет снежным комом: так программа в десять страниц стократ сложней одностраничной! Почему?

Три базовые структуры: линейная последовательность, условный переход и цикл – это строительные блоки наших изделий. В ходе постройки программы эти структуры причудливым образом внедряются друг в друга: условные – внутрь циклов, циклы – внутрь условных операторов и так далее. План «постройки» определяется решаемой задачей – алгоритмом – и тут ничего не упростить. С ростом программы не только запутывается её текст, но и плодятся полчища переменных. «Расползаясь» по телу программы, они затрудняют контроль над собой. Поверьте, продолжая «строительство» в прежнем стиле, вы скоро свихнетесь, – ведь серьезные программы насчитывают тысячи страниц!

В 15-й главе я поведал о соединении усилий программистов в работе над одним проектом, – им на выручку приходят процедуры и функции. Мы уже пользовались ими, извлекая готовенькими откуда-то из «недр» Паскаля (такими, как Writeln, Readln, Length, Random). Заботит ли вас устройство и сложность этих процедур? Нет? То-то же! Подобно усердным слугам, они лишь исполняют наши капризы. Но, то – чужие «слуги», созданные другими программистами, не пора ли обзавестись своими? Разбив сложную программу на «кусочки», мы значительно упростим её. Как говорят, разделяй и властвуй!

Описание процедур

Для постройки нашей первой процедуры возьмем знакомый пример. Вот как организована пауза с ожиданием нажатия клавиши Enter в одной из наших первых программ.


>      Write(’Нажмите Enter…’); Readln;


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

Создать процедуру, – это значит дать ей имя и описание. Делается это с применением ключевого слова PROCEDURE, после которого указывается имя процедуры и её тело, содержащее операторы. Процедуре назначают имя по тем же правилам, что для констант и переменных. Сейчас мы заменим пару упомянутых выше операторов процедурой по имени Pause (пауза), вот как будет выглядеть её описание (рис. 40).



Рис.40 – Описание процедуры Pause

Рекомендуем почитать
Рождение Эмеральда, слабость Амбера

Миры Эмеральда являются свободной прелюдией к мирам «Амбера» Роджера Желязны и к «Хроникам Фауста» Константина Мзареулова. Некоторые события и данные основываются на мелких подробностях из тех книг, но возможны случайные противоречия. Спасибо Роджеру Желязны за идею войны Амбера с Хаосом. Спасибо Константину Мзареулову за то, что он оригинально продолжил «Хроники Амбера» серией «Хроники Фауста». Спасибо Льву Стрельникову, моему приятелю, за то, что он морально помог стать мне писателем и тем самым начать создание «Хроник Эмеральда».


На седьмом небе

Сегодня пятница, 20 ноября 2038 года. Я лежу на земле и смотрю в небо. Там наверху, далеко, темно так, что хоть глаз выколи. Хоть оба вырви, а ничего нет. Представьте, что вы закрыли глаза — и пусто. Выпили чай, пустая кружка, открытые настежь окна дома — и холодно. Холодно, снег шел уже много раз. В этом году холодно, и в следующем будет также, если не пошевелитесь. Если не включите чайник, не закроете окна, не заставите сигнализацию работать, не проверите детей, жену, собаку… Никакого тебе больше чая, жены.


Красная Горка

Это небольшая история о следователе Павле.


Петля на шее

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


Стрела на Север

Приключенческая повесть с инопланетянином, делающим неожиданные подарки.


Вечный эмигрант

Трясет Перу, и Яву, и Бермуды И тонет Русь в дешевеньком вине А я живу, живу с мечтой о чуде, "Сосновых башнях"* в дивной той стране...