- •СОДЕРЖАНИЕ
- •Раздел 1. ОБЩИЕ СВЕДЕНИЯ О ПРОГРАММНОМ ОБЕСПЕЧЕНИИ
- •1.1. Принцип программного управления
- •1.2. Автоматическое выполнение команд программы
- •1.3. Этапы постановки и решения задачи на компьютере
- •1.4. Назначение и классификация языков программирования
- •1.4.1. Машинно-ориентированные языки
- •1.4.2. Машинно-независимые языки
- •1.5. Структура программного обеспечения
- •1.5.1. Системы программирования
- •1.5.2. Операционные системы
- •Раздел 2. ОСНОВЫ АЛГОРИТМИЗАЦИИ
- •2.1. Алгоритм и его свойства
- •2.2. Способы описания алгоритмов
- •2.2.1. Словесное описание
- •2.2.2. Графическое описание
- •2.2.3. Запись на алгоритмическом языке
- •2.3. Разновидности структур алгоритмов
- •2.3.1. Линейный вычислительный процесс
- •2.3.2. Разветвляющийся вычислительный процесс
- •2.3.3. Циклический вычислительный процесс
- •Раздел 3. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •3.1. Теория структурного программирования
- •3.2. Реализация структурного проектирования в современных языках программирования
- •3.3. Преобразование неструктурированных программ в структурированные
- •3.3.2. Метод введения переменной состояния
- •3.3.3. Метод булевого признака
- •3.4. Способы графического представления структурированных схем алгоритмов
- •3.4.1. Метод Дамке
- •3.4.2. Схемы Насси-Шнейдермана
- •Раздел 4. АЛГОРИТМИЧЕСКИЙ ЯЗЫК ПРОГРАММИРОВАНИЯ ПАСКАЛЬ
- •4.1. Общая характеристика языка Паскаль
- •4.2. Алфавит языка Паскаль
- •4.3. Основные понятия языка
- •4.3.1. Идентификаторы
- •4.3.2. Комментарии
- •4.4. Структура простейшей программы
- •4.5. Способы описания синтаксиса
- •4.5.2. Синтаксические диаграммы
- •Раздел 5. ОСНОВНЫЕ ТИПЫ ДАННЫХ
- •5.1. Классификация данных
- •5.2. Стандартные скалярные типы данных
- •5.2.1. Целочисленные типы
- •Формат
- •5.2.2. Вещественные типы
- •Функция
- •5.2.3. Символьный тип (тип Char)
- •5.2.4. Логический тип (тип Boolean)
- •Функция
- •5.3. Выражения
- •5.4. Оператор присваивания
- •Раздел 6. СТРУКТУРА ПРОГРАММЫ
- •6.1. Программный модуль
- •6.2. Раздел меток
- •6.3. Раздел констант
- •6.4. Раздел типов
- •6.5. Раздел переменных
- •6.6. Раздел операторов
- •Раздел 7. ОПЕРАТОРЫ
- •7.1. Составной оператор
- •7.2. Программирование линейных и разветвляющихся структур алгоритмов
- •7.2.1. Оператор перехода Goto
- •7.2.2. Условный оператор If
- •7.2.3. Оператор варианта (выбора) Case
- •7.2.4. Пустой оператор
- •7.3. Программирование циклических структур алгоритмов
- •7.3.1. Оператор цикла с параметром (оператор For)
- •7.3.2. Оператор цикла с постусловием
- •7.3.3. Оператор цикла с предусловием
- •7.3.4. Операторы Continue и Leave
- •Раздел 8. СТРУКТУРИРОВАНИЕ И ОФОРМЛЕНИЕ ПРОГРАММ
- •Раздел 9. ОПИСАННЫЕ СКАЛЯРНЫЕ ТИПЫ
- •9.1. Перечислимый скалярный тип
- •9.2. Тип диапазон
- •10.1. Массивы
- •10.1.1. Задание массивов
- •10.1.2. Действия над элементами массивов
- •10.1.3. Действия над массивами
- •10.1.4. Типизованные константы типа массив
- •10.2. Строковые данные
- •10.2.1. Строковые константы
- •10.2.2. Строковые переменные
- •10.2.3. Встроенные функции, определенные над данными типа String
- •ЛИТЕРАТУРА
Основные типы – это типы, состоящие из единственного элемента данных (так называемые тривиальные структуры данных).
Основные типы делятся на:
–ссылочный тип;
–скалярные типы.
Скалярные типы в свою очередь делятся на:
–стандартные типы – это типы, зафиксированные в языке (предопределенные типы); например, типы Integer, Real, Char;
–описанные типы – это типы, определенные программистом; например, перечислимый тип.
В языке Паскаль большинство скалярных типов обладает свойством перенумерованности (упорядоченности). Оно обозначает, что среди элементов соответствующего типа данных установлен линейный порядок. Таким образом, относительно любых двух элементов данного типа определено, какой из них предшествует другому.
Производные (структурные) типы – это типы, которые образуются на основании других типов (как основных, так и производных). В общем случае производный тип состоит из нескольких элементов данных.
В Паскале производные типы данных делятся на:
–стандартные (предопределенные) – например, типы String, Text и др.
–описанные – например, массивы, записи и др.
Классификацию типов языка Паскаль иллюстрирует рисунок 5.1.
5.2.Стандартные скалярные типы данных
5.2.1. Целочисленные типы
В языке Паскаль существует пять целочисленных типов:
•shortint (короткое целое);
•integer (целое);
•longint (длинное целое);
•byte (байт);
•word (слово).
Их характеристики иллюстрирует таблица 5.1.
98
|
|
|
Типы |
|
|
|
|
значений |
|
Основные |
|
Производные |
||
Ссылочный |
Скалярные |
Стандартные |
Описанные |
|
Стандартные |
Описанные |
|
||
Рисунок 5.1 – Классификация типов языка Паскаль |
||||
Таблица 5.1 – Характеристики целочисленных типов |
|
Тип |
Диапазон |
Формат |
|
|
|
|
|
shortint |
-27 ÷ 27 – 1 |
1 байт |
|
(-128 ÷ 127) |
(8 битов со знаком) |
||
|
|||
|
|
|
|
integer |
-215 ÷ 215 – 1 |
2 байта |
|
(-32768 ÷ 32767) |
(16 битов со знаком) |
||
|
|||
|
|
|
|
longint |
-231 ÷ 231 – 1 |
4 байта |
|
(-2147483648 ÷ 2147483647) |
(32 бита со знаком) |
||
|
|||
|
|
|
|
byte |
0 ÷ 28 - 1 |
1 байт |
|
(0 ÷ 255) |
(8 битов без знака) |
||
|
|||
|
|
|
|
word |
0 ÷ 216 – 1 |
2 байта |
|
(0 ÷ 65535) |
(16 битов без знака) |
||
|
|||
|
|
|
99
В памяти машины целые числа хранятся в виде двоичного числа с фиксированной точкой (ФТ) и занимают (как видно из таблицы) 1 байт, 2 байта или 4 байта.
Внутреннее представление целых чисел.
Рассмотрим внутреннее представление целых чисел в персональных компьютерах на базе, например, 16-разрядных микропроцессоров Intel. Разрядная сетка таких компьютеров может быть представлена так, как показывает рисунок 5.2.
На данном рисунке под каждым разрядом указан его номер (принято нумеровать разряды со стороны младших разрядов, начиная с нуля), а над каждым разрядом – его вес.
215 214 |
22 |
21 |
20 |
||
|
|
|
|
|
|
15 14 |
2 |
1 |
0 |
Рисунок 5.2 – Разрядная сетка 16-разрядного микропроцессора
Минимальное двоичное число, которое может быть записано в данной разрядной сетке –
000...0002 = 010
(в качестве нижнего индекса указано основание системы счисления). Максимальное число, которое может быть записано в шестнадцати
разрядах –
11...112 = 215 + 214 + 213 + ... + 21 + 20 = 216 − 1 = 6553510
Этот диапазон (0 ÷ 65535) соответствует формату Word Паскаля.
Для типа Byte используется один байт без знака (рисунок 5.3). В данном случае диапазон представления чисел –
00...002 ÷ 11..112 = 0 ÷ 28 − 1 = 25510
100
27 |
22 |
21 |
20 |
|
|
|
|
|
|
7 |
2 |
1 |
0 |
Рисунок 5.3 – Представление типа Byte
Для чисел со знаком старший бит соответствующего поля памяти, отведенного для хранения числа, считается знаковым (рисунок 5.4). Если в нем 0 – число положительное (знак +), 1 – отрицательное (знак –).
Знак 214 213 |
22 |
21 |
20 |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
15 14 13 |
2 |
1 |
0 |
|
||||
|
|
|
|
|
|
|
|
|
|
Рисунок 5.4 – Представление шестнадцатеричных чисел со знаком
Максимальное число (положительное), которое может быть записано в данной разрядной сетке:
11...112 = 215 − 1 = 3276710 .
Минимальное положительное число:
00...002 = 010 .
Отрицательные числа в памяти машины хранятся в дополнительном коде. Дополнительный код (ДК) числа i образуется путем инвертирования (замены значения на противоположное) всех значащих разрядов прямого кода числа и прибавления 1 к самому младшему разряду. Аналогично производится
преобразование из дополнительного кода в прямой код. Например, пусть i = −1.
101
000...01 |
прямой код числа 1 |
111...10 |
обратный код числа −1 |
+1 |
|
---------- |
дополнительный код числа −1. |
111...11 |
Дополнительный код числа i может также быть определен по формуле iдоп = 2n − i ,
где n – разрядность представления операндов (включая знак), i − модуль i.
Пример 5.1.
Представление чисел для n = 3 (рисунок 5.5).
Знак
2значащих
разряда
Рисунок 5.5 – Представление чисел для n = 3
Таблица 5.2 поясняет правила получения дополнительного кода числа из его прямого кода в полученном диапазоне. Здесь: 10СС – десятичная система счисления, 2СС – двоичная система счисления.
Диапазон представления при n = 3:
− 2n−1 ÷ 2n−1 − 1 = −22 ÷ 22 − 1 = −4 ÷ +3 .
102
Таблица 5.2 – Правила получения дополнительного кода из прямого кода числа при n = 3
|
Исходное |
Представ- |
Правило |
|
|
|
число i |
ление чис- |
получения ДК |
Примечания |
|
|
в 10СС |
ла i в 2СС |
2n – |i| = 8 − |i| |
|
|
|
–4 |
100 |
8 – 4 = 4 |
Формирование |
|
|
–3 |
101 |
8 – 3 = 5 |
дополнительного кода для |
|
|
–2 |
110 |
8 – 2 = 6 |
отрицательных чисел. В |
|
|
–1 |
111 |
8 – 1 = 7 |
знаковом разряде получена |
|
|
|
|
|
единица. |
|
|
0 |
000 |
— |
Сохранение прямого кода для |
|
|
1 |
001 |
— |
положительных чисел. В |
|
|
2 |
010 |
— |
знаковом разряде – ноль. |
|
|
3 |
011 |
— |
|
|
|
|
|
|
|
|
Пример 5.2.
Представление целых чисел для n = 16.
Формула для определения дополнительного кода числа в этом случае имеет вид:
iдоп = 216 − i
Представление целых чисел в формате два байта со знаком иллюстрирует таблица 5.3. Здесь 16СС – шестнадцатеричная система счисления.
Таблица 5.3 – Представление целых чисел в формате два байта со знаком
|
Исходное |
Представление |
Представле- |
Примечание |
|
|||
|
число i |
числа i в 2СС |
ние числа i |
|
||||
|
в 10СС |
в 16СС |
|
|
||||
|
|
|
|
|||||
|
|
–2 |
15 |
1000 0000 0000 0000 |
8000 |
Формирование |
|
|
|
|
|
дополнительного кода для |
|
||||
|
–2 |
15 |
+1 |
1000 0000 0000 0001 |
8001 |
|
||
|
15 |
отрицательных чисел. В |
|
|||||
|
–2 |
+2 |
1000 0000 0000 0010 |
8002 |
|
|||
|
|
знаковом разряде получена |
|
|||||
|
-------- |
-------------------------- |
----- |
|
||||
|
единица. |
|
||||||
|
|
|
−1 |
1111 1111 1111 1111 |
FFFF |
|
||
|
|
|
|
|
||||
|
|
|
|
0 |
0000 0000 0000 0000 |
0000 |
Сохранение прямого кода |
|
|
|
|
+1 |
0000 0000 0000 0001 |
0001 |
для положительных чисел. В |
|
|
|
|
|
+2 |
0000 0000 0000 0010 |
0002 |
знаковом разряде – ноль. |
|
|
|
-------- |
-------------------------- |
----- |
|
|
|||
|
+215 –1 |
0111 1111 1111 1111 |
7FFF |
|
|
|||
|
|
|
|
|
|
|
|
|
103
Итак, диапазон представления чисел со знаком в шестнадцати разрядах
равен
− 215 ÷ 215 − 1 ,
что соответствует типу Integer в Паскале.
Аналогично представление информации для типа Shortint (рисунок 5.6).
Знак 26 |
21 |
20 |
|||
|
|
|
|
|
|
7 |
6 |
1 |
0 |
Рисунок 5.6 – Представление восьмиразрядных чисел со знаком Диапазон представления чисел со знаком в восьми разрядах равен:
− 27 ÷ 27 − 1 .
Для типа Longint представление информации иллюстрирует рисунок 5.7.
Знак 230 |
22 |
21 |
20 |
|||
|
|
|
|
|
|
|
|
31 |
30 |
|
2 |
1 |
0 |
Рисунок 5.7 – Представление тридцатидвухразрядных чисел со знаком
Из данного рисунка следует, что диапазон представления чисел со знаком в тридцати двух разрядах равен:
− 231 ÷ 231 − 1.
104
Целочисленные константы и переменные.
В программах целые числа обычно используются в качестве счетчиков (для управления количеством повторений цикла) и в качестве индексов. При обработке целых чисел используется арифметика с ФТ, округления не производятся, вычисления выполняются точно.
Множество целочисленных значений является перенумерованным, порядковым номером каждого значения целочисленного типа является само это значение.
Например, порядковый номер числа 5 равен 5, числа (-5) – (-5), порядковый номер нуля равен нулю.
Переменные целочисленных типов объявляются в разделе описания переменных программы с помощью указания идентификатора типа. Например,
Var
a, b: integer;
c:shortint;
d:word;
Целые константы делятся на два типа – десятичные и шестнадцатеричные:
Признак шестнадцатеричной константы – знак $ перед числом. Примеры записи десятичных констант:
+16 25 –48
Примеры записи шестнадцатеричных констант:
$F $9A0
Целой константе присваивается целочисленный тип с наименьшим диапазоном, включающим значение этой константы.
Операции над целочисленными данными.
Над целочисленными данными в Паскале определены операции, которые представляет таблица 5.4.
В двухместных арифметических и логических операциях (кроме операции деления /) тип результата будет таким же, как общий тип обоих операндов. Перед выполнением операции оба операнда преобразуются к их общему типу. Общим типом является целочисленный тип с наименьшим диапазоном, включающим все возможные значения обоих типов.
Например, общим типом для целого (Integer) и длинного целого (Longint) является Longint. Общим типом для типов Integer и Word является Longint.
105
Действие выполняется в соответствии с точностью общего типа.
Для всех целочисленных типов переполнение при выполнении арифметических операций не обнаруживается.
Таблица 5.4 – Операции над целочисленными данными
Группа |
Опера- |
|
|
Тип резуль- |
|
опера- |
Вид |
Описание |
|||
ций |
ция |
|
|
тата |
|
|
|
|
|
||
Арифметические операции |
+ |
Одноместная |
Сохранение знака |
Целый |
|
– |
Одноместная |
Отрицание знака |
Целый |
||
+ |
Двухместная |
Сложение |
Целый |
||
|
|||||
|
– |
Двухместная |
Вычитание |
Целый |
|
|
* |
Двухместная |
Умножение |
Целый |
|
|
/ |
Двухместная |
Деление |
Вещественный |
|
|
div |
Двухместная |
Целочисленное деление |
Целый |
|
|
mod |
Двухместная |
Остаток целочисленного |
Целый |
|
|
|
|
деления |
|
|
|
not |
Одноместная |
Поразрядное дополнение |
|
|
Логические операции |
and |
Двухместная |
целого |
Целый |
|
сложение (ИЛИ) |
|||||
|
Поразрядное логическое |
|
|||
|
or |
|
умножение (И) |
|
|
|
Двухместная |
Поразрядное логическое |
|
||
|
xor |
Двухместная |
Поразрядное логическое |
|
|
|
|
|
исключающее ИЛИ |
|
|
Операции сдвига |
shl |
Двухместная |
i shl j – сдвиг влево значения |
Тип i |
|
|
|
значения i на j битов |
|
||
|
|
|
i на j битов |
|
|
|
shr |
Двухместная |
i shr j – сдвиг вправо |
Тип i |
|
|
|
|
|
|
|
Операции сравнения |
= |
Двухместная |
Равно |
Логический |
|
<= |
Двухместная |
Меньше или равно |
|||
|
<> |
Двухместная |
Не равно |
|
|
|
< |
Двухместная |
Меньше |
|
|
|
> |
Двухместная |
Больше |
|
|
|
>= |
Двухместная |
Больше или равно |
|
106
Примеры и пояснения к выполнению операций над целочисленными данными.
Пример 5.3.
Выполнение операций div, mod.
Результат операции А div В равен целой части результата деления А на В. Знак результата определяется по общим правилам деления.
Результат операции А mod В определяется в соответствии с выражением:
Amod B = A − ( Adiv B ) B .
Например, |
|
10 div 3 = 3 |
10 div (−3) = −3 |
10 mod 3 = 1 |
10 mod (−3) = 1 |
(−10) div 3 = −3 |
(−10) div (−3) = 3 |
(−10) mod 3 = −1 |
(−10) mod (−3) = −1 |
Пример 5.4.
Выполнение операций сдвига shl, shr.
Логические операции и операции сдвига осуществляют поразрядную обработку внутренних представлений целочисленных значений. Для правильного использования этих операций необходимо знать внутреннее представление целых чисел в машине. Использование этих операций приводит к машинной зависимости программ.
Пусть числа имеют тип Byte.
А) 2 shl 5
Внутреннее представление числа 2:
210 = 0000 00102 .
Сдвиг двоичного представления числа 2 влево на 5 двоичных разрядов дает результат:
0100 0000 = 6410 .
Поэтому 2 shl 5 = 64.
107
Следует обратить внимание, что сдвиг двоичного представления числа влево на один двоичный разряд эквивалентен умножению данного числа на 2. Для предыдущего примера числа на сдвиг двоичного представления числа влево на 5 двоичных разрядов эквивалентен умножению данного числа на 25.
2 25 = 26 = 64 .
В) 6 shr 2
Внутреннее представление числа 6:
610 = 0000 01102 .
Сдвиг двоичного представления числа 6 вправо на 2 двоичных разряда дает результат:
0000 00012 = 110 .
Поэтому 6 shr 2 = 1.
Следует обратить внимание, что сдвиг двоичного представления числа вправо на один двоичный разряд эквивалентен делению данного числа на 2. Для предыдущего примера сдвиг двоичного представления числа вправо на 2
двоичных разряда эквивалентен целой части результата деления данного числа на 22:
6 div 22 = 1.
Следует обратить внимание, что при сдвиге вправо отрицательных чисел слева вдвигаются единицы. При сдвиге влево всегда вдвигаются нули.
Пример 5.5.
Выполнение поразрядных логических операций and, or, xor, not. Выполнение логических операций над соответствующими двоичными
разрядами операндов поясняет таблица 5.5.
108
Таблица 5.5 |
– Правила выполнения логических операций |
|
||
|
|
|
|
|
And (И, ·) |
Or (Или, +) |
Xor ( ) |
Not (Не) |
|
|
|
|
|
|
0 · 0 = 0 |
0 + 0 = 0 |
0 0 = 0 |
0→1 |
|
0 · 1 = 0 |
0 + 1 = 1 |
0 1 = 1 |
1→0 |
|
1 · 0 = 0 |
1 + 0 = 1 |
1 0 = 1 |
|
|
1 · 1 = 1 |
1 + 1 = 1 |
1 1 = 0 |
|
Пусть числа имеют тип Byte.
А) 12 and 5
Внутреннее представление числа 12:
1210 = 0000 11002 .
Внутреннее представление числа 5:
510 = 0000 01012 .
and 0000 1100 0000 0101 0000 0100
Результат операции равен
0000 01002 = 410 .
Поэтому 12 and 5 = 4.
В) 12 or 5
or 0000 1100 0000 0101 0000 1101
Результат операции равен
0000 11012 = 1310 .
Поэтому 12 or 5 = 13.
С) 12 xor 5
109
xor 0000 1100 0000 0101 0000 1001
Результат операции равен
0000 10012 = 910 .
Поэтому 12 xor 5 = 9.
D) not 12
not 0000 1100 1111 0011
Результат операции равен
1111 00112 = 24310 .
Поэтому not 12 = 243.
Встроенные процедуры и функции, определенные над целочисленными данными.
Помимо операций над данными целочисленных типов определен ряд встроенных подпрограмм (функций и процедур).
Встроенные процедуры и функции – это процедуры и функции, которые определены в компиляторе языка программирования. Имена встроенных процедур и функций являются предопределенными идентификаторами.
Для получения значения встроенной процедуры или функции в программе записывается ее имя и аргументы в формате, который представляет рисунок 5.8.
<Имя> ( <Аргумент> )
,,
Рисунок 5.8 – Синтаксическая диаграмма обращения к подпрограмме
110
В компиляторе Паскаля определено около 100 встроенных процедур и функций (помимо определенных в стандартных модулях).
Над целочисленными данными определены процедуры и функции, основные из которых содержит таблица 5.6.
Таблица 5.6 – Процедуры и функции, определенные над целочисленными данными
Подпрограм- |
Вид |
Описание |
Тип |
|
ма |
результата |
|
||
|
|
|
||
|
|
|
|
|
Chr(x) |
Функция |
Возвращает символ кода ASCII с |
char |
|
заданным номером (x: byte) |
|
|||
|
|
|
|
|
|
|
Возвращает порядковый номер |
|
|
Ord(x) |
Функция |
скалярного аргумента x |
longint |
|
|
|
(Ord(5) = 5; Ord(0) = 0; Ord(-5) = −5) |
|
|
Abs(x) |
Функция |
Абсолютное значение х |
Тип x |
|
|
|
|
|
|
Sqr(x) |
Функция |
x2 |
Тип x |
|
|
|
|
|
|
Dec(x, [n])* |
Процедура |
Уменьшает значение x на величину n |
Тип x |
|
(по умолчанию на единицу; |
|
|||
|
|
n:longint) |
|
|
Inc(x, [n])* |
|
Увеличивает значение x на величину |
|
|
Процедура |
n (по умолчанию на единицу; |
Тип x |
|
|
|
|
n:longint) |
|
|
Odd(x) |
|
Возвращает True (истину), если |
|
|
Функция |
аргумент нечетный, False (ложь) – |
Boolean |
|
|
|
|
если четный (x:longint) |
|
|
|
|
Возвращает предшествующий |
|
|
Pred(x) |
Функция |
элемент в типе аргумента (для |
Тип x |
|
целочисленных данных возвращает |
|
|||
|
|
x − 1) |
|
|
Succ(x) |
|
Возвращает следующий элемент в |
|
|
Функция |
типе аргумента (для целочисленных |
Тип x |
|
|
|
|
данных возвращает x + 1) |
|
|
Hi(x) |
Функция |
Возвращает старший байт своего |
byte |
|
аргумента (x: integer или x: word) |
|
|||
|
|
|
|
|
Lo(x) |
Функция |
Возвращает младший байт своего |
byte |
|
аргумента (x: integer или x: word) |
|
|||
|
|
|
|
|
|
|
|
111 |