ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 27.08.2020
Просмотров: 931
Скачиваний: 2
Два типа считаются совместимыми, если:
-
оба они есть один и тот же тип;
-
оба вещественные;
-
оба целые;
-
один тип есть тип-диапазон второго типа;
-
оба являются типами-диапазонами одного и того же базового типа;
-
оба являются множествами, составленными из элементов одного и того же базового типа;
-
оба являются упакованными строками (определены с предшествующим словом PACKED) одинаковой максимальной длины;
-
один тип есть тип-строка, а другой - тип-строка, упакованная строка или символ;
-
один тип есть любой указатель, а другой - нетипизированный указатель;
-
один тип есть указатель на объект, а другой - указатель на родственный ему объект;
-
оба есть процедурные типы с одинаковыми типом результата (для типа-функции), количеством параметров и типом взаимно соответствующих параметров.
|
|
Переменные и константы.
При выполнении вычислений или обработке информации тоже требуется иногда запоминать некоторые промежуточные результаты. Для каждого из этих результатов выделяется участок памяти компьютера, состоящий из одного или нескольких байтов (это фундаментальное понятие вычислительной техники конечно известно читателю). Для того чтобы эти участки памяти можно было различать, а также иметь возможность сослаться на содержимое некоторого конкретного участка памяти (ведь не укажешь же на него пальцем), ему сопоставляют имя. Вот эта пара, включающая участок памяти и сопоставленное ему имя, и есть переменная.
Переменная – это в некотором смысле ячейка для хранения информации, например, числа, строки символов. При этом имеется возможность неоднократно считывать значение переменной, а также возможность записывать в эту ячейку другое значение. Переменная может изменять свое значение в процессе выполнения программы. Ее значение может оставаться неизменным от начала до конца выполнения программы, но принимать разные значения в разных прогонах программы.
Имена переменных должны удовлетворять следующим требованиям:
-
начинаться с буквы;
-
включать только буквы, цифры, символ подчеркивания (_), который на клавиатуре находится под тире (-);
-
содержать не более 255 символов.
Обратите внимание, имя не может содержать пробел ( ), точку (.), запятую (,), восклицательный знак (!) или символы (@), (&), ($), (#). Не следует использовать имена, совпадающие с ключевыми (зарезервированными) словами языка.
Константы
определяют в начале программы. После
определения они могут использоваться
во всей программе.
CONST Имя_константы
= Выражение [, Имя_константы
"Выражение]...
Имя_константы -
Имя константы содержит максимум 40
символов и должно начинаться с буквы.
Допустимые символы: "A...Z","0...9"
и точка".". Причем несущественно,
строчные или заглавные буквы составляют
имя константы. Последним должен быть
один из символов, идентифицирующих тот
или иной стандартный тип (! # % $ ). Следует
следить за тем, чтобы не присвоить
константе ключевое слово в качестве
имени. Выражение - Значение, которое
должно храниться в константе. Это
значение может быть просто числом,
другой константой, текстом или
арифметическим выражением (не применять
операцию"^").
множества (этот тип реализован не во всех языках).
Простые типы данных и работа с ними. (в Турбо Паскаль)
|
Идентификатор |
Длина (байт) |
Диапазон значений |
Операции |
Целые типы |
|||
integer |
2 |
-32768..32767 |
+,
-, /, *, Div, Mod, |
byte |
1 |
0..255 |
+,
-, /, *, Div, Mod, |
word |
2 |
0..65535 |
+,
-, /, *, Div, Mod, |
shortint |
1 |
-128..127 |
+,
-, /, *, Div, Mod, |
longint |
4 |
-2147483648..2147483647 |
+,
-, /, *, Div, Mod, |
Вещественные типы |
|||
real |
6 |
2,9x10-39 - 1,7x1038 |
+,
-, /, *, |
single |
4 |
1,5x10-45 - 3,4x1038 |
+,
-, /, *, |
double |
8 |
5x10-324 - 1,7x10308 |
+,
-, /, *, |
extended |
10 |
3,4x10-4932 - 1,1x104932 |
+,
-, /, *, |
Логический тип |
|||
boolean |
1 |
true, false |
Not,
And, Or, Xor, |
Символьный тип |
|||
char |
1 |
все символы кода ASCII |
+, |
5. Структурированные типы данных и работа с ними.
В нашем курсе рассматриваются четыре структурированных типа: массивы, строки, записи и файлы. Вне рассмотрения остались множества (как тип данных) и два очень интересных, но, к сожалению, мало применимых типа: перечисляемый и ограниченный (причина этой самой «малой применимости», на мой взгляд, кроется в том, что для этих двух типов не реализованы функции ввода-вывода значений).
Итак, что же есть структурированный тип данных? Переменная любого структурированного типа содержит в себе некоторое количество компонентов. Каждый компонент, в свою очередь, может быть простого типа или, в более сложном случае, структурированного.
Массив. В массив объединяют данные одного типа. Можно рассматривать массив чисел (целых или вещественных), массив символов (такие массивы на практике встречаются редко, поскольку удобнее использовать строки), массив строк, массив записей, наконец, массив массивов. В последнем случае мы получаем многомерные массивы.
Так как в структурированных данных под одним именем «скрывается» множество элементов, появляется необходимость каким-то образом обращаться к каждому элементу. В массивах этой цели служат индексы, например, пятый элемент массива day будет обозначаться day[5] (в математике такой элемент обозначался бы day5). Если в математике мы привыкли нумеровать элементы массива с 1, то в программировании возможна нумерация с любого номера: с 1, с 0, с -10, с 23…
Таким образом, при объявлении массива в разделе VAR необходимо указать имя массива, его размерность (номера начального и конечного индексов), тип его элементов:
day: array [1..31] of integer; — вот так объявляется одномерный массив из 31 элемента целого типа.
А вот так можно объявить массив, элементами которого являются другие массивы:
day: array [1..31] of array [0..3] of integer;
или: day: array [1..31,0..3] of integer;
Строки. Строковый тип данных — это, по сути, массив символов. Это значит, что, научившись работать с одномерными массивами, мы также легко сможем обрабатывать и строки. Однако стоит помнить о некоторых отличиях:
-
количество элементов в массиве-строке (иначе говоря, количество символов в строке) ограничено числом 255, тогда как количество элементов в массиве практически не ограничено (точнее, ограничено типом переменной-индекса);
-
индекс одномерного массива может изменяться в любых пределах, в том числе и быть отрицательным, тогда как индексы символов строк не могут выходить за пределы [1..255];
-
соответственно, при объявлении массива необходимо указывать полные границы индексов (a: array [4..27] of integer), при объявлении же строки́ можно эти границы вообще не указывать (a: string — в этом случае строка может содержать до 255 символов), а можно в целях экономии памяти указать ограничение (a: string[50] — в этом случае в строку будут помещаться только первые 50 символов);
-
массив всегда имеет объявленную длину, даже если вы заполнили только некоторые из его элементов (например, объявлен массив a: array[1..10] of integer, а значения присвоены только первым трём элементам — остальные элементы при этом существуют и просто равны нулю). Строка же может иметь длину, меньшую заявленной (строка объявлена так: s: string[10], а в программе ей задано такое значение: s:='Привет!' — в этом случае s[8] не существует, равно как и s[9], и s[10]). Длину строки можно узнать с помощью функции length, либо просто прочитав значение нулевого символа: s[0]=length(s);
-
для строкового типа данных создано большое количество процедур и функций, которые позволяют удалять часть строки, вставлять подстроку в указанную позицию строки, выполнять множество других операций; для массивов все подобные операции программисту приходится выполнять самостоятельно. Посмотрите, например, как выполняются операции удаления пары элементов (пусть это будут, например, 5 и 6 элементы) для строки и для массива:
Строка |
Массив |
VAR |
VAR |
Итак, строка — это массив символов; проявляется её «массивность» в том, что к её элементам (то есть, символам) можно обращаться по индексам, можно перебирать множество символов строки в цикле так же, как и обычный массив. Однако стоит помнить, что для работы со строками реализовано множество процедур и функций, поэтому не стоит изобретать велосипед и пытаться обрабатывать строки как обычные массивы.
Записи. Изначально записи были созданы для хранения баз данных. В отличие от массива, элементами записей (их называют полями) могут быть даные различных типов. Именно поэтому при объявлении записи для каждого элемента указывается его тип. Например, так создаётся тип, в котором будет храниться дата (день, месяц, год):
TYPE
dateR=record
day:byte;
month:string[10];
year:integer;
end;
Переменная для хранения даты объявляется таким образом:
VAR
a:dateR;
…
Теперь в программе можно обращаться к полям переменной a. Для этого имя поля записывают через точку после имени переменной:
a.day:=7;
a.month:='апрель';
a.year:=2000;
Элементы (компоненты) записи могут быть массивами или записями. Так, мы можем создать запись, которая позволит хранить данные студента, следующим образом:
TYPE
dateR=record
day:byte;
month:string[10];
year:integer;
end;
student=record
name:string[30];
bd:dateR;
grade:array[1..12]of
byte;
end;
Тогда переменная, в которой эти данные будут храниться, будет объявлена следующим образом:
VAR
st:student;
А так можно обратиться к полям записи:
BEGIN
…
st.name:='Василий
Петров';
st.dateR.day:=23;
st.dateR.month:='март';
st.dateR.year:=1995;
st.grade[1]:=4;
st.grade[2]:=5;
…
Поскольку обычно записи используют для хранения баз данных, то часто объявляют не «одиночную» переменную такого типа, а массив записей:
VAR
st:array[1..125]
of student;
Обратиться к элементам такого массива можно будет так:
st[5].dateR.month:='март';
{месяц рождения пятого
студента}
st[5].grade[3]:=4;
{третья оценка пятого студента}
Множества. К сожалению, из-за недостатка времени в курсе «Основы алгоритмизации и программирование на языке Pascal» не рассматривается этот очень интересный тип данных. Однако множества в курсе используются, хоть и не названные своим именем. Так, для проверки принадлежности значения переменной некоторому отрезку «правильно» использовать логическое выражение:
if (k>=2) and (k<=15) then …
Однако намного более эффективно воспользоваться операциями над множествами:
if k in [2..15] then …
Такая запись условия не только более наглядна, она быстрее выполнится при работе программы. А проблемам оптимизации программного кода в курсе уделено большое внимание.
Файлы. Последний тип данных не совсем привычен — это файлы. В нашем курсе мы рассматриваем два типа файлов — типизированные файлы и текстовые файлы. Работа с файловым типом отличается от работы с любым другим типом данных тем, что необходимо провести, скажем так, «предварительную подготовку». Работа с файлом проводится в следующем порядке:
-
объявление файловой переменной в разделе VAR: f: file of <тип данных> или f: text;
-
ассоциирование файловой переменной с файлом на диске — это делается с помощью процедуры assign(f,'name');
-
открытие файла для чтения или записи (в зависимости от типа файла — типизированный или текстовый — и выполняемого действия используются процедуры reset(f), rewrite(f) или append(f));
-
собственно чтение данных из файла или запись данных в него (команды Write(f,…) и Read(f,…), для текстовых файлов можно использовать также команды WriteLn(f,…) и ReadLn(f,…));
-
закрытие файла командой Close(f).
Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получать:
Type Colors = (Red,Green,Blue);
Numbers = (Zero,One,Two,Three,Four,Five);
var c:Colors; n:Numbers;
Тип-Диапазон:
Тип-диапазон также называют ограниченным или интервальным типом. Он является подмножеством своего базового типа, в качестве которого может выступать любой порядковый тип кроме типа-диапазона. Тип-диапазон наследует все свойства своего базового типа. Имеются две стандартные функции, работающие с этим типом: High(x)- возвращает максимальное значение типа-диапазона, к которому принадлежит переменная x; Low(x) - возвращает минимальное значение.
type Abc = 'A' .. 'z'; {все английские буквы : диапазон на базе типа Char}
Digits = 0 .. 9; {цифры}
var n:Num; c,d:Abc; x:integer;
6. Операторы передачи управления и операторы организации циклов в языках программирования
В С++ есть несколько операторов, изменяющих естественный порядок выполнения вычислений:
-
оператор безусловного перехода goto;
-
оператор выхода из цикла break;
-
оператор перехода к следующей итерации цикла continue;
-
оператор возврата из функции return.
Оператор безусловного перехода goto имеет формат:
goto метка;
В теле той же функции должна присутствовать ровно одна конструкция вида:
метка: оператор;
Оператор goto передает управление на помеченный оператор.
Метка — это обычный идентификатор, областью видимости которого является функция, в теле которой он встречается.
Использование оператора безусловного перехода оправдано в двух случаях:
-
принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей;
-
переход из нескольких мест функции в одно (например, если перед выходом из функции необходимо всегда выполнять какие-либо действия).
В остальных случаях для записи любого алгоритма существуют более подходящие средства.
Оператор выхода из цикла break обеспечивает переход на оператор, непосредственно следующий за оператором if, switch или цикла, внутри которых находится оператор break.
Оператор continue
Оператор перехода к следующей итерации цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.
Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Вид оператора:
return [ выражение ];
Выражение должно иметь скалярный тип. Если тип возвращаемого функцией значения описан как void, выражение должно отсутствовать.
Операторы цикла и передачи управления
|
|
Рис. 6.1. Структурные схемы операторов цикла
Начальные установки служат для того, чтобы до входа в цикл задать значения переменных, которые в нем используются.
Проверка условияпродолжения цикла выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием), либо после тела цикла (цикл с постусловием).
Параметром цикла называется переменная, которая используется при проверке условия продолжения цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла.