Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
940 Кб
Скачать

ных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она опи- сывается с последующей стандартной директивой ABSOLUTE, за которой помещается либо абсолютный адрес, либо идентификатор ранее определенной переменной. Абсолютный адрес указывается парой чисел типа WORD, разделенных двоеточием; первое число трактуется как сегмент, второе как смещение адреса.

Пример: b : Byte absolute $0000:$0055; w : Longlnt absolute 128:0;

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

var

х : Real;

у : array [1..3] of Integer absolute x;

Здесь переменные X и Y будут размещены начиная с одного и того же абсолютного адреса. Таким образом, область памяти длиной 6 байт и размещенные в этой области данные теперь можно рассмат- ривать как данные либо типа REAL, либо как массив из трех данных типа INTEGER.

Пример программы

Описание: программа выведет на экран содержимое первых двух байт представления вещественного числа пи = 3.1415 в виде целого числа.

var

х : Real;

у : array[1..3] of Integer absolute x; begin

х := pi; WriteLn(y[1]);

end.

На экран будет выведен результат: 8578.

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

21

 

 

 

Таблица 2.2

Использование операций с операндами различного типа

 

 

 

 

Операция

Действие

Тип операндов

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

 

 

 

 

Not

Отрицание

Логический

Логический

 

 

 

 

Not

Отрицание

Любой целый

Тип операнда

 

 

 

 

@

Адрес

Любой

Указатель

 

 

 

 

*

Умножение

Любой целый

Наименьший

 

 

 

целый

*

Умножение

Любой веществен-

Exended

 

 

ный

 

 

 

 

 

*

Пересечение

Множественный

Множественный

 

множеств

 

 

 

 

 

Extended

/

Деление

Любой веществен-

 

 

ный

 

Div

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

Любой целый

Наименьший

 

деление

 

целый

Mod

Остаток от

Любой целый

Наименьший

 

деления

 

целый

And

Логическое И

Логический

Логический

 

 

 

 

And

Логическое И

Любой целый

Наименьший

 

 

 

целый

 

 

 

 

Shl

Левый сдвиг

Любой целый

Наименьший

 

 

 

целый

 

 

 

 

Shr

Правый сдвиг

Любой целый

Наименьший

 

 

 

целый

 

 

 

 

+

Сложение

Любой целый

Наименьший

 

 

 

целый

+

Сложение

Любой веществен-

Extended

 

 

ный

 

+

Объединение

Множественный

Множественный

 

множеств

 

 

+

Сцепление

Строковый

Строковый

 

строк

 

 

 

 

 

 

-

Вычитание

Любой целый

Наименьший

 

 

 

целый

 

 

 

Extended

-

Вычитание

Любой веществен-

 

 

ный

 

 

 

 

 

Or

Логическое

Логический

Логический

 

ИЛИ

 

 

Or

Логическое

Любой целый

Наименьший

 

ИЛИ

 

целый

=

Равно

Любой простой

Логический

 

 

или строковый

 

22

 

 

 

Окончание табл. 2.2

 

 

 

 

Операция

Действие

Тип операндов

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

 

 

 

 

<>

Не равно

Любой простой

Логический

 

 

или строковый

 

 

 

 

 

<

Меньше

Логический

Логический

<=

Меньше или

Логический

Логический

 

равно

 

 

>

Больше

Логический

Логический

>=

Больше или

Логический

Логический

 

равно

 

 

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

 

 

 

 

 

 

 

 

 

 

Таблица 2.3

Простейшие логические операции над логическими данными

 

 

 

 

 

 

 

 

 

 

 

Операция

 

Знак

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

Действие

 

Результат

Меньше

 

<

 

Логический

3<5

 

True

 

 

5<3

 

False

 

 

 

 

 

 

 

 

Меньше или

 

< =

Логический

3<=5

 

True

равно

 

5<=3

 

False

 

 

 

 

 

 

Равно

 

=

 

Логический

3=3

 

True

 

 

3=5

 

False

 

 

 

 

 

 

 

 

Неравно

 

<>

 

Логический

3<>5

 

True

 

 

3<>3

 

False

 

 

 

 

 

 

 

 

Больше или

 

>=

 

Логический

5>=3

 

True

равно

 

 

3>=5

 

False

 

 

 

 

 

 

Больше

 

>

 

Логический

5>3

 

True

 

 

3>5

 

False

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 2.4

 

Логические операции над логическими данными

 

 

 

 

 

 

 

 

 

 

 

 

A

 

B

 

Not A

A and B

 

A or B

 

A xor B

 

 

 

 

 

 

 

 

 

 

False

 

False

 

True

False

 

False

 

False

False

 

True

 

True

False

 

True

 

True

True

 

False

 

False

False

 

True

 

True

True

 

True

 

False

True

 

True

 

False

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

23

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

 

 

 

 

 

 

 

 

 

 

Таблица 2.5

 

 

 

Побитовые логические операции

 

 

 

 

 

 

 

 

 

 

 

 

A

 

B

 

 

Not A

A and B

 

A or B

A xor B

 

 

 

 

 

 

 

 

 

 

 

0

 

0

 

 

1

 

0

0

0

0

 

1

 

 

1

 

0

1

1

1

 

0

 

 

0

 

0

1

1

1

 

1

 

 

0

 

1

1

0

 

 

 

 

 

 

 

 

 

 

Таблица 2.6

 

 

Примеры побитовых логических операций

 

 

 

 

 

 

 

 

 

 

 

 

Операция

Знак

 

Тип

 

Тип

 

Действие

Результат

 

операндов

 

результата

 

 

 

 

 

 

 

 

 

 

Отрицание

Not

 

 

Целые

 

Целый

 

NOT 0

255

И

And

 

 

Целые

 

Целый

 

5 AND 3

1

Или

Or

 

 

Целые

 

Целый

 

5 OR 3

7

Исключающее

Xor

 

 

Целые

 

Целый

 

5 XOR 3

6

Или

 

 

 

 

 

 

 

 

 

 

 

 

 

Примечание. Во всех примерах операнды и результат имеют тип BYTE.

5 |0|0|0|0|0|1|0|1|

 

5 |0|0|0|0|0|1|0|1|

3 |0|0|0|0|0|0|1|1|

 

3 |0|0|0|0|0|0|1|1|

5 AND 3 |0|0|0|0|0|0|0|1| = 1

5 OR 3 |0|0|0|0|0|1|1|1| = 7

 

 

 

 

 

(20=1)

 

(20+21+22=7)

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

Операции сдвига над целыми числами (i и j выражения це-

лого типа):

i shl j сдвиг содержимого i на j разрядов влево, освобо- дившиеся младшие разряды заполняются нулями;

i shr j сдвиг содержимого i на j разрядов вправо, освобо- дившиеся старшие разряды заполняются нулями;

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

24

 

 

 

 

 

 

Таблица 2.7

 

 

Операции сдвига

 

 

 

 

 

 

 

 

 

 

Операция

Знак

Тип

Тип ре-

Действие

Результат

операндов

зультата

 

 

 

 

 

 

 

 

 

 

 

 

Сдвиг влево

SHL

Целые

Целый

5

SHL 3

40

Сдвиг вправо

SHR

Целые

Целый

5

SHR 3

0

5 |0|0|0|0|0|1|0|1|

5 |0|0|0|0|0|1|0|1|

5 SHL 3|0|0|0|0|0|1|0|1|0|0|0|=40 (25+23=40)

5 SHR 3|0|0|0|0|0|0|0|0|0|1|1|=0

Пример программы

Описание: программа вывода значений логических операций над целыми числами.

var

n,m : integer; begin

while not EOF do begin

ReadLn(n,m); WriteLn('n=',n,' m=',m);

WriteLn(n,' and ',m,' = ',n and m); WriteLn(n,' or ',m,' = ',n or m) ; WriteLn(n,' xor ',m,' = ',n xor m); WriteLn(n,' shl ',m,' = ' ,n shl m); WriteLn(n,' shr ',m,' = ' , n shr m)

end;

end.

На экран будет выведен результат:

n = 3

m = 5

n and

m = 1

n or

m = 7

n xor

m = 6

n shl

m = 96

n shr

m = 0

2.6. Структура исходного текста программы Pascal

Программы, написанные на языке программирования Pascal, имеют вид:

25

program First;

usus

 

{раздел описаний}

type

 

 

const

 

 

procedure

 

 

function

Begin

var

 

{раздел операторов}

if

 

 

for

 

 

repeat

 

 

case

end.

другие

 

 

Зарезервированные слова PROGRAM,

BEGIN и END выделяют

2 части программы: раздел описаний и раздел операторов. Такая структура обязательна. Любой объект, используемый в программе, должен быть учтен в разделе описаний. Иными словами, в разделе описаний должны быть перечислены имена всех используемых в программе меток, констант, нестандартных типов данных, перемен- ных. Кроме того, в разделе описаний приводятся тексты функций и процедур. Раздел операторов это основная часть программы, здесь содержатся команды, составляющие программу. Программа, напи- санная по правилам стандартного языка Pascal, должна иметь в своем полном варианте (когда в ней задействованы все виды программных объектов) следующую структуру:

Program имя программы;

Uses Список используемых модулей

Uses DOS, Crt, Graph; {Подключение трех стандартных модулей} DOS – использование в программе команд операционной системы

Crt – расширение возможностей ввода-вывода

Graph – подключение графических процедур и функций Label Список меток из основного блока программы

Label 5,361,17;

Const Определение констант программы

Const a=-1.5; b=True; c = `pascal`; Type Описание типов

Type d=1..100; abc='a'..'z';

color=(red,yellow,green); vektor = Array[d] of Real; Var Описание переменных

26

Var n,m:Integer; a: Real; b1,b2: Boolean; pen: color;

x: vektor;

Procedure / Function Описание (текст) процедуры/функции {Процедура преобразования символьной строки в верхний ре-

гистр}

Procedure StringUp (sl:String; var s2:String); var

i: Integer; {Счетчик цикла преобразования} с: Char; {Рабочая переменная преобразования} begin {StringUp}

s2:=' '; {Вначале выходная строка пуста} for i:=1 to Length(si) do

begin

с:= sl[i];

if (с >= 'a') and (с <= 'z') then с:=chr(ord('A')+ord(c)-ord('a1)) {А,а - латинские!}

else

if (c >= 'a') and (c <= 'n') then с:=chr(ord('A')+ord(с)-ord('a')) {А,а - русские!}

else

if (c >= 'p') and (с <= 'я') then с:=chr(ord('PI)+ord(c)-ord('p'));

s2:=s2+c;

end;

end; {StringUp} Begin

Основной блок программы (раздел операторов) End.

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

2.7. Операторы ввода-вывода

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

27

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

Операторы ввода (форматы операторов):

Read(<Список ввода>); Readln(<Список ввода>).

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

Выполнение операторов ввода происходит так: ход программы приостанавливается, на экран выводится курсор, ПК ожидает от поль- зователя набора данных для переменных, имена которых указаны в списке ввода. Пользователь с клавиатуры вводит необходимые значе- ния в том порядке, в котором они требуются списком ввода, нажимает <Enter>. После этого набранные данные попадают в соответствующие им переменные и выполнение программы продолжается.

Примечание. Данные при вводе разделяются пробелами.

Разница между работой процедур Read и Readln: после выпол- нения Read значение следующего данного считывается с этой же строчки, а после выполнения Readln с новой строки.

Операторы вывода (форматы операторов):

Write(<Список вывода>); Writeln(<Список вывода>).

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

Различие между работой процедур Writeln и Write: после вы- полнения Writeln происходит переход на новую строчку, а после

28

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

Форматы оператора вывода.

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

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

Пример использования форматов

Writeln (’ a = ’ , a:8:3, ’ b = ’, b:4);

При a

= 341.154,

b

=

2 на экране будет: a

=

_341.154

b = _ _ _ 2

 

 

 

 

 

При a

= 1.3, b

=

144

на экране будет:

a

= _ _ _

1.300

b = _144

 

 

 

 

 

Writeln (’Строка - ’ , s:3);

Пример программы (использование операторов ввода и вывода)

Var

R,S : Real; Begin

Write('Введите радиус круга '); {Печать на экране сообщения о вводе}

Readln(R); {Ввод значения в переменную R с клавиатуры} S:=4*ARCTAN(1)*SQR(R); {Вычисление площади круга (pR2)} Writeln('Площадь круга радиусом ',R,' равна ',S);{Печать на экране}

End.

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

29

Пример программы

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

Program begin_example; uses crt;

const

FileName= ‘c:\1\file_ex1.dat`; maxR=3; Pr= ‘ ‘; type

st10=string[10];

FD=record

Name:st10;

Sum:real;

end;

RealAr=array[1. .maxR] of real; var

Vname:array[1. .maxR] of st10; Vsum:RealAr;

VFD:FD; FileD:file of FD: i:integer; SumFD:real; maxRaz:integer; NameFD:st10; Fin:boolean;

procedure Write_Array; begin

gotoxy(10,8); write(‘ Данные из файла: ’); for i := 1 to maxRaz do

begin

gotoxy(1, i + 10) ; write(i,‘-элемент

’,‘Name=’,Vname[i]:10,‘Sum=’,Vsum[i]:12:2);

end;

end;

procedure Read_FileD; begin

reset (FileD); i := 0;

while not eof(FileD) do begin

read(fileD, VFD); i :=i + 1;

with VFD do begin

Vname[i] :=VFD.Name;

Vsum[i] := VFD.Sum; end;

end; maxRaz :=I;

30

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