You are on page 1of 41

Лекция 1.

Обзор

Язык Turbo Pascal


Язык программирования Pascal это:
• Алгоритмический язык программирования высокого уровня
• Разработан Никлаусом Виртом в 1970 году для обучения студентов
программированию.
• Хорошо структурированный язык с жестким контролем типов данных
В дальнейшем под языком Pascal будем подразумевать Turbo Pascal.

Алгоритмы
Слово «алгоритм» происходит от имени узбекского математика Хорезми
(по арабски ал - Хорезми), который в IX веке разработал правила 4-х
арифметических действий над числами в десятичной системе счисления.
Алгоритм - точное предписание по выполнению ограниченного числа
определенных действий, последовательно преобразующих исходные данные
в конечный результат.
Совокупность действий по преобразованию исходных данных в
конечный результат составляет процесс выполнения алгоритма, называемый
вычислительным процессом или просто процессом. Тот кто выполняет
алгоритм называется процессор (человек или часть ЭВМ). Алгоритм,
предназначенный для выполнения ЭВМ называется программой.
Алгоритм обладает следующими свойствами:
• дискретностью - алгоритм состоит из конкретных действий;
• определенностью - точностью, не оставляющей место для произвола,
т.е. алгоритм понятен для возможных исполнителей благодаря этому
свойству процесс выполнения алгоритма носит механический характер;
• результативностью - свойством приводить к искомому результату за
конечное число действий (шагов);
• Массовостью - пригодностью для решения задач из некоторого класса.

1
Пример
Дано X, Вычислить 3x2+6x+2. Допустимые операции - сложение и
умножение 2-х чисел. Т.о. есть предпосылки для разработки алгоритма:
• исходные данные - X;
• действия - сложение, умножение, которое применительно к выражению
3x2+6x+2 дадут искомый результат.
Т.к. среди действий нет возведения в степень выражение необходимо
записать в виде 3xx+6x+2.
Получим следующий алгоритм:
начало;
вычислить X× X, результат обозначить через Y;
вычислить 3× 4, результат обозначить через Z;
вычислить 6× X, результат обозначить через W;
вычислить Z+W, результат обозначить через U;
вычислить U+2, результат обозначить через S;
конец;

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

2
FORTRAN
1954

Lisp
1958 COBOL
Algol 60 1959
1960
(первая версия –
1958)

CPL
1963 BASIC PL/1
1964 1964

BCPL Algol W Simula 67


1967 1967 1967

Algol 68
1968
B
1969
Pascal Prolog
1970 1970

C
1971 Smalltalk 72
1972
Modula
1975
UCSD Pascal
1976

Modula 2 Ada
1979 1979
Turbo Pascal
1981

C++
1983 Object Pascal
1985
Perl Oberon
1987 1987

Python Oberon 2
1991 1991

Java Delphi PHP


1995 1995 1995

C#
2000

Рис. Эволюция языков программирования

3
Структурное программирование
Э. Дэйкстра (60-е годы):
Для любой простой программы можно построить функционально
эквивалентную ей структурную программу, т.е. программу,
сформированную на основе фиксированного базисного множества,
включающего:
• структуру последовательного действия,
• структуру выбора одного из двух действий
• структуру цикла, то есть многократного повторения некоторого
действия с проверкой условия остановки повторения.
Простая программа – ровно один вход и один выход.

Базисные конструкции:

Стандартизация и линейность программы – снижение сложности.

Некоторые соображения:
• Алгоритм должен иметь 1 вход и 1 выход.
• Никаких goto.
• Нет зависимости от языка программирования.

4
• Ясен набор операторов, который необходим в языках
программирования.

Операторы
В языке Pascal предусмотрены следующие операторы:
• оператор присваивания
• составной оператор
• пустой оператор
• условный оператор (ветвление)
• оператор варианта (ветвление)
• оператор цикла с предусловием (повтор)
• оператор цикла с постусловием (повтор)
• оператор цикла с параметром (повтор)
• присоединения
• оператор процедуры
Язык Pascal обладает всеми необходимыми средствами для реализации
структурной технологии программирования.

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

[Program <Имя программы>;]


[Uses <Имена подключаемых модулей>;]
[Label <Список меток>;]
[Const <Объявления констант>;]
[Type < Объявления типов>;]
[Var < Объявления переменных>;]
[<Раздел подпрограмм>]
Begin
[<Операторы>]
End.

5
Разделы, заключенные в квадратные скобки, являются необязательными.
Таким образом, минимальная синтаксически допустимая программа
выглядит следующим образом:

Begin
End.

Нетрудно догадаться, что эта программа будет компилироваться и


запускаться (сразу же завершая свою работу), но никаких действий
выполнять не будет.
Более осмысленный пример на языке Pascal:

program Summa;
var
A,B,Sum : integer;
begin
Wгitе(’Введите два числа: ‘);
Readln(A,B);
Sum :=А+В;
Wгitеln(’Сумма равна’,Sum);
Wгitе(’Нажмите Enter’);
Readln;
end.

Для запуска программы из среды Turbo Pascal выберите команду Run в


меню Run. Вы попадете в окно пользователя, появится сообщение:
Введите два числа:
Наберите два любых целых числа с пробелом между ними и нажмите
Enter. Появится следующее сообщение:
Сумма равна
а за ним - сумма двух чисел. В следующей строке появится сообщение:
Нажмите клавишу Enter

6
Программа будет ожидать нажатия клавиши Епtег. Для наблюдения за
выводом из своей программы, выберите команду User Screen в меню Window
(или нажмите Аlt-F5).
Любые данные, т.е. константы, переменные, значения функций или
выражения, в турбо Паскале характеризуются своими типами. Тип
определяет множество допустимых значений, которые может иметь тот или
иной объект, а также множество допустимых операций, которые применимы
к нему. Кроме того, тип определяет также и формат внутреннего
представления данных в памяти ПК.

Операции языка Pascal и их приоритеты

Операции языка Pascal

Унарные

Бинарные

Аппликативные

Мультипликативные

Операции отношения

На этом рисунке приведены группы операций в порядке убывания их


приоритетов. Внутри группы приоритет операций одинаков.

Объявление переменных

var
<имя переменной>:<имя типа1>;
<имя1>[,<имя2>,…]:<тип2>;

var
a,b:integer;
ch:char;

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

Типы данных

Простые

Порядковые

Символьный

Целочисленные

Перечисление

Логический

Диапазон

Вещественные

Структурированные

Массивы

Строки

Записи

Файлы

Указатели

8
Лекция 2. Эволюция языков программирования

История языков развития программирования тесным образом связана с


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

Все основные идеи, которые лежат в основе работы компьютеров, были


изложены еще в 1833 году английским математиком Чарльзом Бэббиджем
(1791-1871). Он разработал проект машины для выполнения научных и
технических расчетов, где предугадал основные устройства современного
компьютера, а также его задачи. Управление такой машиной должно было
осуществляться программным путем. Для ввода и вывода данных Бэббидж
предлагал использовать перфокарты. В то время перфокарты уже
использовались в текстильной промышленности.

Первый язык программирования разработала Лавлейс Огаста Ада Кинг


(1815 – 1852) для машины Бэбиджа.
В комментариях к описанию машины, изданном в 1843 году, введены
понятия «операция», «переменная», «условный переход», «цикл». Приведена
программа для решения системы двух линейных уравнений с двумя
неизвестными

В 1888 году американский инженер Герман Холлерит сконструировал


первую электромеханическую счетную машину. Эта машина, названная
табулятором, могла считывать и сортировать статистические записи,

9
закодированные на перфокартах. В 1890 году изобретение Холлерита было
впервые использовано в 11-й американской переписи населения. Работа,
которую пятьсот сотрудников выполняли в течение семи лет, Холлерит
сделал с 43 помощниками на 43 табуляторах за один месяц.
В 1896 году Герман Холлерит основал фирму Computing Tabulating
Recording Company, которая стала основой для будущей International Business
Machines Corporation (IBM).

В 1946 в США была создана первая электронная вычислительная


машина (ЭВМ) - ENIAC (Electronic Numerical integrator and Computer -
Электронный числовой интегратор и компьютер). Разработчики: Джон Мочи
(John Маuchу) и Дж. Преспер Эккерт (J. Prosper Eckert).
Он был произведен на свет в Школе электрической техники Moore (при
университете в Пенсильвании).
Время сложения - 200 мкс, умножения - 2800 мкс и деления - 24000 мкс.
Компьютер содержал 17468 вакуумных ламп шестнадцати типов, 7200
кристаллических диодов и 4100 магнитных элементов. Общая стоимость
базовой машины - 750000 долларов.

В Советском Союзе первая электронная цифровая вычислительная


машина была разработана в 1950 году под руководством академика
С.А. Лебедева в Академии наук Украинской ССР. Она называлась «МЭСМ»
(малая электронная счётная машина).

Основоположниками компьютерной науки по праву считаются Клод


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

10
основных информационных процессов. Основателем кибернетики является
американский математик Норберт Винер.

Развитие ЭВМ делится на несколько периодов. Поколения ЭВМ каждого


периода отличаются друг от друга элементной базой и математическим
обеспечением. Первое поколение (1945-1954) - ЭВМ на электронных лампах.
Их быстродействие не превышало 2—3 тыс. операций в секунду,
оперативная память не превышала 2 Кб.
Машинно-зависимые языки программирования низкого уровня –
двоичные машинные коды, Автокод, языки Ассемблера.

Таблица 1.

Год Язык (идея) Создатель ЭВМ Заметки о языке


46 Плюнкалкюль Цузе Z4 Немецкий инженер Цузе разработал этот язык
для ЭВМ Z4, но ни компилятора, ни
интерпретатора для него написано не было
(поскольку и язык, и ЭВМ он разрабатывал в
одиночку).
49 "Краткий код" Мочли Юнивак По своей сути, это была система обозначений
для быстрого ввода в ЭВМ алгебраических
выражений."Краткий код" работал как
примитивный интерпретатор.
49 Идея Грейс Марк-1 Программисты под руководством Хоппер
подпрограммы Хоппер впервые во всем мире реализовали идею
подпрограмм как многократно используемую
последовательность команд. Тогда они просто
переписывали куски машинного кода друг у
друга из блокнотов.
50 Ассемблер Грейс Эдсак Первый ассемблер представлял из себя
Хоппер систему мнемонических обозначений,
объединённую с библиотекой подпрограмм

11
52 АВТОКОД Гленн Марк-1 Автокод был первым полноценным
транслятором (компилятором), т.е. он
транслировал мнемоническую схему в
машинные коды.
52 А-0 Грейс Юнивак А-0 был первым полноценным ассемблером,
Хоппер получившим широкую известность. Он
предоставлял услуги как компилятора, так и
компоновщика.По сути, А-0 представлял
первое промышленное средство для создания
других программ.
56 B-0 Грейс Юнивак Хоппер создала первый ассемблер, который
Хоппер понимал мнемонические команды.

ЭВМ 2-го поколения были разработаны в 1950—60 гг. В качестве


основного элемента были использованы уже не электронные лампы, а
полупроводниковые диоды и транзисторы, а в качестве устройств памяти
стали применяться магнитные сердечники и магнитные барабаны - далекие
предки современных жестких дисков. Второе отличие этих машин — это то,
что появилась возможность программирования на алгоритмических языках.
Были разработаны первые языки высокого уровня - Фортран, Алгол, Кобол.

Таблица 2.

Год Язык (идея) Создатель ЭВМ Заметки о языке


54 FORTRAN Бэкус IBM-704 Был первым языком программирования
высокого уровня. Разрабатывался компанией
IBM для её новой ЭВМ.Коллектив под
руководством Бэкуса разработал не только
спецификацию языка, но и создал компилятор
для него. Это обеспечило достаточно быструю
и широкую распространенность языка.Кроме
того, Фортран был первым языком, для
которого были разработаны компиляторы для
разных ЭВМ (т.е. программа могла
12
выполняться на различных ЭВМ).Лучше всего
Фортран подходит для решения инженерных и
расчетных задач.

58 ALGOL – 58 Первая спецификация Алгола была рождена


европейским международным комитетом.
59 “CSC” – первая В 59 году в США появилась первая компания,
компания по занимающаяся созданием промышленных
разработке ПО программ.
59 БНФ Бэкус, Наур Для описания спецификации Алгола Бэкус
создал специальную систему – “нормальную
форму”. Чуть позже эта система была
уточнена Науром.
59 CODASYL Министерство обороны США создало
организацию CODASYL, главным
назначением которой было создание нового
языка, ориентированного на бизнес –
приложения.
60 ALGOL – 60 Бэкус Новая спецификация Алгола, которую
отличали следующие идеи:
• Блочная структура
• Возможность рекурсии
• Описание с использованием БНФ
59 COBOL CODASYL Стандарт языка, принятый для создания
коммерческих приложений
58 Lisp Маккарти Язык для исследований в области
искусственного интеллекта, предназначенный
для работы со списками и лямбда –
выражениями (был создан в МТИ).

Разработка в 60-х годах интегральных схем - целых устройств и узлов из


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

Таблица 3.

Год Язык (идея) Создатель ЭВМ Заметки о языке


64 ПЛ/1 Рэдин (IBM) Универсальный язык программирования,
разрабатывавшийся для системы System/360.
64 БЭЙСИК Кемени, Был разработан в Дартмундском колледже
Курц как язык для обучения работе с
компьютером студентов всех
специальностей (и технических, и
гуманитарных). Начал разрабатываться в 59-
60х годах, когда существовал только
Фортран. Отличия от Фортрана:
o операторы ввода/вывода
o единая система чисел (без различия на
целые/вещественные)
Одновременно с разработкой языка велась
разработка ЭВМ, которая работала бы не в
пакетном режиме, а в режиме разделения
времени (отсюда – необходимость
операторов ввода. Позже появится и
структурно-ориентированный стандарт
TrueBASIC.
66 АЛГОЛ – W Хоар, Вирт Новый стандарт языка, который был
предложен Хоаром и Виртом как
альтернатива существующей спецификации
(буква W – от фамилии Вирт).
68 АЛГОЛ – 68 Этот вариант Алгола очень не понравился
Вирту.
68 Статья о Дейкстра В этой статье Дейкстра доказывал вредность
структурном оператора “GOTO” (т.к. он нарушает
программирован последовательность операторов) и
ии показывал, что любая программа может быть
написана с использованием 3-х структур:
• Последовательность

14
• Альтернатива
• Повторение
69 AПЛ Кеннет Очень компактный универсальный язык
Айверсон программирования. Именно для этого языка
(IBM) была организация ACM открыла первую
SIG(Software Interest Group).
70 ПАСКАЛЬ Никлаус Был разработан Виртом как
Вирт противопоставление Алголу-68. Язык с
высокой структурированностью. До сих пор
– лучший язык для обучения
программированию.
71 ФОРТ Чарльз Мур Самый компактный язык программирования.
Обладает высокой степенью расширяемости.
Первое промышленное применение –
управление радиотелескопами.
72 С Керниган, Язык был разработан для написания
Ричи, операционной системы UNIX. В рекламных
Bell Lab. целях UNIX в университетах
распространялся почти бесплатно, вместе с
UNIX’ом распространялся и С. До сих пор С
– один из лучших языков для системного
программирования.
72 ПРОЛОГ Алан Логический язык программирования, в
Колмери котором описываются факты и отношения
между ними.
75 HOLWG Уайтекер HOLWG – рабочая группа по управлением
Уайтекера, была создана Пентагоном для
получения языка, который мог бы
использоваться на всех компьютерах
министерства обороны США. Результатом в
79 году стал язык Ада.
76 UCSD Pascal Кеннет Боулз Apple II Введены модули
79 АДА Жан Ихбиа Универсальный язык программирования,
был разработан по заказу МО США. После
создания вышло требование переписать все
существующие приложения на Аде.
81 Turbo Pascal Андерс

15
Хейлсберг

Обычно считается, что период с 1975 г. принадлежит компьютерам


четвертого поколения. Их элементной базой стали большие интегральные
схемы (БИС. В одном кристалле интегрировано до 100 тысяч элементов).
Быстродействие этих машин составляло десятки млн. операций в секунду, а
оперативная память достигла сотен Мб. Появились микропроцессоры (1971 г.
фирма Intel), микро-ЭВМ и персональные ЭВМ. Стало возможным
коммунальное использование мощности разных машин (соединение машин в
единый вычислительный узел и работа с разделением времени).

Таблица 4.

Год Язык Создатель ЭВМ Заметки о языке


(идея)
85 С++ Бьярн Объектно-ориентированное расширение языка С
Страуструп
85 Object Ларри Apple
Pascal Теслер,
Никлаус
Вирт

86 Perl Ларри Уолл Язык создавался в помощь системному


администратору операционной системы Unix для
обработки различного рода текстов и выделения
нужной информации. Развился до мощного средства
работы с текстами. Является интерпретируемым
языком и реализован практически на всех
существующих платформах. Применяется при
обработке текстов, а также для динамической
генерации веб-страниц на веб-серверах.
87 Oberon Никлаус Оберон отличается от Модулы-2 отсутствием многих
Вирт необязательных конструкций; добавлены же в язык
средства объектно-ориентированного
программирования -- расширяемые записи. Оберон --
это самый простой универсальный язык.

16
91 Python Интерпретируемый объектно-ориентированный язык
программирования. По структуре и области
применения близок к Perl, однако менее
распространен и более строг и логичен.
92 Oberon-2 Никлаус В 1992 году были приняты расширения языка
Вирт Оберон, предложенные Ханспетером Мёссенбёком.
Расширенный язык получил название Оберон-2.
Основное нововведение -- связанные с типами
процедуры. Сейчас Оберон-2 является фактическим
стандартом языка
93 Delphi Андерс Delphi 1 был первым инструментарием разработки
Хейлсберг Windows приложений, объединившим в себе
оптимизирующий компилятор, визуальную среду
программирования и мощные возможности работы с
базами данных.
95 PHP Расмус Cкриптовый язык программирования общего
Лердорф назначения, интенсивно применяющийся для
создания веб-приложений. В настоящее время
поддерживается подавляющим большинством
хостинг-провайдеров и является одним из лидеров
среди языков программирования, применяющихся
для создания динамических веб-сайтов.
96 Java Кен Арнольд, Наследует синтаксис C и C++ и избавлен от
Джеймс некоторых неприятных черт последнего.
Гослинг Отличительной особенностью языка является
компиляция в код некоей абстрактной машины, для
которой затем пишется эмулятор (Java Virtual
Machine) для реальных систем. Кроме того, в Java нет
указателей и множественного наследования, что
сильно повышает надежность программирования.
99 C# Андерс Основной язык разработки приложений для
Хейлсберг платформы Microsoft .NET. Компилятор с C# входит
в стандартную установку самой .NET, поэтому
программы на нём можно создавать и компилировать
даже без инструментальных средств, вроде Visual
Studio. C# относится к семье языков с C-подобным
синтаксисом, из них его синтаксис наиболее близок к
17
C++ и Java. Язык имеет статическую типизацию,
поддерживает полиморфизм, перегрузку операторов
(в том числе операторов явного и неявного
приведения типа), делегаты, атрибуты, события,
свойства, обобщённые типы и методы, итераторы,
анонимные функции с поддержкой замыканий, LINQ,
исключения, комментарии в формате XML.

ЭВМ пятого поколения — это ЭВМ будущего. Программа разработки,


так называемого, пятого поколения ЭВМ была принята в Японии в 1982 г.
Предполагалось, что к 1991 г. будут созданы принципиально новые
компьютеры, ориентированные на решение задач искусственного интеллекта.
С помощью языка Пролог и новшеств в конструкции компьютеров
планировалось вплотную подойти к решению одной из основных задач этой
ветви компьютерной науки - задачи хранения и обработки знаний. Коротко
говоря, для компьютеров пятого поколения не пришлось бы писать
программ, а достаточно было бы объяснить на "почти естественном" языке,
что от них требуется. Предполагается, что их элементной базой будут
служить не СБИС, а созданные на их базе устройства с элементами
искусственного интеллекта. Для увеличения памяти и быстродействия будут
использоваться достижения оптоэлектроники и биопроцессоры.
К сожалению, японский проект ЭВМ пятого поколения повторил
трагическую судьбу ранних исследований в области искусственного
интеллекта. Более 50-ти миллиардов йен инвестиций были потрачены
впустую, проект прекращен, а разработанные устройства по
производительности оказались не выше массовых систем того времени.
Однако, проведенные в ходе проекта исследования и накопленный опыт по
методам представления знаний и параллельного логического вывода сильно
помогли прогрессу в области систем искусственного интеллекта в целом.

Лекция 3. Алгоритмы

18
Слово «алгоритм» происходит от имени узбекского математика Хорезми
(по арабски ал - Хорезми), который в IX веке разработал правила 4-х
арифметических действий над числами в десятичной системе счисления.
Алгоритм - точное предписание по выполнению ограниченного числа
определенных действий, последовательно преобразующих исходные данные
в конечный результат.
Совокупность действий по преобразованию исходных данных в
конечный результат составляет процесс выполнения алгоритма, называемый
вычислительным процессом или просто процессом. Тот кто выполняет
алгоритм называется процессор (человек или часть ЭВМ). Алгоритм,
предназначенный для выполнения ЭВМ называется программой.
Алгоритм обладает следующими свойствами:
• дискретностью - алгоритм состоит из конкретных действий;
• определенностью - точностью, не оставляющей место для произвола,
т.е. алгоритм понятен для возможных исполнителей благодаря этому
свойству процесс выполнения алгоритма носит механический характер;
• результативностью - свойством приводить к искомому результату за
конечное число действий (шагов);
• Массовостью - пригодностью для решения задач из некоторого класса.

Пример
Дано X, Вычислить 3x2+6x+2. Допустимые операции - сложение и
умножение 2-х чисел. Т.о. есть предпосылки для разработки алгоритма:
• исходные данные - X;
• действия - сложение, умножение, которое применительно к выражению
3x2+6x+2 дадут искомый результат.
Т.к. среди действий нет возведения в степень выражение необходимо
записать в виде 3xx+6x+2.
Получим следующий алгоритм:
начало;

19
вычислить X× X, результат обозначить через Y;
вычислить 3× 4, результат обозначить через Z;
вычислить 6× X, результат обозначить через W;
вычислить Z+W, результат обозначить через U;
вычислить U+2, результат обозначить через S;
конец;

Язык Turbo Pascal


Язык программирования Pascal это:
• Алгоритмический язык программирования высокого уровня
• Разработан Никлаусом Виртом в 1970 году для обучения студентов
программированию.
• Хорошо структурированный язык с жестким контролем типов данных
В дальнейшем под языком Pascal будем подразумевать Turbo Pascal.
Любой алгоритмический язык программирования состоит из следующих
элементов:
• Алфавит
• Лексемы
o Идентификаторы
o Константы
o Знаки операций и разделители
o Комментарии
• Выражения
• Типы данных и операции
• Операторы
• Структура программы

20
Алфавит
Алфавит языка: кодовая таблица ASCII. Для оригинального языка
Pascal:
1. латинские буквы и символ подчеркивания: ABC...Zabc...z_
2. арабские цифры: 012...9
3. 22 специальных символа: +-*/=><.,:;@')(][}{#$^
Символы алфавита используются для построения базовых элементов
Pascal-программ - минимальных единиц языка, имеющих самостоятельный
смысл. Базовые элементы также называют лексемами.

Лексемы
4. Служебные (зарезервированные) слова.
5. Имена. Они вводятся для обозначения в программе переменных, констант,
типов, процедур и функций.
6. Числа и символьные строки.
7. Знаки операций и разделители. Они формируются из одного или
нескольких специальных символов.
8. Комментарии - произвольная последовательность символов (не
обязательно из алфавита языка, то есть допускаются и русские буквы),
заключенную в фигурные скобки { }.

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

3Yfgh
V x
R_36%
Fgh23_
&A

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

A+B
Sin(x)*(2+y)
D(+2/)c
‘A’*2

Операторы
В языке Pascal предусмотрены следующие операторы:
• оператор присваивания
• составной оператор
• пустой оператор
• условный оператор
• оператор варианта
• оператор цикла с предусловием
• оператор цикла с постусловием
• оператор цикла с параметром
• присоединения
• оператор процедуры

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

22
<Имя переменной>:=<Выражение>;

Выражение, указанное справа от знака ":=", должно приводить к


значению того же типа, какого и сама переменная, или типа, совместимого с
переменной относительно команды присваивания. Например, переменной
типа Real можно присвоить значение типа Integer или Word (впрочем,
наоборот делать нельзя). Выражение будет сначала вычислено, затем, его
результат будет положен в ячейки памяти, отведенные для переменной.

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

[Program <Имя программы>;]


[Uses <Имена подключаемых модулей>;]
[Label <Список меток>;]
[Const <Объявления констант>;]
[Type < Объявления типов>;]
[Var < Объявления переменных>;]
[<Раздел подпрограмм>]
Begin
[<Операторы>]
End.

Разделы, заключенные в квадратные скобки, являются необязательными.


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

Begin
End.

Нетрудно догадаться, что эта программа будет компилироваться и


запускаться (сразу же завершая свою работу), но никаких действий
выполнять не будет.
Более осмысленный пример на языке Pascal:

23
program Summa;
var
A,B,Sum : integer;
begin
Wгitе(’Введите два числа: ‘);
Readln(A,B);
Sum :=А+В;
Wгitеln(’Сумма равна’,Sum);
Wгitе(’Нажмите Enter’);
Readln;
end.

Для запуска программы из среды Turbo Pascal выберите команду Run в


меню Run. Вы попадете в окно пользователя, появится сообщение:
Введите два числа:
Наберите два любых целых числа с пробелом между ними и нажмите
Enter. Появится следующее сообщение:
Сумма равна
а за ним - сумма двух чисел. В следующей строке появится сообщение:
Нажмите клавишу Enter
Программа будет ожидать нажатия клавиши Епtег. Для наблюдения за
выводом из своей программы, выберите команду User Screen в меню Window
(или нажмите Аlt-F5).

Лекция 4-5. Основные типы данных. Ввод-вывод

Любые данные, т.е. константы, переменные, значения функций или


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

24
Операции языка Pascal и их приоритеты

Операции языка Pascal

Унарные

Бинарные

Аппликативные

Мультипликативные

Операции отношения

На этом рисунке приведены группы операций в порядке убывания их


приоритетов. Внутри группы приоритет операций одинаков.

Объявление переменных

var
<имя переменной>:<имя типа1>;
<имя1>[,<имя2>,…]:<тип2>;

var
a,b:integer;
ch:char;

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

25
Типы данных

Простые

Порядковые

Символьный

Целочисленные

Перечисление

Логический

Диапазон

Вещественные

Структурированные

Массивы

Строки

Записи

Файлы

Указатели

Простые типы

К простым типам относятся порядковые и вещественные типы.


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

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

Порядковые типы

К порядковым типам относятся целые, логические, символьный,


перечисляемый и тип-диапазон. К любому из них применима функция
ORD(X), которая возвращает порядковый номер значения выражения Х. Для
целых типов функция ORD(X) возвращает само значение Х, т.е. ORD(X)=X
для Х, принадлежащего любому целому типу. Применение ORD(X) к
логическому, символьному и перечисляемому типам дает положительное
целое число в диапазоне от 0 до 1(логический тип), от 0 до 255(символьный),
от 0 до 65535(перечисляемый). Тип-диапазон сохраняет все свойства
базового порядкового типа, поэтому результат применения к нему функции
ORD(X) зависит от свойств этого типа.
К порядковым типам можно также применять функции:
PRED (X) – возвращает предыдущее значение порядкового типа(значение
которое соответствует порядковому номеру ORD (X)-1 то есть
ORD(PRED(X))=ORD(X)-1
SUCC (X) - возвращает следующее значение порядкового типа, которое
соответствует порядковому номеру ORD (X)+1 т.е.
ОRD(SUCC(X)=ORD(X)+1.
Например, если в программе определена переменная

Var
C: Char;
.........
с:=’5’;

то функция PRED(C) вернет значение ‘4’, а функция SUCC(C) значение ‘6’.


Если представить себе любой порядковый тип как упорядоченное
множество значений, возрастающих слева направо и занимающих на

27
числовой оси некоторый отрезок, то функция PRED(C) не определена для
левого, а SUCC(X) для правого конца отрезка.

Целые типы.

Диапазон возможных значений целых типов зависит от их внутреннего


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

Таблица 5.

Длина, байт Название типа Диапазон значений


1 Byte 0..255
1 Shorting -128.127
2 Word 0...65535
2 Integer -32768...32767
4 longint -2147483648...
2147483647

При использовании процедур и функций с целочисленными


параметрами следует руководствоваться «вложенностью типов», т.е. везде,
где может использоваться WORD, допускается использование BYTE(но не
наоборот), в LONGINT «входит» INTEGER, который, в свою очередь
включает в себя SHORTINT.
Перечень процедур и функций, применимых к целочисленным типам
приведен в таблице 2. Буквами b, s, w, i, l обозначены выражения
соответственно типа BYTE, SHORTINT, WORD, INTEGER, LONGINT, x –
выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают
переменные соответствующих типов. В квадратных скобках –
необязательный параметр.

28
Таблица 6.

Обращение Тип результата Действие


Abs (x) X Возвращает модуль х
Chr (b) Char Возвращает символ по его коду
Dec(vx[,i]) Процедура Уменьшает значение vx на i, при
отсутствии i -на 1
Inc(vx,[i]) Процедура Увеличивает значение vx на i, при
отсутствии i -на 1
Hi(i) Byte Возвращает старший байт аргумента
Hi(w) Byte То же
Lo (i) Byte Возвращает младший байт аргумента
Lo(w) Byte То же
Odd(l) Boolean Возвращает TRUE , если аргумент
нечетное число, False – если четное
Random(w) Как у параметра Возвращает псевдослучайное число,
равномерно распределенное на
интервале 0 <= х <w
Sqr(X) То же Возвращает квадрат аргумента
Swap(i) Integer Меняет местами байты в слове
Swap(w) Word То же

При действиях с целыми числами тип результата будет соответствовать


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

Var
A: integer;
X, y: real;
Begin
A:=32767;
X:= a+2;
Y:=longint (a)+2;
Writeln (x:10:0,y:10:0 );
End.

29
В результате прогона получим
-32677 32769

Логический тип

Значениями логического типа может быть одна из предварительно


объявленных констант FALSE(ложь) или TRUE (истина). Для них
справедливы правила:
Ord (false) = 0;
Ord (true)=1;
False<True;
Succ (False)=True;
Pred (true)=False;
Поскольку логический тип относится к порядковым типам, его можно
использовать, например, в операторе
...............
Var
i : Boolean;
. . . .
for i:=false to true do ...

Логические операции

Таблица 7.

A Not A
False True
True False

Таблица 8.

A B A and B
False False False
False True False
True False False

30
True True True

Таблица 9.

A B A or B
False False False
False True True
True False True
True True True

Таблица 10.

A B A xor B
False False False
False True True
True False True
True True False

Пример

if I mod 7 = 0 then
if I mod 13 = 0 then
writeln(I);

if (I mod 7 = 0) and (I mod 13 = 0) then


writeln(I);

Символьный тип

Значением символьного типа является множество всех символов ПК.


Каждому символу приписывается целое число в диапазоне 0..255. Это число
служит кодом внутреннего представления символа, его возвращает функция
ORD.
Для кодировки используется код ASCII. Это 7-битный код, т.е. с его
помощью можно закодировать лишь 128 символов в диапазоне от 0 до 127. В

31
то же время в 8-битном байте, отведенном для хранения символов в Турбо
Паскале, можно закодировать в два раза больше символов в диапазоне 0..255.
Первая половина символов ПК с кодами 0..127 соответствует стандарту
ASCII. Вторая половина с кодами 128-255 не ограничена жесткими рамками
стандарта и может меняться на ПК разных типов.
Символы с кодами 0…31 относятся к служебным кодам. Если эти коды
используются в символьном тексте программы, они считаются пробелами.
При использовании их в операциях ввода - вывода они могут иметь
следующее самостоятельное значение:

Таблица 11.

Символ Код Значение


Bel 7 Звонок: вывод на экран этого символа
сопровождается звуковым сигналом
Ht 9 Горизонтальная табуляция: при выводе на
экран смещает курсор в позицию кратную
8, плюс 1
Lf 10 Перевод строки: при выводе на экран все
последующие символы будут выводиться,
начиная с той же позиции, но на
следующей строке.
VT 11 Вертикальная табуляция: при выводе на
экран заменяется спец.символом
FF 12 Прогон страницы: при выводе на принтер
формирует страницу, при выводе на экран
заменяется спец. символом
Cr 13 Возврат каретки: водится нажатием на
клавишу enter (при вводе с помощью read
или readln означает команду “ввод” и в
буфер ввода не помещается; при выводе
означает команду “продолжить вывод с
начала текущей строки”)
Sub 26 Конец файла: вводится с клавиатуры
32
нажатием ctrl+Z; при выводе заменяется
спец. знаком
Esc 27 Конец работы: вводится с клавиатуры
нажатием на клавишу esc; при выводе
заменяется спец.символом

К типу CHAR применимы операции отношения, а также встроенные


функции:
CHR (B) – функция типа CHAR преобразует выражение В типа BYTE в
символ и возвращает его своим значением;
UPCASE (CH) – функция типа CHAR; возвращает символ в верхнем
регистре, если он определен для аргумента CH типа CHAR, в противном
случае возвращает сам символ Ch:

Var c1,c2:char;
Begin
C1:=upcase (‘s’);
C2:=upcase (‘ ф ’);
Writeln (c1,’ ‘, c2);
End.

В результате прогона программы на экран будет выдано


S ф
Так как функция UPCASE не обрабатывает кириллицу.

Раздел описания типов


Раздел описания типов начинается ключевым словом Type и содержит
описания новых типов данных, созданных программистом:

Type
<Имя типа1>=<Описание1>;
<Имя типа2>=<Описание2>;
...

33
Перечисляемый тип

Задается перечислением тех значений, которые он может получать.


Каждое значение именуется некоторым идентификатором и располагается в
списке, обрамленным круглыми скобками:

Type
Colors = (red, white, blue);

Применение перечисляемых типов делает программы нагляднее.


Если, например, в программе используются данные, связанные с
месяцами года то:

Type
Тип месяц = (янв, фев, мар, апр, май, июн, июл, авг, сен,
окт, ноя, дек);
Var
Месяц :ТипМесяц;
..........
If месяц= авг then writeln(‘Море!!!’);

Этот фрагмент программы был бы очень наглядным. Увы! В Паскале


нельзя использовать кириллицу в идентификаторах, поэтому мы вынуждены
писать так:

tуре
TypeMonth=(jan, feb, mar, may, apr, jun, jul, aug, sep, oct,
nov, dec);
Var
Month:TypeMonth;
..........
If Month = aug then writeln(‘Хорошо бы поехать к морю!’);

34
Соответствия между значениями перечисляемого типа и порядковыми
номерами этих значений устанавливается порядком перечисления: первое
значение в списке получает значение 0, второе – 1 и т.д. Максимальная
мощность перечисляемого типа составляет 65535 значений, поэтому
фактически перечисляемый тип задает некоторое подмножество целого типа
WORD и может рассматриваться как компактное объявление сразу группы
целочисленных констант со значениями 0,1 и т.д.
Использование перечисляемых типов повышает надежность программ
благодаря возможности контроля тех значений, которые получат
соответствующие переменные. Пусть задано:

Type
Colors =(black, red, white);
Ordenal = (one, two, three);
Days = (monday, tuesday, wednesday);

С точки зрения мощности и внутреннего представления все три типа


эквивалентны:
Ord (black)=0,…, ord (white)=2,
Ord (one)=0, ... , ord (three)=2,
Ord (monday)=0, ... , ord (wednesday)=2,
Однако если определены переменные

Var
col: colors;
Num:ordenal;
Day:days;

То допустимы операторы

Col:=black;
Num:=succ (two);
Day:=pred (tuesday);

35
но недопустимы

Col:=one;
Day:=black;

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

Col:=one;
Col:=colors (0);

Разумеется присваивание

Col:=0;

Будет недопустимым.
Переменные любого перечисляемого типа можно объявлять без
предварительного описания этого типа:

Var col: (black, white);

Тип диапазон

Это подмножество есть подмножество своего базового типа, в качестве


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

Type
Digit = ‘0’.. '9';
Dig2 = 48..57;

Тип диапазон не обязательно описывать в разделе type, а можно


указывать непосредственно при объявлении переменной:

Var
Date: 1..31;
Month: 1 .. 12;
Lchr:’A’..’Z’;

При объявлении типа диапазона нужно руководствоваться следующими


правилами:
1. Два символа «..» рассматриваются как один символ, поэтому между ними
недопустимы пробелы;
2. Левая граница диапазона не может превышать правую границу.
Тип-диапазон наследует все свойства базового типа, но с
ограничениями, связанными с его меньшей мощностью. В частности если
определена переменная

Type
Days = (mo, tu, we, th, fr, sut, sa);
Weekend = sa.. su;
Var
w: Weekend;
...................
W:=sa;

37
то ord(w) вернет значение 5, в то время как PRED(W) приведет к ошибке.

Вещественные типы

В отличие от порядковых типов, значения которых всегда


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

Таблица 12.

Длина, байты Название типа Мантисса Диапазон


десятичного
порядка
4 Single 7...8 -45...+38
6 Real 11...12 -39...+38
8 Double 15...16 -324...+308
10 Extended 19...20 -4951...+4932
8 Comp 19...20 -2^63+1...
+2^63-1

Как видно из таблицы вещественное число в Паскале занимает от 4-х до


10 смежных байт и имеет следующую структуру в памяти ПК.

S E M

Здесь s-знаковый разряд числа; е – экспоненциальная часть, содержит


двоичный порядок.m- мантисса числа.
Мантисса имеет длину от 23 до 63 двоичных разрядов, что и
обеспечивает точность 7..8 для single и 19..20 для extended десятичных цифр.
Десятичная точка подразумевается перед левым (старшим) разрядом
мантиссы, но при действиях с числом ее положение сдвигается влево или
вправо в соответствии с двоичным порядком числа, хранящимся

38
экспоненциальной части, поэтому действия над вещественными числами
называют арифметикой с плавающей точкой, запятой.
Паскаль характеризуется богатой гаммой вещественных типов, однако
доступ к типам single, double, extended возможен только при особых режимах
компиляции. Дело в том, что эти типы рассчитаны на аппаратную поддержку
арифметики с плавающей точкой и для их эффективного использования в
состав ПК должен входить арифметический сопроцессор 8087, 80287 или их
отечественный аналог К1810ВМ87.
Компилятор позволяет создавать программы, работающие на любых ПК
и использующие любые вещественные типы. В процессе запуска Турбо
Паскаль проверяет состав аппаратных средств и выявляет наличие или
отсутствие сопроцессора.
Арифметический сопроцессор всегда обрабатывает числа в формате
extended, а три других вещественных типа в этом случае получаются
простым усечением результатов до нужных размеров и применяются я в
основном для экономии памяти.
Например:

{$N+, E+}
Type
RealType= real;
Var
Epsilon:= realtype;
Begin
Epsilon:=1;
while 1+epsilon/2>1 do
Epsilon:=epsilon/2;
Writeln (epsilon);
End.

Независимо от объявления типа REALTYPE на печать будет выдан рез-т:


1.08420217248550Е-0019,что соответствует типу extended.

39
Чтобы получить правильный результат программу необходимо изменить
следующим образом:

{$N+, E+}
Type
Realtype = real;
Var
epsilon, eps1: realtype;
Begin
Epsilon:=1;
Repeat
Epsilon:=epsilon/2;
Eps1:=epsilon+1;
Until eps1>1;
Writeln (2*epsilon)
End.

Следует учесть, что тип REAL оптимизирован для работы без


сопроцессора. Если ваш ПК оснащен сопроцессором, использование типа
REAL приведет к дополнительным затратам времени на преобразование
REAL к EXTENDED. Поэтому никогда не используйте REAL на ПК с
сопроцессором, т.к. дополнительные затраты времени на преобразование
типов могут свести на нет все преимущества сопроцессора. При разработке
программ, критичных ко времени счета, следует заменять его типами
SINGLE или DOUBLE: по сравнению с типом REAL скорость вычислений на
машинах с сопроцессором в этом случае увеличивается в 2-3 раза. Если в ПК
нет арифметического сопроцессора, скорость обработки данных всех
вещественных типов приблизительно одинакова.
Особое положение в Паскале занимает тип COMP, который трактуется
как вещественное число без экспоненциальной и дробной части. COMP- это
"большое" целое число со знаком, сохраняющее 19.. 20 значащих десятичных
цифр. В то же время в выражениях COMP полностью совместим с любыми

40
другими вещественными типами: над ними определены все вещественные
операции, он может использоваться как аргумент математических функций и
т.д. Наиболее подходящей областью применения типа COMP являются
бухгалтерские расчеты: денежные суммы выражаются в копейках и действия
над ними сводятся к операциям с достаточно длинными целыми числами.
Для работы с вещественными данными могут использоваться
встроенные математические функции, представленные в таблице 3. В этой
таблице REAL означает любой вещественный тип, INTEGER- любой целый
тип.

Таблица 13.

Обращение Тип параметра Тип результата Примечание


Abs(x) Real, integer Тип аргумента Модуль аргумента
ArcTan(x) Real Real Арктангенс (радианы)
Cos (x) “ “ Косинус (радианы)
Exp (x) “ “ Экспонента
Frac (x) “ “ Дробная часть числа
Int (x) “ “ Целая часть числа
Ln (x) “ “ Логарифм натуральный
Pi - Real П = 3.141592653...
Random - Real Равномерное
псевдослучайное число
0<=x<1
Random(i) Integer Integer Равномерное
псевдослучайное целое
число 0<=i<1
Randomize - - Инициация датчика
случайных чисел
Sin(x) Real Real Синус (радианы)
Sqr(x) Real, integer Тип аргумента Квадрат аргумента
Sqrt (x) real Real Корень квадратный

41