
- •Глава 1. Основы программирования Программа
- •Этапы разработки программы
- •Спецификация
- •Разработка алгоритма
- •Алгоритм и программа
- •Компиляция
- •Язык программирования Delphi
- •Тип данных
- •Целый тип
- •Вещественный тип
- •Символьный тип
- •Строковый тип
- •Логический тип
- •Переменная
- •Константы
- •Числовые константы
- •Строковые и символьные константы
- •Логические константы
- •Именованная константа
- •Инструкция присваивания
- •Выражение
- •Тип выражения
- •Выполнение инструкции присваивания
- •Стандартные функции
- •Математические функции
- •Функции преобразования
- •Использование функций
- •Ввод данных
- •Ввод из окна ввода
- •Ввод из поля редактирования
- •Вывод результатов
- •Вывод в окно сообщения
- •Процедуры и функции
- •Структура процедуры
- •Структура функции
- •Запись инструкций программы
- •Стиль программирования
- •Глава 2. Управляющие структуры языка Delphi
- •Условие
- •Инструкция if
- •Листинг 2.1. Вычисление стоимости телефонного разговора
- •Листинг 2.2.Контроль веса
- •Инструкция case
- •Листинг 2.3. Пересчет веса из фунтов в килограммы
- •Листинг 2.4. Формирование поясняющего текста
- •Листинг 2.5. Вычисление даты следующего дня (фрагмент)
- •Инструкция for
- •Инструкция while
- •Листинг 2. 6. Вычисление числа я
- •Инструкция repeat
- •Листинг 2.7. Простое число
- •Инструкция goto
- •Листинг 2.8. Простое число (использование инструкции goto)
- •Глава 3. Символы и строки
- •Символы
- •Листинг 3.1. Таблица символов
- •Операции со строками
- •Функция length
- •Процедура delete
- •Функция роs
- •Функция сору
- •Глава 4. Консольное приложение
- •Глава 5. Массивы
- •Объявление массива
- •Операции с массивами
- •Вывод массива
- •Листинг 5.1. Инициализация и вывод массива
- •Ввод массива
- •Использование компонента StringGrid
- •Листинг 5.2. Ввод и обработка массива целых чисел
- •Листинг 5.3. Процедура обработки события OnKeyPress
- •Листинг 5.4. Ввод и обработка массива дробных чисел
- •Использование компонента Memo
- •Листинг 5.5. Ввод массива строк из компонента Memo
- •Поиск минимального (максимального) элемента массива
- •Листинг 5.6. Поиск минимального элемента массива
- •Поиск в массиве заданного элемента
- •Алгоритм простого перебора
- •Листинг 5.7. Поиск в массиве
- •Метод бинарного поиска
- •Листинг 5.8. Бинарный поиск в массиве
- •Сортировка массива
- •Листинг 5.9. Сортировка массива простым выбором
- •Сортировка методом обмена
- •Листинг 5.10. Сортировка массива методом обмена
- •Многомерные массивы
- •Листинг 5.11. Инициализация таблицы
- •Листинг 5.12. Обработка двумерного массива
- •Ошибки при использовании массивов
Инструкция goto
Инструкции if и case используются для перехода к последовательности инструкций программы в зависимости от некоторого условия. Поэтому их иногда называют инструкциями условного перехода. Помимо этих инструкций управления ходом выполнения программы существует еще одна — инструкция безусловного перехода goto.
В общем виде инструкция goto записывается следующим образом:
goto Метка
где метка — это идентификатор, находящийся перед инструкцией, которая должна быть выполнена после инструкции goto.
Метка, используемая в инструкции goto, должна быть объявлена в разделе меток, который начинается словом label и располагается перед разделом объявления переменных.
В программе метка ставится перед инструкцией, к которой должен быть выполнен переход в результате выполнения инструкции goto. Сразу после метки ставится двоеточие.
В листинге 2.8 приведен вариант процедуры проверки числа, в которой инструкция goto используется для завершения процедуры в том случае, если пользователь введет неверные данные.
Листинг 2.8. Простое число (использование инструкции goto)
procedure TForm1.Button1Click(Sender: TObject);
label bye;// раздел объявления меток
var
n: integer; // проверяемое число
d: integer; // делитель
r: integer; // остаток от деления n на d
begin
n:=StrToInt(Editl.text);
if n <= 0 then begin
MessageDlg('Число должно быть больше нуля.',
mtError, [mbOk] , 0) ; Editl.text:= ";
goto bye;
end;
// введено положительное число
d:= 2; // сначала будем делить на два
repeat r:= n mod d;
if r <> 0 // n не разделилось нацело на d
then d:= d + 1;
unti1 r = 0;
label2.caption:=Editl.text;
if d = n then label2.caption:=label2.caption + ' — простое число.'
else label2.caption:=label2.caption +' — обычное число.';
bye:
end;
В литературе по программированию можно встретить суждения о недопустимости применения инструкции goto, поскольку она приводит к запутанности программ. Однако с категоричностью таких утверждений согласиться нельзя. В некоторых случаях применение инструкции goto вполне оправдано. Приведенный пример, где инструкция goto используется для аварийного завершения процедуры, относится именно к таким случаям.
Глава 3. Символы и строки
Компьютер может обрабатывать не только числовую информацию, но и символьную. Язык Delphi оперирует с символьной информацией, которая может быть представлена как отдельными символами, так и строками (по-cледовательностью символов).
Символы
Для хранения и обработки символов используются переменные типа Ansichar и wideChar. Тип Ansichar представляет собой набор ANSI-символов, с которым каждый символ кодируется восьмиразрядным двоичным числом (байтом). Тип wideChar представляет собой набор символов в кодировке Unicode, в которой каждый символ кодируется двумя байтами.
Для обеспечения совместимости с предыдущими версиями поддерживается тип Char, эквивалентный AnsiChar.
Значением переменной символьного типа может быть любой отображаемый символ:
буква русского или латинского алфавитов;
цифра;
знак препинания;
И специальный символ, например, "новая строка".
Переменная символьного типа должна быть объявлена в разделе объявления переменных. Инструкция объявления символьной переменной в общем виде выглядит так:
Имя: char;
где:
имя — имя переменной символьного типа;
char — ключевое слово обозначения символьного типа.
Примеры:
otv: char; ch: char;
Как и любая переменная программы, переменная типа char может получить значение в результате выполнения инструкции присваивания. Если переменная типа char получает значение в результате выполнения операции присваивания, то справа от знака := должно стоять выражение типа char, например, переменная типа char или символьная константа — символ, заключенный в кавычки.
В результате выполнения инструкций c1 := '*';
с2 := c1;
переменная c1 получает значение присваиванием значения константы, а переменная с2 — присваиванием значения переменной cl (предполагается, что переменные c1 и с2 являются переменными символьного типа).
Переменную типа char можно сравнить с другой переменной типа char или с символьной константой. Сравнение основано на том, что каждому символу поставлено в соответствие число (см. приложение 2), причем символу 'о' соответствует число меньшее, чем символу У, символу 'А' — меньшее, чем 'в', символу V — меньшее, чем а. Таким образом, можно записать:
'0'<'1'<..<'9'<..<'A'<'B'<..<'Z'<'a'<'b'<..<'z'
Символам русского алфавита соответствуют числа большие, чем символам латинского алфавита, при этом справедливо следующее:
'А'<'Б'<'В'<..<'Ю'<'Я'<'а'<'б'<'в'<...<'э'<'ю'<'я'
В тексте программы вместо символа можно указать его код, поставив перед числом оператор #. Например, вместо константы 'в' можно записать #193. Такой способ записи, как правило, используют для записи служебных символов или символов, которые во время набора программы нельзя ввести с клавиатуры. К примеру, часто используемый при записи сообщений символ "новая строка" записывается так: #13.
В программах обработки символьной информации часто используют функции chr и Ord. Значением функции chr является символ, код которого указан в качестве параметра. Например, в результате выполнения инструкции c:=chr(32) переменной с будет присвоено значение пробел. Функция ord позволяет определить код символа, который передается ей в качестве параметра. Например, в результате выполнения инструкции k:=ord('*') переменная k будет содержать число 42 — код символа *.
Программа, текст которой приведен в листинге 3.1, выводит таблицу кодировки букв русского алфавита. Вид окна программы представлен на рис. 3.1.
Основную работу выполняет процедура обработки события OnActivate, которая формирует и выводит в поле метки (Label1) таблицу. Событие OnActivate происходит при активизации формы приложения, и поэтому процедура TForm1.FormActivate выполняется автоматически, сразу после появления формы на экране.
Рис. 3.1. Форма приложения во время разработки
Рис. 3.2. Форма приложения во время работы