Структура программы. Программа может состоять максимум из 7 блоков (2-я часть): Раздел меток

Вид материалаПрограмма

Содержание


Разделителем между разделами (блоками) служит «;».
Простые стандартные типы данных.
Разряды числа integer - 15 цифровых знаков longint - 31 цифровой знак
Десятичные разряды
8 бит 23 бита single 11 бит 52 бита double
Вводить значения булевского типа нельзя!
Организация ввода-вывода.
В отличие от read, где параметрами должны быть имена переменных, параметрами write могут быть и выражения. Например
Простые операторы.
Присваивание же переменной целого типа выражения вещественного типа запрещено!
Перед Else после End «;» не ставится.
Тип параметра цикла обязательно должен совпадать с типом начального и конечного значений цикла.
Переменная цикла и оба выражения (А с To и Downto) должны иметь одинаковый тип, (т.е. не могут быть типа real).
Ограничения для оператора цикла с параметром
Оператор цикла с предусловием WHILE
Оператор цикла с постусловием REPEAT
Если ни одно значение не совпало, то ситуация считается неопределенной.
Обращение к стандартной функции ROUND обязательно, так как операция деления вырабатывает всегда вещественный результат.
Длина строки не может содержать более, чем 255 символов.
Ввод и вывод элементов массивов
...
Полное содержание
Подобный материал:

OLEG SMIRNOW Стр. 19.3.2012

143233.doc Дата печати 10/23/2003 09:33:00 AM


Паскаль.


Принципы построения.


Разработан в конце 60-х годов профессором Н. Виртом (Цюрихская высшая техническая школа) для обучения программированию.

Считается языком структурного программирования.

Основные достоинства:
  • Гибкость и надежность;
  • Простота и ясность конструкций (с чем я не согласен);
  • Контроль правильности программ на этапах компиляции и выполнения (это есть и в Бейсике);
  • Наличие структурных типов данных: массивов, записей, файлов и т.д.

Некоторые недостатки:
  • Отсутствие возведения с степень;
  • Отсутствие средств работы с файлами прямого доступа.


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


Программа может состоять максимум из 7 блоков (2-я часть):
  1. Раздел меток;
  2. Раздел констант – неизменных данных. Изменять значения констант в программе нельзя. Пример – Const A=2.5; X=7.3; Но можно указать, например, А=-X или константа С=А+Х /2. Могут также быть объявлены типизированные константы.
  3. Раздел типов;
  4. Раздел переменных – описываются переменные. Пример: VAR A,X: REAL;
  5. Раздел процедур;
  6. Раздел функций;
  7. Раздел операторов, который заключается в операторные «скобки» Begin …

End. Переменным присваиваются соответствующие значения и производятся вычисления (3-я часть):

BEGIN

A:= 2.5; X:=7.3

K:=-5; T:=54.3;

Y: = A+K+X+T

END.


Укрупненно программа состоит из 3-х частей:
  1. Заголовок программы - program Zad1(input,output), где input-клавиатура, output-дисплей. За заголовком программы могут следовать uses-фразы, которые указывают на используемые в программе, но описанные в другом месте объекты. Например, uses crt – вызов стандартного модуля очистки экрана.
  2. Описательная часть (соглашения) – блоки 1-6.
  3. Собственно программные операторы (исполняемая часть) – блок 7.



Всем объектам даются имена (идентификаторы):
    • Имя начинается с буквы
    • Большие и маленькие буквы не различаются (New,NEW,new-одно тоже имя)
    • Длина имени ограничена максимальной длиной строки, т.е. 127 символами, причем значащими из них, являются только первые 63 символа.

Имя можно использовать только после того, как оно описано в тексте программы.


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

Разделителем между разделами (блоками) служит «;».


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


В любое место программы могут включаться комментарии, заключенные в фигурные скобки «{ примечание }» или обрамляемые круглыми скобками со звездочками (* примечание ). Комментарий не должен начинаться в символа $, так как конструкция {$…} и {$…*} относится к директивам компилятора.


Написанный на языке Паскаль текст называется исходным текстом или исходной программой и имеет расширение – Pas.

Компилятор запускается из командной строки командой Turbo.


Простые стандартные типы данных.


Целые числа.


Целые числа представляются в ПК с помощью двоичных чисел.

Двоичное число, состоящее из n бит, можно представить двумя способами:

n

число n бит беззнаковое: 0…2 -1


n-1 n-1

число n бит со знаком: -2 … 2 - 1


Наименование типа данных

Формат


Область

Значений

Byte

8 бит без знака (1байт)

0 - 255

Word

16 бит без знака

(1 слово или 2 байта)

0 - 65535

shortint

8 бит со знаком (1байт)

-128 – 127

integer

16 бит со знаком

(1 слово или 2 байта)

-32768 - 32767

longint

32 бита со знаком

(2 слова или 4 байта)

-2147483648 -2147483647

Integer - используется в следующих арифметических операциях «+», «-», «*», «/» - но результатом деления будет число вещественного типа, «DIV» - деление нацело, «Mod» - вычисление остатка от целочисленного деления;


Внутреннее представление целых чисел:

Целое число без знака – байт (8 цифровых знаков) или слово (16 цифровых знаков)


v

Целое число со знаком

shortint - 7 цифровых знаков
Разряды числа integer - 15 цифровых знаков
longint - 31 цифровой знак
Знаковый разряд (0 - «+»

1 – «-»)

Вещественные числа.


Тип данных

Десятичные разряды


Область

Значений

Кол-во битов (байтов)

single

7- 8

1.5Е-45 –

3.4Е38

32

(4)

real

11-12

2.9Е-39 –

1.7Е38

48

(6)

double

15-16

5.0Е-324 –

1.7Е308

64

(8)

extended

19-20

1.9Е-4951 –

1.1Е4932

80

(10)

Comp

19-20

-9.2Е18 –

9.2Е18

64

(8)

Comp – является расширением типа longint до 19-ти разрядов.

Все типы данных кроме real требуют наличия сопроцессора 8087.

Вещественные числа представляются с фиксированной точкой (0.01) или в экспоненциальной форме (2.1Е-10).


Внутреннее представление вещественных чисел:


v

мантисса

экспонента



39 бит 8 бит real
8 бит 23 бита single
11 бит 52 бита double
Знаковый разряд (0 - «+»

1 – «-»)

Символы.


Тип данных char обозначает множество символов кода ASCII.

Один символ требует для своего внутреннего представления 8 бит (1 байт).

Символы пронумерованы от 0 до 127 (для РС-ДОS от 0 до 255).

Константы такого типа обрамляются апострофами: ‘a’, ‘b’, ‘+’.

Если в строке встречается апостроф «’», тогда его следует удвоить: ‘Пример’’.’

Для этого типа данных существуют следующие стандартные функции: ord(x), chr(x), upcase(x).

ORD(x) – дает порядковый номер символа x (x-char) в упорядоченном множестве символов. Например для ORD(‘:’) = 58.

CHR(x) – дает символ, стоящий под номером x (x-integer) в упорядоченном множестве символов. Например для ORD(‘:’) = 58.

Upcase(x) – дает большую букву x (x-char), если она существует, иначе х остается неизменным.

Над переменными символьного типа можно проводить операции отношения.

Также применимы стандартные функции PRED(S) и SUCC(S).


Boolean - Булевский тип


Характеризуетсяодним из двух значений: - истина и - ложь.

При внутреннем их представлении занимают 8 бит.

К нему применимы три логические операции: AND (конкъюнкция), OR (дизъюнкция) и NOT (отрицание).

Определено, что False < True.

Вводить значения булевского типа нельзя!


Стандартные функции (Табл.1):

Имя функции

Математ.выражение

Тип результата

Комментарий

SIN(X)

Sin x

Real

Синус

COS(X)

Cos x

Real

Косинус

LN(X)

Ln x

Real

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

SQRT(X)

Квадр.корень x

Real

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

ARCTAN(X)

Arctg x

Real

Арктангенс

EXP(X)

e**x

Real

Экспонента

SQR(X)

X**2

Integer

Квадрат x

ABS(X)

|X|

Integer

Абсолютное значение

Random(x)

X может отсутствовать

Real или Word

Случайное число: при real от 0 до 1

при Word от 0 до x

Pi

Число 

Real

Значение числа 

ODD(X)

Четность числа

Boolean

False - четное

True - нечетное

Inc(x,n)

Значение x, увели-ченное на n

X – перечисляемый тип

N - Integer

Значение функции типа x


Если n отсутствует, увеличение на 1

Dec(x,n)

Значение x, уменьшенное на n

X – перечисляемый тип

N - Integer

Значение функции типа x


Если n отсутствует, уменьшение на 1

A mod b

Целочисленный остаток от деления а на b

Integer

При b<0 приводит к ошибке

A div b

Результат деления а на b

Integer




Арифметические операции и функции из таблицы 1 применяются при работе с целыми и вещественными числами.


Функции для преобразования типов данных:


Int(x) – значением функции является целая часть вещественного числа x.


Frac(x) – значением функции является дробная часть вещественного числа x.


TRUNC(X) – вырабатывает целый результат путем отбрасывания дробной части вещественного числа x в формате longint. Пример: из 21.53 получится 21.


ROUND(X) – вырабатывает целый результат путем округления вещественного числа до ближайшего целого. Пример: из 21.53 получится 22, из 21.3 получится 21.


Hi(x) – старший байт x (x – integer)


lo(x) – младший байт x (x – integer)


swap(x) – оба байта меняются местами (x – integer)

Дополнительные функции:


Sizeof(x) – значением функции является число байтов, занимаемых в памяти x (x – наименование типа или имя переменной). Значение функции типа Word.


SUCC(X) – вырабатывает число на единицу большее, чем X.


PRED(X) – вырабатывает число на единицу меньшее, чем X.


Битовые операции (Табл.2):

Уровень

Операція

Тип операнда

Тип результата

Значение

0

Not

Integer

Integer

Побитное отрицание

1

And

Integer

Integer

Побитное И

1

i shl n

Integer

Integer

Значение i сдвигается влево на n разрядов

1

i shr n

Integer

Integer

Значение i сдвигается вправо на n разрядов

2

Or

Integer

Integer

Побитное Или

2

Xor

Integer

Integer

Побитное исключающее Или



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


Логические операции имеют значение типа Boolean, т.е. True или False. Переменные и функции типа Boolean могут связываться через следующие операции:
  • Not – отрицание (уровень 0)
  • And – объединение (И или конъюнкция) (уровень 1)
  • Or – Или (дизъюнкция) (уровень 2)
  • Xor – исключение (уровень 2)
  • =, <>,<,<=,>,>= - операции сравнения (уровень 3).


Приоритеты операций

(операции в одной строке имеют одинаковый приоритет в соответствии с уровнем ):

1. Not



2. * , /, MOD, DIV, AND


3. +, -, OR


4. <, <=, >, >=, <>, =

Операции одного и того же старшинства выполняются слева направо.

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


Приведение типов.


Паскаль является строгим языком по вопросу совместимости типов данных.

При выполнении выражений тип результата совпадает с самым сложным типом операндов!

Для двуместных операциях (a op b) «простейший тип» преобразуется в тип более сложного.

Необходимо учитывать последовательность выполнения операций (см.выше).


Организация ввода-вывода.


Для каждого процесса ввода-вывода следует указать, откуда и куда осуществляется чтение или запись и как это должно выполняться.

В Паскале связь программы с внешними устройствами осуществляется через имена файлов. Но в простейшем случае ввод данных происходит с клавиатуры (имя файла input), а экран дисплея – вывод (имя файла output). Тогда заголовок программы выглядит так: program primer(input,output).


Ввод.


В разделе операторов используются операторы ввода-вывода READ и READLN (после ввода всех данных производится переход к другой строке).

Формат команды: Read(v1,v2,…,vn)

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

Информация набирается в виде: 2.5 7.3 –17.5 на одной или нескольких строках.

Read может иметь переменное число параметров.

Readln может не иметь параметров вообще – Readln – просто перевод на следующую строку.


Вывод.


Операторы вывода WRITE и WRITELN (обеспечивает переход на начало следующей строки).

Формат команды: write(v1,v2,…,vn)

Пример: WRITE(A:2,B:5,C:4); После двоеточия указывается количество отведенных под поле позиций. Если количества указанных позиций недостаточно происходит автоматическое увеличение поля до необходимых размеров. Если размер поля при печати не указывается, то под поле отводится стандартное количество позиций, отличающееся для реализаций ПК.

Переменные пишутся через «,».

Выводимые символы пишутся между апострофами.

Форматирование выводимых данных:
  • Для целых чисел формат такой WRITE(A:d), где d – выражение типа integer, задающее ширину поля данных А с выравниванием по правому краю. Пример, WRITE(A:6).
  • Без применения форматирования вещественные числа выводятся в экпотенциальной форме (x.xxxxE+-xx). Форматированный вид выглядит так:: WRITE(A:d:s),где s - выражение типа integer, задающее количество знаков после запятой. Пример, WRITE(A:6:2). Если задаваемая ширина поля данных d будет выбрана слишком маленькой, d расширяется до нужного числа позиций.
  • При выводе значений символьного типа, если явно не указывается количество позиций, под каждый символ отводится одна позиция. Форматированный вывод выглядит так: WRITELN(S:5).

При выводе значений булевского типа на печать выводится TRUE или FALSE.

В отличие от read, где параметрами должны быть имена переменных, параметрами write могут быть и выражения. Например, write(2*I,3+5/(x+2),chr(123));


Операторы.


Операторы располагаются в Исполняемой части программы.

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

Операторы подразделяются на простые и структуризованные.


Простые операторы.


1. Оператор присваивания.


Это важнейший оператор любого языка программирования.

Он позволяет присвоить переменной значение выражения.

Он обозначается так: переменная «:=» выражение.

При этом тип выражения должен соответствовать типу переменной. Но допускается присваивание вещественной переменной значения выражения целого типа.

Присваивание же переменной целого типа выражения вещественного типа запрещено!

2. Пустой оператор.


Не выполняет никаких операций и ставится из соображений синтаксиса.


3. Оператор условного перехода – GO TO.


Чаще всего используется вместе с Условным оператором IF для перехода к определенному месту программы, которое называется меткой.

Переход описывается фразой GO TO <Метка>

Метка выглядит так:

32: X:=5;

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

LABEL 32;


Есть еще простые операторы: 4. Оператор процедуры и 5. Встроенный оператор.


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


1. Составной оператор.


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

Он обрамляется командами begin и end;

Составной оператор позволяет объединить несколько операторов и рассматривать их с точки зрения синтаксиса, как один.


2. Условный оператор.


Позволяет выбрать один из нескольких возможных операторов.

Существует два вида условного оператора:
  1. IF B THEN S1 – если выражение B – TRUE (истина), то выполняется выражение, стоящее после THEN.
  2. IF B THEN S1 ELSE S2 - если выражение B – TRUE (истина), то выполняется выражение, стоящее после THEN, иначе, после ELSE.


B – выражение булевского типа;

S1, S2 – отдельные операторы или операторы, сгруппированные при помощи операторных скобок BEGIN END. Перед Else после End «;» не ставится.

S1 и S2 в свою очередь тоже могут быть условными операторами. При этом каждому ELSE соответствует предыдущий THEN.


3. Операторы цикла:


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

Есть два вида циклов:
  • Заранее известно сколько раз нужно выполнить цикл – оператор For.
  • Неизвестно, сколько раз нужно выполнить цикл – операторы while и repeat.

Также есть три случая по месту, где стоит условие:
  • В начале цикла - оператор while;
  • В середине цикла – если цикл прерывается в середине оператором перехода.
  • В конце цикла - оператор repeat.


Оператор цикла с параметром FOR:


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

Есть два варианта оператора FOR:
  1. FOR P:=NV TO KV DO A – увеличение значений (NV<=KV)
  2. FOR P:=NV DOWNTO KV DO A – уменьшение значений (NV>=KV)

P – параметр цикла.

NV и KV – начальное и конечное значения.

A – составной или простой оператор.

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

В качестве параметра цикла нельзя использовать переменную вещественного типа.

Переменная цикла и оба выражения (А с To и Downto) должны иметь одинаковый тип, (т.е. не могут быть типа real).

Задать шаг цикла отличный от 1 или –1 нельзя! .

Примеры операторов FOR:
  1. S:=0; FOR I:=1 TO 7 DO S:=S+1;
  2. S:=0; FOR I:=10 TO 2 DO S:=S+1;
  3. FOR K:=1- TO 13 DO BEGIN

L:=K*K; WRITLN(‘L=’,L:3)

END;

3 – используется составной оператор.

Ограничения для оператора цикла с параметром:

  • значения параметра цикла, начального и конечного значений внутри цикла изменять нельзя;
  • войти в цикл можно только через его начало, а выйти только при исчерпании значений параметра цикла.


Оператор цикла с предусловием WHILE:


Выглядит так: WHILE B DO A

B – выражение булевского типа

A – простой или составной оператор.

Пока выражение B выполняется оператор A.

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

Пример:

K:=0;

WHILE K<=10 DO

BEGIN

K:=K+2; WRITE(K:3)

END;

Оператор цикла с постусловием REPEAT:


Похож на оператор с предусловием, но условие вычисляется и проверяется после выполнения операторов, составляющих тело цикла.

Общий вид оператора:

REPEAT A1;A2;…;AN

UNTIL B

В отличие от предусловия выход из цикла происходит при истинности выражения В.

K:=0

REPEAT

K:=K+2; WRITE(K:3)

UNTIL K>10


4. Оператор With:


Оператор варианта CASE:


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

Его формат:

CASE <СЕЛЕКТОР> OF

<СПИСОК МЕТОК ВАРИАНТА>: <ОПЕРАТОР>



<СПИСОК МЕТОК ВАРИАНТА>: <ОПЕРАТОР>

END;


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

Если ни одно значение не совпало, то ситуация считается неопределенной.

Примеры:

PROGRAM WAR;

VAR SYM:’A’..’G’; I,J:1..9;

BEGIN

READLN;

WRITE(‘ВВЕДИ БУКВУ ИЗ ДИАПАЗОНА A-F’); READLN(SYM);

WRITE(‘ВВЕДИ ЦЕЛОЕ ЧИСЛО ИЗ ДИАПАЗОНА 1-9’); READLN(I);

CASE SYM OF

‘A’,’B’,’C’,’E’: WRITELN(SYM:3,’ БУКВА И РУССКАЯ И ЛАТИНСКАЯ’);

‘D’,’F’,’G’: : WRITELN (SYM:3,’ БУКВА ЛАТИНСКАЯ’);

END;

CASE I OF

2,4,8: BEGIN WRITE(I:2, ‘ КРАТНО 2’);

J:=ROUND(I/2);

WRITELN(‘ I/2=’,J:2)

END;

3,9: BEGIN WRITE(I:2, ‘ КРАТНО 3’);

WRITELN(‘ I/3=’,ROUND(J/3):2)

END;

6: WRITELN(I:2, ‘ КРАТНО 2 и 3’,’1/6=’,ROUND(I/2/3):2)

1,5,7: WRITELN(I:2, ‘ ПРОСТОЕ ЧИСЛО‘)

END

END.


Переменные Sum и I описаны, как переменные ограниченных типов.

Обращение к стандартной функции ROUND обязательно, так как операция деления вырабатывает всегда вещественный результат.


Типы структурированных (комбинированных) данных:


Структурированные данные составляются из других типов данных.

Служебное слово Packed должно обеспечить наиболее эффективное размещение в памяти данных этого типа.


  1. Строки - Тип string.


Строка – последовательность символов определенной длины.

Особое место в языке ПАСКАЛЬ занимают массивы символов.

Стандартный ПАСКАЛЬ допускает два способа хранения символьных массивов в памяти ЭВМ: распакованный и упакованный. Распакованные массивы символов хранятся в памяти ЭВМ по одному символу в машинном слове, упакованные - по одному символу в байте. При описании упакованного массива символов используют служебное слово PACKED, например:

  var MAS: Packed Array[1..20] of Char;

  Описание распакованного массива символов имеет вид:

  var M: Array[1..20] of char;

  Для преобразования символьного массива из распакованной формы в упакованную и наоборот, из упакованной в распакованную, в язык ПАСКАЛЬ введены две стандартные функции Pack, UnPack.

Упакованный массив символов образует символьную строку. Символьная строка может быть либо строковой константой, либо строковой переменной. Строковая константа, или строка, представляет собой совокупность символов, заключенную в апострофы.

Строка - это элементарная конструкция языка ПАСКАЛЬ.

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

Строковые переменные - это одномерные упакованные массивы символов, для описания которых в TURBO PASCAL введен тип String. Например, если строка содержит до 30 символов, ее тип будет определен как  

type s= String[30];

Длина строки не может содержать более, чем 255 символов.

В TURBO PASCAL определено понятие строки переменной длины, в этом случае ее описание задается как  

type s= String;  

Тип String без указания длины совместим со всеми типами строк.

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

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

Для строк определены операции присваивания, слияния (конкатенации) и сравнения.

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

Строки могут быть элементами списка ввода - вывода, при этом записывается имя строки без индекса.

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

Инициализация строк может производиться как с помощью типизированных констант:

const sName: String[9]= 'IBM PC/AT';

так и с использованием второй разновидности функции FillChar:

FillChar( var V; NBytes: Word; C: Char );

например:

FillChar(A, SizeOf(A), '0');

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


2. Регулярные типы данных (массивы) - тип array:


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

Общий вид описания массива: ARRAY[T1] OF T2, где

T1 – число компонентов массива – индекс массива - не может быть вещественным числом.

Т2 – тип компонентов.

Массивы могут быть одномерные и многомерные.


Примеры объявления массивов:

TYPE COLOR=(RED,BLUE,BLACK);

MAS1=ARRAY[-5..15] OF REAL; - одномерный массив

MAS2=ARRAY[1..10,1..10] OF INTEGER; - Двухмерный массив или Матрица 10 строк на 10 столбцов.

MAS3=ARRAY[‘A’..’C’] OF ARRAY[1..5] OF BOOLEAN; - Матрица логических величин. Три строки ‘A’, ‘B’,’C’ и пять столбцов. Обращение к элементу (2,1) – C[‘B’,1].

MAS4=ARRAY[BOOLEAN] OF CHAR; - Символьный вектор из двух компонентов: TRUE и FALSE.

VAR A:MAS1; B:MAS2; C:MAS3; D:MAS4; E:ARRAY[COLOR] OF REAL; - Трёхкомпонентный вектор, так как перечислимый тип COLOR содержит три объекта и описан ранее.


Пример суммирования положительных элементов каждой строки матрицы и формирует вектор сумм.

TYPE MAT1=ARRAY[0..5,0..9] OF INTEGER;

VEK1=ARRAY[0..5] OF INTEGER;

VAR MM:MAT1; VV:VEK1; S,I,J:INTEGER;



FOR I:=0 TO 5 DO

BEGIN

S:=0;

FOR J:=0 TO 9 DO

IF MM[I,J]>0 THEN S:=S+MM[I,J]

VV[I]:=S

END;


Упакованные массивы:


Массив в Паскале может быть упакованным. При этом экономится место в памяти, но увеличивается время доступа к компонентам массива.

Используется так же, как обычный массив.

Объявление – VAR AP:PACKED ARRAY[1..3] OF BOOLEAN;


Ввод и вывод элементов массивов:


Вводить и выводить массивы можно только поэлементно. Исключение составляет вывод строк.

Пример программы ввода-вывода:

CONST S=’СТРОКА’;

TYPE MAS1=PACKED ARRAY[1..6] OF CHAR;

MAS2=ARRAY [1..3,1..2] OF REAL;

VAR XS:MAS1; XF:MAS2; I,J:INTEGER;

(* ФРАГМЕНТ 1 *)

BEGIN

READLN; WRITE(‘XS=>’ );

FOR I:=1 TO 6 DO READ(XS[I]); (* ВВЕСТИ ABCDEF *)

(* ФРАГМЕНТ 2 *)

READLN; WRITE(‘XF=>’); (* ВВЕСТИ 1.1 1.2 1.1 2.2 3.2 *)

FOR I:=1 TO 3 DO

FOR J:=1 TO 2 DO READ(XF[I,J);

(* ФРАГМЕНТ 3*)

WRITELN(S, ‘=’,XS);

(* ФРАГМЕНТ 4*)

FOR I:=1 TO 3 DO

BEGIN

FOR J:=1 TO 2 DO WRITE(F[I,J):6:2);

WRITELN

END

END.


3. Записи (тип Record):


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

В отличие от массивов поля могут иметь разные типы.

Доступ к ним осуществляется по имени поля.

После служебного слова record перечисляются поля. Описание типа заканчивается оператором end;

Описание данных типа Record требует задания наименования типа, указания имен компонент (полей) и их типов.


Пример: запись, содержащая анкетные данные студента.

TYPE

STUDENT=RECORD

FIO: ARRAY[1..15] OF CHAR;

DATAROJD:RECORD

DAYDATE:1..3;

MONTHDATE: (JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);

YEARDATE:INTEGER

END;

POL: (MAN,WOM)

END;

VAR CC:STUDENT; GROUP:ARRAY[1..30] OF STUDETN;


Запись данных в поле. Например: CC:FIO:=’Abramov A.A.’


Оператор присоединения:


Операторы присваивания можно записать компактно, если использовать оператор присоединения:

WITH <список переменных-записей, полей> DO <ОПЕРАТОР>;

Имена записей (СС) можно опускать. Транслятор автоматически формирует полные имена:

WITH CC, DATAROJD DO

BEGIN DAYDATE:=25

MONTHDATE:=FEB;

YEARDATE:=1971

END;

Записи могут входить в качестве компонентов в другие переменные. Например, переменная Group – это вектор из 30 записей. Оператор присваивания нового значения полю Месяц:

GROUP[5].DATAROJD.MONTHDATE:=DK

Доступ к каждой записи осуществляется с помощью индекса.

Подсчет числа студентов мужского пола, родившихся в 1974 году:




K:=0; FOR I:=1 TO 30 DO

WITH GROUP[I], DATAROJD DO

IF (YEARDATE=1974) AND (POL=MAN) THEN K:=K+1;

WRITELN(‘KOL MAN=’,K:2);



Записи с вариантами:


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

TYPE POL=(MAN,WOM);

PEOPLE=RECORD

FAM:ARRAY[1..10] OF CHAR;

GODROJD:1900..2010;

MG:POL;

CASE POL OF

MAN(ARMY:BOOLEAN;SPEC:ARRAY[1..15] OF CHAR);

WOM(ZAMUG:BOOLEAN;DETI:INTEGER)

END;

VAR CH1,CH2:PEOPLE;


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

«MG» - поле общей части, которое указывает вариант. Это поле называется «полем признака» или «дискриминантом».

Все варианты описываются внутри оператора CASE.

Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонентов.

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

Можно записать следующие операторы присваивания:

CH1:FAM:=’STOLAROV’;

CH1:GODROJD:=1970;

CH1:MG:=MAN;

CH1:ARMY:=TRUE;

CH1:SPEC:=’PROGRAMMER’;

Задав значение поля признака MG (некоторую константу типа POL), можно присваивать значения только полям вариантой части, помеченным такой же константой.




4. Тип Set.


5. Тип File.


Процедуры и функции (подпрограммы):


Процедуры и функции аналогичны программам в миниатюре и имеют общее название – подпрограммы.

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

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

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

В программе описание подпрограмм должно располагаться между разделами переменных и операторов.

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

Локальные и глобальные величины.

Переменные, объявленные в теле процедуры или функции являются локальными переменными (т.е. видны только в данной процедуре или функции).

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

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


1. Описание процедуры:


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

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

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

Форма описания Процедуры:

Procedure <имя> (<список формальных параметров>)


Например: procedure scet(n:integer; var sum:real);


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

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

Формальным параметрам, вызов которых должен обеспечить передачу параметров по ссылке, в списке параметров предшествует var.


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

<имя процедуры> (<список фактических параметров>);


Например, scet(k, sum);


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

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

Формальные параметры, передаваемые по ссылке должны заменяться именем переменной того же типа.


Описание функции. Указатель функции.:


Описание функции в основном аналогично описанию процедуры.

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


Тип результата задается в заголовке функции:

Function <имя> (<список формальных параметров>): <тип результата>


Пример: function sum(x:int):real;


Среди входящих в функцию операторов должен присутствовать хотя бы один оператор присваивания, в левой части которого стоит имя данной функции. Например: sum := itogi;

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


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

Например, Writeln(‘сумма =’,sum(n):5:2)


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


Перечислимые скалярные типы данных:


Перечислимый тип данных задаётся списком значений.

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

TYPE DAY(MO,TU,WE,TH,FR,SA,SU);

VAR D1,D2,D3:DAY;

Данное описание означает, что переменные D1,D2,D3 типа DAY могут принимать только одно из семи указанных значений.

Объект, указанный в списке, может присутствовать не более, чем в одном описании.

Можно записать следующий оператор присваивания: D1:=SU

Нельзя присваивать переменной значение из описания другого типа!

Для данного типа применимы стандартные функции PRED, SUCC и ORD:
  • SUCC(TU) – выдаст значение «WE»
  • PRED(SU) – равно «SA»
  • ORD(MO) – выдаст значение «0», так как нумерация объектов в списке начинается с «0».

Пример цикла с предусловием по заданному значению переменной FT (фамилия) присваивает переменной IT соответствующее имя:

PROGRAM PT;

TYPE ИМЯ=(Андрей,Алексей,Борис,Глеб);

ФАМИЛИЯ=(Иванов,Петров,Сидоров,Шилов)

VAR FT,P1:ФАМИЛИЯ; IT,P2:ИМЯ;



P1:=ИВАНОВ; P2:=АНДРЕЙ;

WHILE P1
BEGIN

P1:=SUCC(P1); P2:=SUCC(P2)

END;

IT:=P2;




Ограниченные типы данных:


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

TYPE DAY(MO,TU,WE,TH,FR,SA,SU);

WD=SA..SU;

NOM=10..25;

SS=’C’..’X’

Нижняя граница (10) не должна быть больше верхней!


Построение программы по модульному принципу - Модули


Построение программы по модульному принципу:

Когда программа превышает определенный объем или когда одновременно несколько человек хотят работать над программой, можно разбить программу на части. Такое разбиение программы называется построением ее по модульному принципу. При этом можно выделить три ступени:
  1. Разбиение на модули исходной программы.
  2. Разбиение на модули программы в объектных кодах.
  3. Раздельная трансляция модулей исходной программы.



  1. Разбиение на модули исходной программы.


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

В основной программе вставить обращение к подпрограмме – (*$Имя_файла*)

В соответствующем месте добавится текст из указанного файла.

Компилятор работает с полным исходным текстом.


2. Разбиение на модули программы в объектных кодах (Overlay).


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

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

Процедуры и функции можно снабжать заголовком Overlay.


3. Раздельная трансляция модулей исходной программы.


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

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

Модуль для описания переменных – Typen.pas. Характерным признаком является интерфейсная часть, начинающаяся с кодового слова «interface».


unit Typen;

interface

const n=25;

var Mas:array[1..n,1..n] of real;

c:real;

i,j,k,flag:integer;

implementation

begin

end.


Вызывающая программа обращается к модулю с помощью команды Uses.

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

unit ww_mas;

interface

Type


Procedure Vv_mas(k:integer);

uses typen;

implementation

Procedure Vv_mas(k:integer);

begin

writeln('Vvedite elementy massiva Mas ');

for i:=1 to k do

for j:=1 to k do

readln(Mas[i,j]);

writeln('Procedure - Elementy ishodnogo massiva');

for i:=1 to k do

begin

writeln;

for j:=1 to k do

write(Mas[i,j]:4:1,' ');

end;

end;

Здесь необходимо обратить внимание на объявление процедуры и ключевое слово Type.

В результате главная программа становится очень лаконичной.

Program zad7;


uses Typen, ww_mas;


begin

write('Vvedite faktich razmer massiva = ');

readln(k);

Vv_mas(k);

end.
    • Unit-ы компилировать с помощью меню – Compile/Destination Disk, при этом в настройках нужно указать путь на папку, где содержатся тексты программ
    • Результатом компиляции будет файл с расширением TPU.
    • Необходимо обращать внимание на правильное название модулей и процедур, иначе компилятор будет сообщать об ошибках их вызова.