В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 33
Текст из файла (страница 33)
Первоначально во все клетки таблицы занесем значение false. Затем будем просматривать последовательно пары букв в слове и для каждой из них будемзаносить значение true в клетку, поставленную в соответствие этой паребукв. По окончании просмотра слова число различных пар букв будетравно числу клеток со значением true.Поскольку длина слова может быть произвольной, то его обработкубудем производить по мере ввода отдельных букв слова. В качестве результата выполнения программы на печать выведем исходное слово с признаком его конца (чтобы убедиться в том, что введено и обработано всеисходное слово), и число различных пар букв в нем.Предложенный выше способ решения задачи можно реализовать следующей паскаль-программой:{Пример 7.3.
Кардаш А.И.ЛьвовГУ1.5.87гВ слове, состоящем из строчных букв латинского алфавита сточкой в качестве признака конца слова, подсчитать числоразличных пар букв}{Использование двумерных массивов}program ПАРЫБУКВ (input, output);typeматрица = array C'a'..'z','a'..'z'3 of boolean;varтаблица: матрица;{cl — первая буква пары, с2 — вторая буква пары}с,с 1,с2: char;числопар:integer;begin {начальное заполнение таблицы}for cl:='a' to 'z' dofor c2:='ato 'z' doтаблицаСс).
, c2 3 : =f al se;{ввод и печать первых двух букв}read(с 1,с2); write(с1,с2);repeat {учет пары букв cl с2}таблицаСс1,с23:=true;{составление очередной пары букв}с 1:=с2; read(c2>; write(c2);132until с2='.'; writeln;{подсчет различных пар букв}числопар:=0;for с1:='а' to 'z' do•for c2: = 'a' to 'z ' doif таблицаСс1,c2] thenчислопар:=числопар+1;{печать результата}writeln('число различных пар букв =числопар)end.Следующий пример имеет и практическую ценность, решая реальнуюзадачу.П р и м е р 7.4.
Пусть в автопарке такси работает 8 автомашин с государственными номерными знаками: ММТ3233, ММТ3265, ММТ3342,ММТ3349, ММТ3440, ММТ3445, ММТ3502, ММТ3699. Каждый шофереженедельно подает сводку диспетчеру о количестве километров, пройденных за каждый рабочий день его машиной. Зная эту информацию, необходимо подсчитать общий километраж, пройденный всеми автомобилямиза неделю, а также километраж по каждому дню недели в отдельности.Будем считать, что номера машин упорядочены по их возрастанию,и что рабочая неделя состоит из пяти дней. Исходные данные задаютсяпятерками целых чисел в порядке, соответствующем порядку номеровмашин. Порядок чисел в каждой пятерке соответствует порядку рабочихдней в неделе, а каждое число представляет километраж, пройденныйзаданной машиной в определенный день рабочей недели.Эта задача решается с помощью следующей программы на паскале:{Пример 7 .
4 .Зима Е.В.Ф-т ВМиК МГУ 20.4.В7г.Подсчет километража, пройденного автомобилямиавтопарка такси за рабочую неделю}{Регулярные типы}programавтопарк(input,output);typeденьнедели=(пн,вт,ср,чтв,птн);автомобиль=(ММТ3233,ММТ3265,ММТ3342,ММТ3349,ММТ3440,ММТ3445,ММТ3502,ММТ3699);varдень:деньнедели;такси: автомобиль;путь: array [автомобиль,деньнедели] of integer;общпуть: array Сденьнедели] of integer;расст:integer;133begin{ввод и печать исходных данных}writeln('ИСХОДНЫЕ ДАННЫЕ:');•for такси: =ММТ3233 to ММТЗ<Ь<?<? dof o r день:= п н t o птн d obegin read(путьСтакси,день]);wri teln(путьСтакси,день])ег.1;{счетчики общих путей по дням положить равными нулю}f o r день:=пн t o птн d oобщпутьСдень]:=0;{подсчет суммарного пробега машин по дням}f o r день:=пн t o птн d of o r такси:=ММТ3233 t o ММТ3699doобщпу ть С день ] : =общпуть С день ] +пу ть С такси, день 3 ;{подсчет суммарного расстояния за неделю}расст:=0;f o r день:=пн t o птн d oрасст:=расст+общпутьСдень] ;{вывод результатов}writeln('ОБЦЕЕ РАССТОЯНИЕ:writeln('ПУТИ ПО ДНЯМ:for',расст);');день:=пн t o птн d owriteln(обцпутьСдень]>end.А теперь перейдем к рассмотрению строгого синтаксического определения регулярного типа.7.4.
Синтаксис задания регулярного типаЗадание регулярного типа может быть определено следующим образом:(задание регулярного т и п а ) : : =array [< тип индекса > {, (тип индекса >} ] of < тип компонент > |packed array [< тип индекса > {, <тип индекса>}] of <тип компонент >(тип и н д е к с а ) : : = char | boolean | (ограниченный тип)|(перечислимый тип)(ограниченный т и п ) : : = (имя типа) |{задание ограниченного типа)(перечислимый т и п ) : : = (имя типа) |(задание перечислимого типа)134< тип компонент >:: = (задание типа > | <имя типа >Еще раз отметим, что в качестве (тип компонент) может быть заданлюбой тип паскаля, а в качестве (тип индекса) может быть использованлишь такой тип, значения которого образуют ограниченное перенумерованное множество.Здесь же приведем синтаксис переменной с индексами:(переменная с индексами):: = (переменная-массив >[(индекс){, (индекс)}]( и н д е к с ) : : = (выражение)< переменная-массив):: = ( и м я )Тип выражений должен соответствовать типам индексов,определеннымпри задании массива.Итак, теперь мы (с точки зрения синтаксиса) знаем два вида переменных в паскале: переменная-имя (т.е.
идентификатор) и переменная с индексами. Примеры переменных:хtimeВЕКТ [2]ВЕКТМАТРВЕКТ [i + 2] МАТР [2]МАТР 12] [к](эквивалентно МАТР [2. к] )Значение переменной зависит от ее типа. Если переменная простого типа,то значением переменной является отдельное данное. Если переменная —производного типа, то значением переменной-имени является нетривиальная структура данных (например, значением переменной-имени х являетсяотдельное вещественное число, а значением переменной-имени МАТР является структура данных (целочисленная матрица)).Если переменная регулярного типа ВЕКТ представляет собой одномерный вещественный массив (вектор), то значение переменной с индексамиВЕКТ [2] есть вещественное число, являющееся компонентой с номером 2в этом векторе. Значением же переменной с индексами МАТР [2], рассмотренной нами выше, является массив (строка с номером 2 в матрицеМАТР), т.е. тип значения этой переменной с индексами полностью аналогичен типу переменной-имени ВЕКТ.7.5. СтрокиПри решении на ЭВМ задач самых различных классов возникает необходимость в использовании строк, представляющих собой последовательностилитер.
Например, даже в программах решения задач вычислительного характера приходится использовать строки для печати заголовков или комментариев к результатам счета. Использование значений литерного типадля этих целей очень неудобно, поэтому желательно иметь инструментдля задания целых последовательностей литер. Таким инструментом в паскале и являются строки. Следует отметить, что кроме задач вычислительного характера, где строки играют вспомогательную роль, существуетбольшой класс задач, в которых строки литер являются основными объек135тами обработки (например, задачи лексического и синтаксического анализапрограммы, задача трансляции и т.д.). Для использования в программезаранее известных последовательностей литер служат строки-константы,о которых уже говорилось в главе 3. Напомним, что строка-константапредставляет собой произвольную последовательность литер, заключеннуюв одиночные апострофы, например:'Язык Программирования ПАСКАЛЬ''Таблица значений аргумента и Функции sin(x)Номер итерации =Если внутри литерной строки-константы (строковой константы) нужноиспользовать литеру ' (апостроф), то она удваивается, например:'Значения об''явленных переменных:'При изображении строк-констант мы сталкиваемся со следующей трудностью: литера пробел здесь является значащей и поэтому число изображенных литер пробелов играет важную роль, например, при определенииформата выводимой на печать строки.
Если в изображении строки-константырядом находятся несколько пробелов, то неясно, а сколько же их на самомделе. Поэтому договоримся при изображении строк-констант литеру пробелизображать явно, используя для этого литеруВ соответствии с этойдоговоренностью приведенные выше примеры примут следующий вид:' Язык_Программирования_.Паскаль''Таблица_значений_аргумента_и_Функции_51п <х > ''Значения_об''явленных_переменных:_Чаще всего строковые константы используются как фактические параметры в операторах вывода для печати сообщений, напримерwrite<'Номер_итерации_=_'>5writeln <'Конец_выдачи_промежуточных_значений');Литера ' (апостроф) в паскале используется только в качестве ограничителя строки-константы, поэтому недоразумений в использованиистрок-констант идругих констант паскаля не происходит. Например, 25 — это целочисленная константа, а ' 2 5 ' — это строковая константа.Каждая из этих констант имеет в машине свое собственное представление.Например, возможно следующее представление в памяти ЭВМ этих констант: целое число представляется в двоичной системе счисления, а каждаялитера строковой константы представляется 8фазрядным двоичным кодом(в кодировке ASCII):25: 0000000000011001' 2 5 ' : 0011001000110101где 00110010 - к о д цифры 2, а 00110101 - код цифры 5.В программе на паскале запись 25 может быть элементом арифметического выражения и участвовать в вычислениях, а запись ' 2 5 ' — это строкалитер и потому не может использоваться при вычислениях в качествеоперанда какой-либо арифметической операции.136В некоторых случаях значение строки, т.е.
конкретная последовательность литер, образующих эту строку, заранее не известно, а определяетсяв процессе выполнения программы. Поэтому в паскале существует возможность использования строковых переменных, допустимые значзниякоторых определяются строковыми типами. В роли строковых типоввыступают упакованные одномерные массивы, компоненты к о т о р ы х естьлитеры, а тип индекса задается только диапазоном 1 . . N , где N > 1 — целое без знака или имя целочисленной константы. Таким образом, строковый тип задается регулярным типом вида:packed a r r a y C1..N3 o-f charТакие массивы часто называют просто строками. Сразу следует заметить,что N > 1 и поэтому не существует значений строк, которые не содержатни одной литеры или содержат только одну литеру (проще говоря, не существует пустых и однолитерных строк).Строковый тип, к а к обычно, может быть задан двумя способами: либонепосредственно при описании переменных, либо определен и поименованв разделе типов: в последнем случае, к а к обычно, при описании переменныхдостаточно просто указать имя этого типа.Примеры:typeCoo6meHne=packed a r r a y С1..203o-f char;varстр1: Сообщение;с т р 2 : packed a r r a y С 1 .
. 2 0 Э of char;Все свойства массивов переносятся и на массивы-строки. В частности,длина строки (количество компонент) определяется статически в заданиитипа. Так, в приведенных выше примерах длина строки типа Сообщениеравна двадцати. Значение полной переменной типа строка определено,если определены значения всех ее компонент. Для ссылки на отдельныекомпоненты, к а к обычно в случае массивов, используются переменныес индексом, например стр1 [4], стр2 [15] и т.д.Обладая всеми свойствами массивов, строки имеют и ряд особенностейпо сравнению с остальными регулярными типами.Во-первых, к а к уже отмечалось выше, существуют строковые константы, т.е. явно заданные значения строкового типа. Эти строковые константымогут быть присвоены в качестве значений строковым переменным, еслидлина строки (соответствующего строкового типа) равна количеству литер в строке-константе.