- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования 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. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
гом, его могли в этот момент чем-то отвлечь, он мог просто не обратить внима-
ния на ваше предупреждение или забыть о нем. В конце концов, он мог нажать не на ту клавишу! Например, цифра 9 на клавиатуре расположена рядом с циф-
рой 0. И, наконец, обязательно найдутся такие пользователи, которые захотят посмотреть, а что будет, если я все-таки введу ноль!
Ясно, что если в ваших программах будут встречаться такие "казусы", то вашему престижу как программиста будет нанесен невосполнимый урон, осо-
бенно если вы пишете программы на коммерческой основе, т.е. продаете их.
Это также отразится на количестве продаж вашей программы.
Таким образом, контроль за такими "не предусмотренными" действиями пользователя лежит на программисте! Есть такое понятие в программировании
– писать программы, рассчитанные на "дурака" (fool-tolerance).
Поэтому любите своего пользователя, уважайте его, заботьтесь о том, что-
бы ему было легко и комфортно работать с вашей программой (даже есть такое понятие дружественность программы), но пишите свои программы так, чтобы они были защищены от любых непреднамеренных, неумелых и даже "невоз-
можных" действий пользователя.
Чаще всего такого рода ошибки возникают при вводе пользователем ка-
ких-то данных. Со способами защиты своей программы от таких непреднаме-
ренных действий пользователя мы познакомимся позже (см. раздел 2.1.25. и
6.3.7.). Здесь я просто заострил ваше внимание на этой проблеме, чтобы вы все-
гда помнили об этом в процессе написания своих программ.
2.1.16 Стандартные функции с целыми аргументами
Рассмотрим программу:
program functions;
{$mode objfpc}{$H+}
99
2.1 Основные элементы языка
____________________________________________________________________
uses
CRT, FileUtil;
var
a, b, c: integer;
begin
a:=-2;
b:= abs(a);
writeln(UTF8ToConsole('Абсолютная величина числа a= '), b);
c:= sqr(b);
writeln(UTF8ToConsole('Квадрат числа b= '), c);
c:= sqr(b + b);
writeln(UTF8ToConsole('Квадрат числа (b + b)= '), c); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Оператор b:= abs(a); присваивает переменной b абсолютное значе-
ние числа a.
Под абсолютным значением числа понимается значение этого числа, если отбросить знак.
abs(-2)= 2
abs(-10)= 10
abs(5)= 5
Оператор c:= sqr(b)- присваивает переменной c квадрат числа b, т.е. c b2 , sqr (от английского square – квадрат). Число в скобках называется ар-
гументом функции. В качестве аргумента может быть выражение, например,
b2 4ac запишется на Паскале следующим образом: sqrt(sqr(b) 4 * a * c);
100
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Как уже отмечалось, в операторах write и writeln можно использо-
вать любые допустимые выражения, т.е. можно записывать так:
writeln('Квадрат числа (b + b)= ', sqr(b + b));
2.1.17Операции с вещественными числами (тип real).
Свещественными числами можно выполнять различные операции. Все возможные операции иллюстрируются следующей программой:
program real_numbers; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
a, b, c: real; begin
a:= 17.3; b:= 3.4; c:= a * b;
writeln(UTF8ToConsole('Умножение вещественных чисел c = '), c);
c:= a / b;
writeln(UTF8ToConsole('Деление вещественных чисел c = '), c);
c:= a + b;
writeln(UTF8ToConsole('Сложение вещественных чисел c = '), c);
c:= a - b;
writeln(UTF8ToConsole('Вычитание вещественных чисел c = '), c); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
101
2.1 Основные элементы языка
____________________________________________________________________
2.1.18 Форматирование вывода
При выводе значений вещественного типа используется так называемое экспоненциальное представление, в котором используется степень десяти. Вы это могли видеть при выполнении предыдущего примера. Такой вид чисел на экран часто неудобен. В операторах вывода можно использовать форматиро-
вание для указания ширины поля вывода. Вид оператора вывода в этом случае будет таким:
write(переменная_1:w:d, … переменная_n:w:d);
writeln(переменная_1:w:d, … переменная_n:w:d);
где w – общая ширина поля вывода, d – количество знаков после запя-
той, т.е. дробной части числа. w и d должны быть константами или выраже-
ниями целого типа. Для того чтобы общая ширина поля вывода определялась автоматически, указывайте w = 0. Например:
writeln('a * b = ', c:0:2);
В этом случае на экран будет выведено
a * b = 58.82
вместо
a* b = 5.882000000000000Е+001
2.1.19Одновременное использование вещественных и целых чисел.
В программе могут встречаться переменные разных типов:
program int_real; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
102
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
n, k: integer;
a, b: real;
begin
a:= 3.6;
n:= 4;
b:= n;
writeln(UTF8ToConsole('Вещественная переменная b= '), b);
n:= trunc(a);
writeln(UTF8ToConsole('Операция truncate n= '), n);
k:= round(a);
writeln(UTF8ToConsole('Операция round k= '), k); writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
В программе мы видим запись b:= n; где вещественной переменной b
присваивается значение целой переменной n. Кроме того, в таких записях как b:= n + 4.6; или b:= 3 * 7.2 + n; встречаются вещественные и це-
лые числа, стоящие в правой части выражения. Такие записи разрешены. Ком-
пилятор автоматически преобразует выражение в правой части оператора при-
сваивания к вещественному типу. И наоборот, присвоение вещественных зна-
чений целым переменным просто запрещены. Т.е. если написать оператор при-
сваивания
n:= 3.14;
компилятор выдаст ошибку.
Для этого используются стандартные функции trunc и round. С помо-
щью функции trunc производится преобразование вещественного числа в целое путем отбрасывания всех цифр, стоящих после десятичной точки (trun-
103