Реферат Курсовая Конспект
Информатика - раздел Информатика, Министерство Образования И Науки Рф Федераль...
|
Министерство образования и науки РФ
Федеральное бюджетное государственное
образовательное учреждение
Тула 2011 г.
Рассмотрено на заседании кафедры "Автоматизированные станочные системы"
протокол №1 от "31" августа 2011 г.
Зав. кафедрой________________А.Н. Иноземцев
СОДЕРЖАНИЕ
1. Понятие информатики. 9
1.1. История развития информатики. 9
1.2. Мировоззренческие экономические и правовые аспекты информационных технологий 11
2. Понятие информации и ее измерение 12
2.1. Теории информации. 12
2.2. Меры информации. 13
2.3. Единицы измерения информации и примеры.. 13
2.3.1 Синтаксическая мера информации. 14
2.3.2 Семантическая мера информации. 14
2.3.3 Прагматическая мера информации. 15
2.3.4 Алгоритмическая мера информации. 15
2.4. Количество и качество информации. 15
2.5. Единицы измерения информации. 17
2.6. Информацияи энтропия. 20
2.6.1 Сообщения и сигналы.. 21
2.6.2 Схема передачи информации. 21
2.6.3 Энтропия. 22
2.6.4 Избыточность. 22
2.6.5 Сенсация. 23
3. Понятие информационной технологии. 23
3.1. Новая информационная технология. 24
3.2. Инструментарий информационной технологии. 25
3.3. Составляющие информационной технологии. 25
3.4. Развитие информационных технологий. 26
3.4.1 Нулевое поколение ИТ. 27
3.4.2 Первое поколение ИТ. 27
3.4.3 Второе поколение ИТ. 28
3.4.4 Третье поколение ИТ. 28
3.4.5 Четвертое поколение ИТ. 29
3.4.6 Пятое поколение ИТ. 30
3.5. Базовая информационная технология. 32
3.6. Предметная информационная технология. 32
3.7. Обеспечивающая информационная технология. 33
3.8. Функциональная информационная технология. 33
3.9. Виды пользовательского интерфейса информационных технологий. 34
3.10. Свойства информационных технологий. 35
4. Сообщения и сигналы.. 36
4.1. Кодирование и квантование сигналов. 36
4.2. Виды и характеристики носителей и сигналов. 37
4.2.1 Характеристики сигналов, передаваемых по каналу. 37
4.2.2 Модуляция сигналов. 38
4.2.3 Виды и характеристики носителей. 38
4.2.4 Спектры сигналов. 39
4.2.5 Периодические сигналы.. 40
4.2.5.1 Тригонометрическая форма. 41
4.2.5.2 Комплексная форма. 41
4.2.5.3 Определение погрешности. 42
4.2.5.4 Спектр. 42
4.2.6 Непериодические сигналы.. 43
5. Модуляция и кодирование 47
5.1. Коды: прямой, обратный, дополнительный, модифицированный. 47
5.1.1 Прямой код числа. 47
5.1.2 Обратный код числа. 48
5.1.3 Дополнительный код числа. 48
5.1.4 Модифицированный код числа. 49
5.2. Систематические коды.. 49
5.3. Контроль по четности, нечетности, по Хеммингу. 51
5.3.1 Кодирование по методу четности-нечетности. 51
5.3.2 Коды Хэмминга. 53
5.4. Сетевые технологии обработки данных. 55
5.4.1 Распределенная обработка данных. 55
5.4.2 Обобщенная структура компьютерной сети. 56
5.4.3 Классификация вычислительных сетей. 57
5.5. Каналы передачи данных и их характеристики. 58
5.5.1 Обобщенные характеристики сигналов и каналов. 58
5.5.2 Характеристики канала передачи информации без помех. 59
5.5.3 Характеристики каналов передачи информации с помехами. 60
5.6. Методы повышения помехоустойчивости передачи и приема. 62
5.7. Современные технические средства обмена данных и каналообразующей аппаратуры 63
6. Представление информации в цифровых автоматах (ЦА). 67
6.1. Информационные основы контроля работы цифровых автоматов. 68
6.2. Основные принципы помехоустойчивого кодирования. 69
6.3. Помехоустойчивость кода. 75
6.4. Методы помехоустойчивого кодирования. 76
6.4.1 Метод контроля четности. 76
6.4.2 Метод контрольных сумм. 77
6.4.3 Коды Хэмминга. 78
6.4.4 Контроль по модулю. 78
6.4.5 Числовой метод контроля. 79
6.4.6 Цифровой метод контроля. 79
6.4.7 Выбор модуля для контроля. 80
6.5. Контроль логических операций. 82
6.5.1 Операции сдвига. 82
6.5.2 Операция сложения по модулю 2. 84
6.5.3 Операция логического умножения. 84
6.6. Контроль арифметических операций. 84
6.7. Арифметические коды.. 86
7. ЦАП и АЦП. 90
7.1. Основные понятия относящиеся к преобразователям. 91
7.2. Уровни цифровой логики. 92
7.3. Управляющий выходной сигнал – выходной сигнал «состояние». 94
7.4. Управляющий выходной сигнал строб-импульс 94
7.5. Аналоговые сигналы.. 95
7.6. Цифроаналоговые преобразователи. 95
7.6.1 Цифроаналоговое преобразование 96
7.6.2 Основные типы ЦАП. 96
7.6.2.1 ЦАП со взвешенными резисторами. 97
7.6.2.2 ЦАП с цепочкой резисторов типа R—2R. 97
7.6.3 Другие типы ЦАП. 99
7.7. Аналоговые преобразователи. 100
7.7.1 Аналогоцифровое преобразование 100
7.7.2 Основные типы АЦП. 101
7.7.2.1 Двухтактные интегрирующие АЦП. 102
7.7.2.2 АЦП последовательного приближения. 104
7.7.3 Другие типы АЦП. 105
7.7.3.1 Преобразователи напряжения в частоту. 105
7.7.3.2 Параллельные АЦП. 106
7.8. Факторы применения. 107
7.8.1 Характеристики ЦАП. 107
7.8.2 Характеристики АЦП. 112
7.9. Совместимость с системой. 114
7.10. Совместимость преобразователей (взаимозаменяемость) 117
8. Позиционные системы счисления. 117
8.1. Методы перевода чисел. 119
8.2. Форматы представления чисел с плавающей запятой. 126
8.3. Двоичная арифметика. 128
9. Понятие и свойства алгоритма. 132
9.1. Определение алгоритма. 134
9.2. Свойства алгоритма. 135
9.3. Правила и требования, предъявляемые к построению алгоритма. 136
9.4. Типы алгоритмических процессов. 137
9.5. Принцип программного управления. 140
9.5.1 Принципы Джона фон Неймана. 140
9.5.2 Функциональная и структурная организация компьютера. 142
9.6. Выполнение арифметических операций с числами с фиксированной и плавающей запятой 147
9.6.1 Коды: прямой, обратный, дополнительный, 147
9.6.2 Операция сложения. 148
9.6.3 Операция умножения. 148
9.6.4 Операция деления. 149
10. Файлы данных. 150
10.1. Файловые структуры.. 150
10.2. Носители информации и технические средства для хранения данных. 159
10.3. Организация данных на устройствах с прямым и последовательным доступом. 162
11. Вычислительная техника. 163
11.1. Древнейшие счетные инструменты.. 163
11.2. Развитие абака. 166
11.3. Логарифмы.. 170
11.4. Суммирующая машина Блеза Паскаля. 170
11.5. Чарльз Бэббидж и его изобретение 174
11.6. Табулятор Холлерита. 177
11.7. Машина Ц3. 179
11.8. Марк I 180
11.9. ЭНИАК. 183
11.10. ЭДСАК. 186
11.11. МЭСМ.. 186
11.12. Машина электронная вычислительная общего назначения БЭСМ-6. 187
11.13. IBM 360. 188
11.14. Альтаир 8800. 189
11.15. Компьютеры Apple 190
11.16. IBM 5150. 191
12. Основы языка Object Pascal/Delphi 191
12.1. Описание структуры проекта. 191
12.2. Описание структуры модуля. 194
12.3. Описание элементов программ. 195
12.3.1 Элементы языка программирования-алфавит. 197
12.3.2 Элементы языка программирования-идентификаторы,константы, выражения 199
13. Выражения на Object Pascal 201
13.1. Целая и вещественная арифметика. 202
13.2. Приоритет операций. 205
13.3. Встроенные функции. Построение сложных выражений. 206
14. Типы данных. 208
14.1. Встроенные типы данных. Целые типы. Представление знака числа. Арифметическое переполнение 211
14.1.1 Встроенные типы данных. 211
14.1.2 Целые типы.. 214
14.1.3 Представление знака числа. 215
14.1.4 Арифметическое переполнение 216
14.2. Вещественные типы. Сопроцессор. 217
14.3. Текстовые типы.. 221
14.4. Логический тип. 222
14.5. Оператор присваивания. Совместимость типов по присваиванию. 223
15. Ввод-вывод данных. 225
15.1. Устройства вывода. 225
15.2. Объекты, обеспечивающие вывод данных на экран. 226
15.2.1 Перечень компонентов ввода и отображения текстовой информации. 226
15.2.2 Отображение текста в надписях компонентов Label, StaticText и Panel 227
15.2.3 Окна редактирования Edit и MaskEdit 229
15.2.4 Многострочные окна редактирования Memo и RichEdit 233
15.2.5 Группа радиокнопок – компонент RadioGroup. 237
15.2.6 Ввод и отображение целых чисел — компоненты UpDown и SpinEdit 238
15.2.7 Компоненты выбора из списков — ListBox, CheckBox, CheckListBox и ComboBox 239
15.2.8 Таблица строк — компонент StringGrid. 242
15.2.9 Функция InputBox. 243
15.2.10 Процедура ShowMessage 245
15.3. Вывод в текстовый файл. 248
15.3.1 Объявление файла. 248
15.3.2 Назначение файла. 248
15.3.3 Вывод в файл. 249
15.3.4 Открытие файла для вывода. 249
15.3.5 Ошибки открытия файла. 251
15.3.6 Закрытие файла. 252
15.4. Устройства ввода. Ввод с клавиатуры. Реакция на действия пользователя. 252
15.4.1 Устройства ввода. 252
15.5. Ввод из файла. 255
15.5.1 Открытие файла. 255
15.5.2 Чтение данных из файла. 256
15.5.3 Чтение чисел. 256
15.5.4 Чтение строк. 257
15.5.5 Конец файла. 258
16. Ветвление 259
16.1. Операции отношения. 259
16.2. Логические (булевские) операции. 260
16.3. Составной оператор. 262
16.4. Оператор ветвления if 262
16.5. Оператор ветвления case 264
16.6. Исключительные ситуации. 265
17. Циклы.. 266
17.1. Функции цикла в программе. Циклы с пред- и постусловием. 266
17.2. Оператор While. Вечные циклы. 267
17.3. Вечные циклы.. 269
17.4. Оператор REPEAT. Процедуры INC и DEC. 269
17.5. Цикл FOR. 270
17.6. Команды BREAK и CONTINUE. 271
17.7. Вложенные циклы.. 272
17.8. Примеры задач с циклами. 274
18. Массивы.. 275
18.1. Объявление массива. 275
18.2. Операции с массивами. 277
18.2.1 Вывод массива. 277
18.2.2 Ввод массива. 279
18.2.2.1 Использование компонента StringGrid. 279
18.2.2.2 Использование компонента Memo. 285
18.2.3 Поиск минимального (максимального) элемента массива. 288
18.2.4 Поиск в массиве заданного элемента. 290
18.2.4.1 Алгоритм простого перебора. 290
18.3. Ошибки при использовании массивов. 292
19. Функции. 294
19.1. Создание пользовательских функций. Передача аргументов. 294
19.2. Глобальные и локальные переменные 298
19.3. Примеры написания пользовательских функций. 301
20. Процедуры.. 301
20.1. Процедуры программиста. 302
20.2. Передача параметров по ссылке и значению. 303
20.3. Перегрузка процедур и функций. 304
20.4. Упреждающее объявление процедур и функций (forward) 306
20.5. Компиляция. Однопроходные компиляторы.. 307
21. Библиографический список. 310
22. Предметный указатель. 311
Понятие информации и ее измерение
Информация(лат. information) – по ГОСТ 7.0-99 сведения, воспринимаемые человеком и (или) устройствами как отражение фактов материального или духовного мира в процессе коммуникации. В широком смысле – отражение реального мира; в узком смысле – любые сведения, являющиеся объектом хранения, передачи, и преобразования информации.
Меры информации
Рисунок 2.1 - Меры информации
Единицы измерения информации и примеры
Таблица 1.1 - Единицы измерения информации
Мера информации | Единицы измерения | Примеры |
Синтаксическая: шенноновский подход компьютерный подход | Степень уменьшения неопределенности Единицы представления информации | Вероятность события Бит, байт, Кбайт и т.д. |
Семантическая | Тезаурус Экономический показатель | Пакет прикладных программ, ПК, компьютерные сети Рентабельность, производительность и т.д. |
Прагматическая | Ценность использования | Емкость памяти, производительность ПК, скорость передачи данных и т.д. Денежное выражение |
Алгоритмическая | Минимальное число внутренних состояний машины | Машина Тьюринга |
Прагматическая мера информации
Эта мера определяет полезность информации (ценность) для достижения пользователем поставленной цели. Эта мера также величина относительная, обусловленная особенностями использования этой информации в той или иной системе. Ценность информации целесообразно измерять в тех же единицах (или близких к ним), в которых измеряется целевая функция.
Схема передачи информации
Поясним технические термины на простом примере. Вася передает Пете свое имя. Они сидят по разные стороны стола. Вася пишет на листе бумаги букву и передвигает лист к Пете. Петя читает букву и переносит ее на свой лист бумаги. Если передача завершится успешно, на листе у Пети будет последовательность: «ВАСЯ». Если по столу бегает котенок, который все время норовит столкнуть передаваемый листок на пол или расцарапать бумагу, то аналогия с шумом при передаче дискретного сообщения будет полной.
Вася здесь — Источник сообщений. Лист бумаги и написанный на нем символ (буква русского алфавита), рука, которая передвигает лист — Передатчик. Стол — Канал связи. Котенок — Источник шума (особенно если любит помяукать). Петя, получающий лист с написанной на нем буквой, — Приемник. Он копирует букву на свой лист. Если Петя понимает то, что прочел (то есть он умеет читать и ни один символ не был утрачен во время передачи), значит, Сообщение дошло до Получателя. Если Петя читать не умеет — передача Сообщения не состоится. Получатель — не может его принять. Эта простая схема воспроизводится в любой сколь угодно технически изощренной системе передачи информации.
Нулевое поколение ИТ
В нулевом поколении (4000 г. до н.э. - 1900 г.) в течение шести тысяч лет наблюдалась эволюция от глиняных таблиц к папирусу, затем к пергаменту и, наконец, к бумаге. Имелось много новшеств в представлении данных: фонетические алфавиты, сочинения, книги, библиотеки, бумажные и печатные издания. Это были большие достижения, но обработка информации в эту эпоху осуществлялась вручную.
Сообщения и сигналы
Виды и характеристики носителей и сигналов
Спектр
Совокупности коэффициентов ak, bk, k=1, 2, 3,…, разложения периодической функции x(t) в ряд Фурье называется частотными спектрами этой функции Совокупность амплитуд и соответствующих частот гармоник принято называть спектром амплитуд.
Совокупность амплитуд и соответствующих частот гармоник называется спектром фаз.
Спектр амплитуд и спектр фаз однозначно определяют сигнал. Однако для многих практических задач достаточно ограничиться спектром амплитуд.
Рисунок 4.2 - Спектр амплитуд и спектр фаз
Характерной особенностью спектра периодического сигнала является его прерывистость (дискретность). Расстояние между соседними спектральными линиями одинаковое и равно частоте основной гармоники.
Контроль по четности, нечетности, по Хеммингу
Сетевые технологии обработки данных
Классификация вычислительных сетей
В зависимости от территориального расположения абонентских систем вычислительные сети можно разделить на три основных класса:
глобальные сети (WAN — Wide Area Network);
региональные сети (MAN — Metropolitan Area Network);
локальные сети (LAN—Local Area Network).
Глобальная вычислительная сетьобъединяет абонентов, расположенных в различных странах, на различных континентах. Взаимодействие между абонентами такой сети может осуществляться на базе телефонных линий связи, радиосвязи и систем спутниковой связи. Глобальные вычислительные сети позволят решить проблему объединения информационных ресурсов всего человечества и организации доступа к этим ресурсам.
Региональная вычислительная сетьсвязывает абонентов, расположенных на значительном расстоянии друг от друга. Она может включать абонентов внутри большого города, экономического региона, отдельной страны. Обычно расстояние между абонентами региональной вычислительной сети составляет десятки — сотни километров.
Локальная вычислительная сетьобъединяет абонентов, расположенных в пределах небольшой территории: В настоящее время не существует четких ограничений на территориальный разброс абонентов локальной вычислительной сети. Обычно такая сеть привязана к конкретному месту. К классу локальных вычислительных сетей относятся сети отдельных предприятий, фирм, банков, офисов и т.д. Протяженность такой сети можно ограничить пределами 2 - 2,5 км.
Объединение глобальных, региональных и локальных вычислительных сетей позволяет создавать многосетевые иерархии. Они обеспечивают мощные, экономически целесообразные средства обработки огромных информационных массивов и доступ к неограниченным информационным ресурсам. Пример иерархии КС приведен на рисунке.
Практика применения персональных компьютеров в различных отраслях науки техники и производства показала, что наибольшую эффективность от внедрения вычислительной техники обеспечивают не отдельные автономные ПК, а локальные вычисли тельные сети.
Каналы передачи данных и их характеристики
Методы помехоустойчивого кодирования
Рассмотрим простые практические способы построения кодов, способных обнаруживать и исправлять ошибки.
Контроль логических операций
К логическим операциям относятся операции сдвига, логического сложения и умножения, выполняемые по соответствующим правилам.
Несмотря на кажущуюся простоту этих правил, осуществление операций контроля сталкивается с рядом трудностей, объясняемых тем, что логические операции являются поразрядными операциями.
Операции сдвига
Пусть задано число А = апап-1 ...а1а0, имеющее контрольный код rа = аks...аk1.
Обозначим код числа А, сдвинутый влево, через (без циклического переноса) и (с циклическим переносом) (при сдвиге вправо стрелка в обозначении будет повернута направо). Соответствующим образом обозначим и контрольный код:; ; ; .
Cдвиг влево двоичного числа эквивалентен умножению на два. Так как при сдвиге числа происходит потеря некоторых его разрядов, можно предполагать, что контрольный код сдвинутого числа изменится на величину Δ:
,
где — сдвинутый влево контрольный код.
Величина Δ зависит от значений аn и аks,которые при сдвиге выходят за пределы разрядной сетки.
Если при сдвиге n-разрядного числа старшая единица выйдет за пределы разрядной сетки, то это эквивалентно вычитанию единиц из контрольного кода сдвинутого числа [— вес (n+ 1)-го разряда].
Если при сдвиге контрольного кода выходит за пределы разрядной сетки разряд аks = 1, то это эквивалентно уменьшению контрольного кода на 2S. Такую потерю надо восстановить прибавлением к контрольному коду единицы.
В общем случае предыдущее уравнение принимает вид
.
Веса разрядов кодовой комбинации, представленной в системе с основанием 2S, назначаются следующим образом:
s=3 | an | an-1 | an-2 | an-3…a3 | a2 | a2 |
Вес σ | 22 | 21 | 20 | 22…22 | 21 | 20 |
В результате значения поправок Δ для контроля выполнения левого сдвига по модулю будут:
Значение an …. | ||||
Значение aks …. | ||||
Поправка Δ…. | -1 | +1 |
Значение поправки Δ можно заменить ее дополнением до модуля.
Для выполнения сдвига влево с циклическим переносом из старшего разряда в младший разряд необходимо уменьшить контрольный код на величину ; так как =1, этот член равен 0. Следовательно, предыдущая формула примет вид
.
При сдвиге вправо происходит потеря младших разрядов числа и контрольного кода этого числа. Так как сдвиг вправо эквивалентен делению на 2, то
; .
Эти потери надо компенсировать. Значит, контрольный код сдвинутого вправо числа можно найти по формуле
.
В зависимости от модуля поправка к контрольному коду в случае простого сдвига принимает следующие значения:
Значение a1 …. | ||||
Значение ak1 …. | ||||
Поправка Δ для: | ||||
p = 3…. | ||||
p = 7.… |
При модифицированном сдвиге вправо, который выполняется по правилу A = 1, an-1, an-2…a2a1; = 1, an-1…a3a2, происходит также потеря младших разрядов кодовой комбинации числа и контрольного кода. Для этого случая предыдущая формула сохраняет свой вид, но поправки должны быть следующими:
Значение a1 …. | ||||
Значение ak1 …. | ||||
Поправка ΔM для: | ||||
p = 3…. | ||||
p = 7.… |
Основные понятия относящиеся к преобразователям
На Рисунок 6.1 в виде структурной схемы изображены типичные связи ЦАП и АЦП. Возможны также и другие связи, такие как по входу или выходу генератора синхронизирующих импульсов, по дополнительным логическим входам или выходам, и связи, которые являются внутренними для преобразователя и выделены для удобства будущего потребителя, как например: связи по выводам источника опорного биполярного напряжения смещения.
Как видно из Рисунок 6.1, в преобразователях имеются по существу электрические входы и выходыпяти категорий: аналогового сигнала, цифрового кода, напряжения питания сигналов, управления и опорного сигнала. Эти категории сведены в Таблица 6.1.
Рисунок 7.1 - Структурная схема типичных связей преобразователей
Таблица 6.1. Входные и выходные сигналы преобразователей
ЦАП | АЦП | |
Аналоговый сигнал | Выходной сигнал: напряжение или ток, полярность, величина | Входной сигнал: обычно напряжение, полярность, величина |
Цифровой код | Входной сигнал: поступающий через буферное запоминающее устройство или непосредственно последовательный или параллельный, код, логические уровни | Выходной сигнал: последовательный или параллельный, код, логические уровни, синхронизация |
Напряжение питания | Аналоговое: обычно ± 15 Цифровое: +5 В (или другие) | Аналоговое: обычно ± 15 Цифровое: +5 В (или другие) |
Сигналы управления | Входной сигнал: строб-импульс (ы) | Входной сигнал: команда преобразования Выходной сигнал: импульс «состояние» |
Опорный сигнал | Внутренний или внешний, фиксированный или переменный, полярность | Внутренний или внешний, фиксированный или переменный, полярность |
Основные типы АЦП
Как и в случае ЦАП, подавляющее большинство АЦП, находящих сбыт, включают два основных типа: двухтактный интегрирующий АЦП и АЦП последовательного приближения. Каждый из них принимает на входе напряжение, а выдает цифровой код, пропорциональный входному напряжению.
Другие типы АЦП
Факторы применения
Форматы представления чисел с плавающей запятой.
Двоичная арифметика.
Правила сложения:
Пример. Сложить двоичные числа 11012 и 110112.
Запишем слагаемые в столбик и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
5 4 3 2 1
+ 1 1 0 1
1 1 0 1 1
Процесс образования результата по разрядам описан ниже:
Таким образом:
1 1 0 1
+ 1 1 0 1 1
1 0 1 0 0 0
Для проверки определим полные значения слагаемых и результата:
Поскольку 13 + 27 = 40, двоичное сложение выполнено верно.
Пример. Сложить шестнадцатеричные числа 1С16 и 7В16.
Запишем слагаемые в столбик и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
2 1
+1 С
7 В
Процесс образования результата по разрядам описан ниже (он включает преобразование в процессе сложения каждой шестнадцатеричной цифры в десятичное число и обратные действия):
Таким образом:
1 С
+7 В
9 7
Для проверки определим полные значения слагаемых и результата:
Поскольку 28 + 123 = 151, сложение выполнено верно.
Правила вычитания:
Пример. Вычесть из двоичного числа 1012 двоичное число 112.
Запишем алгебраические слагаемые в столбик в порядке "уменьшаемое - вычитаемое" и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
3 2 1
-1 0 1
1 1
Процесс образования результата по разрядам описан ниже:
Таким образом:
1 0 1
- 1 1
1 0
Для проверки определим полные значения слагаемых и результата.
По Таблица 7.2 имеем:
1012 = 5;
112 = 3;
102 = 2.
Поскольку 5 - 3 = 2, вычитание выполнено верно.
Пример. Вычесть из шестнадцатеричного числа 9716 шестнадцатеричное число 7В16.
Запишем алгебраические слагаемые в столбик в порядке "уменьшаемое - вычитаемое" и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
2 1
-9 7
7 В
Процесс образования результата по разрядам описан ниже:
Таким образом:
9 7
-7 В
1 С
Вычитание выполнено верно (см. пример про сложение).
Правила умножения:
Пример. Умножить двоичное число 1012 на двоичное число 112.
Запишем множители в столбик и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
3 2 1
1 0 1
1 1
Процесс образования результата по шагам умножения множимого на каждый разряд множителя с последующим сложением показан ниже:
Для проверки результата найдем полное значение сомножителей и произведения (см. Таблица 7.2):
1012 = 5;
112 = 3;
11112 = 15.
Поскольку 5 * 3 = 15, умножение выполнено верно.
Пример. Умножить шестнадцатеричное число 1С16 на шестнадцатеричное число 7В16.
Запишем множители в столбик и пронумеруем разряды, присвоив младшему разряду номер 1:
номера разрядов:
2 1
1 С
7 В
Процесс образования результата по шагам умножения множимого на каждый разряд множителя с последующим сложением показан ниже (в процессе умножения выполняем перевод шестнадцатеричных чисел в десятичные и обратно):
Для проверки результата найдем полное значение сомножителей и произведения (см. пример про сложение), воспользовавшись правилами формирования полного значения числа:
1С16 = 28;
7В16 = 123;
.
Поскольку 28 * 123 = 3444, умножение выполнено верно.
Правила деления:
Рассмотрим правила деления только для двоичных чисел, поскольку деление шестнадцатеричных чисел проще выполнять, переведя их предварительно в десятичную систему счисления.
Пример. Разделить двоичное число 11112 на двоичное число 112.
Решение задачи представим схемой:
Для проверки правильности результата преобразуем двоичные числа в десятичные:
11112 = 15;
112 = 3;
15 / 3 = 5;
5 = 1012.
Деление выполнено верно.
Принцип программного управления
Марк I
В 1937 году американский физик Говард Гатуэй Айкен начал работать в Гарвардском университете над тезисами своей диссертации. Айкену было около сорока — возраст, не типичный для диссертанта. Нетипичным был и его путь в науку.
Закончив военно-техническую школу в Индианаполисе, Айкен поступил в Висконсинский университет, где в 1923 году получил степень бакалавра в области электротехники. Но еще в 1919 году, будучи студентом, Айкен начал служить в Мэдисонской газовой компании, специализируясь на разработке и исследовании генераторов сильных токов. Добившись некоторых успехов, он в 1928 году перешел в фирму «Вестингауз». Но молодого инженера тянуло к «основам науки» — математике и физике, и в 1931 году он снова становится студентом, на этот раз Чикагского университета. В следующем году, окончательно порвав с Вестингаузом, он переходит в Гарвард, где завершает свое научное образование.
Теоретическая часть диссертации Айкена содержала решение так называемых нелинейных обыкновенных дифференциальных уравнений. Чтобы сократить вычислительную работу, Айкен начал придумывать несложные машины для автоматического решения частных задач, например для вычисления полиномов. В конце концов, он пришел к идее автоматической универсальной вычислительной машины, способной решать широкий круг научно-технических задач.
Фирма IBM, согласившаяся финансировать создание машины, выделила в распоряжение Айкена четырех инженеров. Работа продолжалась около пяти лет, и в августе 1944 года была закончена и передана Гарвардскому университету «Вычислительная машина с автоматическим управлением последовательностью операций» (АСКК), известная под названием «Марк I».
Замечательно, что ее автором был человек, широтой своих интересов — инженер, математик, физик,— напоминавший Чарльза Бэббиджа. С идеями великого англичанина Айкен познакомился случайно, спустя три года после начала работы над «Марк I». Пораженный предвидением Бэббиджа, он писал: «Живи Бэббидж на 75 лет позже, я остался бы безработным!»
В «Марк I» использовались механические элементы для представления чисел и электромеханические — для управления работой машины. Как и в аналитической машине, числа хранились в регистрах, состоящих из десятизубых счетных колес. Каждый регистр содержал 24 колеса, причем 23 из них использовались для представления числа, а одно — для представления его знака. Регистр имел механизм передачи десятков и поэтому использовался не только для хранения чисел; находящееся в одном регистре могло быть передано в другой регистр и добавлено к находящемуся там числу (или вычтено из него).
Эти операции выполнялись следующим образом. Через счетные колеса, образующие регистр, проходил непрерывно вращающийся вал, причем любое колесо с помощью электромеханических переключателей могло быть присоединено к этому валу на время, составляющее некоторую часть периода его оборота. К каждому колесу присоединялась щетка (считывающий контакт), которая при вращении колеса пробегала по неподвижному десятисегментному контакту. Это позволяло получить электрический эквивалент цифры, хранящейся в данном разряде регистра. Для выполнения операции суммирования устанавливались такие соединения между щетками первого регистра и механизмом переключения второго регистра, что колеса последнего связывались с валом на часть периода оборота, пропорциональную цифрам, находящимся в соответствующих разрядах первого регистра. Все переключатели автоматически выключались в конце фазы сложения, занимавшей не более половины периода оборота. Таким образом, механизм суммирования, по существу, не отличался от сумматоров холлеритовских табуляторов. Регистры были снабжены системой сквозного переноса, аналогичной предлагавшейся Бэббиджем.
Всего в «Марк I» было 72 регистра и, кроме того, дополнительная память из 60 регистров, образованных механическими переключателями. В эту дополнительную память вручную вводились константы — числа, которые не изменялись в процессе вычислений.
Умножение и деление производились в отдельном устройстве. Кроме того, машина имела встроенные релейные блоки для вычисления функций sin х, 10х и log х. Скорость выполнения арифметических операций в среднем составляла: сложение и вычитание —0,3 секунды, умножение — 5,7 секунды, деление—15,3 секунды. Таким образом, «Марк I» был «эквивалентен» примерно 20 операторам, работающим с ручными счетными машинами.
Работой «Марк I» управляли команды, вводимые с помощью перфорированной ленты. Каждая команда кодировалась посредством пробивки отверстий в 24 колонках, идущих вдоль ленты, и считывалась с помощью контактных щеток. Совокупность электрических сигналов, полученных в результате «прощупывания» позиций данного ряда, определяла действие машины на данном шаге вычислений (Рисунок 11.13).
После завершения операции лента сдвигалась, и под контактные щетки попадал следующий ряд отверстий. В одной перфоленте Айкен объединил два типа бэббиджевских перфокарт — операционные карты и карты переменных.
Рисунок 11.13 - «Марк 1»
В качестве устройств вывода Айкен использовал пишущие машинки и перфораторы. «Марк I» содержал все основные блоки аналитический машины: устройства ввода и вывода, устройство управления, память («склад») и арифметическое устройство («мельница»).
Вслед за пуском «Марк I» гарвардская группа, оформившаяся в вычислительную лабораторию университета во главе с все тем же Айкеном, начала работу над «Марк II». В этой машине для запоминания чисел, выполнения арифметических операций и операций управления должны были использоваться электромеханические реле. Законченная в 1947 году «Марк II» содержала около 13 000 таких реле и была, таким образом, чисто, релейной вычислительной машиной.
Числа в «Марк II» представлялись в форме с плавающей запятой, то есть в виде а∙10 , где а содержит до 10 значащих цифр, а порядок в заключен в пределах —15 ≤ в ≤ 15.
Каждая десятичная цифра представлена в двоичной форме и хранится в группе из четырех реле.
В двоичной системе счисления используются две цифры— 0 и 1, и любое число поэтому представляется как последовательность нулей и единиц. Например, число 53 в двоичной системе выглядит как 110101. Широкое использование двоичной системы в вычислительной технике обусловлено существованием простых технических аналогов двоичной цифры — электромеханических реле и электронных триггеров, которые могут находиться в одном из двух устойчивых состояний. Тогда одному из них можно поставить в соответствие 0, а другому—1. Нетрудно видеть, что для представления одной десятичной цифры потребуется 4 двоичных разряда (скажем, цифра 9 выглядит как 1001). В «Марк II» используется не чисто двоичное, а двоично-десятичное представление чисел, поэтому для представления десятиразрядной десятичной мантиссы требуется 4 * 10 двоичных разрядов (и реле соответственно). Еще 4 реле идут на представление показателя и 2 реле используются для хранения знака мантиссы и показателя. Таким образом, каждый из 100 регистров машины содержит 46 реле.
Для ввода чисел в регистр и вывода их (на эти операции уходит примерно 0,033 секунды) используется еще 16 реле. Короткие арифметические операции выполняются в сумматоре, который в отличие от «Марк I» отделен от памяти, Время выполнения операций сложения и вычитания занимает примерно 0,125 секунды. Умножение выполняется в отдельном устройстве и требует в среднем 0,25 секунды, а операция деления заменена операцией вычисления приближенных значений обратных величин. В машине предусмотрены специализированные устройства для вычисления функций 10х, cos х, sin x; log х. Так же как в «Марк I», для управления машиной используется перфолента, а вывод результатов осуществляется с помощью печатающих механизмов.
ЭНИАК
Десятилетний период преимущественного применения электровакуумных приборов в универсальных ЦВМ (50-е годы) характеризуется развертыванием серийного производства ЦВМ с хранимой программой, выделением электронной вычислительной техники в самостоятельную область техники, оказывающую влияние на развитие других областей научно-технического прогресса, и созданием электронной вычислительной промышленности в ряде экономически развитых стран.
Первая электронная вычислительная машина ЭНИАК была построена в США (1946), хотя технические предпосылки для создания электронно-вычислительных машин имелись по многих странах с высокоразвитой промышленностью, в том числе и в СССР. Но в результате военных действий второй мировой войны промышленность почти всех высокоразвитых государств сильно пострадала. Ущерб, нанесенный фашистскими захватчиками нашей стране, был колоссальным. Для США же годы второй мировой войны были годами бурного экономического развития. Обладая мощной промышленной базой, США имели возможность проводить разносторонние научные и технические исследования. Хотя большинство этих исследований было прямо пли косвенно связано с военными нуждами, однако диапазон и размах научно-исследовательской работы были значительно шире, чем в других странах. Наиболее ярким примером может служить огромный объем работ по проекту «Манхеттен» (создание атомной бомбы). Постройка первой электронной ЦВМ также целиком финансировалась за счет военных ассигнований. Разумеется, это нисколько не умаляет выдающегося вклада конструкторов ЭНИАК в развитие вычислительной техники, хотя и показывает, что в США в тот период времени имелись наиболее благоприятные условия для реализации подобных проектов.
Работа над ЭНИАКом проходила в обстановке чрезвычайной секретности. Не удивительно поэтому, что выдающийся американский математик Джон фон Нейман узнал о ней совершенно случайно. Будучи консультантом крупнейшей в США Абердинской баллистической лаборатории, он летом 1944 года встретил на железнодорожной станции Абердина своего старого знакомого Германа Гольдстайна. В разговоре тот упомянул о работах Моучли — Эккерта. «Когда Джонни увидел, к чему мы пришли, он двумя ногами прыгнул в электронные вычислительные машины»,— вспоминал впоследствии Гольдстайн.
НЕЙМАН (Нойман) (Neumann) Джон (Янош) фон (3 декабря 1903, Будапешт — 8 февраля 1957, Вашингтон), американский математик и физик. Труды по функциональному анализу, квантовой механике, логике, метеорологии. Внес большой вклад в создание первых ЭВМ и разработку методов их применения. Его теория игр сыграла важную роль в экономике.
МОКЛИ (Mauchly) Джон Уильям (30 августа 1907, Цинциннатти, шт. Огайо — 8 января 1980, Эмблер, шт. Пенсильвания), американский физик и инженер, изобретатель в1946 совместно с П. Эккертом первого универсального компьютера «Эниак» (ENIAC Electronic Numerical Integrator and Computer).
ЭККЕРТ (Eckert) Джон Преспер-младший (9 апреля 1919, Филадельфия, шт. Пенсильвания — 3 июня 1995, Брин Мор, там же), американский инженер. В 1946, совместно с Дж. Мокли, изобрел первый универсальный компьютер, ставший прототипом большинства современных компьютеров.
Естественно, что фон Нейман легко мог оценить огромное практическое значение быстродействующих вычислительных машин и включился в работу над ними. Он присоединился к группе Моучли — Эккерта тогда, когда конструкция ЭНИАКа была выбрана (Рисунок 11.14 и Рисунок 11.15). Однако, как у Бэббиджа в процессе работы над разностной машиной возникла идея аналитической, так и в муровской группе до завершения ЭНИАКа родилась идея принципиально новой ЭВМ!
Трудно назвать автора этой идеи. По-видимому, она возникла в результате дискуссий трех главных идеологов нового направления —Д. фон Неймана, Г. Гольдстайна и А. Беркса — впоследствии декана факультета вычислительной техники Мичиганского университета. Эти ученые изложили основные принципы построения вычислительных машин нового типа в ставшей теперь классической статье: «Предварительное рассмотрение логической конструкции электронного вычислительного устройства». Главные положения этой статьи — обоснование использования двоичной системы для представления чисел и принцип «хранимой программы».
Двоичную систему использовали и создатели релейных машин, но это была не «чистая» двоичная система, а двоично-десятичная или двоично-пятеричная; выполнение же арифметических операций происходило, по существу, в традиционной десятичной системе.
Авторы «Предварительного рассмотрения» сумели отказаться от традиции — они убедительно продемонстрировали преимущества чисто двоичной системы при выполнении машиной арифметических и логических операций.
Один из наиболее ощутимых недостатков релейных машин и ЭНИАКа заключался в способах программного управления ходом вычислений. ЭНИАК, например, несколько дней готовили к работе, осуществляя необходимые соединения на коммутационной доске, а собственно решение задачи длилось всего несколько минут.
Для устранения этого недостатка фон Нейман и его коллеги предложили «принцип хранимой программы», в соответствии с которым программа, как и исходные числовые данные, вводилась и хранилась в памяти машины. Из памяти отдельные команды извлекались в устройство управления, где их содержание декодировалось (расшифровывалось) и использовалось для передачи чисел из памяти в арифметическое устройство, выполнения операций над ними и отсылки результата обратно в память. Команды предварительно вводились в последовательные регистры памяти и выполнялись в порядке очередности до тех пор, пока не встречалась команда перехода (условного или безусловного), направлявшая ход вычислительного процесса по одному из нескольких возможных путей. Такой подход позволял интерпретировать команды как числа и, следовательно, давал возможность осуществлять арифметические и логические операции над ними, автоматически (без вмешательства программиста) изменять и модифицировать их в процессе решения задачи.
Секретом успеха Неймана иногда считают его «аксиоматический метод». Он рассматривал предмет, сконцентрировавшись на его основных свойствах (аксиомах), из которых вытекает все остальное.
Рисунок 11.14 - Джон фон Нейман и его «детище»
Рисунок 11.15 - ЭНИАК
ЭДСАК
Первая машина с хранимой программой - "ЭДСАК" - была создана в Кембриджском университете (Англия) в 1949 г. Она имела запоминающее устройство на 512 ртутных линиях задержки. Время выполнения сложения было 0,07 мс, умножения - 8,5 мс (Рисунок 11.16).
Рисунок 11.16 - 1949г. ЭДСАК.
МЭСМ
В 1948г. году академик Сергей Алексеевич Лебедев предложил проект первой на континенте Европы ЭВМ - Малой электронной счетно-решающей машины (МЭСМ). В 1951г. МЭСМ официально вводится в эксплуатацию, на ней регулярно решаются вычислительные задачи. Машина оперировала с 20разрядными двоичными кодами с быстродействием 50 операций в секунду, имела оперативную память в 100 ячеек на электронных лампах (Рисунок 11.17).
Рисунок 11.17 - 1951г. МЭСМ
Uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
Begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
End.
В окне кода жирным шрифтом выделяются так называемые зарезервированные слова, а курсивом - комментарии (так же выделяются зарезервированные слова и комментарии в книге). Как видим, текст программы начинается зарезервированным словом program и заканчивается словом end с точкой за ним. Замечу, что сочетание end со следующей за ней точкой называется терминатором программной единицы: как только в тексте программы встретится такой терминатор, компилятор прекращает анализ программы и игнорирует оставшуюся часть текста.
Зарезервированные слова играют важную роль в Object Pascal, придавая программе в целом свойство текста, написанного на почти естественном английском языке. Каждое зарезервированное слово (а их в Object Pascal несколько десятков) несет в себе условное сообщение для компилятора, который анализирует текст программы так же, как читаем его и мы: слева направо и сверху вниз.
Комментарии, наоборот, ничего не значат для компилятора, и он их игнорирует. Комментарии важны для программиста, который с их помощью поясняет те или иные места программы. Наличие комментариев в тексте программы делает ее понятнее и позволяет легко вспомнить особенности реализации программы, которую вы написали несколько лет назад. В Object Pascal комментарием считается любая последовательность символов, заключенная в фигурные скобки. В приведенном выше тексте таких комментариев два, но строка
{$R *.RES}
на самом деле не является комментарием. Этот специальным образом написанный фрагмент кода называется директивой компилятора (в нашем случае - указание компилятору на необходимость подключения к программе так называемого файла ресурсов). Директивы начинаются символом $, который стоит сразу за открывающей фигурной скобкой.
Поскольку речь зашла о комментариях, замечу, что в Object Pascal в качестве ограничителей комментария могут также использоваться пары символов (*, *) и //. Скобки (*...*) допускают вложенные комментарии, а символы // указывают компилятору, что комментарий располагается за ними и продолжается до конца текущей строки:
{Это комментарий}
(*Это тоже комментарий*)
//Все символы до конца этой строки составляют комментарий
Слово Program со следующим за ним именем программы и точкой с запятой образуют заголовокпрограммы. За заголовком следует раздел описаний, в котором программист (или Delphi) описывает используемые в программе идентификаторы. Идентификаторыобозначают элементы программы, такие как типы, переменные, процедуры, функции (об элементах программы мы поговорим чуть позже). Здесь же с помощью предложения, которое начинается зарезервированным словом uses (использовать) программист сообщает компилятору о тех фрагментах программы (модулях), которые необходимо рассматривать как неотъемлемые составные части программы и которые располагаются в других файлах. Строки:
uses
Forms, Unit1 in 'Unitl.pas' {fmExample};
указывают, что помимо файла проекта в программе должны использоваться модули Forms и Unit1. модуль Forms является стандартным (т. е. уже известным Delphi), а модуль Unit1 - новым, ранее неизвестным, и Delphi в этом случае указывает также имя файла с текстом модуля (in 'uniti.pas') и имя связанного с модулем файла описания формы {fmExample}.
Собственно тело программыначинается со слова begin (начать) и ограничивается терминатором end с точкой. Тело состоит из нескольких операторов языка Object Pascal. В каждом операторе реализуется некоторое действие - изменение значения переменной, анализ результата вычисления, обращение к подпрограмме и т. п. В теле нашей программы - три исполняемых оператора:
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
Каждый из них реализует обращение к одному из методов объекта Application. Я вынужден забежать вперед и хотя бы кратко пояснить только что введенные термины, которые определяют важные для Object Pascal понятия. Объектом называется специальным образом оформленный фрагмент программы, заключающий в себе данные и подпрограммы для их обработки. Данные называются полями объекта, а подпрограммы - его методами. Объект в целом предназначен для решения какой-либо конкретной задачи и воспринимается в программе как неделимое целое (иными словами, нельзя из объекта "выдернуть" отдельное поле или метод). Объекты играют чрезвычайно важную роль в современных языках программирования. Они придуманы для того, чтобы увеличить производительность труда программиста и одновременно повысить качество разрабатываемых им программ. Два главных свойства объекта - функциональность и неделимость - делают его самостоятельной или даже самодостаточной частью программы и позволяют легко переносить объект из одной программы в другую. Разработчики Delphi придумали для нас с вами сотни объектов, которые можно рассматривать как кирпичики, из которых программист строит многоэтажное здание программы. Такой принцип построения программ называется объектно-ориентированным программированием (ООП). В объекте Application собраны данные и подпрограммы, необходимые для нормального функционирования Windows-программы в целом. Delphi автоматически создает объект-программу Application для каждого нового проекта. Строка:
Application.Initialize;
означает обращение к методу Initialize объекта Application. Прочитав эту строку, компилятор создаст код, который заставит процессор перейти к выполнению некоторого фрагмента программы, написанного для нас разработчиками Delphi. После выполнения этого фрагмента (программисты говорят: после выхода из подпрограммы) управление процессором перейдет к следующей строке программы, в которой вызывается метод CreateForm и т. д.
Встроенные типы данных. Целые типы. Представление знака числа. Арифметическое переполнение
Оператор присваивания. Совместимость типов по присваиванию
Оператор в программе - это единое неделимое предложение, выполняющее какое-либо алгоритмическое действие. Тело программы представляет собой последовательность операторов. Необходимо заметить, что под любым оператором подразумевается действие (сравнение, присваивание, переход по программе и т.д.). Блоки описания переменных, констант, меток, типов и составляющие их предложения не являются в этом смысле операторами. Операторы, расположенные в программе друг за другом, разделяются точкой с запятой «;». Этот символ имеет значение конца оператора и разделяет записанные в одну строку операторы:
а:=45; b:=а*20;
Однако это не означает, что можно не закрывать единственные в строке операторы символом «;».
Все операторы Object Pascal можно разделить на простые и структурированные. Простыми считаются операторы, которые не содержат в себе других операторов. К ним относятся:
- оператор присваивания;
- вызов процедуры;
- оператор безусловного перехода GOTO;
- пустой оператор.
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption:= 'Звук';
end;
Единственная строка в теле вышеприведенной процедуры представляет собой так называемый оператор присваивания языка Object Pascal. В левой части оператора указывается свойство Button1.Caption, а в правой части - значение ' Звук ', которое мы хотим придать этому свойству. Связывает обе части комбинация символов “:=”, которая читается как “присвоить значение”. Символы “:=” всегда пишутся слитно, без разделяющих пробелов, хотя перед двоеточием и после знака равенства можно для лучшей читаемости программы вставлять пробелы. Как и любое другое предложение языка, оператор присваивания завершается точкой с запятой.
Оператор присваиванияявляется простейшим и наиболее часто употребляемым. Он применяется для вычисления нового значения переменной и для определения значения, возвращаемого функцией.
Итак, значение и переменная разделены парой «:=». Такое обозначение присваивания в Pascal введено по двум причинам:
- это четко разделяет операцию присваивания и операцию сравнения;
- это позволяет избежать правильных с точки зрения программирования, но странно выглядящих с точки зрения математики выражений вида "a=a+1", характерных для языков C или Basic.
Таким образом, для вычисления произведения двух чисел, хранящихся в переменных a и b, и занесения результата в переменную с нужно применить оператор:
с:=a*b;
Типы значения и переменной могут быть любыми (исключая только файловый тип), но должны быть совместимы для присваивания(желательно совпадение).
В случае с целыми типами следует руководствоваться “вложенностью” типов, т.е. везде, где может использоваться Word, допускается использование Byte (но не наоборот), в LongInt “входит” SmallInt, который, в свою очередь, включает в себя ShortInt.
Текстовые константы совместимы с любым строковым типом.
Для вещественных типов comp и currency сохранена полная совместимость с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т.д.
Ввод-вывод данных
Объекты, обеспечивающие вывод данных на экран
Try
A := StrToInt(Edit1.Text);
...{операторы, использующие переменную А}
except on EConvertError do
ShowMessage('Вы ввели ошибочное число;
повторите ввод');
Этот код обеспечивает сообщение пользователю об ошибке ввода и предотвращает ошибочные вычисления. Впрочем, это не лучший вариант предотвратить ошибочный ввод, поскольку пользователь узнает о своей ошибке только после того, как программа пытается использовать введенные данные. Лучше, если пользователь просто не сможет ввести неправильные символы. Например, если вы хотите, чтобы пользователь мог вводить в окно редактирования Edit только цифры и символ точки, вы можете в обработчик события OnKeyPress этого компонента вставить оператор:
if not (Key in ['0'..'9', ',']) then Key := #0;
Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом, который не занесется в текст окна Edit.
Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. В противном случае значение MaxLength указывает максимальное число символов, которое может ввести пользователь.
Свойство Modified, доступное только во время выполнения, показывает, проводилось ли редактирование текста в окне. Если вы хотите использовать это свойство, то в момент начала работы пользователя с текстом Modified надо установить в false. Тогда при последующем обращения к этому свойству можно по его значению (true или false) установить, было или не было произведено редактирование.
Свойство PasswordChar позволяет превращать окно редактирования в окно ввода пароля. По умолчанию значение PasswordChar равно #0 — нулевому символу. В этом случае это обычное окно редактирования. Но если в свойстве указать иной символ (например, символ звездочки «*»), то при вводе пользователем текста в окне будут появляться именно эти символы, а не те, которые вводит пользователь. Тем самым обеспечивается секретность ввода пароля.
Компонент MaskEdit отличается от Edit тем, что в нем можно задать строку маски в свойстве EditMask. Маска состоит из трех разделов, между которыми ставится точка с запятой (;). В первом разделе — шаблоне – записываются специальным образом символы (см. Таблица 16.2 - Символы шаблона маски), которые можно вводить в каждой позиции, и символы, добавляемые самой маской. Во втором разделе записывается 1 или 0 в зависимости от того, надо или нет, чтобы символы, добавляемые маской, включались в свойство Text компонента. В третьем разделе указывается символ, используемый для обозначения позиций, в которых еще не осуществлен ввод. Прочитать результат ввода можно или в свойстве Text, которое в зависимости от вида второго раздела маски включает или не включает в себя символы маски, или в свойстве EditText, содержащем введенный текст вместе с символами маски.
Таблица 16.2 - Символы шаблона маски
! | Наличие символа «!» означает, что в EditText недостающие символы предваряются пробелами, а отсутствие символа «!» означает, что пробелы размещаются в конце. |
> | Символ «>» означает, что все последующие за ним символы должны вводиться в верхнем регистре, пока не кончится маска или пока не встретится символ «<». |
< | Символ «<» означает, что все последующие за ним символы должны вводиться в нижнем регистре, пока не кончится маска или пока не встретится символ «>». |
<> | Символы «<>» означают, что анализ регистра не производится. |
Символ «» означает, что следующий за ним символ является буквенным, а не специальным, характерным для маски. Например, символ «>» после символа «» воспримется как знак >, а не как символ, указывающий на верхний регистр. | |
L | Символ «L» означает, что в данной позиции должна бытъ буква. |
l | Символ «l» означает, что в данной позиции может быть только буква или ничего. |
A | Символ «А» означает, что в данной позиции должна быть буква или цифра. |
a | Символ «а» означает, что в данной позиции может быть буква, или цифра, или ничего. |
C | Символ «С» означает, что в данной позиции должен быть любой символ. |
c | Символ «с» означает, что в данной позиции может быть любой символ или ничего. |
Символ «0» означает, что в данной позиции должна быть цифра. | |
Символ «9» означает, что в данной позиции может быть цифра или ничего. | |
# | Символ «#» означает, что в данной позиции может быть цифра, знак «+», знак «-» или ничего. |
: | Символ «:» используется для разделения часов, минут и секунд. |
/ | Символ «/» используется для разделения месяцев, дней и годов в датах. |
Символ « » означает автоматическую вставку в текст пробела. |
Вводить маску можно непосредственно в свойство EditMask. Но удобнее пользоваться специальным редактором масок, вызываемым при нажатии кнопки с многоточием в строке свойства EditMask в Инспекторе Объектов.
В редакторе масок окно Sample Masks содержит наименования стандартных масок и примеры ввода с их помощью. В окно Input Mask надо ввести маску. Если вы выбираете одну из стандартных масок, то окно Input Mask автоматически заполняется и вы можете, если хотите, отредактировать эту маску.
Окно Character for Blanks определяет символ, используемый для обозначения позиций, в которых еще не осуществлен ввод (третий раздел маски). Индикатор Save Literal Characters определяет второй раздел маски: установлен, если второй раздел равен 1, и не установлен, если второй раздел равен 0.
Кнопка Masks позволяет выбрать и загрузить какой-либо другой файл стандартных масок. К сожалению, среди файлов стандартных масок, поставляемых с Delphi, отсутствует маска, соответствующая российским стандартам. Но вы легко можете сами сделать себе такой файл стандартных масок. Он делается в обычном текстовом редакторе и должен сохраняться как «только текст» с расширением .dem. Чтобы редактор масок Delphi видел этот файл, его надо сохранить в каталоге Delphi BIN. Каждая строка файла состоит из трех частей, разделяемых символом вертикальной черты. Первая часть состоит из пояснительного текста, появляющегося в левой панели окна Sample Masks редактора масок. Вторая часть — пример, который появляется в правой панели окна Sample Masks редактора масок. А третья часть — сама маска.
Телефон | 5551212 | !000-00-00;0;_
Телефон с кодом страны | 0955551212 | !(999) 000-00-00;0;_
Почтовый индекс | 123456 | !000000;1;_
Паспорт| VII123456 | !L-LL 999999;0;_
Дата с указанием дня | 270694 | !99/99/00;1;_
Дата без указания дня | 0694 | !99/00;1;_
Время с секундами | 210515 | ! 90:00:00;1;_
Время без секунд | 1345 | !90:00;1;_
Рассмотрим примеры масок. В приведенном выше файле маска для ввода номера телефона имеет вид:
!(999) 000-00-00;0;_
В этой маске символ 9 означает, что в соответствующей позиции может быть только цифра. Символ 0 означает, что в данной позиции должна быть цифра. Символ подчеркивания в конце маски будет заполнять пустые позиции. Таким образом, пользователю для ввода в окне будет отображен шаблон:
(___)___-__-__
Поскольку второй раздел маски равен 0, то при чтении введенных пользователем значений свойства EditText и Text будут различаться. Свойство EditText для примера будет равно (095) 123-45-67, а свойство Text будет равно 0951234567. Если второй раздел маски сделать равным 1, то значения обоих свойств будут равны (095) 123-45-67.
Рассмотрим еще пример. Если с помощью EditMask надо ввести, например, целое число без знака, состоящее не более, чем из двух цифр, можно задать маску 99;0;. Если число обязательно должно быть двузначным, то маска должна иметь вид 00;0;.
Begin
Color:=FontDialog1.Font.Color;
Name:=FontDialog1.Font.Name;
Size:=FontDialog1.Font.Size;
Style:=FontDialog1.Font.Style;
end;
RichEdit1.SetFocus;
В приведенном коде присваивается поочередно значение каждого свойства. Но этот текст можно кардинально сократить, воспользовавшись тем, что объекты SelAttributes и Font совместимы по типу. Поэтому можно присвоить сразу все свойства одного объекта другому:
if FontDialog1.Execute then
RichEdit1.SelAttributes.Assign(FontDialog1.Font);
RichEdit1.SetFocus;
Запустите приложение и увидите, что вы можете менять атрибуты текста, выполняя отдельные фрагменты различными шрифтами, размерами, цветами, стилями. Устанавливаемые атрибуты влияют на выделенный текст или, если ничего не выделено, то на атрибуты нового текста, вводимого начиная с текущей позиции курсора (позиция курсора определяется свойством SelStart).
В компоненте имеется также свойство DefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойстве SelAttributes.
Но значения атрибутов в DefAttributes сохраняются и в любой момент эти значения могут быть методом Assign присвоены атрибутам свойства SelAttributes, чтобы вернуться к прежнему стилю.
Свойство DefAttributes доступно только во время выполнения. Поэтому его атрибуты при необходимости можно задавать, например, в обработчике события OnCreate.
За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойство Paragraph типа TParaAttributes. Этот тип в свою очередь имеет ряд свойств:
Таблица 16.3 – Свойства типа TParaAttributes
Alignment | Определяет выравнивание текста. Может принимать значения taLeftJustify (влево), taCenter (по центру) или taRightJustify (вправо). |
FirstIndent | Число пикселей отступа красной строки. |
Numbering | Управляет вставкой маркеров, как в списках. Может принимать значения nsNone — отсутствие маркеров, nsBullet — маркеры ставятся. |
LeftIndent | Отступ в пикселях от левого поля. |
RightIndent | Отступ в пикселях от правого поля. |
TabCount | Количество позиций табуляции. |
Tab | Значения позиций табуляции в пикселях. |
Значения подсвойств свойства Paragraph можно задавать только в процессе выполнения приложения, например, в событии создания формы или при нажатии какой-нибудь кнопки. Значения подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответственное выравнивание текущего абзаца:
RichEdit1.Paragraph.Alignment:=taLeftJustify; // Влево
RichEdit1.Paragraph.Alignment:=taCenter; // По центру
RichEdit1.Paragraph.Alignment:=taRightJustify;// Вправо
Следующий оператор приведет к тому, что текущий абзац будет отображаться как список, т.е. с маркерами:
RichEdit1.Paragraph.Numbering:=nsBullet;
Уничтожение списка в текущем абзаце осуществляется оператором
RichEdit1.Paragraph.Numbering:=nsNone;
В целом, если с помощью компонента ActionList определено некоторое действие ввода и уничтожения списка, названное ABullet, то операторы обработки соответствующего действия могут иметь вид:
if (ABullet.Checked) then
RichEdit1.Paragraph.Numbering:=nsNone
else RichEdit1.Paragraph.Numbering :=nsBullet;
ABullet.Checked:=not ABullet.Checked;
Они обеспечивают переключение соответствующей быстрой кнопки и раздела меню из нажатого состояния (отмеченного) в ненажатое с соответствующим изменением вида текущего абзаца.
Свойства TabCount и Tab имеют смысл при вводе текста только при значении свойства компонента WantTabs = true. Это свойство разрешает пользователю вводить в текст символ табуляции. Если WantTabs = false, то нажатие пользователем клавиши табуляции просто переключит фокус на очередной компонент и символ табуляции в текст не введется.
Мы рассмотрели основные отличия Memo и RichEdit. Теперь остановимся на общих свойствах этих окон редактирования.
Свойства Alignment и WordWrap имеют тот же смысл, что, например, в метках, и определяют выравнивание текста и допустимость переноса длинных строк. Установка свойства ReadOnly в true задает текст только для чтения. Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. Свойства WantReturns и WantTab определяют допустимость ввода пользователем в текст символов перевода строки и табуляции.
Свойство ScrollBars определяет наличие полос прокрутка текста в окне. По умолчанию ScrollBars = ssNone, что означает их отсутствие. Пользователь может в этом случае перемещаться по тексту только с помощью курсора. Можно задать свойству ScrollBars значения ssHorizontal, ssVertical или ssBoth, что будет соответственно означать наличие горизонтальной, вертикальной или обеих полос прокрутки.
Основное свойство окон Memo и RichEdit — Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Lines в окне Инспектора Объектов. Перед вами откроется окно редактирования списков строк. Вы можете редактировать или вводить текст непосредственно в этом окне, или нажать кнопку CodeEditor и работать в обычном окне Редактора Кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопкой мыши, команду Close Page и ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования.
Во время выполнения приложения вы можете заносить текст в окно редактирования с помощью методов свойства Lines типа TStrings. Этот тип широко используется в свойствах многих компонентов, и его описание вы можете найти в во встроенной справке Delphi. Здесь коротко укажем только на его основные свойства и методы, используемые в свойстве Lines.
Весь текст, представленный одной строкой типа String, внутри которой используются разделители типа символов возврата каретки и перевода строки, содержится в свойстве Text.
Доступ к отдельной строке текста вы можете получить с помощью свойства Strings[Index: Integer]. Индексы, как и везде в Delphi, начинаются с 0. Так что Memo1.Lines.Strings[0] — это текст первой строки. Учтите, что если окно редактирования изменяется в размерах при работе с приложением и свойство WordWrap = true, то индексы строк будут изменяться при переносах строк, так что в этих случаях индекс мало о чем говорит.
Свойство только для чтения Count указывает число строк в тексте.
Для очистки текста в окне надо выполнить процедуру Clear. Этот метод относится к самому окну, а не к его свойству Lines.
Для занесения новой строки в конец текста окна редактирования можно воспользоваться методами Add или Append свойства Lines. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в фале осуществляется методом SaveToFile.
Пусть, например, в вашем приложении имеется окно редактирования Edit1, в котором пользователь вводит имя сотрудника, и есть кнопка, при щелчке на которой в окно Memo1 должна занестись шапка характеристики этого сотрудника, после чего пользователь может заполнить текст характеристики.
Обработчик щелчка на кнопке может иметь вид:
Memo1.Clear;
Memo1.Lines.Add ('Х А Р А К Т Е Р И С Т И К А');
Memo1.Lines.Add('Сотрудник '+Edit1.Text) ;.
Memo1.SetFocus;
Загрузка в окно Memo1 текста из файла (например, хранящейся в файле характеристики сотрудника) может осуществляться командой
Memo1.Lines.LoadFromFile ('text.txt');
Сохранение текста в файле может осуществляться командой
Memo1.Lines.SaveToFile('text.txt');
Свойство SelStart компонентов Memo и RichEdit указывает позицию курсора в тексте или начало выделенного пользователем текста. Свойство CaretPos указывает на запись, поле X которой содержит индекс символа в строке, перед которым расположен курсор, а поле Y — индекс строки, в которой находится курсор (встроенная справка Delphi утверждает другое — что свойство CaretPos содержит координаты курсора в пикселях; но, к счастью, это не так). Таким образом, учитывая, что индексы начинаются с 0, значения Memo1.CaretPos.Y+1 и Memо1.CaretPos.X+1 определяют соответственно номер строки и символа в ней, перед которым расположен курсор.
15.2.5 Группа радиокнопок – компонент RadioGroup
Радиокнопки образуют группы взаимосвязанных индикаторов, из которых обычно может быть выбран только один. Они используются для выбора пользователем одной из нескольких взаимоисключающих альтернатив. Впрочем, радиокнопки могут использоваться и для отображения аналогичных данных. В этом случае управление кнопками осуществляется программно.
Компонент RadioGroup — это панель группы радиокнопок. Это панель, которая может содержать регулярно расположенные столбцами и строками радиокнопки. Надпись в левом верхнем углу панели определяется свойством Caption. А надписи кнопок и их количество определяются свойством Items, имеющим тип TStrings. Щелкнув на кнопке с многоточием около этого свойства в окне Инспектора Объектов, вы попадете в редактор списков строк. В нем вы можете занести надписи, которые хотите видеть около кнопок, по одной в строке. Сколько строчек вы запишете — столько и будет кнопок.
Кнопки, появившиеся в панели после задания значений Items, можно разместить в несколько столбцов (не более 17), задав свойство Columns. По умолчанию Columns = 1, т.е. кнопки размещаются друг под другом.
Определить, какую из кнопок выбрал пользователь, можно по свойству ItemIndex, которое показывает индекс выбранной кнопки. Индексы, как всегда в Delphi, начинаются с 0. По умолчанию ItemIndex = -1, что означает отсутствие выбранной кнопки. Если вы хотите, чтобы в момент начала выполнения приложения какая-то из кнопок была выбрана (это практически всегда необходимо), то надо установить соответствующее значение ItemIndex во время проектирования. Если вы используете радиокнопки не для ввода, а для отображения данных, устанавливать значение ItemIndex можно программно во время выполнения приложения.
Компонент RadioGroup очень удобен, но не свободен от некоторых недостатков. Его хорошо использовать, если надписи кнопок имеют примерно одинаковую длину и если число кнопок в каждом столбце (при размещении их в нескольких столбцах) одинаково. Связано это с тем, что RadioGroup при размещении кнопок ориентируется на надпись максимальной длины.
Таблица строк — компонент StringGrid
Компонент StringGrid представляет собой таблицу, содержащую строки. Данные таблицы могут быть только для чтения или редактируемыми. Таблица может иметь полосы прокрутки, причем заданное число первых строк и столбцов может быть фиксированным и не прокручиваться. Таким образом, можно задать заголовки столбцов и строк, постоянно присутствующие в окне компонента. Каждой ячейке таблицы может быть поставлен в соответствие некоторый объект.
Компонент StringGrid предназначен в первую очередь для отображения таблиц текстовой информации. Однако этот компонент может отображать и графическую информацию.
Таблица 16.5 - Основные свойства компонента
Cells[ACol, ARow: Integer]: string | Строка, содержащаяся в ячейке с индексами столбца и строки ACol и ARow. |
Cols[Index: Integer]: TStrings | Список строк, содержащихся в столбце с индексом Index. |
Rows[Index: Integer]: TStrings | Список строк, содержащихся в строке с индексом Index. |
Objects [ACol, ARow: Integer]: TObject; | Объект, связанный со строкой, содержащейся в ячейке с индексами столбца и строки ACol и ARow. |
Все эти свойства доступны во время выполнения. Задавать тексты можно программно или по отдельным ячейкам, или сразу по столбцам и строкам с помощью методов класса TStrings.
Свойства ColCount и RowCount определяют соответственно число столбцов и строк, свойства FixedCols и FixedRows — число фиксированных, не прокручиваемых столбцов и строк. Цвет фона фиксированных ячеек определяется свойством FixedColor. Свойства LeftCol и TopRow определяют соответственно индексы первого видимого на экране в данный момент прокручиваемого столбца и первой видимой прокручиваемой строки.
Свойство ScrollBars определяет наличие в таблице полос прокрутки. Причем полосы прокрутки появляются и исчезают автоматически в зависимости от того, помещается таблица в соответствующий размер, или нет.
Свойство Options является множеством, определяющим многие свойства таблицы: наличие разделительных вертикальных и горизонтальных линий в фиксированных (goFixedVertLine и goFixedHorzLine) и не фиксированных (goVertLine и goHorzLine) ячейках, возможность для пользователя изменять с помощью мыши размеры столбцов и строк (goColSizing и goRowSizing), перемещать столбцы и строки (goColMoving и goRowMoving) и многое другое. Важным элементом в свойстве Options является goEditing — возможность редактировать содержимое таблицы.
В основном компонент StringGrid используется для выбора пользователем каких-то значений, отображенных в ячейках. Свойства Col и Row показывают индексы столбца и колонки выделенной ячейки. Возможно также выделение пользователем множества ячеек, строк и столбцов.
Среди множества событий компонента StringGrid следует отметить событие OnSelectСell, возникающее в момент выбора пользователем ячейки. В обработчик этого события передаются целые параметры ACol и ARow — столбец и строка выделенной ячейки, и булев параметр CanSelect — допустимость выбора. Параметр CanSelect можно использовать для запрета выделения ячейки, задав его значение false. А параметры ACol и ARow могут использоваться для какой-то реакции программы на выделение пользователя. Например, оператор
Label1.Caption:='Выбрана ячейка '
+IntToStr(ARow)+':'+IntToStr(ACol);
выдаст в метку Label1 номер выбранной ячейки. А оператор
Label1.Caption :=StringGrid1.Cells [ACol, ARow];
выведет в ту же метку текст выделенной ячейки. Конечно, в реальном приложения задача заключается не в том, чтобы вывести подобные тексты при выборе пользователем той или иной ячейки, а в том, чтобы сделать нечто более полезное.
Вывод в текстовый файл
Var
f: TextFile; // файл
fName: String[80]; // имя файла
i: integer;
Begin
fName := Editl.Text;
AssignFile(f, fName);
Rewrite(f); // открыть для перезаписи
// запись в файл
for i: =0 to Memol.Lines.Count do // строки нумеруются с нуля
writeln(f, Memol.Lines[i]);
CloseFile(f); // закрыть файл
MessageDlg('Данные ЗАПИСАНЫ в файл ',mtlnformation,[mbOk],0);
end;
В листинге 16.2 приведена процедура, которая запускается нажатием командной кнопки: «Добавить». Она открывает файл, имя которого указано в поле Edit1, и добавляет в него содержимое поля Memol.
Листинг 16.2. Добавление в существующий файл
procedureTForm1.Button2Click(Sender: TObject);
Var
f: TextFile; // файл
fName: String[80];.// имя файла
i: integer; begin
fName := Editl.Text;
AssignFile(f, fName);
Append(f); // открыть для добавления
// запись в файл
fori:=0 toMemo1.Lines.Count do // строки нумеруются с нуля
writeln(f, Memo1.Lines[i]);
CloseFile(f); // закрыть файл
MessageDlg('Данные ДОБАВЛЕНЫ в файл ',mtInformation,[mbOk],0);
End;
Закрытие файла
Перед завершением работы программа должна закрыть все открытые файлы. Это делается вызовом процедуры close. Процедура close имеет один параметр — имя файловой переменной. Пример использования процедуры:
Close(f).
Устройства ввода. Ввод с клавиатуры. Реакция на действия пользователя
Ввод из файла
Программа может вводить исходные данные не только с клавиатуры, но и из текстового файла. Для того чтобы воспользоваться этой возможностью, нужно объявить файловую переменную типа TextFile, назначить ей при помощи инструкции AssignFile имя файла, из которого будут считываться данные, открыть файл для чтения (ввода) и прочитать (ввести) данные, используя инструкцию read или readln.
Чтение данных из файла
Чтение из файла выполняется при помощи инструкций read и readln, которые в общем виде записываются следующим образом:
read(ФайловаяПеременная, СписокПеременных);
readln(ФайловаяПеременная, СписокПеременных) ;
где:
· ФайловаяПеременная — переменная типа TextFile;
· СписокПеременных — имена переменных, разделенные запятыми.
Ветвление
Операции отношения
Действие операций отношениясоответствует их математическому пониманию. Результатом этих операций является булевское значение (True, False).
При использовании операций отношения для строковых значений, сравнение выполняется посимвольно слева направо согласно значениям кодов символов. Все строковые значения независимо от длины считаются совместимыми. Кроме того, значения символьного типа также считаются совместимыми со значениями строкового типа, и обрабатываются как строки длиной в один символ.
При сравнении операндов указательного типа допустимо использование только операций = и <>. В Таблица 17.1 приведены все операции отношения. Два указателя равны только в том случае, если они ссылаются на один и тот же объект.
Таблица 17.1 Операции отношения
Операция | Действие | Выражение | Результат |
= | Равно | A = B | True, если A = B |
<> | Не равно | A <> B | True, если A < B или A > B |
< | Меньше | A < B | True, если A < B |
> | Больше | A > B | True, если A > B |
<= | Меньше или равно | A <= B | True, если A < B или A = B |
>= | Больше или равно | A >= B | True, если A > B или A = B |
В Таблица 17.2 приведены примеры операций отношений.
Таблица 17.2 Примеры операций отношения
Выражение | Результат |
123 = 132 | False |
123 <> 132 | False |
17 <= 19 | True |
17 > 19 | False |
7 >= 7 | True |
False <> True | True |
'ABC' < 'ABD' | True |
16.2. Логические(булевские) операции
Результатом операции notбудет целочисленное значение, равное десятичному числу, которое соответствует поразрядно инвертированному двоичному представлению исходного операнда.
Результатом операции andбудет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции И.
Результатом операции orбудет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции ИЛИ.
Результатом операции хоrбудет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции исключающее ИЛИ.
Результатом операции A shl Вбудет целочисленное значение, равное десятичному числу, полученному в результате поразрядного сдвига влево двоичного представления операнда А на В разрядов. Освободившиеся при этом разряды заполняются нулями.
Результатом операции A shr Вбудет целочисленное значение, равное десятичному числу, полученному в результате поразрядного сдвига вправо двоичного представления операнда А на В разрядов. Освободившиеся при этом разряды заполняются нулями.
Результатом выполнения логических (булевских) операций является логическое значение True или False. Операндами в логическом выражении служат данные типа Boolean.
Таблица 17.3 Логическиеоперации
Операция | Действие | Выражение | A | B | Результат |
not | Логическое отрицание | not A | True | False | |
False | True | ||||
and | Логическое И | A and B | True | True | True |
True | False | False | |||
False | True | False | |||
False | False | False | |||
or | Логическое ИЛИ | A or B | True | True | True |
True | False | True | |||
False | True | True | |||
False | False | False | |||
xor | Исключающее ИЛИ | A xor B | True | True | False |
True | False | True | |||
False | True | True | |||
False | False | False |
Пример результатов выполнения типичных логических операций представлены в
Таблица 17.4 и Таблица 17.5:
Таблица 17.4 Примеры
Выражение | Результат |
not (17 > 19) | True |
(7 <= 8) or (3 < 2) | True |
(7 <= 8) and (3 < 2) | False |
(7 <= 8) xor (3 < 2) | True |
Таблица 17.5 Примеры
Десятичное значение | Двоичное представление | |
Операнд A | ||
Операнд B | ||
not A | ||
A and B | ||
A or B | ||
A xor B | ||
A shl B | ||
A shr B |
Составной оператор
Составной операторпредставляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой и заключенную в так называемые операторные скобки - begin и end:
begin
<оператор 1>;
<оператор 2>;
<оператор N>
end
Частным случаем составного оператора является тело следующей программы:
var
X, Y : Integer;
begin
X := 4;
Y := 6;
Edit.Text:=IntToStr(X + Y); // Точка с запятой после этого оператора
не обязательна
end.
Хотя символ точки с запятой служит разделителем между операторами и перед словом end может опускаться, мы рекомендуем ставить его в конце каждого оператора (как в примере), чтобы придать программе более красивый вид и избежать потенциальных ошибок при наборе текста.
Составной оператор может находиться в любом месте программы, где разрешен простой оператор. Он широко используется с условными операторами и операторами повтора.
Оператор ветвления if
Оператор ветвления if- одно из самых популярных средств, изменяющих естественный порядок выполнения операторов программы. Вот его общий вид:
if <условие> then
<оператор 1>
Else
<оператор 2>;
Условие - это выражение булевского типа, оно может быть простым или сложным. Сложные условия образуются с помощью логических операций и операций отношения. Обратите внимание, что перед словом else точка с запятой не ставится.
При выполнении условного оператора сначала вычисляется условие, результат которого может принимать только булевский тип, а затем, в зависимости от значения результата (True, False), выполняется Оператор1, стоящий после ключевого слова then (если результат равен True), или Оператор2, стоящий после ключевого слова else (если результат равен False).
Поясним сказанное на примере:
var
A, B, C: Integer;
begin
A := 2;
B := 8;
if A > B then
C := A
else
C := B;
Edit.Text:=IntToStr(C);
end.
В данном случае значение выражения А > В ложно, следовательно появится сообщение C=8.
У оператора if существует и другая форма, в которой else отсутствует:
if <условие> then <оператор>;
Логика работы этого оператора if еще проще: выполнить оператор, если условие истинно, и пропустить оператор, если оно ложно. Поясним сказанное на примере:
var
A, B, C: Integer;
begin
A := 2;
B := 8;
C := 0;
if A > B then C := A + B;
Edit.Text:=IntToStr(C);
end.
В результате на экране появится сообщение С=0, поскольку выражение А > В ложно и присваивание С := А + В пропускается.
Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов. При вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует. Например:
var
A: Integer;
begin
Readln(A);
if A >= 0 then
if A <= 100 then
Edit1.Text:= 'A попадает в диапазон 0 - 100.';
else
Edit1.Text:= 'A больше 100.';
else
Edit1.Text:= 'A меньше 0.';
end.
Конструкций со степенью вложенности более 2-3 лучше избегать из-за сложности их анализа при отладке программ.
Оператор ветвления case
Оператор ветвления caseявляется удобной альтернативой оператору if, если необходимо сделать выбор из конечного числа имеющихся вариантов. Он состоит из выражения, называемого переключателем, и альтернативных операторов, каждому из которых предшествует свой список допустимых значений переключателя:
case <переключатель> of
<список 1 значений переключателя>: <оператор 1>;
<список 2 значений переключателя>: <оператор 2>;
……
<список N значений переключателя>: <оператор N>;
else <оператор N+1>
end;
Оператор case вычисляет значение переключателя (который может быть задан выражением), затем последовательно просматривает списки его допустимых значений в поисках вычисленного значения и, если это значение найдено, выполняет соответствующий ему оператор. Если переключатель не попадает ни в один из списков, выполняется оператор, стоящий за словом else. Если часть else отсутствует, управление передается следующему за словом end оператору.
Переключатель должен принадлежать порядковому типу данных. Использовать вещественные и строковые типы в качестве переключателя не допускается.
Список значений переключателя может состоять из произвольного количества констант и диапазонов, отделенных друг от друга запятыми. Границы диапазонов записываются двумя константами через разграничитель в виде двух точек (..). Все значения переключателя должны быть уникальными, а диапазоны не должны пересекаться, иначе компилятор сообщит об ошибке. Тип значений должен быть совместим с типом переключателя. Например:
case StrToInt(Edit1.text) of
20..31: Label1.Caption:= 'День попадает в диапазон 20 - 31.';
1, 5..10: Label1.Caption:= 'День попадает в диапазон 1, 5 - 10.';
else Label1.Caption:= 'День не попадает в заданные диапазоны.';
end;
Если значения переключателя записаны в возрастающем порядке, то поиск требуемого оператора выполняется значительно быстрее, так как в этом случае компилятор строит оптимизированный код. Учитывая сказанное, перепишем предыдущий пример:
case StrToInt(Edit1.text) of
1, 5..10: Label1.Caption:= 'День попадает в диапазон 1, 5 - 10.';
20..31: Label1.Caption:= 'День попадает в диапазон 20 - 31.';
else Label1.Caption:= 'День не попадает в заданные диапазоны.';
end;
16.6. Исключительные ситуации
Для чего они нужны? Допустим, что у тебя есть участок кода, где может произойти ошибка. Как сделать так, чтобы программа не вылетала при её возникновении? Очень просто. Надо заключить этот код в блок проверки исключений и тогда твоя программа выдержит даже цунами.
Блок try...except (Рисунок 17.1) служит для обработки конкретных исключительных ситуаций(или более кратко - исключений). Этот блок имеет два наиболее характерных способа записи (полный и сокращенный), первый из которых неформально можно представить в следующем виде:
try
<СписокОператоров1>
except
on <Исключение1> do <Оператор1>;
on <Исключение2> do <Оператор2>;
. . . .
on <ИсключениеN> do <ОператорN>
else <СписокОператоровM>
end;
Рисунок 16.1 - Исключительные ситуации
Опишем принцип работы полного варианта блока try...ехсерt. Если в процессе работы проекта ошибок времени выполнения не происходит, то наличие блока обработки исключительных ситуаций никакого влияния на работу не оказывает. Если же при выполнении СпискаОператоро1 между зарезервированными словами try и except возникает исключительная ситуация, то выполнение СпискаОператоров1 прерывается, и управление передается в блок обработки исключения (Exception Block), который по структуре похож на оператор case. В случае, когда возникшая исключительная ситуация совпадает с одним из заголовков альтернатив on...do, то выполняется соответствующий этой альтернативе Оператор, в противном случае выполняется СписокОператоров2 (после зарезервированного слова else).
Кроме описанного полного варианта записи блока try...except, возможен еще и сокращенный, который в неформальном синтаксисе выглядит так:
try
<СписокОператоров1>
except
<СписокОператоров2>
end;
При использовании такого блока обработки исключений управление на Список0ператоров2 будет передано при любой ошибке, возникшей в процессе выполнения СпискаОператоров1. Если же ошибок при обработке СпискаОператоров1 не было, то СписокОператоров2 также, как и в полном варианте блока try...except, выполняться не будет.
Рассмотрим простейший пример:
TRY
x:=y/0;
EXCEPT
// Здесь можно вывести сообщение об ошибке.
END;
x:=0;
Между TRY и EXCEPT я вставил маленькое действие - деление на ноль. Компьютер не умеет делать такие вещи, поэтому произойдёт ошибка и выполнится код между EXCEPT и END. После обработки ошибки процедура заканчивает выполнение и все остальные операторы не будут выполнены, как, например, в нашем случае - x:=0; Если бы мы поменяли 0 на любое другое число, то ошибки бы не было, и код между EXCEPT и END никогда не выполнился бы.
Циклы
Вечные циклы
Если в теле цикла выполняются действия, которые не могут привести к изменению значения условия, то получаем вечный цикл. Что во многих случаях приводит к зацикливанию приложения или зависанию компьютера.
Пример использования:
…
t:=true;
while t do
begin
x:=100;
if x<10 then t:=false;
end;
Оператор REPEAT. Процедуры INC и DEC
Инструкция repeat, как и инструкция while, используется в программе если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычисления. В общем виде инструкция repeat записывается так:
Repeat
{инструкции}
until условие;
где условие – выражение логического типа, определяющее условие завершения цикла.
Инструкция repeat выполняется следующим образом: сначала выполняются инструкции, следующие за словом repeat. Затем проверяется условие (вычисляется значение выражения условие). Если условие ложно (значение выражения условие равно FALSE), то инструкции цикла (инструкции, находящиеся между repeat и until) выполняются еще раз. Если условие истинно (значение выражения условие равно TRUE), то выполнение цикла прекращается. Таким образом, инструкции, находящиеся между repeat и until выполняются до тех пор, пока условие ложно (значение выражения условие равно FALSE).
Пример использования:
…
x:=0;
repeat
x:=x+1;
until x=10;
Алгоритм, соответствующий инструкции repeat, представлен на Рисунок 18.2 - Блок-схема, соответствующая инструкции repeat.
Рисунок 17.2 - Блок-схема, соответствующая инструкции repeat
Обратите внимание.
Инструкции цикла, находящиеся между repeat и until, всегда будут выполнены хотя бы один раз.
Для того чтобы цикл завершился, необходимо, чтобы инструкции цикла, находящиеся между repeat и until, изменяли значения переменных, входящих в выражение условие
Процедура INC увеличивает порядок на 1 или N и соответствует утверждению X:=X+1 или X: = X + N.
procedure Inc(var X [ ; N: Longint ] ),
где X - переменная порядкового типа, N - выражение типа целого числа.
Процедура DEC уменьшает на 1 или N от переменной и соответствует утверждению X: = X - 1, или X: = X - N.
procedure Dec(var X[ ; N: Longint]),
где X - переменная порядкового типа, N - выражение типа целого числа.
Примеры задач с циклами
1) Вычисление суммы элементов ряда.
program summr;
var
i:integer;
elem, summ:real;
begin
sum:=0;
for i:=1 to 5 do
begin
elem:=1/i;
sum:=sum+elem;
writeln(i:2,’’,elem:4:2);
end;
writeln(‘Сумма элементов ряда: ‘summ:4:2’);
end.
2) Вычисление числа ПИ с заданной точностью.
program pi;
var
n:integer;
p, t, elem:real;
begin
p:=0;
n:=1;
elem:=1;
write(‘Задайте точность вычисления ПИ ’);
readln(t);
writeln(‘Вычисление ПИ с точностью’,t:9:6);
while elem >= t do
begin
elem:=1/(2*n-1);
if (n mod 2) = 0
then p:=p-elem
else p:=p+elem;
n:=n+1;
end;
p:=p*4;
writeln(‘Значение ПИ с точностью’,t:9:6,’равно’,p:9:5);
writeln(‘Просуммировано’,n,’ членов ряда’);
end.
3) Вычисление суммы положительных чисел, введенных с клавиатуры.
program summrep;
var
summ, numb:integer;
begin
writeln(‘Вычисление суммы положительных целых чисел’);
summ:=0;
repeat
write(‘->’);
readln(numb);
if numb>0 then sum:=sum+numb;
until numb <= 0;
writeln(‘Сумма введенных чисел: ’summ);
end.
Массивы
Массив— это структура данных, представляющая собой набор переменных одинакового типа, имеющих общее имя. Массивы удобно использовать для хранения однородной по своей природе информации, например, таблиц и списков.
Операции с массивами
Типичными операциями при работе с массивами являются:
· вывод массива;
· ввод массива;
· поиск максимального или минимального элемента массива;
· поиск заданного элемента массива;
· сортировка массива.
Interface
Uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TForm1 = class(TForm);
Button1: TButton;
Label1: TLabel;
procedure ButtonlClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Implementation
($R *.dfm}
Const
NT = 5;
Var
team: array[1..NT] of string[10] =
('Зенит','Динамо','Ротор','Спартак','СКА');
procedure TForml.ButtonlClick(Sender: TObject);
Var
st:string; // список команд
i:integer; // индекс, номер элемента массива
Begin
// формирование списка для отображения в форме
for i:=l to NT do st := st + IntToStr(i)+ ' '
+ team[i] + #13; // вывод списка Label1.Caption := st;
End;
End.
Interface
Uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
Type
TForm1 = class(TForm);
Label1: TLabel;
StringGridl: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure ButtonlClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForml ;
Implementation
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject);
Var
a : array[1..5] of integer; // массив
summ: integer; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
Begin
// ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for i:= 1 to 5 do
if Length(StringGridl.Cells[i-1, 0]) <>0
then a[i] := StrToInt(StringGridl.Cells[i-1,0])
else a[i] := 0;
// обработка массива
summ := 0;
for i :=1 to 5 do
summ := summ + a[i]; sr := summ / 5;
//вывод результата
Label2.Caption :='Сумма элементов: ' + IntToStr(summ)
+ #13+ 'Среднее арифметическое: ' + FloatToStr(sr);
End;
End.
После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши <Enter>. Сделать это можно при помощи процедуры обработки события onKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.
Текст процедуры обработки события OnKeyPress приведен в листинге 3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.
Листинг 3. Процедура обработки события OnKeyPress
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
Begin
case Key of
#8,'0'..'9' : ; // цифры и клавиша <Backspace>
#13: // клавиша <Enter>
if StringGridl.Col < StringGridl.ColCount — 1
then StringGridl.Col := StringGridl.Col + 1;
else key := Chr(0); // остальные символы запрещены
End;
End;
Если нужно ввести массив дробных чисел (a: array [1. .5] of real), то процедура обработки события OnKeyPress несколько усложнится, т. к. помимо цифр допустимыми символами являются символ-разделитель (запятая или точка — зависит от настройки Windows) и минус. С целью обеспечения некоторой дружественности программы по отношению к пользователю можно применить трюк: подменить вводимый пользователем неверный разделитель верным. Определить, какой символ-разделитель допустим в текущей настройке Windows, можно, обратившись к глобальной переменной DecimaiSeparator.
В листинге 4 приведен текст модуля приложения ввода и обработки массива дробных чисел. Процедура обработки события OnKeyPress обеспечивает ввод в ячейку таблицы только допустимых при записи дробного числа символов.
Листинг 4. Ввод и обработка массива дробных чисел
unit. getar_1; interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type
TForm1= class(TForm);
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
Label2: TLabel;
procedure Button1ClicktSender: TObject);
procedure StringGridlKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ButtonlClick(Sender: TObject);
var
a : array[1..5] of real; // массив
suram: real; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
begin
// ввод массива
// считаем, что если ячейка пустая, то соответствующий
// ей элемент массива равен нулю
for i:= 1 to 5 do
if Length(StringGridl.Cells[i-l,0])<>0
then a[i] := StrToFloat(StringGridl.Cells[i-1, 0]) else a[i] := 0;
// обработка массива
summ := 0;
for i :=1 to 5 do
summ := summ + a[i]; sr := summ / 5;
// вывод результата
Label2.Caption :='Сумма элементов: ' + FloatToStr(summ)
+ #13+ 'Среднее арифметическое: ' + FloatToStr(sr);
end;
// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9' : ; // цифры и <Backspace>
#13: // клавиша <Enter>
if StringGridl.Col < StringGridl.ColCount - 1
then StringGridl.Col := StringGridl.Col + 1; '.',',':
// разделитель целой и дробной частей числа
begin
if Key <> DecimalSeparator then
Key := DecimalSeparator;
// заменим разделитель
// на допустимый
if Pos(StringGridl.Cells[StringGridl.Col,0],
DecimalSeparator) <> 0
then Key := Chr(O); // запрет ввода второго
// разделителя
end;
' -' : // минус можно ввести только первым символом,
// т. е. когда ячейка пустая
if Length(StringGrid1.Cells[StringGrid1.Col, 0]) <>0 then
Key := Chr(0) ;
else // остальные символы запрещены
key := Chr(0);
end;
end;
end.
Interface
Uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;
Type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
procedure ButtonlClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Forml: TForm1;
Implementation
($R *.DFM}
procedure TForml .ButtonlClick(Sender: TObject);
Const
SIZE=5; // размер массива
Var
a:array[l..SIZE]of string[30]; //массив
n: integer; // количество строк, введенных в поле Memo
i:integer; // индекс элемента массива
st:string;
Begin
n:=Memo1.Lines.Count;
if n = 0 then begin
ShowMessage('Исходные данные не введены!');
Exit; // выход из процедуры обработки события
End;
// в поле Memo есть текст
if n > SIZE then begin
ShowMessage('Количество строк превышает размер массива.');
n:=SIZE; // будем вводить только первые SIZE строк
End;
for i:=1 to n do
a[i]:=Form1.Memol.Lines[i-1]; // строки Memo пронумерованы с нуля
// вывод массива в окно сообщения
if n > 0 then begin
st:='Введенный массив:'+#13;
for i: =1 to n do
st:=st+IntToStr(i)+' '+ a[i]+f13;
ShowMessage(st);
End;
End;
End.
Основную работу выполняет процедура TForm1.Button1Click, которая сначала проверяет, есть ли в поле Memo1 текст. Если текст есть (в этом случае значение свойства Lines.Count больше нуля), то процедура сравнивает количество введенных строк и размер массива. Если это количество превышает размер массива, то программа изменяет значение п, тем самым подготавливает ввод только первых SIZE строк.
На Рисунок 19.5 приведен вид диалогового окна приложения Ввод массива. После щелчка на командной кнопке Ввод появляется окно (Рисунок 19.6), которое содержит значения элементов массива, полученные из Memo-поля.
Рисунок 19.5 - Окно приложения Ввод массива
Рисунок 19.6 - Массив, введенный из Memo-поля
Interface
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Grids;
Type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
StringGridl: TStringGrid;
procedure ButtonlClick(Sender: TObject);
Private
{ Private declarations )
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Implementation
{$R *.DFM}
procedure TForm1.ButtonlClick(Sender: TObject);
Const
SIZE=5;
Var
a:array[l..SIZE] of integer; // массив целых
min:integer; // номер минимального элемента массива
i:integer; // номер элемента, сравниваемого с минимальным
Begin
// ввод массива
for i:=1 to SIZE do
a[i]:=StrToInt(StringGridl.Cells[i-1,0]);
// поиск минимального элемента
min:=1; // пусть первый элемент минимальный
for i:=2 to SIZE do
if a[i]< a[min] then min:=i;
// вывод результата
label2.caption:='Минимальный элемент массива:'
+IntToStr(a[min] +#13+'Номер элемента:'+ IntToStr(min);
End;
End.
На Рисунок 19.7 приведен вид диалогового окна приложения после щелчка на кнопке Поиск.
Рисунок 19.7 - Окно приложения Поиск минимального элемента массива
– Конец работы –
Используемые теги: информатика0.032
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Информатика
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов