Организация данных в ЭВМ и основы программирования (1017140), страница 5
Текст из файла (страница 5)
Begin
For P:=False To True Do
For Q:=False To True Do
For R:=False To True Do
For T:=False To True Do
Begin
F:=P And Not (Q Or T) And T
Write(‘P=’,P,’Q=’,Q,’R=’,R,’T=’,T);
Write(‘F=’,F);
writeln;
End;
End.
Логические выражения очень часто используются в программах. Без них трудно обойтись при записи условных операторов, а также циклов While и Repeat.
В языке Паскаль нельзя записать двухстороннее неравенство 1< X <2. Вместо этого надо воспользоваться логическим выражением: (X>1) And (X<2).
Нельзя записать X = Y = Z, а надо: (X = Y) And (X = Z).
Если надо записать, что Х не лежит в диапазоне от - 2 до +2, то:
Not ((X>-2) And (X>=2)) или (X<=-2) Or (X>=2)
Стандартные идентификаторы True и False можно использовать в качестве логических констант. Равноправные операторы.
If P Then S;
If P=True Then S;
Функция Odd(x) = True при X=2n-1, n=1,2,3,...
False при X=2n
2.4. Символьный тип
Символьная константа - это символ , заключенный в апострофы (чтобы представить апостроф , его повторяют дважды).
‘A’, ‘R’,’+, ‘7’
В описании констант:
Const Sim = ‘A’;
A = ‘A’;
S = ‘+’;
D1 = ‘;’;
Символьная переменная принимает значение одного символа. Она описывается в разделе переменных как CHAR.
Var Bukwa: Char;
B1, B2, R: Char;
В операторе присваивания:
Bukwa : = ‘+’;
R: = Bukwa;
К символьным данным применимы операции сравнения, т.к. все символы упорядочены, каждый символ имеет свой порядковый номер.
Ввод символьных данных имеет особенности: символьные данные вводят сплошной строкой, без пробелов, т.к. пробел - это тоже символ!!!
Var S1, S2, S : Char;
Read (S1 , S2 , S3 )
- - - - - - - - - - - - - - -
ABC —> S1 = ‘A’ , S2 = ‘B’ , S3 = ‘C’
A_B_C_ —> S1 = ‘A’ , S2 = _ , S3 = ‘B’
Формат: X : M
‘_’ : 7 - вывод семи пробелов.
Результатом операции сравнения является логическая константа True или False. ‘A’<’B’
Встроенные функции:
Ord(x) - определяет порядковый номер символа Х, например, ORD(‘R’) = 82.
Chr(x) - определяет символ, стоящий по порядковому номеру Х, например, CHR(68)= ‘D’.
Эти две функции носят название функций преобразования.
Очевидно , что Chr(Ord(S)) = S; Ord(chr(68)) = 68.
Если С1 и С2 - переменные символьного типа, то С1<С2 , если Ord(C1) < Ord(C2)
Pred(x) - дает предыдущий символ но относительно к Х, например,. Pred(‘N’) = ‘M’.
Succ(x) - определяет следующий за Х символ, например,. Succ(‘R’) = ‘S’, Succ(‘9’) = ‘:’
Справедливы равенства:
Ord (false) = 0 Ord (True) = 1
Succ (False) =True Pred (True) = False
2.4.1. Символьные строковые константы
Символьные строки - последовательность любого, в том числе и равного нулю количества символов, заключенных в апострофы. Символы - из набора ASCII.
‘Номер’ , ‘Summa’ , ‘_ _ ‘ , ‘A+B’
‘Д’’АРТАНЬЯН’ - внутри апостроф - двойной
Const C1 = ‘ ‘;
C2 = ‘РЕЗУЛЬТАТ’;
К строкам применимы операции отношения. Результат: True или False, сравнение происходит посимвольно слева направо .
‘ABC’>=’ACB’результат False , т.к. ‘B’<’C’
Переменной нельзя присвоить значение строки!!! Ограничение - максимальный размер строки, воспринимаемый компилятором, - не более 126 символов. Строка, состоящая из одного символа, называется символьной константой. Если между апострофами нет ни одного символа, то такая строка называется пустой (см. далее раздел «Регулярные типы»).
Для включения в строку символов, не имеющих физического изображения, используется их ASCII-код с символом # перед ним, например, A = ‘#31’ - это - управляющий символ.
Задания
1. Можно ли выполнить / (деление) над переменными целого типа?
2. Определить:Odd(15) Odd(26) Succ(137) Pred(26)
3. Найти ошибки в записи вещественных чисел.
4. .0Е – 2 - 71 - 6.1 0.1Е – 5 А56 2.1
5. Вычислить:Trunc(5.61) Round(17.16) Round(- 17.16)
6. Что не правильно?
Odd(17.1) Cos(32.1) Cos(5) Sin(0.2) Succ(3.2) Pred(7)
7. Найти:
Ord(chr(49)) = 49 Chr(ord(‘+’)) = +
Pred(‘B’) = ‘A’ Succ(‘B’) = ‘C’
8. Вычислить при A = 2, B = 3, C = 4, M = 5, X = 6, E = True
а) (A+B)/C*M = (2+3)/4*5 =
б) 2+X*X/(X+(A+B)/5) = 2+6*6/(6+(2+3)/5) = 2+36/7 =
в) (A<B) and (X+A-<B) or (C<M) or E =
9. Записать:
а) A не принадлежит отрезку [0;3]
б) A принадлежит отрезку [- 2,0]
в) A принадлежит промежуткам [- 5,- 4] или [0,2) или (3.2,7]
3. НЕСТАНДАРТНЫЕ ПРОСТЫЕ ТИПЫ (ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ)
Мы установили, что тип данных задает набор значений, которые могут принимать данные. Например,. данные целого типа могут принимать значения целых чисел. от -32768 до 32767, данные логического типа - значения True и False. Задание типа данных устанавливает и ограниченный набор операций, которые могут выполняться над этими данными. Например, над данными вещественного типа можно выполнять операции +, - , * , / , но нельзя производить операции Div и Mod, которые предназначены для данных целого типа.
Типизация данных значительно уменьшает возможность появления ошибок. Если все же ошибки возникают, то компилятор сам их обнаруживает и сообщает нам об этом. Учитывая ценность типизации данных, в языке Паскаль помимо стандартных типов (целого, действительного, логического, символьного) введены и другие типы, нестандартные (определяемые пользователем). Язык Паскаль предоставляет программисту широкие возможности для задания дополнительных типов, характеристики которых программист может определить самостоятельно. Новые типы описываются в разделе типов или определяются непосредственно при описании переменных.
3.1. Перечисляемый тип
Очень часто в программах целое число используется не в качестве арифметической величины, а как указатель некоторого элемента сравнительно небольшого множества. В таких случаях в описании программы обычно приводится список всех возможных значений вместе с указанием предполагаемой интерпретацией каждого значения. Такую величину можно рассматривать как элемент специального типа, который в языке Паскаль называется перечисляемым типом данных. Перечисляемый тип определяется как упорядоченный набор идентификаторов, заданный путем их перечисления.
Пример. Type Colour = (Red , Orange , Green) ;
Перечисляемый тип задается списком значений (объектов), которые могут принимать переменные этого типа. При этом каждый объект есть имя. Перечислимый тип задается самим программистом, в зависимости от того, какую задачу он решает.
Перечислимый тип состоит из списка констант. Переменные этого типа могут принимать значения любой из этих констант. Числа, логические и символьные константы не могут являться объектами перечислимых типов. Применение перечислимого типа повышает наглядность программы и дает возможность автоматически контролировать допустимость значений переменных.
Язык Паскаль представляет программисту широкие возможности для задания дополнительных типов, характеристики которых программист может определить самостоятельно. Новые типы описываются в специальном разделе типов или определяются непосредственно при описании переменных.
Описание перечисляемого типа имеет вид:
Type Имя типа = (Список констант);
Var : Имя переменной: имя типа;
Здесь под константой понимается особый вид констант - констант, задаваемых пользователем. Под списком понимается перечень констант, разделенных запятыми. Сам список заключается в круглые скобки .
В общем виде:
Type T = (A1, A2,...,An);
Пример. Type Year = (Winter , Spring , Summer , Autumn);
Var A:Year;
Здесь Year - имя перечисляемого типа:
Зима, Весна, Лето, Осень - константы;
A - переменная, которая может принимать значение любой из констант.
Объект, указанный в списке ,может присутствовать только в одном описании.
Пример. Type T1 = (One , two , three);
T2 = (Tree , four , five);
Эти два задания типов несовместимы.
Имена объектов, указанных в описании перечисленного типа, являются константами этого типа. В языке Паскаль допускается указывать константы перечислимого типа непосредственно в разделе переменных без использования раздела Type.
Пример. Var A: (Winter , Sprihg , Summer , Autumn);
Но лучше использовать описание данных с использованием раздела Type.
Нельзя присваивать переменной одного типа значения из имени другого типа.
Пример .
Type Name =(Jon , Tom , Nick) ;
Color =(Red , Blue , Black);
Var X , Y , Z : Name ;
C1 , C2 : Color ;
Каждая из констант имеет порядковый номер, счет начинается с нуля. Упорядоченность констант позволяет применять к ним операции отношения (сравнения): < ,<= ,= , <>, >, >=. Результат операции будет логического типа (Type , False). Winter < Spring < Summer < Autumn (Зима < Весна< Лето< Осень)
Свойства перечисляемого типа:
1) Ai <> Aj, если i ><j (различимость).
2) Ai < Aj, если i < j (упорядоченность).
3) Значениями типа Т могут быть только А1, А2, ... Аn.
Упорядоченность определяется той последовательностью, в которой перечислены константные идентификаторы. Наличие упорядоченности позволяет применить стандартные функции:
Ord (x) - нахождение порядкового номера,
Pred (x) - нахождение предыдущего элемента,
Succ (x) - нахождение последующего элемента.
Succ (Ai) = Ai +1 для i= 1,2,...n-1 - последующий член .
Pred (Ai) = Ai- 1 для i = 1,2,3...n - предыдущий член .
Ord (Ai) = i -1 - функция определения порядкового номера Аi. Нумерация условно начинается с нуля.
Пример.
Имеется перечень зверей: лиса, волк, заяц, зубр, тигр, лев, медведь, косуля, олень, барс. Определить порядковый номер тигра (N1) и порядковый № зверя после косули (N2)
Program Zver;
Type Zver = (lisa,volk,zaiac,zubr,tigr,lev,medved,kosulia,olen,bars);
Var P1,P2: Zver;
N1,N2 : Integer;
Begin
P1 : = tigr;
P2 : = Succ (kosulia);
N1 : = Ord(P1)+1;
N2 : = Ord(P2)+1;
Writeln (‘N1 = ‘, N1:2);
writeln (‘N2 = ‘, N2 : 2);
End.
Так как счет перечислимых начинается с нуля, а не с единицы, для вычисления порядкового номера необходимо прибавить единицу.
Пример. Некто по средам и пятницам учится, в остальные будние дни работает. Составить программу, распечатывающую эти занятия последовательно по дням недели.
Program Den;
Type Week = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Var Day: Week;
Begin
For Day : = Monday To Sunday Do
If (Day : = (Wednesday) Or (Day = Friday)
Then Writeln (‘Study’)
Else If (Day : = (Saturday) Or (Day = Sunday)
Then Writeln (‘Nothing’)
else Writeln (‘Work’)
End.
Результат будет такой: Work
Work
Study
Work
Study
Nothing
Nothing
В языке Paskal нельзя вводить и выводить данные перечислимого типа с помощью операторов Read и Write.
3.2. Ограниченный тип (диапазон, интервал)
Множество значений простых типов упорядоченно и конечно (разумеется, кроме вещественного типа). Если программисту необходимо сузить диапазон значений, принимаемых некоторым объектом скалярного типа, то он осуществляет это в явном виде наложением ограничения на стандартный или определенный ранее перечислимый тип, который в этом случае называется базовым. Если какая-то переменная принимает не все значения своего типа, а только значения, содержащиеся в некотором ограниченном диапазоне, то ее можно рассматривать как переменную ограниченного типа (иногда говорят интервальный тип или тип диапазон).
Пример.Type Day = (Mo , Tu , We , Th , Fr , Sa , Su);
Mom = 10...25
Sss = ` C`...`X`;
Wd = SA...SU;
Для ограниченного типа Mom базовым является целый тип, для SSS - символьный, для Wd - определённый ранее перечислимый тип Day.
Попытка присвоить переменной ограниченного типа значение \, не входящее в заданный диапазон, приведёт к возникновению ошибки при счёте.
Таким образом,. введение ограниченных типов перекладывает проверку допустимости значений с программиста на компилятор.
Пусть, например, в разделе описания указан перечислимый тип Год:
Type Year = ( Jan, Febr, Mart, Apr, May, Jun, Jul, Aug, Sent, Okt, Nov, Dec);
А нам предстоит решать задачи, связанные только с весенним временем года. Тогда можно ввести ограниченный тип: Spring Sum = Маy .. Aug; который является частью перечислимого типа.