- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования 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.1 Основные элементы языка
____________________________________________________________________
вольной информации (буквы, цифры и специальные знаки).
Консольное приложение позволяет сосредоточиться на существе той или иной конструкции языка, поэтому мы начнем с консольных приложений. Одна-
ко нельзя считать, что консольные приложения предназначены лишь для изуче-
ния языка. Можно и с помощью консольных приложений разрабатывать очень сложные программы. Например, компилятор Free Pascal является консольным приложением, то есть может быть запущен в консоли, из командных файлов или из IDE Lazarus.
Для создания консольного приложения необходим только текстовый ре-
дактор и компилятор Free Pascal. В принципе для этого Lazarus не нужен. Од-
нако мы все же будем использовать Lazarus, поскольку IDE Lazarus позволяет создавать в том числе и консольные приложения. А его мощный текстовый ре-
дактор с подсветкой синтаксиса и другими широкими возможностями значи-
тельно облегчит нам написание программ.
2.1.9 Русский язык в консольных приложениях
В консольных приложениях под Windows, к сожалению, возникают про-
блемы с выводом на экран русских букв. Это вызвано различием в кодировке символов в Windows, которая работает в графическом режиме и ее консоли, ко-
торая работает в текстовом режиме. Не вдаваясь пока в тонкости, скажу лишь,
что мы в своих программах будем использовать специальную функцию
UTF8ToConsole(), которая позволит нам корректно отображать русские бу-
квы на экране в консольных приложениях для платформы Windows в операто-
рах writeln и write.
Используйте функцию UTF8ToConsole() вот таким образом:
writeln(UTF8ToConsole('Русский текст'));
вместо
70
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
writeln('Русский текст');
В Linux таких проблем нет, поэтому можно писать просто
writeln('Русский текст');
Но мы и в Linux будем писать
writeln(UTF8ToConsole('Русский текст'));
Это позволит нам без проблем переносить программы из Linux в Windows,
т.е. наши программы без каких-либо переделок будут безошибочно компилиро-
ваться и выполняться как на платформе Linux, так и на платформе Windows.
2.1.10 Первая программа
Запустите Lazarus. Выберите пункт меню Проект, Создать проект… (рис.
2.15).
Рис. 2.15. Меню "Проект"
Создайте консольное приложение (рис. 2.16). Для этого выберите Кон-
сольное приложение и нажмите Создать.
71
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.16. Окно создания нового проекта
Возьмите себе за правило сразу же сохранять только что созданный про-
ект, даже если он пока пустой. Это должно стать вашей хорошей привычкой,
такой же, как чистить зубы утром и вечером! Дело в том, что во время сохране-
ния, вы можете создать папку для своего проекта, и все файлы текущего проек-
та будут сохранены в отдельной папке. Это поможет вам структурировать ваши проекты и не запутаться в них, если их будет много.
Для сохранения проекта проще всего воспользоваться кнопками на панели инструментов, рис. 2.17.
Рис. 2.17. Кнопки сохранения проекта
В открывшемся диалоговом окне сохранения проекта создайте новую пап-
ку в нужном месте, укажите имя проекта и нажмите Сохранить, рис. 2.18, 2.19.
72
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Рис. 2.18. Стандартное диалоговое окно сохранения в Windows
Рис. 2.19. Стандартное диалоговое окно сохранения в Linux
При задании имени папки и имени проекта старайтесь, чтобы имена отра-
жали суть проекта. Это поможет вам легко ориентироваться в своих проектах,
73
2.1 Основные элементы языка
____________________________________________________________________
особенно когда их накопится достаточно много. Также помните, что если вы даете имя, состоящее из нескольких слов, то в Linux нельзя ставить пробелы между словами. В этом случае Lazarus не сможет открыть ваш проект, рис. 2.20.
Имя проекта всегда задавайте в нижнем регистре.
Рис. 2.20. Окно сообщения "Файл не найден"
После сохранения в папке с проектом появятся несколько файлов, которые мы рассмотрим позже. В окне редактора исходного кода вы увидите текст. Это заготовка кода для консольного приложения, автоматически вставляемого Lazarus (рис. 2.21).
Рис. 2.21. Заготовка кода для консольного приложения, автоматически вставляемого Lazarus
74
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Мы не будем сейчас обращать внимание на этот код и разбирать его, по-
скольку у нас для этого пока недостаточно знаний. Просто удалите этот код.
Для этого установите курсор в любое место окна редактора исходного текста и нажмите Ctrl+A. Весь текст в окне выделится. Нажмите клавишу Delete. Введи-
те следующий код программы:
program summa;
{$mode objfpc}{$H+}
uses
FileUtil; { Подключение модуля FileUtil для корректного отображения русских букв с помощью функции UTF8ToConsole }
var
result, A, B: integer;
begin
readln(A, B);
result:=A + B;
writeln(UTF8ToConsole('1-е введенное число= '), A); writeln(UTF8ToConsole('2-е введенное число= '), B); writeln(UTF8ToConsole('Сумма двух чисел = '), result);
end.
Окно редактора исходного кода в Windows будет иметь вид, рис. 2.22:
75
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.22. Окно редактора исходного кода в Windows
В Linux это же окно будет иметь вид, рис. 2.23.
Рис. 2.23. Окно редактора исходного кода в Linux
76
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Обратите внимание на объявление
uses
FileUtil;
Этим объявлением мы подключаем модуль FileUtil в котором опреде-
лена функция UTF8ToConsole().
Если вас смущает что значит модуль и функция в Паскале, то немного по-
терпите. В главе 3 мы подробно рассмотрим все эти вопросы. Напоминаю, что мы вынуждены это делать, чтобы в Windows в окне DOS при работе вашей про-
граммы корректно отображался русский шрифт. Также пока примите на веру и проделайте следующее.
Откройте меню Проект->Инспектор проекта и нажмите на кнопку со значком "+", рис. 2.24.
Рис. 2.24. Окно инспектора проекта
В появившемся окне "Добавить к проекту" нажмите на кнопку "Новое тре-
бование", рис. 2.25.
Рис. 2.25. Добавление нового требования
77
2.1 Основные элементы языка
____________________________________________________________________
В раскрывающемся списке "Имя пакета" найдите и выберите пакет LCL.
Нажмите клавиши Ctrl+F9. Начнется компиляция и сборка программы. Ес-
ли вы ввели текст программы без ошибок в точности как приведено выше, то компиляция завершится успешно. В окне Сообщения вы увидите сообщение
Проект "summa" успешно собран.
В папке проекта появятся, в дополнение к уже существующим, еще не-
сколько файлов. В частности, готовый к исполнению файл. В Windows это бу-
дет файл с расширением exe, в Linux файл без расширения.
Чтобы запустить программу на выполнение прямо из среды Lazarus на-
жмите клавишу F9 или кнопку "Запуск" (зеленый треугольник) на панели инст-
рументов или меню Запуск->Запуск, рис. 2.26.
Рис. 2.26. Способы запуска программы
Пользователям Linux для того, чтобы запускать программы из среды Lazarus в терминале необходимо в меню Запуск->Параметры запуска устано-
78
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
вить флажок "Использовать приложение для запуска", рис. 2.27, 2.28.
Рис. 2.27. Меню "Запуск"
При этом для некоторых дистрибутивов Linux надо заменить строку
/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)
на
/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)
79
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.28. Настройка проекта для запуска в терминале
Для запуска программы вне среды Lazarus в Windows достаточно дважды
щелкнуть по имени исполняемого exe-файла.
ВLinux выдать команду <путь к файлу> ./<имя исполняемого файла>
Вдальнейшем, для единообразия в изложении, будем предполагать,
что все примеры в книге запускаются из среды Lazarus.
После запуска программы у вас появится окно вида, рис. 2.29 (Windows) и
рис. 2.30 (Linux).
80
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Рис. 2.29. Окно исполняемой программы в Windows
Рис. 2.30. Окно исполняемой программы в Linux
Введите значения переменных A и B. Это должны быть целые числа. Для завершения ввода числа нажмите Enter.
Окно вывода программы в Linux будет иметь вид, рис. 2.31:
81
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.31. Окно вывода программы в Linux
В Windows после ввода второго числа в окне что-то промелькнет и окно закроется. Как сделать так, чтобы окно не закрывалось, и мы могли увидеть ре-
зультаты выполнения программы?
Для этого можно вставить в код программы оператор readln без пара-
метров перед завершающим оператором end с точкой. Снова нажмите клави-
шу F9. На этот раз после ввода чисел окно не закроется и вы сможете увидеть результаты работы программы, рис. 2.32.
Рис. 2.32. Окно вывода программы в Windows
82
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Чтобы закрыть окно программы нажмите Enter.
Проанализируем нашу программу. Вроде программа работает, сумма вы-
числяется правильно. И все же даже в этой простейшей программе видны су-
щественные недостатки. Недостатки с точки зрения организации взаимосвязи с пользователем или, как говорят, интерфейса связи с пользователем.
Во-первых, после запуска нашей программы появляется пустое окно. Это сразу же вызывает негативные ассоциации. Что-то случилось с компьютером?
Он завис?
Ну, мы-то с вами знаем, что нужно ввести два числа, но пользователь мо-
жет и не знать об этом! Как исправить это? А очень просто! Вставьте оператор writeln(UTF8ToConsole('Введите два целых числа'));
перед оператором ввода readln(A, B);
Окно программы будет выглядеть так, рис. 2.33, 2.34:
Рис. 2.33. Окно программы в Windows
83
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.34. Окно программы в Linux
Теперь даже ежу понятно, что нужно ввести два числа!
Во-вторых, (это касается опять же Windows) неплохо было бы дать поль-
зователю инструкцию как выйти их программы. Окно программы будет закры-
то только после нажатия клавиши Enter. Нажатие любых других клавиш к за-
крытию окна не приведет! Можно, конечно, воспользоваться кнопкой закрытия окна. Но желательно, чтобы программа сама закрывала свое собственное окно.
И опять, пользователь ведь не знает, что для выхода из программы нужно на-
жать клавишу Enter. Есть два варианта выхода из этой ситуации:
1.В конце программы, но перед readln вставить оператор
writeln(UTF8ToConsole ('Для выхода нажмите Enter'));
2.Воспользоваться функцией readkey без параметров. Окно программы бу-
дет закрываться при нажатии любой клавиши. Этот вариант предпочтительней,
только для этого необходимо использовать объявление uses Crt, чтобы включить модуль CRT о котором речь пойдет позже и в ко-
тором и есть эта функция. Но, даже в этом случае, будет правильнее, если вставить оператор (разумеется, перед readkey) writeln(UTF8ToConsole('Для выхода нажмите любую клавишу'));
84
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
Окончательный текст программы будет выглядеть следующим образом:
program summa; {$mode objfpc}{$H+} uses
Crt, FileUtil; {Подключение модуля CRT для использования функ-
ции readkey и модуля FileUtil для корректного отображения русских букв с помощью функции UTF8ToConsole}
var
result, A, B: integer; begin
writeln(UTF8ToConsole('Введите два числа')); readln(A, B);
result:=A + B;
writeln(UTF8ToConsole('1-е введенное число= '), A); writeln(UTF8ToConsole('2-е введенное число= '), B); writeln(UTF8ToConsole('Сумма двух чисел = '), result); writeln(UTF8ToConsole('Нажмите любую клавишу')); readkey;
end.
Результаты работы программы приведены на рис. 2.35, 2.36.
85
2.1 Основные элементы языка
____________________________________________________________________
Рис. 2.35. Результаты работы программы в Windows
Рис. 2.36. Результаты работы программы в Linux
Пользователи Linux обратите внимание, что если вы выполняете програм-
му в терминале, то выдается еще дополнительно сообщение "Press enter". Все же операторы
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
86