Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основы программирования на языке Pascal (Основы языка Паскаль)

Содержание:

Введение

Не много об истории языка Паскаль. Язык Паскаль получил свое название в честь великого французского ученого, физика-математика Блеза Паскаля, который в 1642 г. изобрел счетную машину для арифметических операций – Паскалево колесо. История создания языка Паскаль начинается с 1965 года, когда международная федерация по обработке информации IFIP предложила нескольким специалистам в области информатики принять участие в разработке нового языка программирования – приемника АЛГОЛА-60. Среди них был швейцарский ученый, работавший доцентом информатики Стенфордского университета Николаус Вирт. В конце 1968 года Вирт и сотоварищи из швейцарского федерального института технологии в Цюрихе разработали первую версию Паскаля, а спустя 2 года – 1- й вариант компилятора. В 1971 году Вирт выпустил описание своего языка. Создавая Паскаль, Вирт преследовал 2 цели: во-первых, разработать язык, пригодный для обучения программированию как систематической дисциплине; во-вторых, реализация языка должна быть эффективной и надежной на существующих вычислительных машинах.

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

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

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

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

Кроме авторской версии, стали появляться различные его расширения и диалекты. Например: УКСД Паскаль, Паскаль-80, ЭППЛ-Паскаль, ТУРБО-Паскаль, Квик-Паскаль. Особую популярность на микроЭВМ и ПЭВМ в настоящее время получило семейство Паскаль-систем, названное ТУРБО-Паскаль и разработанное BORLAND. Данное семейство, работающее с CP/M, MSXDOS, имеет высокую производительность, т. к. используется ускоренная однопроходная процедура компиляции. Последняя версия ТУРБО-Паскаль 7.0 Паскаль стала прародителем более поздних языков программирования.

Через 10 лет после Паскаля Вирт создал язык МОДУЛА-2, в котором особое внимание уделяется построению программ как набора независимых модулей. На Паскаль опирались все 4 языка , принятые в начале 70-х годов Министерством обороны США для разработки своего универсального высокоуровневого языка, который в дальнейшем получил название АДА.

Основы языка Паскаль

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

1.1. Алгоритм

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

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

1.2. Свойства алгоритма

Дискретность – алгоритм состоит из отдельных инструкций (шагов);

Однозначность – каждый шаг понимается исполнителем единственным образом;

Массовость – алгоритм работает при меняющихся в некоторых пределах входных данных;

Результативность – за конечное число шагов достигается некоторый результат.

1.3. Формы записи алгоритма

Принято выделять 2 основных формы.

Графическая (блок-схема) – отдельные шаги алгоритма изображаются геометрическими фигурами, последовательность выполнения шагов – связями между фигурами;

Рис.1

Указанные на рисунке основные фигуры блок-схем интерпретируются так:

Прямоугольник – любая последовательность действий; внутри прямоугольника записываются формулы или словесное описание выполняемых действий;

Ромб – блок проверки условия; так как любое условие может быть только истинно или ложно, у блока 1 вход и 2 выхода, соответствующие действиям, выполняемым в случаях, когда условие истинно и когда оно ложно. Выходы подписывают символами "+" и "-", или "да" и "нет", "1" и "0" и т.п.

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

Лист с разрывом – блок вывода данных. Внутри фигуры указывается, какие данные или сообщения программа выводит для представления пользователю.

Закругленный прямоугольник – необязательные блоки начала и конца программы, внутри блоков обычно указывается "нач" или "кон" соответственно.

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

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

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

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

нач начало программы

кон конец программы

если-то-иначе проверка условия

ввод ввод данных

вывод вывод данных

для-от-до-нц-кц цикл со счетчиком (нц – начало цикла, кц – конец)

пока-нц-кц цикл с предусловием

нц-кц-пока цикл с постусловием

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

1.4. Программа и программное обеспечение

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

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

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

1.5 Этапы разработки программы

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

1. Определение входных и выходных данных, требований к программе – что дано и что требуется получить, каков будет способ взаимодействия (интерфейса) программы с пользователем, на каком языке и в какой системе программирования она будет разрабатываться, каковы требования к аппаратному и системному программному обеспечению компьютеров, на которых будет работать программа;

2. Разработка алгоритма – определение последовательности действий, ведущих к решению задачи и запись их в одной из указанных выше форм;

3. Кодирование (программирование) – перевод алгоритма на один из языков программирования и создание исходного текста программы в одной из систем программирования. Программа на любом языке состоит из операторов – так называются отдельные действия, разрешенные в языке. Число операторов в любом языке ограничено и правила их написания жестко заданы;

4. Компиляция и отладка – исходный текст на Паскале не будет непосредственно исполняться компьютером – для работы программы ее требуется откомпилировать, то есть, перевести в машинный код. Эту работу выполняет специальная программа-компилятор или оболочка языка. Оболочка Паскаля, с помощью которой мы будем разрабатывать свои программы, называется Turbo Pascal версии 7.1, она разработана компанией Borland International в 1983-97 гг. В результате преобразования компилятором исходного текста программы в машинный код получается исполняемый файл, который можно запустить (выполнить) в той операционной системе (ОС), для которой разработан компилятор. Наша оболочка Паскаля создавалась для ОС MS-DOS, однако, в современных ОС семейства Windows программа, написанная на Паскале, работать все же будет, правда, без удобных интерфейсных возможностей Windows.

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

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

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

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

2. Данные в языке Паскаль

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

  • имена могут включать латинские буквы, цифры и знак подчеркивания (для простоты опустим некоторые другие символы, разрешенные в именах);
  • имя состоит из одного слова; если требуется пробел в имени, он заменяется на подчеркивание: так, My_1 будет правильным идентификатором, а My 1 – нет;
  • имя всегда начинается с буквы: допустим объект с именем A1, но не 1A; прописные и строчные буквы в именах не различаются Паскалем: x1 и X1 – это одна и та же величина;
  • имена не могут совпадать с зарезервированными в языке служебными словами, обозначающими определенные в языке операции над данными: например, нельзя назвать Begin или BEGIN ни одну величину в программе, так как begin – зарезервированное служебное слово, а прописные и строчные буквы в служебных словах также не различаются. Познакомиться с большинством служебных слов мы сможем в процессе изучения языка.

2.1 Типы данных

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

Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разный диапазон возможных значений; целые числа можно умножать друг на друга, а, к примеру, символы - нельзя. Каждое выражение в программе имеет определенный тип:

Стандартные типы:

логические

целые

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

символьный

строковый

адресный

файловые

Типы, определяемые программистом:

Простые:

перечисляемый

интервальный

адресные

Составные:

массивы

строки

записи

множества

файлы

процедурные типы

объекты

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

Логические типы. Основной логический тип данных Паскаля называется boolean. Величины этого типа занимают в памяти 1 байт и могут принимать всего два значения: true (истина) или false (ложь). Внутреннее представление значения false - 0 (нуль), значения true - 1.

К величинам логического типа применяются логические операции and, or, xor и not. Они описаны ниже. Для наглядности вместо значения false используется 0, а вместо true - 1.

Таблица 1

a

b

a and b

a or b

a xor b

not a

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Операция and - "логическое ‘И’", логическое умножение. Операция or - "логическое ‘ИЛИ’", логическое сложение. Операция xor - так называемое исключающее ‘ИЛИ’, или операция неравнозначности. Логическое отрицание not является унарной операцией. Кроме этого, величины логического типа можно сравнивать между собой с помощью операций отношения, перечисленных в таблице:

Таблица 2

Операция

Знак операции

больше

>

больше или равно

>=

меньше

<

меньше или равно

<=

равно

=

не равно

<>

Результат этих операций имеет логический тип.

Целые типы. Целые числа представляются в компьютере в двоичной системе счисления. В Паскале определено несколько целых типов данных, отличающихся длиной и наличием знака:

Таблица 3

Тип

Название

Размер

Знак

Диапазон

integer

целое

2 байта

есть

-32768..32767(-215..215-1)

shortint

короткое целое

1 байта

есть

-128..127(-27..27-1)

byte

байт

1 байта

Нет

0..255(0..28-1)

word

слово

2 байта

Нет

0..65535(0..216-1)

lonight

длинное целое

4 байта

есть

-2147483648..2147483647(-231..231-1)

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

Таблица 4

Операции

Знак операции

сложение

+

вычитание

-

умножение

*

деление

div

остаток от деления

mod

Кроме этого, к целым величинам можно применять поразрядные операции and, or, xor и not. При выполнении этих операций каждая величина представляется как совокупность двоичных разрядов. Действие выполняется над каждой парой соответствующих разрядов операндов. Например, результатом операции 3 and 2 будет 2, поскольку двоичное представление числа 3 - 11, числа 2 - 10. Для работы с целыми величинами предназначены также и операции сдвига влево shl и вправо shr. Слева от знака операции указывается, с какой величиной будет выполняться операция, а справа - на какое число двоичных разрядов требуется сдвинуть величину. Например, результатом операции 12 shr 2 будет значение 3, поскольку двоичное представление числа 12 - 1100.

Вещественные типы. Вещественные типы данных хранятся в памяти компьютера иначе, чем целые. Внутреннее представление вещественного числа состоит из двух частей - мантиссы и порядка, и каждая часть имеет знак. Например, число 0,087 представляется в виде 0,87*10-1, и в памяти хранится мантисса 87 и порядок -1 (для наглядности мы пренебрегли тем, что данные на самом деле представляются в двоичной системе счисления и несколько сложнее). Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных. Точность числа определяется длиной мантиссы, а диапазон - длиной порядка.

Таблица 5

Тип

Название

Размер

Значащих цифр

Диапазон значения

real

вещественный

6

11-12

2.9e-39..1.7e+38

single

одинарной точности

4

7-8

1.5e-45..3.4e+38

double

двойной точности

8

15-16

5.0e-324..1.7e+308

extended

расширенный

10

19-20

3.4e-4932..1.1e+4923

comp

большое целое

8

19-20

-9.22e18..9.22e18(-263..263-1)

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

Стандартные функции. К вещественным величинам можно применять стандартные функции, перечисленные ниже:

Таблица 6

Имя

Описание

Результат

Пояснения

abc

модуль

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

|x| записывается abs(x)

arctan

арктангенс угла

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

arctg x записывается arctan(x)

cos

косинус угла

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

cos x записывается cos(x)

exp

экспонента

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

ex записывается exp(x)

frac

дробная часть аргумента

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

frac(3.1) даст в результате 0.1

int

целая часть аргумента

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

frac(3.1) даст в результате 3.0

ln

натуральный логарифм

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

logex записывается ln(x)

pi

значение числа п

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

3.1415926536

round

округление до целого

Целый

round(3.1) даст в результате 3 round(3.8) даст в результате 4

sin

синус угла

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

sin x записывается sin(x)

sqr

квадрат

Целый

x2 записывается sqr(x)

sqrt

квадратный корень

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

записывается sqrt(x)

trunc

целая часть аргумента

Целый

trunc(3.1) даст в результате 3

Символьный тип. Этот тип данных, обозначаемый ключевым словом char, служит для представления любого символа из набора допустимых символов. Под каждый символ отводится 1 байт. К символам можно применять операции отношения (<, <=, >,>=, =, <>), при этом сравниваются коды символов. Меньшим окажется символ, код которого меньше. Стандартных функций для работы с символами тоже немного:

Таблица 7

Имя

Описание

Результат

Пояснения

ord

порядковый номер символа

Целый

ord('b') даст в результате 98 ord('ю') даст в результате 238

chr

преобразование в символ

Символьный

chr(98) даст в результате 'b' chr(238) даст в результате 'ю'

pred

предыдущий символ

Символьный

pred('b') даст в результате 'a'

succ

последующий символ

Символьный

pred('b') даст в результате 'a'

upcase

перевод в верхний регистр

Символьный

upcase('b') даст в результате 'B'

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

все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;

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

к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;

к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа [6].

2.2 Константы

Константой называют величину, значение которой не меняется в процессе выполнения программы.

Числовые константы служат для записи чисел. Различают следующие их виды:

Целочисленные (целые) константы: записываются со знаком + или -, или без знака, по обычным арифметическим правилам:

-10 +5 5

Вещественные числа могут записываться в одной из двух форм:

обычная запись: 2.5 -3.14 2. - обратите внимание, что целая часть отделяется от дробной символом точки;

экспоненциальная ("научная") форма: в этой записи вещественное число представляется в виде m*10p, где m – мантисса или основание числа, 0.1≤|m|≤1, p – порядок числа, это целочисленная константа. Действительно, любое вещественное число можно представить в экспоненциальной форме:

-153.5 -0.1535*103

99.005 0.99005*102

Во всех IBM-совместимых компьютерах вещественные числа хранятся как совокупность мантиссы и порядка, что позволяет упростить операции над ними, используя специальную арифметику, отдельно обрабатывающую мантиссу и порядок. Для программной записи числа в экспоненциальной форме вместо "умножить на 10 в степени" используется обозначение E или e (латинская):

-153.5 -0.1535*103 -0.1535E3 или -1.535E02

99.005 0.99005*102 0.99005E+2 или 9.9005e+01

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

1030 1e30

-1020 -1E20

10-30 1E-30

Поскольку размер памяти, отводимой под мантиссу и порядок, ограничен, то вещественные числа всегда представляются в памяти компьютера с некоторой погрешностью. Например, простейшая вещественная дробь 2/3 дает в десятичном представлении 0,666666... и, независимо от размера памяти, выделяемой для хранения числа, невозможно хранить все его знаки в дробной части. Одной из типичных проблем программирования является учет возможных погрешностей при работе с вещественными числами.

Кроме числовых констант существуют и другие их виды:

логические константы служат для проверки истинности или ложности некоторых условий в программе и могут принимать только одно из двух значений: служебное слово true обозначает истину, а false – ложь;

символьные константы могут принимать значение любого печатаемого символа и записываются как символ, заключенный в апострофы ('одинарные кавычки'):

'Y' 'я' ' '

В последнем случае значение символьной константы равно символу пробела. Если требуется записать сам символ апострофа как символьную константу, внутри внешних апострофов он удваивается: ''''

К символьным также относятся константы вида #X, где X – числовое значение от 0 до 255 включительно, представляющее собой десятичный ASCII-код символа. Таблицы ASCII-кодов, используемых операционными системами DOS и Windows, приведены в Приложении 1. Например, значение #65 будет соответствовать коду символа 'A' латинской. Обработка нажатий клавиш и расширенные коды клавиатуры описаны в главе 24 и Приложении 5.

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

'Введите значение X:'

'Ответ='

Если в строковой константе необходимо записать сам символ апострофа, это делается так же, как для символьных констант.

Именованные константы описываются в разделе описаний программы оператором следующего вида:

const Имя1=Значение1;

Имя2=Значение2;

. . .

ИмяN=ЗначениеN;

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

const e=2.7182818285;

lang='Turbo Pascal 7.1';

Здесь описана числовая константа e со значением основания натурального логарифма и строковая константа с именем lang, содержащая строку 'Turbo Pascal 7.1'.

Каждое даваемое программистом имя должно быть уникальным в пределах одной программы. Если мы включим этот раздел в свою программу, мы уже не сможем создать в ней других объектов с именами e и lang.

2.2 Переменные и типы переменных

Переменными называют величины, значения которых могут изменяться в процессе выполнения программы. Каждая переменная задается своим уникальным именем, построенным по правилам, указанным в начале главы. Максимально возможная длина имени зависит от реализации Паскаля, теоретически можно давать переменным имена вплоть до 63 символов длиной, что едва ли актуально – обычно имена не длиннее 5-10 символов.

Поскольку любые данные в памяти компьютера хранятся в числовой форме и двоичной системе счисления, кроме имени, переменной обязательно следует присвоить и тип, определяющий диапазон значений, принимаемых переменной, и способ ее обработки машиной. Поясним сказанное на примере. Как видно из Приложения 1, латинская большая буква 'A' имеет десятичный код 65, или 01000001 в двоичном представлении. Без дополнительной информации о типе данных, хранящихся в некоторой ячейке памяти, компьютеру было бы невозможно решить, что именно представляют из себя эти данные – число 65, код символа 'A' или что-то еще. В любом языке программирования, в том числе и в Паскале, существует стандартный набор типов, к которым может быть отнесена та или иная совокупность ячеек памяти. Информацию о типах данных Паскаля удобно свести в таблицу. Строки этой таблицы будут упорядочены по старшинству типов, от самого "младшего", требующего наименьшее число байт для представления, и, соответственно, представляющего наименьший диапазон возможных значений, до самого "старшего", представляющего наибольший диапазон значений. В таблице представлены не все возможные, а лишь основные типы данных Паскаля.

Ключевое слово Паскаля

Название и описание типа

Объем памяти, байт

Диапазон возможных значений

Boolean

Логический: хранит одну логическую переменную

1

true и false

Char

Символьный: хранит код одного символа из набора ASCII-кодов

1

от 0 до 255 включительно (28=256)

Integer

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

2

±215

Word

Целочисленный без знака

2

±216 - диапазон вдвое больше, так как 16-й бит не занят под знак числа

Longint

Длинное целое: для представления больших целочисленных значений

4

±231

Real

Вещественное число с точностью представления до 11-12 знака в дробной части

6

~ 2.9*10-39 - 1.7*1038

Double

Вещественное число с точностью представления до 15-16 знака в дробной части

8

~ 5*10-324 – 1.7*10308

String

Последовательность символов типа Char длиной от 1 до 255

2-256 (данные строки + 1 байт для хранения ее длины)

Любые строки текста, состоящие из печатаемых символов

Теоретически для записи переменной типа Boolean было бы достаточно 1 бита, но минимальная адресуемая единица памяти – 1 байт.

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

Разумеется, задача правильного выбора типов данных целиком ложится на программиста. Например, если некоторый счетчик в программе может принимать целочисленные значения от 1 до 100000, неправильно было бы описывать его как переменную типа Integer – ведь 215=32768 и при достижении счетчиком этой величины произойдет сброс его значения, которое станет равно -32768. Разумным в данном случае было бы описание счетчика как переменной типа Longint.

Переменные описываются в программе оператором следующего вида:

var Список1:Тип1;

Список2:Тип2;

. . .

СписокN:ТипN;

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

var t,r:real;

i:integer;

Описывает 2 вещественных переменных с именами t и r, а также целочисленную переменную с именем i. Ключевое слово var можно и продублировать, но обычно такой необходимости нет. Сокращение var образовано от английского слова "Variable" (переменная).

2.4 Матрицы и типовые алгоритмы обработки матриц

Многие задачи связаны с обработкой многомерных массивов данных. Наиболее распространены при этом двумерные массивы.

В математике двумерные массивы представляются матрицей:

или, в сокращенной записи,

, где

где n - число строк матрицы, m - число столбцов, индексы (номера) текущих строки и столбца, на пересечении которых находится элемент .

Как и другие объекты данных, матрица описывается в разделе var. От вектора ее описание отличается тем, что в квадратных скобках перечисляются два оператора диапазона, указывающие, соответственно, нумерацию строк и столбцов матрицы:

var ИмяМатрицы: array [n1..n2, m1..m2] of Тип;

Здесь

n1..n2 – диапазон значений номера строки, n1 и n2 – целочисленные константы;

m1..m2 – диапазон значений номера столбца, значения m1 и m2 также целочисленные.

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

Под матрицу выделяется область памяти размерностью n*m*k байт, где k – размерность в байтах одного элемента. Для известных нам типов данных эту размерность можно узнать из таблицы в разделе 2.2. В оперативной памяти матрица хранится построчно.

Например, для матрицы A, описанной оператором вида

var A:array [1..5,1..4] of real;

выделяется 20 ячеек памяти по 6 байт, причем в следующей за элементом A1,4 ячейке хранится значение элемента A2,1.

Обращение к отдельным элементам матрицы осуществляется с помощью переменной с двумя индексами, например:

ai,j a[i,j]

a2,1 a[2,1]

a2n,k a[2*n,k]

Первый индекс, как и в математике, всегда показывает номер строки, а второй – номер столбца.

Поскольку адресация памяти в любом случае линейна, следует понимать матрицу как удобный для программиста структурный тип данных. В отдельных случаях использование матрицы может быть заменено использованием вектора с тем же количеством элементов: так, матрице An,m всегда может быть сопоставлен вектор b размерностью n*m, а обращение к элементу A[i,j] при нумерации строк и столбцов с единицы может быть заменено на обращение к элементу b[(i-1)*m+j].

Подобно тому, как любая последовательная обработка вектора выполняется в цикле for, обработка матрицы выполняется в двойном цикле for:

for i:=1 to n do

for j:=1 to m do

{Обработка элемента A[i,j]}

Согласно правилу выполнения кратных циклов, переменная j меняется в этом двойном цикле быстрее, чем i, таким образом, обработка всех элементов матрицы будет выполнена построчно. Для последовательной обработки всех элементов матрицы по столбцам достаточно поменять местами циклы по i и j:

for j:=1 to m do

for i:=1 to n do

{Обработка элемента A[i,j]}

Теоретически мы могли бы решить эту же задачу и перестановкой индексов в обращении к элементу матрицы (A[j,i] вместо A[i,j]), однако, во избежание путаницы, делать этого не рекомендуется.

Приведем примеры использования двойного цикла for для ввода и вывода элементов матрицы. Пусть матрица C размерностью 4*2 (как мы помним, это означает, что в матрице 4 строки и 2 столбца) описана оператором вида

var c:array [1..4,1..2] of real;

В программе предусмотрено также 2 целочисленных счетчика для строк и столбцов матрицы:

var i,j:integer;

В этом случае типовой ввод матрицы с клавиатуры мог бы выглядеть так:

writeln ('Введите матрицу C размерностью 4*2');

for i:=1 to 4 do

for j:=1 to 2 do read (c[i,j]);

Иногда удобнее печатать отдельное приглашение к вводу каждого элемента:

writeln ('Введите матрицу C размерностью 4*2');

for i:=1 to 4 do

for j:=1 to 2 do begin

write ('C[',i,',',j,']=');

readln (c[i,j]);

end;

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

C[1,1]=

Оператор readln используется, поскольку элементы вводятся по одному.

Как и для векторов, возможны альтернативные способы ввода – описание матрицы в разделе констант и формирование ее элементов из случайных чисел. Приведем пример описания матрицы констант размерностью 2*3:

const d:array [1..2,1..3] of integer=(

(1,2,3),

(4,5,6)

);

Как видно из примера, для описания матрицы констант создается список ее строк, каждая строка, в свою очередь, представляет собой список значений элементов.

Вывод на экран матрицы небольшой размерности бывает удобно реализовать в виде "одна строка матрицы на одной строке экрана". Для этого элементы матрицы во внутреннем цикле печатаются оператором write, не переводящим строку на экране, а во внешнем цикле выполняется writeln:

writeln ('Матрица C:');

for i:=1 to 4 do begin

writeln;

for j:=1 to 2 do write (c[i,j]:4:1);

end;

Разумеется, при выводе элементов матрицы можно использовать константы ширины и точности.

Базовые алгоритмы обработки матриц – те же, что мы изучили в темах "Циклы" и "Одномерные массивы". Отличие состоит в том, что реализацию этих алгоритмов можно условно рассматривать для двух типов задач:

  • Алгоритмы реализуются при обработке всех элементов матрицы.
  • Алгоритмы реализуются внутри каждой строки или каждого столбца матрицы.

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

Пр. В матрице A размерностью 4*4 найти сумму ее положительных элементов, произведение элементов, значения которых попадают в интервал [2,10], а также отношение этих двух величин.

var a:array [1..4,1..4] of real;

i,j:integer;

s,p,z:real;

begin

{Цикл ввода}

writeln ('Ввод матрицы размерностью 4*4');

for i:=1 to 4 do

for j:=1 to 4 do read (a[i,j]);

{Начальные значения и цикл обработки}

s:=0;

p:=1;

for i:=1 to 4 do

for j:=1 to 4 do begin

if a[i,j]>0 then s:=s+a[i,j];

if (a[i,j]>=2) and (a[i,j]<=10) then p:=p*a[i,j];

end;

{Вывод результатов}

writeln ('Сумма=',s:6:2);

writeln ('Произведение=',p:6:2);

if p<>0 then begin

z:=s/p;

writeln ('Отношение=',z:6:2);

end

else writeln ('p=0, отношение вычислить нельзя');

reset (input); readln;

end.

Поскольку о типе матрицы в условии ничего не сказано, выбран "более общий" тип real. Способ ввода также выбран "по умолчанию" – пользователь вводит значения элементов матрицы с клавиатуры. Искомые сумма, произведение и отношение обозначены, соответственно, s, p и z.

Список литературы

1. Абрамов С.А., Гнездилова Г.Г. Задачи по программированию. М.: Наука, 1988.

2. Быкадоров Ю.А., Кузнецов А.Т. Информатика и вычислительная техника 10–11.

– Мн.: Народная асвета,– 1977.

3. Бородич Ю.С., Вальвачев А.Н., Кузьмич А.И. Паскаль для персональных

компьютеров. Мн.: Вышэйшая школа, 1991.

4. Гудман С., Хидетниеми С. Введение в разработку и анализ алгоритмов. М.: Мир,

1981.

5. Зима В.С., Абрамов С.А. Начала программирования на языке Паскаль.

6. Офицеров Д.В., Старых В.А. Программирование в интегрированной среде

Турбо-Паскаль. Справочное пособие. Мн.: Беларусь, 1992.

7. Офицеров Д.В., Долгий А.Б., Старых В.А. Программирование на персональных

компьютерах . Практикум. Мн.: Вышэйшая школа, 1993.

8. Пильщиков В.Н. Сборник упражнений по языку Паскаль. М.: Наука, 1989.