Алгоритмические языки высокого уровня. Курс лекций
.pdfных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она опи- сывается с последующей стандартной директивой 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
