ЛАБОРАТОРНАЯ РАБОТА N6 ПРОГРАММИРОВАНИЕ

advertisement
3
Содержание
Введение……………………………………………………………………..
4
1. Системы счисления …………………………………………………………
5
2. Преобразование чисел………………………………....................................
7
3. Арифметические операции в двоичной системе счисления……………... 10
4. Формы представления данных…………………………………………….. 14
5. Логические функции операции………………….………………………… 17
6. Программирование на языке Turbo Pascal………………………………... 22
7. Примеры решения задач на языке Turbo Pascal ………………………… 34
4
Введение
Данные методические указания предназначены для студентов 1-го курса
дневной формы обучения специальности 190700 (653400) и содержат описания
практических работ I семестра. Методические указания могут быть
использованы в качестве учебного материала по аналогичным дисциплинам
других специальностей.
В пособии рассмотрен материал по темам:
- Системы счисления.
- Числа с плавающей точкой.
- Логические функции и операции.
- Программирование на языке Turbo Pascal.
Приведены примеры выполнения арифметических операций в 2-й
системе счисления и операции над числами с плавающей точкой. Предложен к
рассмотрению материал, объясняющий решение логических задач.
В данном пособии рассматриваются вопросы разработки программ в
среде Turbo Pascal. Уделено внимание основным понятиям, операторам ввода и
вывода данных, составлению программ, реализующих ветвление, циклические
процессы, работе с массивами, процедурами, файлами и записями. Ко всем
изучаемым темам прилагаются задания для самостоятельной работы.
Выполнение предложенных практических работ предполагается после изучения
лекционного материала по соответствующим темам.
Целью выполнения практических работ сборника является:
- успешное решение контрольных заданий;
- выполнение индивидуального домашнего задания;
- приобретение практических навыков программирования различных
типов алгоритмов.
5
1. Системы счисления
Совокупность приемов наименования и записи чисел называется
счислением. Под системой счисления понимается способ представления
любого числа с помощью ограниченного алфавита символов, называемых
цифрами. Счисление представляет собой частный случай кодирования, где
слово, записанное с использованием определенного алфавита и по
определенным правилам, называется кодом. Применительно к счислению это
код числа.
Различают позиционные и непозиционные системы счисления. В
непозиционных
системах
счисления
каждое
число
обозначается
соответствующей совокупностью символов. Характерным представителем
непозиционных систем является римская система счисления со сложным
способом записи чисел и громоздкими правилами выполнения арифметических
операций. Например, запись MCMXCIX означает, что записано число 1999 (М тысяча, С - сто, Х - десять, V - пять, I - единица и т. д.).
Позиционные системы счисления обладают большими преимуществами в
наглядности представления чисел и в простоте выполнения арифметических
операций.
В позиционной системе счисления значение числа определяется не только
набором входящих в него цифр, но и их местом расположения (позицией) в
последовательности цифр, изображающих это число, например, числа 127 и
721.
Позиционной является десятичная система счисления, используемая в
повседневной жизни. Помимо десятичной существуют другие позиционные
системы счисления, и некоторые из них нашли применение в информатике.
Количество символов, используемых в позиционной системе счисления,
называется ее основанием. Его обозначают обычно буквой q. В десятичной
системе счисления используется десять символов (цифр): 0, 1, 2, 3,4, 5, 6, 7, 8, 9,
и основанием системы является число десять.
Особое место среди позиционных систем счисления занимают системы со
степенными весами разрядов, в которых веса смежных позиций цифр
(разрядов) отличаются по величине в постоянное количество раз, равное
основанию q системы счисления.
В общем случае в такой позиционной системе счисления с основанием q
любое число Х может быть представлено в виде полинома разложения:
,
где A(q) - запись числа в системе счисления с основанием q;
q - основание системы счисления;
ai - целые числа, меньше q;
(1.1)
6
n - число разрядов в целой части числа;
m - число разрядов в дробной части числа.
Для обозначения используемой системы счисления ее основание
указывается в индексе. Изображение числа A в виде последовательности
коэффициентов ai полинома является его условной сокращенной записью
(кодом).
A(q)=an-1 an-2…a1a0,a-1…a-m .
(1.2)
Запятая отделяет целую часть числа от дробной и служит началом отсчета
значений веса каждого разряда.
В информатике применяют позиционные системы счисления с
недесятичным основанием: двоичную, восьмеричную и шестнадцатеричную.
Двоичная система счисления
Наибольшее распространение получила двоичная система счисления. В
этой системе для представления любого числа используются два символа цифры 0 и 1. Основание системы счисления q = 2.
Произвольное число с помощью формулы (1.1) можно представить в виде
разложения по степеням двойки. Тогда условная сокращенная запись в
соответствии с (1.2) означает изображение числа в двоичной системе счисления
(двоичный код числа), где ai =0 или 1.
Например:
15,625=1•23+1•22+1•21+1•20+1•2-1+0•2-2+1•2-3=1111,101(2).
Двоичное представление числа требует примерно в 3,3 раза большего
числа разрядов, чем его десятичное представление. Тем не менее, применение
двоичной системы счисления создает большие удобства для работы ЭВМ, т. к.
для представления в памяти разряда двоичного числа может быть использован
любой запоминающий элемент, имеющий два устойчивых состояния.
Восьмеричная система счисления
В восьмеричной системе счисления алфавит состоит из восьми символов
(цифр): 0, 1 ... 7. Основание системы счисления q = 8. Для записи
произвольного числа в восьмеричной системе счисления необходимо по
формуле (1.1) найти его разложение по степеням восьмерки, а затем
воспользоваться условной сокращенной записью (1.2).
Например, десятичное число 53(10) = 65(8).
Шестнадцатеричная система счисления
В шестнадцатеричной системе счисления алфавит включает в себя 16
символов цифр и букв: 0, 1 ... 9, А (10), В (11), С (12), D (13), Е (14), F (15).
Основание системы счисления q = 16. Для записи произвольного числа в этой
7
системе счисления необходимо по формуле (1.1) найти его разложение по
степеням 16, а по формуле (1.2) - код.
Например: 31(10)=1F(16).
Двоично-десятичное кодирование
Наряду с двоичными кодами, которыми оперирует ЭВМ, для ввода и
вывода десятичных чисел (данных) используют специальное двоичнодесятичное кодирование. При двоично-десятичном кодировании каждая
десятичная цифра заменяется тетрадой (четверкой) двоичных цифр, а сами
тетрады записываются последовательно в соответствии с порядком следования
десятичных цифр. При обратном преобразовании двоично-десятичного кода в
десятичный исходный код разбивается на тетрады вправо и влево от запятой,
которые затем заменяются десятичными цифрами.
Таким образом, при двоично-десятичном кодировании фактически не
производится перевод числа в новую систему счисления, а мы имеем дело с
двоично-кодированной десятичной системой счисления.
Например, десятичное число 12(10) = C(16)= 14(8)= 1100(2)= 00010010(2-10)..
2. Преобразование чисел
ЭВМ работают с двоичными кодами, поэтому возникает необходимость
перевода числа из одной системы счисления в другую.
Преобразование числа Х из системы счисления с основанием q в систему
счисления с основанием р осуществляется по правилу замещения или по
правилу деления-умножения на основание системы счисления.
Правило замещения
Правило замещения реализуется на основании формулы (1.1) и
предусматривает выполнение арифметических операций с кодами чисел в
новой системе счисления. Поэтому оно чаще всего используется для
преобразования чисел из q системы счисления в десятичную.
Пример. 111011,011(2)= 1•24 +0•23 +1•22 +0•21 +l•20+0•2-1+l•2-2+l•2-3= 59, 375(10).
1023,012(8)= 1•83 +0•82 +2•81 +3•80+0•8-1+l•8-2+2•8-3= 531, 0195…(10) .
1А3,02(16)= 1•162 +10•161 +3•160+0•16-1+2•16-2= 419, 1429(10) .
Правило деления-умножения
Правило
деления-умножения
предусматривает
выполнение
арифметических операций с кодами чисел в исходной системе счисления с
основанием q, поэтому его удобно применять для преобразования десятичных
чисел в любые другие позиционные системы счисления. Правила
преобразования целых чисел и правильных дробей различны. Для
преобразования целых чисел используется правило деления, а для
8
преобразования правильных дробей - правило умножения. Для преобразования
смешанных чисел используются оба правила соответственно для целой и
дробной частей числа.
Правило деления используется для преобразования целого числа,
записанного в q-ичной системе счисления, в р-ичную. В этом случае
необходимо последовательно делить исходное q-ичное число и получаемые
частные на новое основание р, представленное в q-ичной системе счисления.
Деление продолжают до тех пор, пока очередное частное не станет меньше р.
Правило умножения используется для преобразования дробного числа,
записанного в q-ичной системе счисления, в р-ичную. В этом случае
необходимо последовательно умножать исходную дробь и дробные части
получающихся произведений на основание р, представленное в исходной
q-ичной системе счисления. Целые числа получаемых произведений,
замененные цифрами р-ичной системы счисления, и дают последовательность
цифр в новой р-ичной системе.
Умножение необходимо производить до получения в искомом р-ичном
коде цифры того разряда, вес которого меньше веса младшего разряда
исходной q-ичной дроби. При этом в общем случае получается код
приближенно и всегда с недостатком значения дроби. Поэтому в случае
обратного преобразования (р-ичного кода дроби в q-ичный) результат может не
совпадать с исходным значением q-ичной дроби.
Пример. 75,35(10) перевести в 2-ичную систему счисления
Для получения частных и остатков по правилу деления для целой части
числа удобно использовать формулу записи, известную под названием
«деление в столбик», а для получения р-ичного кода дробной части числа по
правилу умножения — форму записи, известную под названием «умножение
столбиком». Применительно к рассматриваемому примеру имеем:
В двоичную
0, 35
2
0, 70
2
1, 40
2
0, 80
2
1, 60
2
1, 20
75
1
2
37
1
2
18
0
2
9 2
1 4 2
0 2
2
0
1
В результате преобразования получаем 75,35(10) = 1001011,01011...(2).
9
Как следует из примера, процесс перевода дробной части можно
продолжить до бесконечности. ЭВМ оперирует числами, представленными
конечными наборами цифр. Поэтому дроби округляют в соответствии с
правилами преобразования и весом младшего разряда исходной дроби.
Пример. 75,35(10) перевести в 8-ричную систему счисления
В восьмеричную
0, 35
8
2, 80
8
75
8
3
9
1
8
1
6, 40
8
3, 20
8
1, 60
8
4, 80
В результате преобразования получаем 75,35(10) = 113,26314...(8).
Пример. 75,35(10) перевести в 16-ричную систему счисления
В шестнадцатиричную
0, 35
16
5, 60
16
75
11
16
4
В
9, 60
16
9, 60
В результате преобразования получаем 75,35(10) = 4В,599...(16).
Преобразование чисел из 8-ричной системы счисления в 16-ричную и
обратно
Преобразование чисел из восьмеричной системы счисления в
шестнадцатеричную и обратно осуществляется через двоичную систему
счисления. Основания этих систем счисления кратны целой степени 2, т. е.
8=23 , а 16=24 . Это означает, что при преобразовании восьмеричного кода числа
в двоичный необходимо каждую восьмеричную цифру заменить
соответствующим трехзначным двоичным кодом (триадой).
При преобразовании шестнадцатеричного кода числа в двоичный
необходимо каждую шестнадцатеричную цифру заменить четырехзначным
двоичным кодом (тетрадой).
При преобразовании двоичного кода в восьмеричный или
шестнадцатеричный двоичный код делится соответственно на триады или
10
тетрады влево и вправо от запятой (точки), разделяющей целую и дробные
части числа. Затем триады (тетрады) заменяются восьмеричными
(шестнадцатеричными) цифрами.
Если при разбиении двоичного кода в крайних триадах (тетрадах)
недостает цифр до нужного количества, они дополняются нулями.
соответственно, «лишние» нули слева и справа, не вошедшие в триады
(тетрады) отбрасываются.
Таблица взаимосвязи 2-ичной и 8-ричной систем счисления
8-ричная
с/с
0
1
2
3
4
5
6
7
2-ичная
000
001
010
011
100
101
110
111
с/с
Таблица взаимосвязи 2-ичной и 16-ричной систем счисления
16-ричная с/с
0
1
2
3
4
5
6
7
8
9
2-ичная
с/с
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
10 11 12 13 14 15
(А) (В) (С) (D) (E) (F)
1010
1011
1100
1101
1110
1111
Примеры
1) 251, 56(8) преобразовать в 16-ую систему счисления
251, 56(8) = 010 101 001, 101 110(2) = 0000 1010 1001, 1011 1000(2) = 0А9, В8(16).
2) А3FD1,15DE(16) преобразовать в 8-ую систему счисления
А3FD1,15DE(16) = 1010 0011 1111 1101 0001, 0001 0101 1101 1110(2) = 010 100 011 111
111 010 001, 000 101 011 101 111 000(2) = 2437721, 053570(8).
3. Арифметические операции в двоичной системе счисления
Сложение
Правила сложения двоичных чисел аналогичны правилам в десятичной
системе счисления.
Таблица сложения в двоичной системе счисления:
1 + 1 = 10
1+0=1
0+1=1
0 + 0 = 0.
Здесь все числа двоичные.
Пример: Складывать будем «столбиком», как и в десятичной системе
счисления.
Сложим числа 1001 и 10
Сложим 100 и 100
Сложим 101 и 101
11
Вычитание
Таблица вычитания двоичных чисел:
10 - 1 = 1
1-0=1
1-1=0
0 - 0 = 0.
Здесь все числа двоичные.
Пример: Вычетать будем «столбиком», как и в десятичной системе счисления.
Вычтем из числа 100 число Вычтем из
10
число 10
числа
1001 Вычтем
число 1
из
числа
1000
Здесь сначала из правого нуля в 100 вычли ноль, а после, чтобы из среднего
нуля в 100 вычесть 1, мы заняли 1 из позиции 3. Всё как в десятичной системе,
но в нашем распоряжении только 0 и 1 и таблица вычитания.
Умножение
Таблица умножения двоичных чисел:
1*1=1
1*0=0
0*1=0
0 * 0 = 0.
Здесь все числа двоичные.
Пример: Умножать будем «столбиком», как и в десятичной системе
счисления.
Умножим числа 100 и 11
Умножим числа 100 101
Деление
Таблица деления двоичных чисел:
1:1=1
0:1=0
0 : 0 = 0.
При делении используем таблицы вычитания и умножения для двоичных
чисел, делим подобно тому, как мы делим десятичные числа.
Пример: разделим двоичные числа 1110 и 10
Специальное кодирование чисел
Для хранения чисел и выполнения различных операций над ними их
представляют различными кодами: прямым, обратным и дополнительным. Для
12
представления чисел со знаками в памяти ЭВМ используют прямой код. Для
обозначения прямого кода числа Х используется запись вида [X q] .
Правило представления Q-ичного кода числа в прямом коде имеет вид:
где хi - значение цифры в i-м разряде исходного кода.
Здесь старший бит несет информацию о знаке числа. Если он принимает
значение 0, то знак числа «+» ; если значение 1 - то знак числа «-».
Например, для двоичного кода
Х(2)= +11001011
[Х(2)]=0.11001011;
Х(2)= -01101011
[Х(2)]=1.01101011.
При представлении чисел в прямом коде реализация арифметических
операций в ЭВМ должна предусматривать различные действия с модулями
чисел в зависимости от их знаков. Сложение в прямом коде чисел с
одинаковыми знаками выполняется достаточно просто. Числа складываются, а
результату суммы присваивается код знака слагаемых. Значительно более
сложной является операция алгебраического сложения в прямом коде чисел с
различными знаками. В этом случае приходится определять большее по
модулю число, производить вычитание чисел и присваивать разности знак
большего по модулю числа. Для упрощения выполнения операций
алгебраического сложения в ЭВМ используются специальные коды,
позволяющие свести эту операцию к операции арифметического сложения. В
качестве специальных в ЭВМ применяются обратный и дополнительный коды.
Они образуются из прямых кодов чисел, причем специальный код
положительного числа равен его прямому коду.
Для обозначения обратного кода числа Х(q) используется запись вида
[Х(q)]обр. Правило представления q-ичного кода числа в обратном коде имеет
вид:
Для двоичной системы счисления, если х = 1, то
и наоборот.
Отсюда можно сформулировать частное правило образования обратного кода
для отрицательных двоичных чисел.
Для преобразования прямого кода двоичного отрицательного числа в
обратный код и наоборот необходимо знаковый разряд оставить без изменения,
а в остальных разрядах нули заменить на единицы, а единицы - на нули.
13
Например:
x(2)= +11011001,
x(2)= - 01011101,
[X(2)]
пр.=0.11011001,
[X(2)]
пр.=1.01011101,
[X(2)] обр.=
0.11011001.
[X(2)] обр.=
1.10100010.
Для обозначения дополнительного кода числа Х(q) используется запись
вида [X(q)]доп . Правило представления q-ичного кода числа в дополнительном
коде имеет вид:
Для преобразования прямого кода q-ичного отрицательного числа в
дополнительный необходимо образовать его в обратный код и в младший
разряд добавить единицу.
Например, для двоичных чисел:
[X(2)]
x(2)= +11011001,
0.11011001,
[X(2)]
x(2)= - 01011101,
пр.=1.01011101,
пр.=
[X(2)]доп.=
0.11011001.
[X(2)]обр.=
1.10100011.
При выполнении операции сложения чисел, представленных
специальными q-ичными кодами, знаковые разряды участвуют в операции
наряду с цифровыми разрядами. При этом цифровые разряды слагаемых
складываются как модули чисел по правилам q-ичной арифметики. Знаковые
разряды и цифры переноса из старшего цифрового разряда при любом
основании системы счисления (q=2) складываются как одноразрядные
двоичные коды. Если при этом формируется перенос из знакового разряда, то
он имеет вес единицы младшего разряда q-m при использовании обратного кода
и должен быть добавлен в младший разряд результата. При использовании
дополнительного кода единица переноса из знакового разряда не принимается
во внимание, т. е. отбрасывается.
Например:
14
При выполнении операции алгебраического сложения перед
преобразованием прямых кодов слагаемых в специальные необходимо их
выровнять по числу разрядов, если число разрядов слагаемых различно. Кроме
того, в некоторых случаях может произойти переполнение разрядой сетки.
Признаком переполнения разрядной сетки является следующая комбинация
цифр в знаковых разрядах слагаемых и результата: 1+1 = 0.
4. Формы представления данных
В ЭВМ используются следующие формы представления данных:
• числа с фиксированной точкой (запятой);
• числа с плавающей точкой (запятой);
• десятичные числа;
• символьные данные.
Числа с фиксированной точкой
При представлении числа Х в форме с фиксированной точкой
указываются знак числа (sign X) и модуль числа (modX) в q-ичном коде. Иногда
такую форму представления чисел называют естественной формой. Место
точки (запятой) постоянно для всех чисел и в процессе решения задач не
меняется. Знак положительного числа кодируется цифрой «0», а знак
отрицательного числа — цифрой «1».
Код числа в форме с фиксированной точкой, состоящий из кода знака и
q-ичного кода его модуля, называется прямым кодом. Разряд прямого кода
числа, в котором располагается код знака, называется знаковым разрядом кода.
Разряды прямого кода числа, в которых располагается q-ичный код модуля
числа, называются цифровыми разрядами кода. При записи прямого кода
знаковый разряд располагается левее старшего цифрового разряда и обычно
отделяется от цифровых разрядов точкой.
Разрядная сетка ЭВМ для размещения чисел в форме с фиксированной
точкой показана на рис. 1.
На рисунке используется n разрядов для представления целой части числа
и r разрядов — для дробной части числа.
15
а)
Рис. 1. Число с фиксированной точкой
При заданных значениях n и r диапазон изменения модулей чисел, коды
которых могут быть представлены в данной разрядной сетке, определяется
неравенством
.
Использование формы с фиксированной точкой для представления
смешанных (с целой и дробной частью) чисел в ЭВМ практически не
встречается. Как правило, используются ЭВМ либо с дробной арифметикой
(n=0), либо с целочисленной арифметикой (r=0).
Форма представления чисел с фиксированной точкой упрощает
аппаратную реализацию ЭВМ, уменьшает время выполнения машинных
операций, однако при решении задач на машине необходимо постоянно следить
за тем, чтобы все исходные данные, промежуточные и окончательные
результаты находились в допустимом диапазоне представления.
Числа с плавающей точкой
b)
p
m
Рис. 2. С плавающей точкой
В нормальной форме число представляется в виде произведения X=mqp,
где m — мантисса числа;
q — основание системы счисления;
р — порядок.
Для задания числа в нормальной форме требуется задать знаки мантиссы
и порядка, их модули в q-ичном коде, а также основание системы счисления.
16
Нормальная форма представления чисел неоднозначна, ибо взаимное
изменение m и р приводит к плаванию точки (запятой). Отсюда произошло
название формы представления чисел (рис. 2).
Для однозначности представления чисел в ЭВМ используется нормальная
нормализованная форма, в которой положение точки всегда задается перед
значащей цифрой мантиссы, т. е. выполняется условие
.
Разрядная сетка содержит:
 разряд для знака мантиссы;
 r цифровых разрядов для q-ичного кода модуля мантиссы;
 разряд для кода знака порядка;
 s разрядов для q-ичного кода модуля порядка.
Диапазон представления модулей чисел в нормальной нормализованной форме
определяется следующим неравенством:
.
В конкретной ЭВМ диапазон представления чисел с плавающей точкой
зависит от основания системы и числа разрядов для представления порядка.
При этом у одинаковых по длине форматов чисел с плавающей точкой с
увеличением основания системы счисления существенно расширяется диапазон
представляемых чисел.
Точность вычислений при использовании формата с плавающей точкой
определяется числом разрядов мантиссы r. Она увеличивается с увеличением
числа разрядов.
Сложение чисел с плавающей точкой
Выравниваются порядки слагаемых: младший порядок увеличивается до
большего. При этом на соотвеотствующее число разрядов вправо сдвигается
мантисса выравниваемого слагаемого. Производится суммирование мантисс по
правилам сложения чисел с фиксированной точкой в двоичном коде. К
полученному результату добавляется порядок слагаемых. При необходимости
производится нормализация мантиссы.
Пример: сложить 2 числа 0,10101*10^101 и 0,11001*10^011
Наименьший порядок у 2-го слагаемого: 0,11001*10^011 = 0,0011001*10^101
Производим сложение 0,10101 и 0,0011001:
0,10101
+ 0,0011001
0,1101101
Получаем результат
0,1101101*10^101.
В полученном результате мантисса нормализована.
Пример: сложить 2 числа 0,11101*10^101 и 0,11001*10^011.
Наименьший порядок у 2-го слагаемого: 0,11001*10^011 = 0,0011001*10^101.
17
Производим сложение 0,11101 и 0,0011001:
0,11101
+ 0,0011001
1,0001101
Получаем результат
1,0001101*10^101.
В полученном результате мантисса сформировалась ненормализованной.
Нормализация результата: 1,0001101*10^101 = 0,10001101*10^110.
5. Логические функции и операции
Логика – эта наука, изучающая законы и формы мышления; учение о
способах рассуждений и доказательств.
Основными формами мышления являются понятие, суждение,
умозаключение.
Понятие – это форма мышления, выделяющая существенные признаки
предмета или класса предметов, позволяющих отличить их от других. Понятие
имеет две стороны: содержание и объем.
Содержание понятия – совокупность существенных признаков,
отраженных в этом понятии. Например, содержание понятия персональный
компьютер - это универсальное электронное устройство для автоматической
обработки информации, предназначенное для одного пользователя.
Объем понятия – множество предметов, каждому из которых принадлежат
признаки, составляющие содержание понятий.
Например:
1. Объем понятия город – это множество, состоящее из городов,
носящих имя Москва, Одесса, Казань, Уфа, Нижнекамск и др.
2. Объем понятия персональный компьютер – совокупность
существующих в мире персональных компьютеров.
Суждение (высказывание, утверждение) – это форма мышления, в
которой что-либо утверждается или отрицается о свойствах реальных
предметов и отношениях между ними. Высказывание может быть либо
истинным, либо ложным, и может быть либо простым, либо составным
(сложным).
Например:
1. Истинное и простое высказывание: Буква “т” - согласная.
2. Ложное и сложное высказывание: Осень наступила, и грачи
прилетели.
Вопросительные и восклицательные предложения не являются
высказываниями, так как в них ни чего не утверждается и не отрицается.
Например:
1. Уходя, гасите свет!
2. Кто хочет быть счастливым?
Высказывания могут выражаться с помощью математических,
физических, химических и прочих знаков. Например: 5>3, H2O+SO2=H2SO4.
18
Умозаключение – это форма мышления, с помощью которой из одного
или нескольких суждений может быть получено новое суждение.
Посылками умозаключения по правилам формальной логики могут быть
только истинные суждения. Тогда, если умозаключение проводится в
соответствии с правилами формальной логики, то оно будет истинным. В
противном случае можно прийти к ложному умозаключению.
Например:
1. Все металлы – простые вещества. 2. Все школьники – отличники.
Литий – металл.
Вовочка – школьник.
Литий – простое вещество.
Вовочка – отличник.
Алгебра высказываний была разработана для того, чтобы можно было
определять истинность или ложность составного высказывания, не вникая в их
содержание.
Алгебра логики (алгебра высказываний) – раздел математической логики,
изучающий строение (форму, структуру) сложных логических высказываний и
способы установления их истинности с помощью алгебраических методов.
Под высказыванием (суждением) будем понимать повествовательное
предложение, относительно которого можно сказать, истинно оно или ложно.
В алгебре высказываний простым высказываниям ставятся в соответствие
логические переменные, обозначаемые прописными буквами латинского
алфавита.
Например:
А= “Листва на деревьях опадает осенью”.
В= “Земля прямоугольная”.
Высказывания могут быть истинными или ложными. Истинному
высказыванию соответствует значение логической переменной 1, а ложному –
значение 0 .
В алгебре логики высказываний высказывания обозначаются именами
логических переменных, которые могут принимать лишь два значения:
“истина” (1) и “ложь” (0).
В алгебре логоки высказываний над высказываниями можно производить
логические операции, в результате которых получаются новые, составные
(сложные) высказывания.
Логическая операция – способ построения сложного высказывания из
данных высказываний, при котором значение истинности сложного
высказывания полностью определяется значениями истинности исходных
высказываний.
19
Логическая
операция
Название
Соответствует Обозначение
Таблица
союзу
знаками
истинности
Инверсия
(от лат. inversion –
переворачиваю)
отрицание
А
1 0
0 1
не А
Логическое
АиВ
умножение
А
1
1
0
0
В
1 1
0 0
1 0
0
Логическое
А или В
сложение
А
1
1
0
0
В
1
0
1
0
1
1
1
0
А
1
1
0
0
В
1
0
1
0
1
0
0
1
А
1
1
0
0
В
1
0
1
0
1
0
0
1
Конъюнкция
(от лат.
conjunction –
связываю)
Дизъюнкция
(от лат. disjunction
– различаю)
Импликация
(от лат. implication
– тесно связывать)
Если А,
Логическое то В;
следование
Когда А, тогда
В
А тогда и
Эквивалентность
Логическое
(от лат. equivalents
только тогда,
равенство
- равноценность)
когда В
А–условие
В-следствие
При вычислении значения логического выражения (формулы) логические
операции вычисляются в определенном порядке согласно их приоритету:
1) инверсия;
2) конъюнкция;
20
3) дизъюнкция;
4) импликация и эквивалентность.
Операции одного приоритета выполняются слева направо. Для изменения
порядка действий используются скобки.
Например: дана формула
Порядок вычисления:
- инверсия
- конъюнкция
- дизъюнкция
- импликация
- эквивалентность.
Законы логики
Законы логики отражают наиболее важные закономерности логического
мышления. В алгебре высказываний законы логики записываются в виде
формул, которые позволяют проводить эквивалентные преобразования
логических выражений в соответствии с законами логики.
Закон тождества. Всякое высказывание тождественно самому себе: А = А.
Закон непротиворечия. Высказывание не может быть одновременно
истинным и ложным. Если высказывание А — истинно, то его отрицание не
А должно быть ложным. Следовательно, логическое произведение
высказывания и его отрицания должно быть ложно: A & ¬A = 0.
Закон исключенного третьего. Высказывание может быть либо истинным,
либо ложным, третьего не дано. Это означает, что результат логического
сложения высказывания и его отрицания всегда принимает значение
«истина»: A v ¬A = 1.
Закон двойного отрицания. Если дважды отрицать некоторое высказывание,
то в результате мы получим исходное высказывание: ¬ ¬A = A.
В основе выполнения преобразований логических выражений лежат
правила алгебраических преобразований. Многие из них имеют аналоги в
обычной алгебре.
Законы Моргана: ¬(A v B)= ¬А & ¬В
¬(A & B)= ¬А v ¬В.
Правило коммутативности. В обычной алгебре слагаемые и множители
можно менять местами. В алгебре высказываний можно менять местами
логические переменные при операциях логического умножения и
логического сложения:
Логическое умножение
Логическое сложение
A&B=B&A
AvB=AvB
21
Правило ассоциативности. Если в логическом выражении используются
только операция логического умножения или только операция логического
сложения, то можно пренебрегать скобками или произвольно их расставлять:
Логическое умножение
Логическое сложение
(A & B) & C = A & (B & C)
(A v B) v C = A v (B v C)
Правило дистрибутивности. В отличие от обычной алгебры, где за скобки
можно выносить только общие множители, в алгебре высказываний можно
выносить за скобки как общие множители, так и общие слагаемые:
Дистрибутивность умножения
Дистрибутивность сложения
относительно умножения
относительно сложения
(a x b) + (a x c) = a x (b + c)
(A v B) & (A v C) = A v (B & C)
(A & B) v (A & C) = A & (B v C)
Пример: упростить логическое выражение: (А &. В) v (A & ¬В).
Воспользуемся правилом дистрибутивности и вынесем за скобки А:
(А & В) v (А & ¬В) = А & (В v ¬В).
По закону исключенного третьего В v ¬В = 1, следовательно:
А & (В v ¬B) = А & 1 = А.
Пример решения задачи: Алеша, Боря и Гриша нашли в земле сосуд.
Каждый из них высказал по два предположения.
Алеша: " Это сосуд греческий, V века".
Боря: " Это сосуд финикийский, III века".
Гриша: " Это сосуд не греческий, IV века".
Учитель истории сказал ребятам, что каждый из них прав только в одном из
двух своих предположений. Где и в каком веке был изготовлен сосуд?
Решение.
Введем обозначения: G - это сосуд греческий, F - сосуд финикийский. Цифры 3,
4, 5 - век.
(1)
(2)
(3)
Умножая (1) на (2), получим:
G &5& F &3 G &5& F &3 G &5& F &3 G &5& F &3 1
22
Отбросим те логические произведения, в которых речь идет о невозможных
событиях.
Умножая уравнение (4) на уравнение (3), получим
Ответ: Сосуд изготовлен в Финикии в V веке.
6. Программирование на языке Turbo Pascal
Программа на языке Turbo Pascal - это последовательность строк,
описывающих алгоритм решения задачи. Строка может содержать один или
несколько операторов, разделенных точкой с запятой ";".
Структура программы Turbo Pascal
Program [имя программы]
Uses
[имя модуля]
Label
[описание меток]
Const
[описание констант]
Type
[описание типов]
Var
[описание переменных]
Procedure [ имя процедур]
Function [имя функций]
Exports [описание экспортируемых имен]
Begin
[тело программы]
end.
Оператор представляет собой строго формализованное указание на
выполнение конкретного действия. Длина программной строки не должна
превышать 256 символов.
Данные представляются в программе в виде констант и переменных. Тип
данных определяет возможные значения констант и переменных, форму
представления в ЭВМ, объем занимаемой памяти, операции, которые могут
выполняться над данными этого типа.
Числа. В языке Turbo Pascal
пользуются двумя типами чисел:
вещественными и целыми.
Под целое число отводится 1 байт или 2 байта памяти и оно хранится
форме с фиксированной точкой. Запись целого числа представляет собой
последовательность цифр со знаком или без него (например:120, -13, 5487,
-7821, +3841).
23
Вещественные числа хранятся в ячейке памяти длиной 4 байта в форме с
плавающей точкой. Возможны две формы "внешней" записи вещественных
чисел в программах:
- с фиксированной точкой (например, - 3.7);
- с плавающей точкой (например: -00.45Е2, 0.78E-3, здесь буквa " Е
означает основание " 10 " и разделяет мантиссу и порядок).
Числовое или символьное значение можно сохранить в переменной или в
константе.
Переменная - величина, которая может меняться при выполнении
программы. Переменная всегда имеет имя, которое содержит не более 40
буквенно-цифровых символов и начинается с латинской буквы. Переменные
описываются явно с помощью операторов описания типа (табл.1).
Таблица 1
Таблица диапазона числовых данных
тип
диапазон
целый
-32768 ÷ +32767
целочисленный
короткий
целочисленный
длинный
веществ. обычной
точности
-3.402823E+38 ÷ -1.40129E-45
+1.40129E-45 ÷ +3.402823E+38
веществ. двойной
точности
-1.79769E+308 ÷ -4.94965E-324
+-4.94965E-324 ÷ +1.79769E+308
-128 ÷ +127
-2147483648 ÷ +2147483647
Программирование линейных алгоритмов.
Алгоритм - это последовательность действий, однозначно определяющих
процесс преобразования исходных и промежуточных данных в результат
решения задачи. Форма представления алгоритма может быть как текстовой,
так и графической - в виде схемы. Решение всего многообразия задач может
быть сведено к трем типам алгоритмов: линейному, разветвляющемуся и
циклическому. Чаще встречается комбинация этих типов.
Линейный алгоритм - алгоритм, в котором к результату решения задачи
приводит последовательное выполнение действий.
Алгоритм решения такой задачи в словесной форме состоит из
следующих пунктов: начало программы; ввод исходных данных; вычисления;
вывод результатов; окончание программы.
Программы, реализующие линейный алгоритм, как правило, очень
просты и для их реализации используются операторы ввода данных,
выполнения действий (вычислений) и вывода результатов.
24
Ввод данных в программах, написанных на языке Turbo Pascal, можно
осуществить с помощью оператора Read, Readln:
Read ( a, b, c), Readln (a, b, c) - операторы ввода данных в
диалоговом режиме, где a, b, c - список имен переменных
Задать исходные данные можно также операторами присваивания,
например: а := 5 ; b := -8 ; c := 12.5;
Для вычисления арифметических выражений используется оператор
присваивания “ := ", частный случай которого может применяться и для ввода
данных.
Общий вид оператора: Q := P, где Q - имя переменной, P - арифметическое выражение.
Арифметические выражения соответствуют общепринятым алгебраическим выражениям, в них могут входить числа, переменные, функции,
соединенные знаками арифметических операций и круглыми скобками.
В языке Turbo Pascal имеются следующие арифметические операции:
*, /
- умножение, деление;
MOD
- определение остатка от деления;
DIV
- целочисленное деление;
+, - сложение, вычитание.
Операции перечислены в порядке убывания приоритета их выполнения.
Действия внутри круглых скобок выполняются первыми.
Математические функции
При записи функций на языке Turbo Pascal аргумент функции
заключается в круглые скобки. В качестве аргумента математических функций
может быть число, переменная или арифметическое выражение. Следует
отметить, что в тригонометрических функциях аргумент должен быть задан в
радианах.
Наиболее распространенные функции языка Turbo Pascal:
Abs(X) - вычисляет модуль аргумента, что соответствует
математической записи x;
Exp(X) - экспонента, соответствует математической записи e x ;
Ln(X) - вычисляет натуральный логарифм аргумента;
Sqr (x) - вычисляет возведение аргумента в квадратную степень;
Sqrt(X) - вычисляет корень квадратный из аргумента;
ArcTan(X) - вычисляет арктангенс аргумента;
Cos(X) - вычисляет косинус аргумента;
Sin(X) - вычисляет синус аргумента;
Sgn(X) - определяет знак аргумента. Если аргумент отрицательный,
функция принимает значение (-1,) если положительное (+1). При нулевом
аргументе функция принимает значение 0.
Fix(X) - отбрасывает дробную часть значения аргумента;
25
Int(X) - округляет аргумент в сторону уменьшения;
Cint(X) - округляет аргумент по математическим правилам.
Random(X) - выдает случайное число обычной точности в интервале
01. Аргумент может быть опущен. Рекомендуется в начале программы
запустить генератор случайных чисел оператором Randomize.
Write (x, y, z); Writeln (x, y, z); - оператор вывода значений переменных
x, y, z.
Программирование разветвляющих алгоритмов.
Алгоритм разветвляющейся структуры - алгоритм, в котором
последовательность выполнения действий зависит от каких-либо условий.
В языке Turbo Pascal для ветвления
используются следующие
операторы:
1.Оператор безусловной передачи управления GOTO N, - где N метка
строки. Этот оператор передает управление строке с меткой N.
2. Операторы условной передачи управления (приведены три типа):
a) IF < логическое выражение > THEN < оператор >;
- при выполнении оператора IF сначала определяется результат
логического выражения: ИСТИНА (TRUE) или ЛОЖЬ (FALSE). Если
ИСТИНА, то управление передается операторам, следующим за словом THEN,
если ЛОЖЬ, то оператору, записанному после оператора IF;
б) IF <логическое выражение>THEN< оператор >ELSE<оператор>;
- при выполнении оператора IF данной модификации сначала
определяется результат логического выражения. Если ИСТИНА, то управление
передается операторам, следующим за словом THEN, если ЛОЖЬ, то
оператору, записанному после ELSE;
в) блочный " IF " (записывается в нескольких строках):
IF < логическое выражение > THEN < оператор>
[ ELSE IF < логическое выражение > THEN < оператор>
ELSE < оператор> ]*;
При выполнении блочного IF, сначала определяется результат первого
логического выражения. Если результат - ИСТИНА, то управление передается
операторам, следующим за первым словом THEN, а затем к строке, следующей
за разделителем «;». Если - ЛОЖЬ, то определяется результат следующего
логического выражения, и в случае ИСТИНЫ управление передается
операторам, записанным за следующим THEN, а потом к строке, идущей за «;»
и т.д. Если же ни одно из условий оператора не выполняется, то выполняются
операторы, записанные после слова ELSE, а затем управление передается
при записи структуры операторов в общем виде квадратные скобки означают
необязательность элемента, заключенного в “ [ ] ”

26
строке, следующей за «;».
В командах разрешено использовать только один оператор, но если вам
необходимо написать более одного оператора в команде, применяют
конструкцию begin … end; , которая позволяет записать любое количество
операторов.
Например: If a>=d Then begin b :=4; c := 5;
d := a+b-c; End;
Логические выражения состоят из числовых или текстовых данных,
знаков отношений и логических операций (табл. 4).
Таблица 4
Логические операции
ЗНАКИ СРАВНЕНИЯ
Название знака
В программе
Равно
=
не равно
<>
больше
>
больше или равно
>=
меньше
<
меньше или равно
<=
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Название операции
В программе
Логическое умножение
AND
Логическое сложение
Отрицание
OR
NOT
Программирование циклических алгоритмов
Алгоритм называется циклическим, если все или отдельные его этапы в
процессе решения задачи неоднократно повторяются.
Цикл обеспечивает повторное выполнение или, иначе говоря,
циклическую работу операторов. Оператор или группа операторов,
повторяющаяся в цикле, называется "телом цикла".
Далее рассмотрим два типа циклических задач:
а) задачи, в которых вычисления многократно ведутся по одним и тем же
формулам с различными значениями входящих в нее величин;
б) задачи, где значение некоторой величины вычисляется через значение
этой же величины, полученное в предыдущем цикле (рекурсии). Примерами
таких задач являются задачи вычисления сумм и произведений рядов, а также
вычисление значений факториала.
Характерные моменты циклического алгоритма:
- первоначальный вход в цикл выполняется через блок подготовки;
- цикл всегда характеризуется некоторой переменной, называемой
параметром цикла. Начальное значение параметра задается перед циклом в
27
блоке подготовки, а при каждом повторении цикла выполняются операторы
тела цикла и начальное значение параметра изменяется на единицу;
- число повторений цикла должно быть конечным, однако, не всегда
число повторений известно или может быть вычислено заранее. В этом случае
выход из цикла осуществляется при выполнении некоторых условий. Когда
число повторений известно или может быть определено заранее, выход их
цикла осуществляется при достижении параметром некоторой заранее заданной
величины. Для такого рода задач используется оператор цикла "FOR". В общем
виде оператор цикла записывается следующим образом:
For I: = n TO k do <оператор1>;
или
For I := n TO k do begin
<оператор1>;
<оператор2>;
…………
<оператор N>; End;
Здесь:
I - параметр цикла (переменная);
n - начальное значение параметра цикла (переменная или число);
k- конечное значение параметра цикла (переменная или число).
Этот оператор многократно выполняет <оператор>, находящийся после
ключевого слова do для всех значений параметра I от n до k (при этом I =I+1,
n< k).
Внимание. Если параметр TO заменить на параметр DOWNTO, то
значение параметра I вычисляется по формуле I=I – 1 (n > k).
Структура самого оператора включает и подготовку цикла, и изменение
параметра, и проверку условия выхода из цикла.
Проиллюстрируем использование оператора "For" в следующих заданиях.
Когда условие задачи не позволяет определить заранее число повторений
цикла, выход из цикла зачастую осуществляется по достижении заданной
точности вычислений или по какому-либо другому условию, оговоренному в
задании. В этих случаях удобно использовать следующие операторы цикла:
While L do <оператор >;
Repeat
< операторы >;
Until L
28
Здесь: L - логическое выражение.
Операторы, находящиеся между после do и после Repeat, повторяются до
тех пор, пока выражение, стоящее после While, - истинно или до тех пор, пока
выражение, стоящее после Until, - ложно.
Работа с массивами.
Массивом называют совокупность данных одного типа, обозначаемую
одним именем. В зависимости от типа данных массивы могут быть как
числовыми, так и текстовыми. При работе с массивами в ЭВМ под каждый
элемент массива отводится ячейка памяти, обращение к которой
осуществляется с помощью имени массива с индексом, например А[15].
Положение элемента в массиве определяется индексами: одним - для
одномерных массивов, двумя - для двумерных (матриц) и т.д. В языке Turbo
Pascal допускаются массивы размерностью 255. Максимальное значение
каждого индекса не должно превышать 32767.
Имя массива образуется аналогично имени простой переменной. Индексы
заключаются в квадратные скобки и разделяются запятой, если массив не
одномерный. В качестве индексов могут использоваться числа, переменные или
арифметические выражения, значения которых автоматически округляются до
целого. Если индексы не числовые, то их значения должны быть определены
заранее.
Примеры обозначения в языке Turbo Pascal элементов массивов:
Mas[33], Mas[i], Mas[i + 4]
- для одномерного массива;
Mas[12,3], Mas[i,j], Mas[i+2,j+3] - для двумерных массивов.
Массив должен быть объявлен соответствующим оператором в области
описания переменных Var.
В операторе указываются имена массивов и в квадратных скобках
верхние и нижние границы изменения индексов, которые должны быть целыми
положительными числами или переменными, значение которых определено в
программе ранее.
Например, Mas array [5 .. 50] of Real; - оператор описывает одномерный
массив, имя которого Mas, а индексы могут принимать значения от 5 до
50, т.о. под этот массив выделяется 46 ячеек памяти.
Значение нижней границы индексов может быть опущено и тогда по
умолчанию оно принимается равным единице, например:
Massiv1 array [15] of Real;
Massiv2 array [5,8] of Real; - операторы описывают два массива:
- одномерный массив с именем Massiv1 и индексы могут принимать
значения от 1 до 15, т.о. зарезервировано 15 ячеек;
- двумерный массив (матрицу) с именем Massiv2, при этом индекс
строки может принимать значения от 1 до 5, а индекс столбца - от 1 до 8.
29
При обозначении двумерных массивов индекс строки стоит на первом
месте, индекс столбца - на втором.
В языке Turbo Pascal обработка массивов осуществляется поэлементно, в
том числе и ввод-вывод массива. Если массив содержит всего несколько
элементов, то задать их значения можно с помощью операторов присваивания:
Massiv1 array [4] of Real;
Massiv1 [1]:=0.25; Massiv1 [2]:=0.12;
Massiv1 [3]:=0.35; Massiv1 [4]:=0.28;
или с помощью оператора ввода:
Massiv1 array [4] of Real;
Readln (Massiv1[1], Massiv1[2], Massiv1[3], Massiv1[4]);
Аналогичным образом осуществляется и вывод массива:
Writeln (Massiv1[1], Massiv1[2], Massiv1[3], Massiv1[4]);
В том случае, когда массив содержит много элементов и перечисление
их при вводе - выводе становится неудобным, организуется цикл.
Описание и ввод строковых данных
Строковая константа представляет собой произвольную последовательность символов, заключенную в одинарные кавычки, длиной до 32567
символов, например, ‘ Hello’, ‘Добрый день’.
Строковые переменные бывают переменной или фиксированной длины.
Строка переменной длины (String) представляет собой последовательность
длиной до 32567 символов из таблицы ASCII. В памяти под такую символьную
переменную отводится количество байт равное количеству символов
переменной плюс 4. Объявить строковый тип переменной длины можно с
помощью оператора объявления типа данных:
Var Str: String;
Строка фиксированной длины Str1:String [n]; представляет собой строку
длиной n символов. В памяти под такую символьную переменную отводится n
байт. Описать символьную переменную фиксированной длины можно таким
образом:
Var Hello :String[12];
Hello := ‘Привет – Hello’;
Writeln(‘ Результат:’, Hello);
На экран будет выведено: Результат: Привет - Hello
Строковое выражение может содержать строковые константы, строковые переменные, вызов функций и строковые операции.
30
1. Операция "+" (конкатенация) предназначена для объединения строк.
Результат операции имеет строковый тип. Например, после выполнения
фрагмента программы:
L:= ‘MOSCOW’;
AGE:= ‘We’ + ‘ live in ‘ + L;
строковая переменная AGE примет значение:
We live in MOSCOW.
2. Oперации сравнения (=, <>, <, >, <=, >=). Сравнение двух строк
выполняется слева направо с учетом кодов ASCII. Т.е. сравниваются сначала
коды первых символов, затем вторых и т.д. Результат операций сравнения
имеет логический тип, то есть принимает значения ДА или НЕТ, например,
‘A’ < ‘B’ (результат ДА)
‘RA’ > ‘RR’ (результат НЕТ)
‘002’> ‘12’ (результат ДА)
Если две строки имеют различную длину, но их начальные символы
совпадают, включая последний символ более короткой строки, то короткая
строка считается меньшей, например:
‘12.0’ > ‘12’ (результат ДА).
Cтроки считаются равными тогда и только тогда, когда имеют одинаковую длину и одинаковую последовательность символов, например:
‘TURBO’ = ‘TURBO’ (результат ДА)
‘TURBO’ = ‘ TRUBO ‘ (результат НЕТ).
Строковые функции и операторы
Приведем наиболее часто употребляемые строковые функции:
 Val(St) – преобразует строковое выражение в его численное
представление.
 Length(St) в качестве результата дает целое число, равное длине
строкового выражения St.
 Copy(St, n, m) в качестве результата дает фрагмент строки St длиной m,
начиная с позиции n.
 Str(числовое выражение) - преобразует числовое выражение в
символьное. Если его значение положительно, то к полученной строке слева
добавляется пробел.
 Delete(St,n,m) удаляет из строки St подстроку длиной m, начиная с
позиции n.
 Pos(St,’stroka’) производит поиск подстроки в строке и выдает №
позиции, или 0 – если подсторка не найдена.
 Insert(St, ‘stroka’,n) добавляет подстроку ‘stroka’ в строку St,
начиная с n.
31
 Chr(integer) определяет по коду ASCII символ.
 Ord(string) вычисляет порядковый номер символа.
Работа в графическом режиме.
Графические режимы используются для формирования рисунков.
В программировании используется такая характеристика как разрешение.
Для графических режимов - это количество доступных точек на экране, для
текстовых - количество символов в строке. Разрешение экрана является одним
из важнейших параметров видеоподсистемы. Чем оно выше, тем больше
информации можно отобразить на экране.
Другое важное свойство графического режима – количество различных
цветов, доступных для раскрашивания изображений. Базовая палитра включает
16 стандартных цветов.
Стандартный модуль GRAPH содержит библиотеку из более, чем 50
графических программ. В нем поддерживается несколько видов закрашивания,
типов линий и шрифтов, размер которых можно изменять.
Для переключения экрана в графический режим необходимо выполнить
процедуру:
InitGraph (var Graphdriver : integer; var GraphMode : integer;
PathToDriver : string);
По этой процедуре выполняются:
− поиск в каталоге PathToDriver файла драйвера графической карты с
номером GraphDriver;
− загрузка драйвера в оперативную память;
− установка указанного графического режима GraphMode.
Если имя каталога не указано (параметр PathToDriver представляет собой
пустую строку ''), то файл ищется в текущем каталоге.
Если GraphDriver = 0, то происходит автоматическое определение
графической среды, а переменным GraphDriver и GraphMode присваиваются
величины, определяющие номер драйвера и номер режима графического
экрана.
Пиксель - это единичный элемент экрана. Количеством пикселей по
горизонтали и вертикали определяется размер графического экрана.
Синонимом пикселя является понятие "точка".
Для перехода из графического режима в текстовый используется
процедура CloseGraph без параметров, которая устанавливает текстовый режим
и очищает память, автоматически выделенную программе. Это выполняется
подсистемой управления графикой.
По соглашению верхний левый угол экрана имеет координаты (0,0).
Координата X увеличивается при перемещении вправо, а координата Y - при
перемещении вниз. Таким образом, координаты каждого из четырех углов и
32
конкретной точки, например середины экрана, могут выглядеть следующим
образом:
(0, 0)
(639, 0)
(319, 174)
(0, 349)
(639, 349)
Рис. 3. Графический экран
На рис. 3 рассмотрен графический режим с матрицей экрана 640х350
пикселей. В некоторых других режимах эта матрица может быть иной,
например, 320х200 или 640х200 и так далее.
Определение координат правого нижнего угла экрана выполняется по
функциям: GetMaxX, GetMaxY.
Синтаксис: GetMaxX : integer; GetMaxY : integer.
Если цвета могут изменяться, то присвоение выбранного цвета позиции
цветовой гаммы производится с помощью процедуры SetPalette.
Синтаксис: SetPalette (ColorNum, Color : word);
Идентификатор цвета Color присваивается позиции ColorNum цветовой
гаммы.
Рисование графических примитивов
Рисование точки (пикселя) с координатами (X, Y) цветом с номером Color
выполняется процедурой PutPixel(X, Y: integer; Color: word).
Рисование отрезков прямых линий можно выполнить одной из
следующих трех процедур:
Line(X1, Y1: integer; X2, Y2: integer) – рисование отрезка прямой линии,
соединяющего точки с координатами (X1,Y1) и (X2,Y2);
LineRel(dX, dY: integer) - рисование отрезка прямой линии от текущего
положения графического курсора на расстояние dX по горизонтали и dY по
вертикали;
LineTo(X, Y: integer) - рисование отрезка прямой линии от текущего
положения графического курсора к точке, имеющей координаты (X, Y).
Графическое окно можно установить с помощью процедуры:
SetViewPort(X1, Y1: integer; X2, Y2: integer; Clip :boolean);
Процедура задает графическое окно в виде прямоугольника с
координатами противоположных углов (X1, Y1) и (X2, Y2). CLIP определяет,
должны ли обрезаться выходящие за пределы окна части рисунка: если этот
параметр задается константой ClipOff (или False), то не обрезать, если же
константой ClipOn (или True), то обрезать.
33
Графический курсор невидим, но его текущие координаты могут быть
определены с помощью процедур GetX и GetY.
Синтаксис: GetX : integer; GetY : integer.
Для очистки графического экрана используется процедура без параметров
ClearDevice.
После очистки экрана графический курсор будет установлен в верхнем
левом углу текущего графического окна.
Процедура без параметров ClearViewPort очищает текущее графическое
окно и заполняет его цветом первой позиции цветовой гаммы.
Контроль выполнения графических операций
При выполнении графических процедур возможны следующие
ошибочные ситуации:
1. Параметры процедуры не нарушают требований синтаксиса, но
подобраны неправильно, при этом выполнение процедуры не вызовет никаких
изменений.
2. Параметры подобраны правильно, а процедура выполняется
неправильно.
3. Определение причин неправильного выполнения графических
операций остается за разработчиком программы. Эту задачу упрощает функция
GraphResult, позволяющая определить результат завершения графической
операции.
Синтаксис: GraphResult : integer;
Если операция закончилась успешно, функция возвращает 0, в противном
случае – отрицательное значение, идентифицирующее причину неудачи. Коды
ошибок:
grOk -0 -нормальное выполнение графической операции;
grNoInitGraph -1 -графический режим не установлен;
grNotDetected -2 -нет графической карты;
grFileNotFound -3 -файл драйвера устройства не найден;
grInvalidDeviceNum -15 -ошибочный номер устройства.
Поскольку двукратный вызов функции GraphResult (без выполнения
между вызовами графической операции) приводит к тому, что вторым
результатом всегда будет 0, рекомендуется назначить первый результат
промежуточной переменной.
Для обработки "неуспешных" графических операций следует создавать
процедуры анализа и выхода из соответствующих ситуаций.
34
7. Примеры решения задач на языке Turbo Pascal
Задача №1. Найдите частное чисел а и b, значение которых вводится с
клавиатуры.
Program zadacha_1;
Var
rez, a, b: real;
Begin
writeln(‘введите значения а, b’);
readln(а, b, );
If b<>0 then begin
rez:= a/b;
writeln(‘Результат вычислений =’,rez); end;
else
Writeln (‘ Делитель равен нулю. Решения нет. ‘);
end.
Задача №2. Преобразовать время, введенное с клавиатуры в минутах, в
часы и минуты.
Program zadacha_2;
Var
min, h,vr: integer;
Begin
writeln(‘введите количество минут’);
readln(vr );
h:= vr div 60; min := vr-h*60;
writeln(vr, ‘ мин. – это ‘, h, ‘ час. ’ ,min, ‘ мин.’);
end.
Задача №3. Сравните числа а и b, которые ввели с клавиатуры.
Program zadacha_3;
Var
a, b: real;
Begin
writeln(‘введите значения а, b’);
readln(а, b, );
If b=a then writeln(‘Числа ’,a,’ и ’, b, ‘ равны’)
Else if a>b then Writeln (‘Число ‘, a, ‘ больше’, b)
Else Writeln (‘Число ‘, b, ‘ больше’, a);
end.
35
Задача № 4. Даны числа x, y, z. Найти максимальное значение (x+y, z+x).
Program zadacha_4;
Var
x, y, z, max: real;
Begin
writeln(‘введите значения x, y, z’);
readln(x, y,z, );
if (x+y) >( z+x) then max:= x+y
Else max:= z+x;
Writeln (‘Самое большое число ‘, max);
end.
Задача №5. Определить время года по номеру месяца.
Program zadacha_5;
Var
month: integer;
Begin
writeln(‘Введите номер месяца’);
readln(month);
Case month of
1, 2, 12: Writeln (month , ‘- Зима ‘);
3..5: Writeln (month , ‘- Весна ‘);
6..8 : Writeln (month , ‘- Лето ‘);
9..11: Writeln (month , ‘- Осень ‘);
Else Writeln (‘Неправильно задан номер месяца ‘); end;
end.
Задача № 6. Вывести на экран таблицу умножения на n- число.
Program zadacha_6;
Var
n, i ,rez: integer;
Begin
writeln(‘введите число n’);
readln(n );
For i :=1 to 10 do begin
rez := i*n;
writeln(n, ‘ * ‘, i, ‘ = ’ , rez); end;
end.
Задача № 7. Определить сумму 1-й и 3-й цифры из 3-значного числа.
Program zadacha_7;
Var
36
n, n_1, n_3, vr: integer;
Begin
writeln(‘введите трехзначное число’);
readln(n );
n_3:= n mod 10; {выделение 3-ей цифры}
vr := n div 10; {выделение 1-ой и 2-й цифр}
n_1 := vr div 10; {выделение 1-ой цифры}
writeln(‘ Результат = ‘, n_1 + n_3);
end.
Задача№8. Определить количество ненулевых элементов одномерного
массива.
Program zadacha_8;
Var
mas: array [1..10] of integer;
n, i: integer;
Begin
For i:=1 to 10 do begin
writeln(‘введите элемент массива ’, i);
readln(mas[i] );
if mas[i] <> 0 then n:= n+1; end;
writeln(‘ В массиве ‘, n, ‘ ненулевых элементов ‘);
end.
Задача №9. Определить минимальное значение в двумерном массиве,
заполненном случайными числами. Результат записать в файл.
Program zadacha_9;
Var
f: text; s: string;
mas: array [1..10, 1..10] of real;
n, i: integer;
min: real;
Begin
Randomize;
Writeln (‘Введите имя файла’);
Readln(s);
Assing (f, s);
Rewrite(f); {открыть файл на перезапись};
For i:=1 to 10 do begin
For n:=1 to 10 do
mas[i. n] := random (150); end;
min:=0;
37
For i:=1 to 10 do For n:=1 to 10 do
If mas[i. n] < min then min:=mas[i, n];
writeln(f, ‘ Самое маленькое число в массиве ‘, min );
Close(f);
Writeln(‘ Результат записан в файл:‘, s);
end.
Задача № 10. Удалить из строки начальные пробелы.
Program zadacha_10;
Var
vr: string[80];
Begin
writeln(‘введите текст ’);
readln(vr );
while (pos (‘ ‘, vr) = 1) and (length(vr)>0) do delete (vr, 1, 1);
writeln(‘ новая строка = ‘, vr);
end.
Задача № 11. Определить среднее арифметическое чисел, находящихся в
файле.
Program zadacha_11;
Var
s:string;
n, i, sum: integer;
res: real;
f:text;
begin
sum:=0;
i:=0;
Writeln (‘Введите имя файла’);
Readln(s);
Assing (f, s);
Reset(f); {открыть файл на чтение};
While not EOF(f) do begin
readln(f,n);
sum:=sum+n;
i:=i+1;
end;
Close(f);
Res:=sum/i;
Writeln(‘ Среднее арифметическое:‘, res:4:2);
End.
38
Задача № 12. Определение результата сравнения чисел в виде символа (>,
<, =).
Program zadacha_12;
Function Comp(a, b:real): char;
Begin
if a>b then Comp:=‘>’
else if a<b then Comp:=‘<‘
else Comp:=‘=‘;
End;
var
x1, x2: real;
res: char;
Begin
Writeln (’Введите 2 числа ‘);
Readln(x1, x2);
res:=Comp(x1, x2); {вызов функции};
writeLn ( x1:6:2, res, x2:6:2);
End.
Задача № 13. Нарисовать узор, состоящий из квадратов.
Program zadacha_13;
Uses Graph;
Var
grDriver: integer; grMode: integer; grPath:string; ErrCode: integer;
x, y, d, n, z, j, i: integer;
Begin
grDriver:= VGA; grMode:= VGAHI; { разрешение 640х480};
grPath:=‘e:\tp\bgi’; {файл egavga.bgi};
InitGraph(grDriver, grMode, grPath);
ErrCode := GraphResult;
If ErrCode <> grOK then begin Writeln(‘ Ошибка инициализации граф.
режима‘);
Writeln (‘Для завершения нажмите Enter’); Readln; Halt(1); end;
{Рисуем узоры};
y:=100; d:=30; z:=10;
For i:=1 to 5 do begin
if ( (i mod 2) =1) then begin n:=5; x:=100; end; {нечетный ряд, 5 квад. в
ряду};
else begin n:=4; x:=100+round(d/2 + z/2); end; {четн.ряд, 4 квад. В
ряду};
For j:=1 to n do begin
rectangle(x, y, x+d, y+d); x:=x+d+z; end;
y:= y+Round(d/2 + z/2); end;
Readln; End.
39
Download