Основы программирования (947332), страница 7
Текст из файла (страница 7)
2^^-!8Примечание. Следует иметь в виду, что:• работа со всеми вещественными типами, кроме Real, требует установки особого режима компиляции (указания директивы {$N+} или соответствующей опции компилятора);• для типа Real используется самая медленная арифметика.Структурные типы данных будут рассмотрены в соответствующих разделах.Инициализированные переменные. В Borland Pascal имеется возможность объявления переменных с заданными начальными значениями.
Такиепеременные называют инициализированными и объявляют в специальнойконструкции const (рис. 2.7).Примечание, С точки зрения идеологии языка объявление инициализированных переменных в конструкции const является не корректным. В последующих версиях языка эта некорректность была исправлена.Инициализированные переменные в программе можно изменять так же,как и обычные, например:ИдентификаторпеременнойЬСКЗЧ1ЯРис. 2.7. Синтаксическая диафамма конструкции<Объявление инициализированных переменных>36Литерал2. Простейшие конструкции языкаConst a:real=5, б;...а:=(П'])/к;.,.Наложенные переменные. Иногда возникает необходимость объявления переменных, размещенных по конкретным физическим адресам памятиили в том же месте, что и другие переменные программы. Наложение переменных выполняют также с использованием конструкции var, но после типауказывают зарезервированное слово absolute. На рис.
2.8 представлена полная синтаксическая диаграмма данной конструкции, из которой следует, чтовозможны два варианта наложения переменной.1. Наполсение по абсолютному адресу. В этом случае за словом absoluteследует пара чисел типа word, разделенных двоеточием. Первое число трактуется как адрес сег{иента, а второе как смещение (см. параграф 7.1). Такоеобъявление соответствует физическому связыванию переменной и областипамяти по указанному физическому адресу.Например:Var А: word absolute $0000:$OOFF;L:array[L.2] of char absolute 128:0;...Данный вариант применяют, например, для обращения к таблицам операционной системы.2.
Наложение на ранее определенную переменную. В этом случае за словом absolute размещают идентификатор ранее определенной переменной..При этом переменной, описанной с absolute, присваивается адрес переменной, идентификатор которой стоит после него. Таким образом, происходитсовмещение в памяти данных с разными именами и, возможно, типами.
Например:Var c:byte;а:real absolute с;...Вследствие наложения любое изменение одной переменной отражаетсяна значении другой. При несовпадении размеров областей внутреннего предхНУ Т I переменной | \J_y\\^AbsoIuteVrH АбсолютныйадресгОИдентификаторРис. 2.8. Полная синтаксическая диаграмма конструкции <Объявлениепеременной>37Часть 1. Основы алгоритмизации и процедурное программированставления переменных, связанных по absolute, как в примере выше, корректность полученных результатов не контролируется. Пример использованиятакого варианта наложения рассмотрен в параграфе 5.5.2.4* ВыраженияВсе вычисления и другие преобразования данных в программе записываются в виде выражений.
Обычно выражение включает несколько операций, которые выполняются в порядке их приоритетности. Различают:• арифметические операции: + (сложение), - (вычитание), * (умножение), / (деление вещественное), div (деление целочисленное), mod (остатокцелочисленного деления) - эти операции применяют к вещественным и целым числам, результат - также число;• операции отношения: > (больше), < (меньше), = (равно),о (не равно),>= (не меньше), <= (не больше) - эти операции применяют к числам, символам, символьным строкам и некоторым другим типам данных, результат значение логического типа;• логические операции: and (и), or (или), хог (исключающее или), not(не) - эти операции выполняют с логическими переменными и константами,результат - значение логического типа;• поразрядные операции: and (и), or (или), хог (исключающее или), not(не), shr (сдвиг вправо), shl (сдвиг влево) - эти операции выполняют с целыми числами, результат - целое число;• строковая операция: + (сцепление строк) - выполняется над символами и строками, результат - строка (см.
параграф 4.5);• операции над множествами: + (объединение), - (дополнение), * (пересечение), результат - множество; in (определение принадлежности элемента множеству), результат ~ значение логического типа (см. параграф 4.7);• операция над указателями: @ (определение адреса программногообъекта), результат - адрес (см. параграф 7.1).В табл. 2.3 приведены приоритеты,Т а б л и ц а 2.3 присвоенные этим операциям.Для изменения порядка выполненияОперацииПриоритетопераций в выражении используют круглые скобки. В выражениях также допус1@, notкается использование стандартных (см.2*, /, div, mod,приложение 1) и определенных программистомфункций (см.
главу 5). Им приand, shr, shlсваивается высший приоритет.+, -, or, xor3 ,Арифметические операции. Записьвыражений, содержащих арифме4>, <, o, =, <=,тические операции, выполняется «в>=, inстроку», порядок выполнения операций382. Простейшие конструкции языкаопределяется скобками. Особенно внимательно следует программироватьвыражения, включающие операции различных приоритетов. Например:1) запись а+Ь/с предполагает, что вначале выполняется операция деления, а затем сложения;2) запись (a+b)/c*d предполагает, что сумма а+Ь делится на с, а затем умножается (!) на d.При программировании арифметических выражений также следует учитывать правила выполнения операций, перечисленные ниже.1. Операции «целочисленное деление» и «определение остатка от деления» применимы только к операндам целых типов, например: 6 div 4 =1, а6 mod 4 = 2.
Если в операции участвуют переменные, то они должны бытьобъявлены как целые, например:Var /, n:integer;...п mod 2;...Для получения при делении целых значений результата с точностью додробной части необходимо использовать операцию вещественного деления:6/4=1.5.2. При выполнении арифметических операций над числами различныхтипов выполняется неявное преобразование типов:а) если один операнд целого типа, а другой - вещественного, то переменная целого типа преобразуется к вещественному типу; результат операции - значение вещественного типа;б) если в качестве операндов использованы вещественные или целые переменные различных типов, то их значения преобразуются к типу с наибольшей разрядной сеткой; результат операции того же типа.
Так, если в выражении есть переменные double, extended и real, то значения будут преобразованы в тип extended и того же типа будет полученный результат.Операции отношения. Операции отношения определены для вещественных и целых чисел, логических значений, кодов символов, строк и множеств. Результат этих операций ~ значение логического типа, true, если отношение истинно, и false - в противном случае.Следует помнить, что из-за ограниченной разрядной сетки вещественные числа представляются в памяти не точно, и, соответственно, проверкаравенства или неравенства вещественных чисел долэюна выполняться с некоторым допуском^ например:(х-у)>1е'10(Х'у)<1е'10{вместо хОу}(вместо х=у}Если такой допуск не указан, то он определяется автоматически, исходяиз количества значащих цифр в представлении числа (см. табл.
2.2), и может39Часть I. Основы алгоритмизации и процедурное программированиеоказаться слишком строгим для задачи с неточными данными или методамирешения (более подробно см. параграф 2.7).Логические операции. Логические операции выполняют над значениями типа boolean. Если в логических операциях в качестве операндов используют результаты операций отношения, которые имеют более низкий приоритет, то необходимы скобки. Например, логическое выражение, которое должно быть истинно, если значение х попадает в интервал [а, Ь], должно быть записано следующим образом:(х> =а) and (х< =Ь).Поразрядные логические операции и операции сдвигов. Поразрядные логические операции и операции сдвигов выполняются над целыми числами.
Полученный результат- число того же типа. Второй операнд операцийсдвига определяет количество двоичных разрядов, на которое необходимосдвинуть первый операнд:5 shl 4 - число 5 в своем внутреннем двоичном представлении сдвигается влево на 4 двоичных разряда, что соответствует умножению числа на 2^ == 16. Следовательно, результат данного выражения - число 80.Остальные типы операций рассмотрены в соответствующих разделах.2.5. Оператор присваиванияС помощью оператора присваивания в программе записываются действия, связанные с изменением значений переменных (рис.
2.9). При выполнении этого оператора вычисляется выражение, приведенное в правой части, иего результат заносится в переменную, имя которой указано слева. Если оператор присваивания записывается в последовательности операторов, то после него ставится точка с запятой.Например:а) Var a,b,c:real;Begin ...c:=(a*a'Sin(b)J/(a+25J); ...б) Var v: boolean; a: integer; b:real;Begin a:=8;b:--]J;v: =(a>5)and(b> =8); {v получит значение false}...ИдентификаторпеременнойВыражениеРис. 2.9. Синтаксическая диаграмма конструкции<Оператор присваивания>402. Простейшие конструкции языкаДля корректного выполнения операции присваивания результат выражения и переменная, записанная в правой части оператора присваивания,должны иметь одинаковые или совместимые типы.Совместимыми считаются:• все целые типы;• все вещественные типы;• отрезок некоторого базового типа и базовый тип;• два отрезка одного базового типа;• символ и строка.При несовпадении типов правой и левой частей оператора присваиваниядля совместимых типов происходит неявное преобразование результата выражения к типу переменной, указанной в правой части.
Например:VarL:longint; {переменная типа longint}Е,х: extended; {переменные типа extended}Linteger; {переменная типа integer}R:real; {переменная типа real}Begin...R:=I*E/(x-^L);... {результат выражения, записанного в правойчасти оператора присваивания, будет иметь тип extended,однако, так как переменная R типа real, то результат будетпреобразован в этот тип}End,Если типы правой и левой частей оператора присваивания не совместимы, то необходимо использовать явное преобразование типов.Явное преобразование обычно выполняют посредством использованияспециальных функций:Тгипс(х) - преобразует значение вещественного типа в значение целоготипа, отбрасывая дробную часть;Round(x) - преобразует значение вещественного типа в значение целоготипа, округляя его до ближайшего целого;Ord(x) - преобразует значение порядкового типа в его номер;Cltr(x) - преобразует номер символа по таблице ASCII в сам символ.Например:а)Varn,nl:integer;xn,xk,h:real;Beginxn:=I;xk:=5.7; h:=OJ;n:'=Round((xk'Xn)/h);nl:=Trunc((xk'Xn)/h);{n получит значение 16}...