Найти ошибки в следующей программе и объяснить, какие правила языка Паскаль здесь нарушены:
Program mistake_2; Type month = (january, february, marth, april, may, june, jule, august, september, october, november, december); winter = december..february; spring = marth..may; Var m : month; k : 1..12; Begin Write('Введите месяц'); Readln(m); If m>spring Then m := june; For k := Ord(january) To Ord(m) Do m := succ(m); Writeln(m); End.
На предыдущих занятиях были рассмотрены основные типы Паскаля и действия, которые можно совершать с этими типами, одним из самых распространенных действий является присваивание.
Рассмотрим такую ситуацию, пусть заданы типы Т1 и Т2, а также описаны переменные р1 и р2 следующим образом:
Var p1 : T1; p2 : T2;
Возникает вопрос, когда можно записать р1 := р2? Чтобы ответить на этот вопрос, рассмотрим совместимость простых типов по присваиванию. Операция р1 := р2 является допустимой, если истинно одно из следующих утверждений:
Т1 и Т2 - тождественные типы.
Типы являются тождественными, если они описаны одним и тем же идентификатором или происходят от одного и того же идентификатора.
Например,
Type T1 = Real; T2 = Real; T3 = T1; T4 = (red, gren, blue, black, white); T5 = (red, gren, blue, black, white); T6 = T4;
Здесь Т1, Т2 и Т3 - идентичные типы, Т4, Т5 - не идентичны, поскольку (red, gren, blue, black, white) не являются идентификатором типа, Т4, Т6 являются идентичными.
Т2 является поддиапазоном типа Т1.
Например,
Type T1 = Real; T2 = Integer;
(множество целых чисел входит в диапазон вещественных чисел).
Т1 и Т2 - являются отрезками одного и того же типа.
Например,
Type T1 = 1..100; T2 = -3..20; week = (d1, d2, d3, d4, d5, d6, d7); working_week = (d1..d5).
Совместимость по присваиванию станет более понятна, если вспомнить, что переменные в памяти занимают определённое число байт. Так, переменная типа Integer занимает 2 байта, типа - Real 6 байтов, а в большее число ячеек всегда можно поместить меньшее, а наоборот не всегда.
Совместимость типов необходима также в выражениях и операциях сравнения.
Program Example; Var a : Byte; b : Integer; c : Longint; Begin Writeln('Введите 2 числа:(Byte, Integer)'); Readln(a, b); c:=a + b; Writeln(c); End.