- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования Pascal
- •Основные элементы языка
- •Переменные. Стандартные типы.
- •Операции отношения
- •Раздел описаний переменных
- •Выражения. Порядок выполнения операций.
- •Константы
- •Комментарии в программе
- •Операторы
- •2.1.7.1. Оператор присваивания
- •2.1.7.2. Операторы ввода/вывода
- •2.1.7.3. Операторы инкремента и декремента
- •Среда разработки Lazarus
- •Русский язык в консольных приложениях
- •Первая программа
- •Открытие существующего проекта
- •Другие способы создания консольных приложений
- •Типовой пустой проект
- •Операции с целыми числами
- •Вместо лирического отступления 2
- •Стандартные функции с целыми аргументами
- •Операции с вещественными числами (тип real).
- •Форматирование вывода
- •Одновременное использование вещественных и целых чисел.
- •Другие стандартные функции с вещественными аргументами
- •Булевы переменные
- •Условные операторы.
- •2.1.22.1 Оператор if …. then
- •2.1.22.2. Оператор if …then ... else
- •Операторы цикла
- •2.1.23.1. Оператор цикла с предусловием
- •2.1.23.2. Оператор цикла с постусловием
- •2.1.23.3. Оператор цикла с параметром.
- •2.1.23.4. Второй вариант оператора цикла с параметром
- •Оператор выбора case
- •Организация простейшего контроля ввода данных.
- •Вычисление сумм сходящихся рядов
- •Реализация некоторых алгоритмов главы 1.
- •Программа решения задачи о поездах и мухе
- •Программа вычисления определенного интеграла
- •Более сложные элементы языка
- •Общая структура Паскаль – программы
- •Процедуры и функции
- •3.1.1.1 Структура процедуры
- •3.1.1.2. Структура функции
- •3.1.1.3 Глобальные и локальные переменные
- •3.1.1.4 Способы передачи параметров
- •3.1.1.5 Процедуры завершения
- •Еще раз о типах данных
- •Классификация типов данных
- •3.2.1.1 Целый тип
- •3.2.1.2. Интервальный тип
- •3.2.1.3. Перечислимый тип
- •3.2.1.4. Множества
- •3.2.1.5. Логический тип
- •3.2.1.6. Вещественный тип
- •3.2.1.7. Указатели
- •Обработка символьной информации в Паскале
- •Символьные и строковые типы данных.
- •3.3.1.1. Тип Char
- •3.3.1.2. Функции для работы с символами
- •3.3.1.3. Тип String
- •3.3.1.4. Строковые процедуры и функции
- •Массивы
- •Динамические массивы
- •Программа решения системы линейных алгебраических уравнений методом Гаусса
- •3.4.1.1. Вариант 1 – с goto
- •3.4.1.2. Вариант 2 – без goto
- •3.4.1.3. Вариант 3 – наилучшая реализация
- •Модули в Паскале
- •Структура модуля
- •Системные модули
- •3.5.2.1. Модуль CRT
- •Файлы
- •Тип данных – запись
- •Файловые типы
- •Процедуры для работы с файлами
- •3.6.3.1. Общие процедуры для работы с файлами всех типов
- •3.6.3.2. Процедуры для работы с текстовыми файлами
- •3.6.3.3. Процедуры для работы с типизированными файлами
- •3.6.3.4. Процедуры для работы с нетипизированными файлами
- •3.6.3.5. Организация контроля ввода/вывода при работе файлами
- •3.6.3.6. Создание простой базы данных с типизированными файлами.
- •Алгоритмы сортировки
- •Обменная сортировка (метод "пузырька")
- •Сортировка выбором
- •Сортировка вставками
- •Метод быстрой сортировки
- •Алгоритмы поиска
- •Поиск в массивах
- •Вставка и удаление элементов в упорядоченном массиве
- •Динамические структуры данных
- •Представление в памяти компьютера динамических структур.
- •Реализация стека с помощью массивов
- •Указатели
- •Стандартные операции с линейными списками
- •Реализация динамических структур линейными списками
- •4.3.6.1. Реализация стека
- •4.3.6.2. Реализация очереди с помощью линейного списка
- •4.3.6.3. Реализация двоичного дерева с помощью линейного списка
- •Сортировка и поиск с помощью двоичного дерева
- •Три источника и три составные части ООП.
- •Классы и объекты.
- •Обращение к членам класса.
- •Инкапсуляция
- •Спецификаторы доступа.
- •Свойства.
- •Наследование
- •Полиморфизм
- •Раннее связывание.
- •Позднее связывание.
- •Конструкторы и деструкторы.
- •Элементы графического интерфейса
- •Различия между консольными и графическими приложениями
- •Визуальное программирование в среде Lazarus
- •Создание графического приложения
- •Форма и ее основные свойства
- •Компоненты
- •Обработчики событий
- •Простейшие компоненты
- •6.3.5.1. Компонент TLabel
- •6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton
- •6.3.6.1. Компонент TEdit
- •6.3.6.2. Компонент TLabeledEdit
- •6.3.7.1. Компонент TMaskEdit
- •Специальные компоненты для ввода чисел
- •Тестирование и отладка программы
- •Компоненты отображения и выбора данных
- •6.3.10.1. Компонент TMemo
- •6.3.10.2. Компонент TStringGrid
- •6.3.10.3. Компоненты выбора
- •Компонент TListBox
- •Компонент TComboBox
- •Компоненты выбора – переключатели
- •6.3.10.4. Компоненты отображения структурированных данных
- •Компонент TTreeView
- •Компонент TListView
- •Организация меню. Механизм действий - Actions
- •6.3.11.1. Компонент TMainMenu
- •6.3.11.2. Компонент TToolBar
- •6.3.11.3. Компонент TActionList
- •6.3.11.4. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
Глава 3 Более сложные элементы языка
____________________________________________________________________
var имя переменной: ^тип;
Например:
var px: ^integer; // указатель на данные целого типа py: ^real; // указатель на данные вещественного типа pname: ^string; // указатель на данные типа строка
pphone: ^string[7];
Компилятор строго следит за правильностью использования указателя и типом данных, на которые ссылается этот указатель.
Для нетипизированных указателей тип данных не указывается. В этом слу-
чае программист сам должен заботиться о правильном использовании указателя и типов данных. При его описании используется ключевое слово pointer.
Пример описания нетипизированного указателя:
var p: pointer;
Более подробно мы будем изучать указатели в главе 4.
В дальнейшем мы рассмотрим еще типы данных, в частности, в следую-
щем разделе познакомимся с типами данных, позволяющих обрабатывать сим-
вольную информацию.
3.3. Обработка символьной информации в Паскале
3.3.1 Символьные и строковые типы данных.
Первые применения ЭВМ были в основном для решения так называемых вычислительных задач, т.е. задач возникающих в математике, в научно – тех-
нических задачах, где требуется решение различных уравнений, вычисление значений функций и т.д. Но применение компьютеров для вычислительных за-
дач составляет всего 20 – 25% по сравнению с их применением в других облас-
тях. К таким задачам относятся задачи, возникающие в лингвистике, логике,
165
3.3Обработка символьной информации в Паскале
____________________________________________________________________
психологии, теории игр и т.д.
Компьютеры широко применяются для набора различных текстов и доку-
ментов, перевода текстов. Компьютеры сочиняют музыку, пишут стихи, играют
вшахматы. Конечно, при решении таких задач вычисления производятся, но не
втаком объеме, как при решении вычислительных задач. В основном в нечи-
словых задачах компьютер оперирует с символьной информацией.
Необходимо понимать, что вся информация, хранящаяся в памяти компью-
тера, представлена в виде двоичных чисел. Все дело в том, что под этими дво-
ичными числами понимается, действительно ли это какие-то числа или что-
либо другое. Так вот под "другое" имеются в виду символы или совокупность символов. Т.е. каждый символ кодируется в виде двоичных чисел. Только об-
рабатываются эти числа совершенно по-другому. Программист знает, когда он работает с числами, когда с символами и поэтому предусматривает для каждого случая соответствующие способы работы с этими числами. А в памяти компь-
ютера двоичное представление символа или группы символов может совпадать с каким-нибудь "настоящим" числом.
Примечательно, что возможность применения компьютеров для решения нечисловых задач понимали еще тогда, когда и компьютеров-то вообще не бы-
ло! Вот что писала знаменитая Ада Лавлейс еще в 1843 году: "Многие не све-
дущие в математике люди думают, что поскольку назначение аналитической машины Бэббиджа – выдавать результаты в численном виде, то природа проис-
ходящих в ней процессов должна быть арифметической и численной, а не ал-
гебраической и аналитической. Но они ошибаются. Машина может упорядочи-
вать и комбинировать числовые значения так же, как и буквы или любые дру-
гие символы общего характера. В сущности, при выполнении соответствующих условий она могла бы выдавать результаты и в алгебраическом виде".
В 1963 г. американская организация по стандартизации American Standards Association (ASA) предложила для представления символов, т.е. цифр, букв и других знаков специальный семибитный код, который стал называться кодовой
166
Глава 3 Более сложные элементы языка
____________________________________________________________________
таблицей ASCII (American Standard Code for Information Interchange). Номер,
который символ имеет в таблице ASCII, называется кодом этого символа. Сим-
вол можно представить, указав его в кавычках, а можно использовать значок #,
за которым следует код символа. Например, буква 'А', в таблице ASCII
имеет номер 65, т е. его код равен 65, тогда можно указать # 65 и это будет оз-
начать букву 'А'.
Однако эта кодовая таблица содержала кроме цифр и знаков только буквы английского алфавита. Поэтому был принят стандарт на 8-битную таблицу
ASCII, в которой первые 128 символов оставались те же, что и в 7-битной таб-
лице, а символы с 128 по 255 отводились для не английских символов. Позднее
Microsoft расширила таблицу ASCII и она была переименована и стала назы-
ваться ANSI (American National Standards Institute). В таблице 3.4. приведена первая половина (с кодами 0…127) этого стандарта.
Как мы видим, первая половина таблицы содержит все буквы латинского алфавита, цифры от 0 до 9, а также все наиболее употребимые знаки, такие как знак +, -, /, *, скобки и т.д.
Вторая половина символов с кодами 128…255 меняется для различных на-
циональных алфавитов. С появлением национальных локализаций для второй половины таблицы ASCII было введено понятие «кодовая страница» (code page, CP). Для кодирования русских букв в MS DOS стали применять кодировку
CP866, ранее известную как альтернативная кодировка ВЦ Академии Наук
СССР.
В Windows для представления кириллицы используется кодовая страница
CP-1251. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman Cyr для представления символов кириллицы (без букв 'ѐ' и 'Ё')
используют последние 64 кода (от 192 до 256): 'А'…'Я' кодируются значе-
ниями 192…223, 'а'…'я' – 224…255.
А в консоли Windows используется кодировка CP866. Этим и объясняются проблемы при выводе русских букв на экран в консольных приложениях.
167
3.3Обработка символьной информации в Паскале
____________________________________________________________________
Кодировка символов в соответствии со стандартом ANSI
|
|
|
|
|
|
|
Таблица 3.4 |
|
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
|
Символ |
0 |
NUL |
32 |
BL |
64 |
@ |
96 |
|
` |
1 |
SOH |
33 |
! |
65 |
A |
97 |
|
a |
2 |
STX |
34 |
― |
66 |
B |
98 |
|
b |
3 |
ETX |
35 |
# |
67 |
C |
99 |
|
c |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
|
d |
5 |
ENQ |
37 |
% |
69 |
E |
101 |
|
e |
6 |
ACK |
38 |
& |
70 |
F |
102 |
|
f |
7 |
BEL |
39 |
' |
71 |
G |
103 |
|
g |
8 |
BS |
40 |
( |
72 |
H |
104 |
|
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
|
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
|
j |
11 |
VT |
43 |
+ |
75 |
K |
107 |
|
k |
12 |
FF |
44 |
, |
76 |
L |
108 |
|
l |
13 |
CR |
45 |
- |
77 |
M |
109 |
|
m |
14 |
SO |
46 |
. |
78 |
N |
110 |
|
n |
15 |
SI |
47 |
/ |
79 |
O |
111 |
|
o |
16 |
DEL |
48 |
0 |
80 |
P |
112 |
|
p |
17 |
DC1 |
49 |
1 |
81 |
Q |
113 |
|
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
|
r |
19 |
DC3 |
51 |
3 |
83 |
S |
115 |
|
s |
20 |
DC4 |
52 |
4 |
84 |
T |
116 |
|
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
|
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
|
v |
23 |
ETB |
55 |
7 |
87 |
W |
119 |
|
w |
24 |
CAN |
56 |
8 |
88 |
X |
120 |
|
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
|
y |
25 |
SUB |
58 |
: |
90 |
Z |
122 |
|
z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
|
{ |
28 |
FS |
60 |
< |
92 |
\ |
124 |
|
| |
28 |
GS |
61 |
= |
93 |
] |
125 |
|
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
|
~ |
31 |
US |
63 |
? |
95 |
_ |
127 |
|
• |
Существуют и другие стандарты кодировки символов. В частности, для представления букв некоторых языков, таких как китайский, японский, корей-
ский и др. 8-ми разрядов не хватает. Поэтому разработан специальный стандарт
Unicode.
168
Глава 3 Более сложные элементы языка
____________________________________________________________________
Юникод, или Уникод (Unicode) — стандарт кодирования символов, позво-
ляющий представить знаки практически всех письменных языков.
Стандарт предложен в 1991 году некоммерческой организацией «Консор-
циум Юникода» (Unicode Consortium, Unicode Inc.). Применение этого стандар-
та позволяет закодировать очень большое число символов из разных письмен-
ностей: в документах Unicode могут соседствовать китайские иероглифы, ма-
тематические символы, буквы греческого алфавита, латиницы и кириллицы,
при этом становятся ненужными кодовые страницы.
Стандарт состоит из двух основных разделов: универсальный набор сим-
волов (UCS, Universal Character Set) и семейство кодировок (UTF, Unicode
Transformation Format).
Универсальный набор символов задаѐт однозначное соответствие симво-
лов кодам — элементам кодового пространства, представляющим неотрица-
тельные целые числа.
Семейство кодировок определяет машинное представление последова-
тельности кодов UCS.
Коды в стандарте Юникод разделены на несколько областей. Область с ко-
дами от U+0000 до U+007F содержит символы набора ASCII с соответствую-
щими кодами. Далее расположены области знаков различных письменностей,
знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем.
В Lazarus по умолчанию используется кодировка UTF-8. В UTF-8 все сим-
волы разделены на несколько групп. Символы с кодами менее 128 кодируются одним байтом, первый бит которого равен нулю, а последующие 7 бит в точно-
сти соответствуют первым 128 символам 7-битной таблицы ASCII, следующие
1920 символов – кодируются двумя байтами. Последующие символы кодиру-
ются тремя и четырьмя байтами.
Для нас важным является тот факт, что символы кириллицы кодируются в
UTF-8 в точности двумя байтами.
169