Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗАЧЁёёт прога.docx
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
2.54 Mб
Скачать

5. Арифметические и логические выражения, операнд, операция, оператор, комментарии.

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

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

1. Арифметические операции

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

Знак Операция

Операции

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

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

Пример

+

Сложение

Integer, Real

Integer, Real

x+y

-

Вычитание

Integer, Real

Integer, Real

x-y

*

Умножение

Integer, Real

Integer, Real

x*y

/

Деление

Integer, Real

Real

x/y

div

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

Integer

Integer

X div Y

mod

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

Integer

Integer

X mod Y

Операций div и mod: • результатом целочисленного деления x div Y будет результат деления x на Y, округленный в сторону нуля до ближайшего целого числа. Например, результатом выражения 4 div 2 будет 2, а результатом выражения 17 div 4 будет 4; • результатом операции mod будет остаток от целочисленного деления операндов. Таким образом, выражение x mod у эквивалентно выражению x-(x div Y) *Y. Например, результатом выражения 4 mod 2 будет о, а результатом выражения 9 mod 4 будет 1.

Пример

Var a, b, c, d: integer; Begin a: = 7; b: = 5; c: = -10; d: = a+b; d: = -d; end;

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

Логические выражения — это выражения, в которых содержатся: 1. логические константы True И (ИЛИ) False; 2. логические переменные и (или) константы типа Boolean; 3. операции отношения; 4. логические операции; 5. скобки.

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

Знак Операция

Операции

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

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

Пример

not

Отрицание

Boolean

Boolean

not(C in MySet)

and

Конъюнкция (логическое И)

Boolean

Boolean

A and В

or

Дизъюнкция (логическое ИЛИ)

Boolean

Boolean

A or В

xor

Исключающая дизъюнкция (исключающие ИЛИ)

Boolean

Boolean

A xor В

Для того чтобы был четкий порядок выполнения операции, в языке Delphi имеется понятие приоритет.

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

По приоритету все операции разделяются на четыре уровня:

По первый (наивысший) уровень приоритета. К нему относятся операции and и not; • второй уровень приоритета — операции *, /, div, mod, and, shl, shr и as; • третий уровень приоритета — операции +, -, or и хоr; • четвертый (самый низкий) уровень приоритета — операции =, о, <, >,<=, >=, in и is.

Если подряд идут несколько операций с одинаковым приоритетом, то операции выполняются слева направо.

Комментарии – это пояснения программы или ее отдельных частей. Наличие комментариев делает программу более понятной и удобной для чтения. Применение комментариев – признак хорошего стиля программирования. Не комментируемая программа наихудшая ошибка, которую может сделать программист, а также свидетельство дилетантского подхода к составлению программы. Комментарии подобны ориентирам в незнакомом лесу. Только неразумный не оставляет ориентиров. Нельзя перегружать текст программы комментариями. Комментарий это любая последовательность символов основного и расширенного набора символов ASCII, заключенных в фигурные скобки. Комментарий воспринимается компилятором как пробельный символ и игнорируется поэтому он м. б. помещен в любое место программы где может быть пробел в том числе до заголовка программы. В Паскале допускаются вложенные комментарии, но при этом они должны иметь разные ограничители {… (* … *) … } , {… /* … */ … } Комментарий, содержащий знак $ после открывающей скобки является директивой компилятора. Например: {$I+}-проверка ошибок ввода/вывода; {$R+}-проверка границ переменных; {$MI+<размер стека>,< размер дин. памяти >}-размер выделяемой памяти;

Содержание [Лекции по Turbo Pascal] Для лучшего понимания программы в ней записывается пояснительный текст — комментарий. Комментарий можно записать в любом месте программы, где разрешен пробел. Текст комментария ограничен символами { } или (* *) и может содержать любые комбинации латинских и русских букв, цифр и других символов алфавита языка Паскаль. Ограничений на длину комментария нет, он может занимать несколько строк. Примеры.

{Начало программы} или (*Начало программы*) {Вывод запроса на экран} {Ввод значения А с клавиатуры} {Вычисление произведения двух целых чисел Proizved}

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

{Пример {1} задания {4}} вызовет ошибку при компиляции. Однако ограничители { } можно вложить в (* *) и наоборот: (*Пример{1} задания {4} *) или {Пример (* 1 *) задания (* 4 *)}.

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

begin {Начало программы} Write ('Введите значение целого числа А >'); {Вывод запроса на экран} Readln (A); {Ввод значения А с клавиатуры} Write('Введите значение целого числа В >'); Readln (B); Proizved := А * В; {Вычисление переменной Proizved} {Временно невыполняемая часть программы Write ('Произведение чисел ',А,' и ',В,' = ', Proizved); Вывод ответа} end. {Конец программы}

При необходимости { } или (* *) можно убрать, и программа будет выполняться в полном объеме.

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

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

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

7. Типы и описание данных как элементы языка и программы. Базовые, стандартные и производные (пользовательские) типы данных. Тип данных может быть либо описан непосредственно в разделе описания переменных, либо определяться идентификатором типа. Стандартные типы не требуют описания в отличие от типов, образованных пользователем. Выбор описания типа зависит только от программиста и специфики программы. Раздел описания типов данных начинается зарезервированным словом type, за которым следуют одно или несколько определений типов, разделенных точкой с запятой. Формат:

type <имя типа> = <значения типа>;

Пример.

type LatLetter = ('А'..'z'); Days = 1. . 31; Matr = array[1..10] of integer;

Каждое описание задает множество значений и связывает с этим множеством некоторое имя типа. Например, в данном описании тип LatLetter определяет множество букв латинского алфавита. Days — множество целых чисел от 1 до 31, Matr — массив из 10 целых чисел. В языке Паскаль любые объекты, т.е. константы, переменные, значения функций или выражения,  характеризуются своими типами. Тип определяет множество допустимых значений того или иного объекта, а также множество операций, которые к нему применимы. Кроме того, тип определяет формат внутреннего представления данных в памяти ЭВМ. В отношении типов объектов Паскаль является статическим языком. Это означает, что тип объекта, например, переменной, определяется при ее описании и не может быть изменен в дальнейшем.

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

Ниже рассматриваются только некоторые из указанных в схеме типов:

| Целочисленные | Логический | Символьный | Строковый | Вещественные | Диапазон | Массив |

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

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

Целочисленные типы - обозначают множества целых чисел в различных диапазонах. Имеется пять целочисленных типов, различающихся диапазоном допустимых значений и размером занимаемой оперативной памяти. Целочисленные типы обозначаются идентификаторами: Byte, ShortInt, Word, Integer, LongInt; их характеристики приведены в следующей таблице.

Тип 

Диапазон 

Размер в байтах 

Byte  ShortInt  Word Integer  LongInt

0 ... 255 -128 ... 127 0 ... 65535 -32768 ... 32767 -2147483648 ... 2147483647

1 1 2 2 4

Значения целых типов записываются в программе привычным способом:

123     4    -3    +345    -699

Наличие десятичной точки в записи целого числа недопустимо. Будет ошибкой записать целое число следующим образом:

123.0

Кроме прывычной десятичной формы записи допускается запись целых чисел в шестнадцатиричном формате, используя префикс $, например:

$01AF     $FF    $1A    $F0A1B

Регистр букв A,B, ..., F значения не имеет.

Допустимые операции: - присваивание; - все арифметические: +, - ,*, /, div, mod (при обычном делении [/] результат вещественный!); - сравнение <, >, >=, <=, <>, =.

Логический тип (Boolean) - состоит всего из двух значений: False (ложно) и True (истинно). Слова False и True определены в языке и являются, по сути, логическими константами. Регистр букв в их написании несущественен: FALSE = false. Значения этого типа являются результатом вычислений условных и логических выражений и участвуют во всевозможных условных операторах языка.

Допустимые операции: - присваивание; - сравнение: <, >, >=, <=, <>, =; - логические операции: NOT, OR, AND, XOR

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

'ж'     's'    '.'    '*'    ' '-(пробел)

Для представления самого апострофа его изображение удваивается: ''''. Если же символ не имеет графического представления, например, символ табуляции или символ возрата каретки, то можно воспользоваться эквивалентной формой записи символьного значения, состоящего из префикса # и ASCII-кода символа:

#9     #32    #13

Допустимые операции: - присваивание; - сравнение: <, >, >=, <=, <>, =. Большим считается тот символ, который имеет больший ASCII-номер.

Строковый тип (String, String[n]) - этот тип данных определяет последовательности символов - строки. Параметр n определяет максимальное количество символов в строке. Если он не задан, подразумевается n=255. Значение типа "строка" в программе запиывается как последовательность символов, заключенных в одиночные кавычки (апострофы), например

'Это текстовая строка'   'This is a string' '1234' - это тоже строка, не число '' - пустая строка

Допустимые операции: - присваивание; - сложение (конкатенация, слияние); например, S := 'Зима'+' '+'пришла!'; - сравнение: <, >, >=, <=, <>, =. Строки считаются равными, если имеют одинаковую длину и посимвольно эквивалентны.

Функции для работы со строками смотри здесь

Вещественные типы - обозначают множества вещественных чисел в различных диапазонах. Имеется пять вещественных типов, различающихся диапазоном допустимых значений и размером занимаемой оперативной памяти. Вещественные типы обозначаются идентификаторами: Real, Single, Double, Extended, Comp; их характеристики приведены в следующей таблице.

Тип 

Диапазон 

Размер в байтах 

Real Single Double Extended Comp

2.9·10-39 ... 1.7·1038 1.5·10-45 ... 3.4·1038 5.0·10-324 ... 1.7·10308 3.4·10-4932 ... 1.1·10-4932 -2·1063 ... +2·1063-1

6 4 8 10 8

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

Значения вещественных типов могут записываться в программе несколькими способами:

1.456

0.000134

-120.0

65432

+345

0

-45

127E+12

-1.5E-5

-1.6E+12

5E4

0.002E-6

Будет ошибкой записать вещественное число следующим образом:

.5 (правильно 0.5) 12. (правильно 12.0 или 12)

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

<мантисса> Е <порядок>

Такое обозначение понимается как "мантисса, умноженная на десять в степени, равном порядку". Например,

-1.6E+12 сответствует -1.6·1012

Допустимые операции: - присваивание; - все арифметические: +, - ,*, / ; - сравнение: <, >, >=, <=, <>, =. При сравнении вещественных чисел следует помнить, что в следствие неточности их представления в памяти компьютера (в виду неизбежности округления) стоит избегать попыток определения строгого равенства двух вещественных значений. Есть шанс, что равенство окажется ложным, даже если на самом деле это не так.

Диапазон или (ограниченный тип) не является предопределенным типом языка (таким как, например, Integer или Char) и поэтому ему не соответствует никакой идентификатор. Этот тип является вводимм пользователем. Используя его мы можем определить новый тип, который будет содержать значения только из ограниченного поддиапазона некоего базового типа. Базовым типом может быть только целочисленный тип, тип Char (символьный) и любой из введенных программистом перечислимых типов.

Для введения нового типа - диапазона - нужно в блоке описания типов TYPE указать имя вводимого типа и границы диапазона через специальный символ диапазона ".." (две точки подряд):

TYPE   Century = 1..21; { поддиапазон цилочисленного типа }   CapsLetters = 'А'..'Я'; { поддиапазон из типа Char }

 

Структурированные типы языка К структурированным типам относятся: массив, запись, множество, файл и др. Все они определяют тип (или типы) некоторой структуры данных.

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

Тип массив определяется конструкцией:

Array [диапазон]   of  ТипЭлементов;

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

TYPE   Vector = array[1..10] of Real; VAR   V1 : Vector;   V2 : array[0..5] of Byte; Здесь переменная V1 определяется с использованием описанного выше типа Vector; тип переменной V2 конструируется непостредственно на этапе ее описания.

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

VAR   M1 : array[1..3] of array[1..3] of Byte;

Это же самое можно записать гораздо компактнее:

VAR   M2 : array[1..3, 1..3] of Byte;

Зжесь массивы M1 и M2 имеют совершенно одинаковую структуру - квадратной матрицы размером 3x3.

Доступ к элемента массива осуществляется путем указания его индекса, например:

writeln( V1[1] ); {вывод на экран первого элемента массива V1} readln( M2[2,3] );{ввод третьего элемента второй строки матрицы М2}