Урок Delphi 6Выражения и операторы Delphi |
Уроки Delphi
1. Первая программа
2. Использование компонентов
3. События Delphi
4. Типы данных Delphi
5. Создание своих типов данных
6. Выражения и операторы
7. Работа с файлами в Delphi
8. Дополнительные формы
9. Подпрограммы в Delphi
10. Исключительные ситуации
11. Взаимодействие приложения с пользователем
12. Указатели в Delphi
13. Обзор компонентов
14. Работа со строками
15. Создание интерфейса
16. Графика в Delphi
17. Многопоточность в Delphi
18. Динамическое создание
компонентов Поиск по сайту Это важно:
Метод Application.ProcessMessages;
Это полезно:
Параметр Sender в обработчиках событий;
Бояться не надо |
Выражения DelphiВ программах Delphi применяются
Математические выраженияВ математических выражениях используются операции присваивания:= То есть, результат выражения X:=1+2*3-4/5; будет равен не 1, как в случае последовательного выполнения, а 6.2 . Если же мы хотим получить именно последовательное выполнение, то необходимо применять скобки (), обособляющие те операции, которые необходимо выполнить первыми. Скобки могут быть вложены друг в друга неограниченное число раз: X:=((1+2)*3-4)/5; Вот теперь X будет равен 1.Помимо четырёх математических действий в Delphi доступно множество математических функций, таких, например, как тигонометрические, логарифмические, и т.д. Они становятся доступны в программе после добавления в секцию Interface uses модуля Math. Их описание также можно найти в модуле Math.pas (можно найти воспользовавшись поиском Windows). Многие из них можно реализовать и самому, но встроенные функции наверняка будут работать быстрее и лучше, т.к. написаны на языке ассемблера. Логические выраженияЛогические выражения выполняются над операндами логического типа, то есть имеющими тип Boolean Delphi. Они применяются в основном в условных операторах.Операторы DelphiДля создания приложений, реализующих сложную алгоритмическую логику, нужны средства управления ходом работы программы: изменения порядка выполнения операторов в зависимости от различных условий, и эффективной организации работы часто повторяющихся фрагментов. Математически доказано, что любой алгоритм можно закодировать с помощью
var A, B : Integer; В начале фрагмента переменная A равна 3, а в конце -25. Условный оператор позволяет изменить порядок выполнения операторов в зависимости от выполнения некоторого условия. Вот как он записывается: if условие then действие else альтернатива ; Слова if (если), then (тогда), else (иначе) - зарезервированные. Действие и else альтернатива - это любые операторы Delphi, или несколько операторов, заключённых в логические скобки begin/end, или вызов подпрограммы. Если условие истинно, то выполняется действие, если ложно, то выполняется альтернатива. Условие представляет собой логическое выражение. В нём сравниваются значения выражений (в том числе также и логических), вызов функций, возвращающих значения типа Boolean, и комбинирование этих значений с помощью логических операций:
Результат выполнения операции логического И равен true, если оба операнда равны true. Результат выполнения операции логического ИЛИ равен true, если хотя бы один из операндов равен true. Результат выполнения операции исключающего ИЛИ равен true, если операнды не равны друг другу. Операторы цикла позволяют организовать многократное повторение одной и той же последовательности действий. В Delphi имеются три оператора, позволяющих это сделать:
Простой оператор цикла применяется, когда известно количество повторений цикла. Он записывается так: for счётчик := выражение-1 to выражение-2 do действие ; Счётчик - это переменная, которая должна быть объявлена перед логическим блоком, в котором оператор цикла расположен, и её тип должен относиться к одному из перечислимых типов, обычно Integer. Выражение-1 и выражение-2 могут быть как константой или идентификатором, так и вызовом функции. Действие - один или несколько операторов Delphi. Если это группа операторов, то они должны быть заключены в логические скобки begin/end. В начале работы оператора переменная-счётчик получает значение выражения-1. Если при этом значение счётчика окажется меньше или равно значению выражения-2, то выполняются операторы, входящие в действие. Это и есть один цикл. Затем переменная-счётчик принимает значение, следующее за текущим, и начинается новый цикл, то есть сравнение счётчика и выражения-2, выполнение действия, и так далее, до тех пор, пока значение переменной-счётчика не превысит значение выражения-2. Возможна работа оператора цикла, при котором переменная-счётчик будет не увеличиваться, а уменьшаться. В этом случае ключевое слово to заменяется на downto: for счётчик := выражение-1 downto выражение-2 do действие ; Соответственно, выражение-1 должно быть больше или равно выражению-2. Условный оператор цикла удобно использовать в том случае, когда количество повторений заранее не известно: while условие do тело цикла ; Этот цикл будет выполняться до тех пор, пока истинно условие (логическое выражение, возвращающее значение типа Boolean). При этом если это выражение сразу равно false, тело цикла не будет выполнено ни разу. Нужно очень внимательно следить за написанием условия и контролем завершения цикла, так как в результате ошибки цикл while будет повторяться бесконечное количество раз, что приведёт к "зацикливанию" и "зависанию" программы. Условный оператор повторения сначала выполняет тело цикла, а затем уже проверяет выполнение условия: repeat тело цикла until условие ; Таким образом, этот вариант цикла гарантирует, что тело цикла будет выполнен по крайней мере один раз. И будет выполняться до тех пор, пока условие не станет истинным (т.е. true). Стоит отметить, что это единственный оператор Delphi, в котором тело цикла не требуется заключать в логические скобки begin/end. Начало и конец тела цикла определяются по ключевым словам repeat и until. Вместе с операторами цикла используются специальные команды:
Break ; При её выполнении управление передаётся на первый оператор, следующий за оператором цикла. Команда продолжения цикла позволяет немедленно продолжить выполнение цикла, пропустив все оставшиеся операторы в теле цикла, то есть начать следующую итерацию. Вот эта команда: Continue ; Справедливости ради стоит рассказать об ещё одном операторе, позволяющем изменить последовательность выполнения программы. Это оператор перехода: goto метка ; В качестве метки может использоваться любой допустимый идентификатор или число в диапазоне от 0 до 9999. Метку предварительно необходимо объявить в разделе описания переменных, но с помощью не ключевого слова var, а ключевого слова label: label меткa ; или label список меток ; Переходить можно как вниз, так и вверх по программе. Двоеточие отделяет метку от оператора, на который производится переход. Пример использования оператора перехода: var X, Y: Integer; label A, B; begin A: X:=5 ; . . . операторы программы goto B; . . . B: Y:=25; goto A; end; Из этого примера видно, что оператор end ; завершающий программу, никогда не будет выполнен, то есть программа зациклится. Именно поэтому, вообще, использование оператора перехода является плохим стилем программирования, и без его использования вполне можно обойтись использованием условных операторов и операторов цикла. Единственный случай, когда использование оператора goto может быть оправдано - это выход из нескольких вложенных циклов, что иначе требует применения нескольких операторов Break. Пример. Сортировка одномерного массиваРассматриваются процедуры программы, приводятся подробные комментарии. Также можно скачать проект в виде архива. Цикл while и операторы goto использованы только для демонстрации работы с ними. Здесь - более правильный вариант с применением цикла repeat и оператора break.Параллельно замечу, что сортировка массива "методом пузырька" - неэффективный метод. Количество итераций (проходов цикла) растёт гораздо быстрее роста количества элементов, Сортировка массивов - типичная задача, где используются циклы. Существует множество методов сортировки массивов. В рассматриваемом примере рассматривается сортировка массива методом "пузырька". В ручном режиме работы программы можно видеть, как числа поднимаются вверх по массиву, подобно всплывающему пузырьку, и становится понятным такое название метода.
procedure TForm1.Button2Click(Sender: TObject); var i, n: Integer; //переменные цикла Sort: Boolean; //Переменная - признак окончания сортировки Obmen: Point; //Служебная переменная перестановки значений массива Label manual1, manual2; //Метки операторов перехода begin Sort:=True; //Признак неотсортированности массива n:=StringGrid1.RowCount-1; //Количество строк в таблице (без заголовка) if RadioButton1.Checked then goto manual1; //Переход на ручной режим while(Sort=True) do //Начало автоматического режима: в предыдущем цикле было событие сортировки manual1: //Начало ручного режима begin Sort:=False; //Допустим, что массив уже отсортирован (сортировка не нужна) for i:=1 to n-1 do //Опять проверяем все значения от 1 до n if(tab[i+1].digit < tab[i].digit) then //Проверка на возрастание значений. Равные значения не трогаем begin //Если неверно, то переставляем соседние значения: Obmen:=tab[i]; //1. Сохраняем одно из значений tab[i]:=tab[i+1]; //2. На его место переписываем соседнее значение tab[i+1]:=Obmen; //3. Переписываем сохранённое значение на новое место Sort:=True; //Признак того, что состоялось событие сортировки end; if RadioButton1.Checked then goto manual2; //Пропускаем переход к новому циклу автоматического режима end; //Здесь заканчивается очередной цикл авторежима и осуществляется переход к новому manual2: for i:=1 to n do //Переписываем отсортированные значения массива в таблицу begin StringGrid1.Cells[0, i]:=IntToStr(tab[i].n)+'.'; StringGrid1.Cells[1, i]:=IntToStr(tab[i].digit); end; end; end. Есть возможность немного улучшить процедуру сортировки, что ускорит её примерно на четверть. Дело в том, что после каждого завершённого цикла наибольший ещё неотсортированный элемент перемещается на своё место в низ таблицы. То есть, очередной k-й цикл уже последние k элементов может не просматривать. Для реализации этого нужно ввести переменную - счётчик циклов, и отнять её от переменной цикла. При этом те же 100 000 элементов сортируются уже за 24 секунды! Реализацию этого варианта предоставляю читателю, ввиду его крайней простоты. Структурные типы данных
В начало урока
Работа с файлами в Delphi |
© 2023 Delphi-Manual.ru - Уроки Delphi начинающим с нуля |