Основы программирования на языке Паскаль
|больше: |
|та, которая длиннее? |
|та, которая содержит больше заглавных букв? |
| На самом деле такая проверка проходит довольно сложно: компьютер |
|сравнивает сначала первые символы строк. Большим из двух считается тот, код|
|которого больше (вспомните, что такое код символа). Если равны первые |
|символы, то так же анализируется следующая пара до тех пор, пока не будет |
|найдено различие. Если начало строк совпадает, а одна из них кончается |
|раньше, то вторая автоматически называется большей. |
| Код символа в Паскале можно определить при помощи функции Ord. |
| Ее формат: Ord(C), где С - либо непосредственно указанный символ, либо|
|переменная символьного типа, либо один символ строковой переменной. Вообще,|
|функция Ord имеет более глубокий смысл, но об этом - позже. Есть и обратная|
|функция, которая возвращает символ по известному коду. Это функция Chr(N), |
|где N - выражение, приводящее к целому числу в интервале от 0 до 255 |
|(возможные значения кода символа). Очевидно, что Chr(Ord(C))=C, |
|Ord(Chr(N))=N. |
| Следующая маленькая программа выводит на экран кодовую таблицу: |
|Program Str3; |
|Var |
| I : Byte; |
|Begin |
|For I:=32 to 255 do |
|Write('VV',I:4, '-',Chr(I)) |
|End. |
| Цикл в программе начинается с 32 потому, что символы с кодами от 0 до |
|31 являются управляющими и не имеют соответствующего графического |
|представления. |
| Задача: "Определить, является ли введенная строка "перевертышем". |
|Перевертышем называется такая строка, которая одинаково читается с начала и|
|с конца. Например, "казак" и "потоп" - перевертыши, "канат" - не |
|перевертыш". |
| Поступим следующим образом: из введенной строки сформируем другую |
|строку из символов первой, записанных в обратном порядке, затем сравним |
|первую строку со второй; если они окажутся равны, то ответ положительный, |
|иначе - отрицательный. Естественно, предложенный способ решения не является|
|единственно возможным. |
|Program Str4; |
|Var |
| S,B : String; |
| I : Byte; |
|Begin |
|Writeln('Введите строку'); |
|Readln(S); |
|B:=''; {Переменной B присваиваем значение "пустая строка"} |
|For I:=1 to Length(S) do |
|B:=S[I]+B; {Конкатенация. Символы строки S пристыковываются к} |
|{переменной B слева. Самым левым окажется последний.} |
|If B=S Then Writeln('Перевертыш') Else Writeln('Не перевертыш') |
|End. |
| Число, записанное в строковую переменную, естественно числом не |
|является, но очень часто требуется его все же использовать в качестве |
|числа. Для этого нужно произвести преобразование типа. Перевод строкового |
|представления числа в числовое выполняет в Паскале оператор Val. |
|Его формат: |
|Val(S,X,C); |
| Здесь S - строка, содержащая число, X - числовая переменная, в которую|
|будет помещен результат, С - переменная целочисленного типа, в которую |
|помещается первого встреченного в S отличного от цифры символа. Если после |
|выполнения оператора Val переменная С имеет значение 0, то это означает, |
|что преобразование типа прошло совершенно успешно и в строке нецифровых |
|символов не встретилось. |
| Противоположное действие осуществляет оператор Str. Формат оператора: |
| Str(X,S); |
|X - число (либо арифметическое выражение), S - строковая переменная. |
| В переменную S попадает строковое представление числа X. Это нужно, |
|например, при необходимости выводить на экран числа в графическом режиме |
|(будет изучено позже), так как стандартные процедуры вывода на экран там |
|работают только со строковыми величинами. |
| Для иллюстрации рассмотрим такую задачу: "Найти сумму цифр введенного |
|натурального числа". Используя только числовые переменные, решить ее можно,|
|но предлагаемое здесь решение, по-моему, проще. |
|Program Str5; |
|Var |
|S : String; |
|I,X,A,C : Integer; |
|Begin |
|Writeln('Введите натуральное число'); |
|Readln(S); {Число вводится в строковую переменную} |
|A:=0; |
|For I:=1 To Length(S) Do |
|Begin |
|Val(S[I],X,C); {Цифровой символ превращается в число} |
|A:=A+X {Цифры суммируются} |
|End; |
|Writeln('Сумма цифр равна ',A) |
|End. |
| Теперь рассмотрим еще несколько действий над строками: |
|оператор DELETE(S,I,C) из строковой переменной S удаляет C символов, |
|начиная с I-того; |
|оператор INSERT(SN,S,I) вставляет подстроку SN в строковую переменную S |
|перед символом с номером I; |
|функция COPY(S,I,C) возвращает подстроку строки S из C символов, начиная с |
|символа с номером I; |
|функция Pos(SN,S) возвращает номер символа, с которого в строке S |
|начинается подстрока SN (позицию первого вхождения подстроки в строку). |
|Если такой подстроки нет, то возвращается ноль. |
| Пример их использования: |
|"Во введенной строке заменить все вхождения подстроки 'ABC' на подстроки |
|'KLMNO'". |
|Program Str6; |
|Var |
|S : String; |
|A : Byte; |
|Begin |
|Writeln('Введите строку'); |
|Readln(S); |
|While Pos('ABC',S)<>0 Do |
|Begin |
|A:= Pos('ABC',S); |
|Delete(S,A,3); |
|Insert('KLMNO',S,A) |
|End; |
|Writeln(S) |
|End. |
| |
|Определение типов |
| Как было упомянуто ранее, в изучаемом языке возможно определять новые |
|типы переменных. После определения этот тип становится доступным для |
|описания переменных, также как и стандартные типы. |
| Новый тип перед первым его использованием должен быть описан в |
|соответствующем разделе описаний. Его заголовок - служебное слово Type. |
|Type |
| = ; |
| Есть несколько способов описания. Иногда говорят даже о видах типов |
|(как бы это странно ни звучало). |
| Итак, первым рассмотрим так называемый перечисляемый тип. |
| Перечисляемый тип используется для повышения наглядности программ, |
|позволяя записывать в переменные этого типа названия разнообразных |
|объектов, исследуемых программой. Этот тип представляет собой набор |
|идентификаторов, с которыми могут совпадать значения параметров. |
| Формат описания следующий: = (, ,? ); |
| Далее можно определить любое число переменных уже описанного типа. |
|Обратите внимание на то, что каждый идентификатор может участвовать в |
|описании только одного перечисляемого типа. |
| Этим переменным можно присваивать только значения из списка, |
|определенного при описании типа. Эти значения не являются ни числами, ни |
|строковыми величинами, ни даже величинами логического типа, поэтому они не |
|могут участвовать в арифметических, строковых, логических выражениях, а |
|также не могут быть выведены на экран или принтер. Величины перечисляемого |
|типа можно сравнивать между собой, над их множеством в языке Паскаль |
|определены несколько функций: |
| Ord(X) - порядковый номер значения переменной X в списке |
|идентификаторов. |
| Succ(X) - следующее значение для величины Х. |
| Pred(X) - предыдущее значение данного типа. |
| Обратите внимание на то, что для функции Ord нумерация среди значений |
|идет, начиная от нуля. Для последнего значения нельзя применять функцию |
|Succ, для первого - Pred. |
| Переменные различных перечисляемых типов несовместимы друг с другом. |
| Множество стандартных порядковых типов в языке Паскаль на самом деле |
|определены как перечисляемые. Это типы Char, Integer, другие. Достоинства |
|стандартных порядковых типов лишь в том, что над каждым из них уже |
|определены специфические действия. Например, тип Boolean описан так: |
|Type |
|Boolean = (False, True); |
| Единственное его отличие от перечисляемых типов, определяемых |
|программистом, состоит в том, что значения типа Boolean можно выводить на |
|экран. Можете проверить, Ord(False)=0. |
| Интересно, что переменная перечисляемого типа может быть счетчиком в |
|цикле "с параметром". |
|Пример: |
|Program T1; |
|Type |
| Colors = (Black, Blue, Green, Cyan, Red, Magenta, Brown, Yellow, |
|White); |
|Var |
| C1,C2 : Colors; |
|Begin |
|C1:=Green; |
|C2:=Red; |
|Writeln(Ord(C1), Ord(Succ(C2))) |
|End. |
| Во время выполнения на экране появятся числа "2" и "5", что |
|соответствует номерам значений Green и Magenta. |
| Следующий тип, который можно определить в программе - тип-диапазон. |
| Здесь не нужно перечислять все значения этого типа, потому, что |
|возможными для него являются значения поддиапазона уже определенного до |
|него любого порядкового типа (стандартного или описанного ранее |
|перечисляемого типа). Достаточно лишь указать начальную и конечную величину|
|отрезка порядкового типа. Единственное условие: начальное значение не |
|должно превышать конечное. |
| Формат описания отрезочного типа: |
|Type |
| =..; |
|Примеры: |
|Type |
|Age=0..150; {Целое число в интервале от 0 до 150} |
|Lat='A'.. 'Z'; {Заглавные буквы латинского алфавита} |
|Month=(January, February, March, April, May, June, July, August, September,|
|October, November, December); |
|Spring=March..May; {Весенние месяцы} |
| Есть еще одна возможность определить новый тип, о существовании |
|которой можно было бы и догадаться. |
|Type |
| =; |
|Пример: |
|Type |
| Number=Byte; |
| |
|Массивы |
| До сих пор мы рассматривали переменные, которые имели только одно |
|значение, могли содержать в себе только одну величину определенного типа. |
|Исключением являлись лишь строковые переменные, которые представляют собой |
|совокупность данных символьного типа, но и при этом мы говорили о строке, |
|как об отдельной величине. |
| Вы знаете, что компьютер предназначен в основном для облегчения работы|
|человека с большими информационными объемами. Как же, используя только |
|переменные известных вам типов, сохранить в памяти и обработать данные, |
|содержащие десяток, сотню, тысячу чисел или, к примеру, строк? А ведь такие|
|задачи встречаются в любой области знания. Конечно, можно завести столько |
|переменных, сколько данных, можно даже занести в них значения, но только |
|представьте, какой величины будет текст такой программы, сколько времени |
|потребуется для его составления, как много места для возможных ошибок? |
|Естественно, об этом задумывались и авторы языков программирования. Поэтому|
|во всех существующих языках имеются типы переменных, отвечающие за хранение|
|больших массивов данных. В языке Паскаль они так и называются: "массивы". |
| Массивом будем называть упорядоченную последовательность данных одного|
|типа, объединенных под одним именем. Кстати, под это определение подходит |
|множество объектов из реального мира: словарь (последовательность слов), |
|мультфильм (последовательность картинок) и т. д. Проще всего представить |
|себе массив в виде таблицы, где каждая величина находится в собственной |
|ячейке. Положение ячейки в таблице должно однозначно определяться набором |
|координат (индексов). Самой простой является линейная таблица, в которой |
|для точного указания на элемент данных достаточно знания только одного |
|числа (индекса). Мы с вами пока будем заниматься только линейными |
|массивами, так как более сложные структуры строятся на их основе. |
| Описание типа линейного массива выглядит так: |
| Type =Array [] Of ; |
| В качестве индексов могут выступать переменные любых порядковых типов.|
|При указании диапазона начальный индекс не должен превышать конечный. Тип |
|элементов массива может быть любым (стандартным или описанным ранее). |
| Описать переменную-массив можно и сразу (без предварительного описания|
|типа) в разделе описания переменных: |
| Var : Array [] Of ; |
Страницы: 1, 2, 3, 4, 5
|