Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii.doc
Скачиваний:
59
Добавлен:
31.03.2015
Размер:
773.63 Кб
Скачать

Лекции 3-4: Базисные конструкции языка.

1.Общая характеристика языка Pascal.

2. Алфавит языка, основные конструкции языка.

3. Структура программы.

4. Стандартные типы данных, операции, выражения.

1.Общая характеристика языка Паскаль.

Язык Паскаль в его современном воплощении (TURBO PASCAL 7.0, OBJECT PASCAL 9.0) -это весьма мощный язык, содержащий многие десятки различных и весьма полезных конструкций. Изучить все его возможности в таком кратком курсе, как наш, нереально.

Одним из фундаментальных свойств Паскаля является его сильная типизация. Это означает, что каждый элемент обрабатываемых данных жёстко связан с соответствующим типом данных, т.е. каждый элемент данных имеет один и только один тип, а каждая операция имеет фиксированные типы для своих операндов и результата. Типизация данных помогает контролировать (в том числе автоматически) многие ошибки в данных и операциях, оптимально распределять память, что упрощает создание высокоэффективных трансляторов. Не все языки программирования поддерживают сильную типизацию (например, Basic, C её игнорируют).

Замечание

Некоторые конструкции Турбо Паскаля отходят от принципа сильной типизации (нетипизированные указатели, файлы, открытые массивы и др.), однако это скорее исключение из общего правила. В основном данные сильно типизированные.

Для того чтобы использовать преимущества, которые даёт сильная типизация, необходимо в программе описывать все вводимые программистом имена обрабатываемых структур данных и других объектов до того, как они используются в процессах обработки. Для этого в структуре программы предусмотрен раздел описаний. Транслятор Паскаля устроен таким образом, что он не позволяет использовать данные, которые предварительно неописаны.

Другой важной стороной типизации является наличие в Паскале развитого механизма создания новых типов самим программистом, что также отличает Паскаль от многих других языков. Собственно этот механизм является сердцевиной Паскаля, обеспечивая чрезвычайную гибкость языка. Мы познакомимся с ним постепенно, начиная с конструирования простых типов и до конструирования объектов как расширения типа.

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

Однако не следует обольщаться! Программирование на Паскале (как впрочем, и на любом другом языке) не даётся само собой! Для программирования необходимо овладеть основами языка и методики разработки программ. Необходимо научиться "читать" программы (понимая смысл написанного!), а затем и "писать" собственные (пусть вначале и несложные) программы. Не следует думать, что вы легко сможете постичь и то и другое сразу. Поэтому важно на первых этапах сосредоточиться на изучении основ языка, т.е. научиться "читать программы". Этот процесс естественен при изучении любого языка.

К изучению Паскаля следует относиться как к изучению нового для вас языка (аналогичного скажем английскому) и понять, что означают отдельные его слова, а затем и фразы (операторы и другие фрагменты) и как правильно их записывать. Если ассоциация с английским языком вызывает у вас волнения, то хочу успокоить. Паскаль много проще английского языка, и изучить его основы можно за относительно небольшой срок и с несравненно меньшими усилиями. В нём нет двусмысленных или расплывчатых конструкций, времён, склонений или спряжений. Паскаль, как язык программирования, - это язык записи действий (алгоритмов и структур данных). Каждой его конструкции приписывается однозначный смысл (часто независящий от "окружения"), а правила записи конструкций во многом сходны с императивами (командами, указаниями, инструкциями) естественного языка.

При чтении программ на Паскале ключевым принципом является принцип программного управления. Важно помнить, что за исключением описаний каждая законченная конструкция программы - это оператор, представляющий некоторое алгоритмическое действие. Операторы отделяются друг от друга точкой с запятой (в специальных случаях этот разделитель может опускаться) и выполняются в той последовательности, в которой они записаны (если сам оператор не изменяет эту последовательность).

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

2. Алфавит языка, ключевые слова, идентификаторы.

Любой язык, в том числе и Паскаль, начинается со своего алфавита - "кирпичей", из которых строятся все конструкции языка.

Алфавитом Паскаля являются некоторые символы кодовой таблицы ASCII, которым в Паскале приписан определённый (и фиксированный смысл), а также некоторые цепочки символов. В алфавит входят все латинские (большие и малые) буквы, десятичные цифры, специальные символы и зарезервированные (ключевые) слова. К специальным символам относятся символы операций (+,-, *, /), бинарных отношений (=,>,<,), скобки (простые, квадратные, фигурные), разделительные символы (., :; ), кавычки (''), а также символы ^,@, $, #. Кроме того, к алфавиту относятся некоторые пары символов (рассматриваемые как неделимые): <> - символ неравенства, >= и <= - больше или равно (меньше или равно), := - символ присваивания.

Дополнительную группу символов алфавита составляют ключевые слова (зарезервированные слова). Их в Паскале несколько десятков и мы будем знакомиться с ними постепенно по мере изучения конструкций языка. Примерами ключевых слов (которые потребуются нам в ближайшее время) являются program, begin, end, var. Эти и некоторые другие последовательности символов ASCII зарезервированы в Паскале, им приписан фиксированный смысл (например, begin - открывающая операторная скобка) и использовать их в другом смысле нельзя. Мы будем выделять ключевые слова полужирным шрифтом.

Заметим, что русские буквы не являются элементами алфавита Паскаля, как и некоторые другие символы кодовой таблицы. Это не значит, что их нигде нельзя использовать, но их использование в программах на Паскале ограничено только определенными конструкциями, о которых мы ещё поговорим особо.

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

Замечание

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

Паскаль - формальный язык, основная цель которого - представление алгоритма решаемой задачи. Поэтому аналогия с естественным языком (цели которого значительно шире), конечно, ограничена. Каждая конструкция Паскаля имеет свой точный смысл, и изучение конструкций Паскаля имеет две стороны: во-первых, это изучение синтаксиса конструкций (т.е. правил их записи), с другой стороны - изучение смысла конструкций.

Для описания синтаксиса мы будем использовать простые формальные средства - нотацию Бэкуса-Наура, а для описания семантики - пояснения на естественном языке.

Нотация Бэкуса-Наура (называемая также БНФ) описывает синтаксис конструкций языка через небольшое число примитивов:

Метаопределение - заключённое в угловые скобки название конструкции (название может рассматриваться как комментарий конструкции). Примеры: <буква>, <ключевое слово>, <литерал>, <комментарий>. При этом последовательность символов, не заключенная в угловые скобки, рассматривается буквально (т.е. только как последовательность написанных символов).

Равенство по определению будем обозначать сочетанием 3 символов ::=

Альтернативный выбор (союз "или") будем обозначать символом |

Необязательный выбор конструкции будем заключать в квадратные скобки [ ]

Повторяющуюся (нуль или более раз) конструкцию будем заключать в фигурные скобки { }.

Введённых примитивов вполне достаточно для синтаксического определения конструкций языка Паскаля, которые нам предстоит рассмотреть. Продемонстрируем введённые примитивы рядом примеров описания используемых далее конструкций языка Паскаль.

Синтаксическое определение понятия "цифра":

<цифра> ::= 0|1|2|3|4|5|6|7|8|9

Синтаксическое определение понятия "литерал ":

<литерал> ::= ' {< символ кодовой таблицы >} '

Синтаксическое определение понятия "комментарий":

{ < строка символов ASCII, не содержащая символов { и } > }

Одной из важных конструкций Паскаля является идентификатор (имя). Имя может обозначать переменную, функцию, тип данных или другие элементы программы. Понятие имени во многом аналогично его использованию в естественном языке и является одним из фундаментальных понятий языка.

В языках программирования имена часто используются для обозначения переменных, т.е. объектов, способных изменять своё значение в процессе выполнения программы. В Паскале имена могут использоваться даже для обозначения именованных констант (мнемоническое имя константы, которое легче запомнить, чем значение константы).

Имена (кроме стандартных имён) выбирает программист в процессе разработки программы и этот выбор должен облегчать чтение текста программы: имя должно "говорить само за себя" - пояснять смысл используемого объекта. При этом имена должны быть одновременно и достаточно выразительными и достаточно лаконичными (краткими). Синтаксические ограничения в выборе имени даёт определение имени:

<имя> ::= <латинская буква или символ _> { < латинская буква >| <цифра >| _ }

Примеры имён: alfa, F1, test_1m; неправильные имена: тест1, 2_vol.

Некоторые имена являются стандартными именами Паскаля. К их числу относятся имена стандартных функций, процедур, типов и др. Следует особо отметить, что стандартные имена не являются ключевыми словами (т.е. они могут быть использованы в ином смысле, хотя это не следует делать без особой надобности !). Примеры таких стандартных имён: write, odd, integer, boolean. Заметьте, что русские буквы нельзя использовать в именах Паскаля!

Существуют только три конструкции Паскаля, в которых разрешено использовать любые символы (в том числе и русские буквы):- это символьные константы, строковые константы (литералы) и комментарии.

Символьные и строковые константы - это, соответственно, один символ или любые последовательности символов кодовой таблицы, заключенные в апострофы. Пример: ' Это - строка символов'. Литералы - важные конструкции языка, с которыми мы будем еще неоднократно иметь дело. Они используются в операторах ввода-вывода и при обработке строк.

Комментарии - любые последовательности символов кодовой таблицы (не содержащие фигурных скобок), заключенные в фигурные скобки. Пример комментария: { Программа на TURBO PASCAL}. Заметим, что фигурные скобки есть ограничитель для комментариев, и использовать их ни в каком другом смысле нельзя.

Замечание

Некоторые комментарии зарезервированы и представляют директивы компилятора. Эти комментарии начинаются символом $. Например: {$R+} -включить контроль границ диапазона.

Незарезервированные комментарии вы вправе использовать в любом месте программы. Такие комментарии следует использовать для пояснений текста программы, делая этот текст более понятным. Никаких других функций эти комментарии в программе на Паскале не несут.

3. Структура программы.

Любая программа на Турбо Паскале имеет одну и ту же общую структуру:

[ program < имя программы > ; ]

[ <раздел описаний > ]

begin

< раздел операторов >

end.

Эта структура состоит из заголовка программы (необязательного), раздела описаний (который может в особых случаях отсутствовать) и раздела операторов, содержащего хотя бы один оператор.

Заголовок начинается ключевым словом program и имеет единственное назначение - идентифицировать программу. Мы в дальнейшем всегда будем его использовать. Имя программы - идентификатор, выбираемый программистом.

В разделе описаний должны быть описаны все нестандартные имена, используемые далее в разделе операторов этой программы. Раздел описаний реализует принцип сильной типизации, согласно которому каждый используемый объект должен быть описан и каждый объект может быть только одного типа. Описанию подлежат: типы, метки, переменные, именованные константы, процедуры, функции, модули, объекты (классы). Синтаксическая форма описаний зависит от вида описываемого объекта. Общие свойства описаний:

 Каждый вид описания начинается некоторым ключевым словом (характеризующим вид описываемого объекта). Например: var - для описания переменных, type - для описания типов, function - для описания функции.

 Порядок описаний произвольный (за исключением uses -описания используемых модулей, которое должно быть первым описанием в программе).

 Объекты со стандартными именами не описываются (они считаются уже описанными), если эти объекты используются в их стандартном смысле.

Остановимся более подробно на форме описания для переменных и констант. Описание переменных программы использует следующую синтаксическую структуру:

<описание переменных одного типа > ::= var < список переменных > : < тип > ;

где: < список переменных > ::= <имя переменной > {, < имя переменной > }

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

var math,phys,phil,hist:integer;{баллы по предметам}

average:real; {средний балл}

Константы следует описывать только, если в программе используются ссылки на эти константы по их мнемоническому имени. Синтаксическая структура описания константы имеет вид:

< описание константы > ::= const < имя константы> = < значение константы > ;

Например: const g = 9.8;

Допустим также промежуточный между переменной и константой вид, называемый типизированной константой. По своей сути - это переменные с начальным значением (инициализированные переменные), использование которых часто представляет большие удобства. Синтаксическая структура описания этих констант:

< описание типизированной константы > ::= const < имя >:<тип> = <значение >;

Например: const name:string = ''; { name, инициированная как пустая строка }

Типизированные константы инициализируются только в начале работы программы, а при выходе из подпрограмм сохраняют прежние значения.

В разделе операторов (заключенных в операторные скобки begin - end) записываются операторы, реализующие алгоритм программы. В последовательности операторов один оператор отделяется от другого символом ; (точка с запятой).

Замечание

Точка с запятой после оператора, за которым следует end, until может быть опущена.

Оператор представляет самостоятельный элемент действия. Операторы Паскаля могут быть простыми либо составными. Простые операторы – “не расщепляются” на более мелкие операторы, а составные операторы, наоборот, содержат в своем составе другие (простые или составные) операторы. Таким образом, сложные операторы (а, следовательно, и сложные действия) имеют вложенную структуру, комбинирующую в одну конструкцию более простые операторы. Для объединения операторов в сложный оператор помимо последовательного соединения используют и другие важные способы композиции (условные операторы, циклы и др.), которые мы рассмотрим ниже.

Замечание

Следует различать понятия "оператор" и "операция". Операция в Паскале не является самостоятельным элементом действием. Она может лишь входить в состав операторов. В операциях используют другой способ композиции - суперпозицию, т.е. подстановку операций в качестве операндов в другие операции (при соответствии типов).

Раздел операторов (как и вся программа) заканчивается символом точка. Этот символ ограничивает текст программы, так что вся последующая информация (если она есть), не воспринимается компилятором и не вызывает никаких действий.

Заметим также, что в структуре программы могут использоваться комментарии (их разрешается вставлять в любую точку структуры программы). Для создания ясных, понятных, легко читаемых текстов программ рекомендуется использовать комментарии для пояснения смысла всей программы (а также функций, процедур, модулей), переменных (особенно входных и выходных), отдельных фрагментов вычислений.

4. Стандартные типы данных, операции, выражения.

Хотя в Турбо Паскале имеется много различных стандартных типов, для простых программ (с которых мы начинаем изучение конструкций Турбо Паскаля) будет достаточно знание лишь 5 стандартных типов:

integer - целые числа;

real - вещественные числа;

char - символьный (литерный) тип;

string - строковый тип;

boolean - булевский (логический) тип.

Целые числа типа integer - это числа диапазона -32768 .. 32767, над которыми допустимы обычные операции арифметики: сложения (+), вычитания (-), умножения (*). Для целочисленного деления предусмотрена операция div, а для получения остатка от деления (остатка по модулю) - операция mod. Примеры: 42 div 8 даёт результат 5, а операция 42 mod 8 даёт результат 2. Константы типа integer - обычные целые числа возможно со знаком. В этих числах недопустимы точка или запятая.

Синтаксическое определение целых чисел имеет вид:

< целое число > ::= [ -| + ] { < цифра > }

В отличие от целых чисел вещественные числа типа real представляются в памяти компьютера приближенно. Константы типа real - числа, возможно с дробной частью (отделяемой от целой части точкой). Дробная часть у этих чисел может и отсутствовать. Например:

1.072359001E -0018 { число, соответствующее 1.072359001*10-18 }

Операции сложения, вычитания, умножения для типа real обозначаются теми же символами, что и для чисел типа integer. Операция деления обозначается символом / и является делением с остатком (результатом является также число типа real).

Типы real и integer - это существенно различные типы чисел. Однако имеются и операции, которые преобразуют типы данных, такие как round(x) - округление вещественного числа x до ближайшего целого, trunc(x) - отбрасывание у вещественного числа x дробной части.

Для типов integer и real допустима также операция возведения в квадрат sqr, и извлечения квадратного корня sqrt (результатом этой операции всегда является число типа real, если этот результат существует).

Символьный тип имеет своими значениями (константами) символы кодовой таблицы ASCII (всего 256 символов). Некоторые из этих символов имеют привычное изображение и могут использоваться как элементы различных текстов (например, буквы, цифры, разделительные символы). Это - информационные символы. Однако в кодовой таблице есть и управляющие символы - неотображаемые при печати текстов (например, символ конца страницы, конца строки, табуляции и др.). Константы информационных символов представляются как символы, заключенные в апострофы. Например: 'G', 'П', 'k', 'л', '4'. Заметим, что '4' не является числом 4, это - символ 4. Важнейшие функции над символами: это ord - преобразование символа в код (номер символа в кодовой таблице) и chr - преобразование кода в символ. Вместо функции chr можно также использовать операцию, обозначаемую знаком #. Например #9 - табуляция, #12 - прогон страницы, #68 - символ 'D'. Таким образом, операция # даёт более универсальный способ представления символов кодовой таблицы.

Строковый тип имеет своими значениями (константами) последовательности символов кодовой таблицы (в том числе и одиночные символы). Строковые константы, как и символьные константы, заключаются в апострофы. Тип string включает все строки длиной до 255 символов, в том числе пустую строку, обозначаемую как ''. В строковом типе можно указывать максимальную длину строки, меньшую 255 в форме string[<длина>], где <длина> - целое число без знака, не превышающее 255. Основная операция над строками - операция сцепления (конкатенация), обозначаемая символом +. Она присоединяет к концу первой строки вторую строку. Например: 'Турбо' +' Паскаль' дает результатом строку 'Турбо Паскаль'.

Замечание

Символ апостроф ' в строке символов представляется парой апострофов. Например: 'Это есть '' - апостроф'.

Булевский (логический) тип Boolean содержит всего лишь два значения - true и false, обозначающие соответственно истинное и ложное значение. Значение типа Boolean часто используется для результата бинарных отношений между числами (типов integer или real), символами или строками. Это уже упоминаемые выше 6 отношений: <, <=, >, >=, =, <>.

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

Для символов - это отношения между кодами символов как целыми числами. Для строк - отношения для лексикографического порядка на строках. Лексикографический порядок строк - упорядоченность строк в соответствии с порядком кодов символов при сравнении строк посимвольно слева направо (короткая строка выравнивается до длинной строки добавлением пробелов справа).

Например: 'Турбо' < 'Турбо Паскаль' даёт результатом true, а 'F'>'G' - false.

Для данных типа Boolean допустимы булевские операции and, or, xor, not , представляющие связки "И", "ИЛИ", "ИСКЛЮЧИТЕЛЬНО ИЛИ", "НЕ" в соответствии с таблицей:

Таблица 1. Таблица истинности булевских операций.

x1

x2

x1 and x2

x1 or x2

x1 xor x2

not x1

True

true

true

true

false

false

True

false

false

true

true

false

False

true

false

true

true

true

False

false

false

false

false

true

Эти операции позволяют представлять более сложные отношения, в частности цепочки бинарных отношений. Например: (4<7) and (7<10) представляет цепочку отношений 4<7<10.

Замечание

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

Рассмотренные выше операции над значениями стандартных типов являются частными случаями более общей конструкции, называемой выражением. Аналогом выражения является формула для вычисления значений. Выражение может содержать константы, переменные, операции (или функции), а также круглые скобки. Как и для операций, выражение вычисляет значение некоторого фиксированного типа в качестве своего результата. Тип результата называется типом выражения. Так могут быть выражения целого типа, вещественного типа, символьные, строковые выражения, и, наконец, булевские (логические) выражения.

Например: (4+ alfa)*3*(5-sqr(x-1)) - выражение типа integer (если alfa и x - переменные типа integer) либо типа real (если хотя бы одно из alfa и x имеют тип real).

В Турбо Паскале выражение - промежуточная конструкция, используемая для построения операторов.

Для некоторых из рассмотренных выше операций типы операндов не являются строго фиксированными. Это имеет место в частности, для арифметических операций (+, -, *, sqr) и для сцепления строк (+). В этих случаях действуют правила автоматического преобразования типов в выражениях:

 Если в арифметических операциях или в бинарных отношениях между числами операнды имеют различные типы (real и integer), то операнд типа integer автоматически преобразуется к типу real;

 Если в операции сцепления строк или в бинарных отношениях между строками операнды имеют различные типы (string и char), то операнд типа char автоматически преобразуется к типу string[1].

Заметим, что автоматические преобразования типов односторонние:

integer  real или char  string[1] .

Обратные преобразования не выполняются автоматически. Для явного выполнения преобразований между типами могут использоваться соответствующие процедуры или функции. Особо отметим стандартные процедуры преобразования между числами и строками:

Str(x, st) -преобразование числа х (вещественного или целого типов) в строку st.

Val(st, x, err) -преобразование строки st в число х (целое или вещественное) (err =0 при отсутствии ошибки преобразования).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]