Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Зададим свойства нашего диалога. Во-первых, в свойстве Title надо написать заголовок окна диалога, например, "Введите имя файла для сохранения результатов". Во-вторых, в свойство DefaultExt записывается расширение, автоматически присоединяемое к введенному пользователем имени файла. Очевидно, оно должно быть txt, ведь мы сохраняем текстовый файл. Свойство Filter позволяет выбирать отображаемые в диалоге файлы по маске. Например, можно задать маски "Текстовые файлы (*.txt)" и "Все файлы (*.*)". Для этого окно редактирования фильтра нужно заполнить так, как показано на рис. 4. Текст в левой колонке – подсказка для пользователя, в правой – собственно маска файла.
Диалог имеет свойство Options, "раскрывающееся" в длинный список параметров. Из них нам нужны следующие (их надо установить в True):
foPathMustExist – введенный путь к файлу доложен существовать;

Рис. 4 – Окно редактирования фильтров файлового диалога.
foNoChangeDir – смена директории в файловом диалоге не будет приводить к смене текущей директории всей программы.
Остается написать очень простую процедуру сохранения результатов, вызывающуюся при щелчке по кнопке "Сохранить":
procedure TForm1.Button2Click(Sender: TObject);
begin
WITH SaveDialog1 DO
IF Execute THEN
Memo1.Lines. SaveToFile(filename)
end;
Оператор WITH "выносит за скобки" название компонента SaveDialog1, чтобы не писать одно и то же несколько раз. Без оператора WITH тот же фрагмент программы выглядел бы так:
begin
IF SaveDialog1.Execute THEN
Memo1.Lines. SaveToFile(SaveDialog1.filename)
end;
Здесь Execute – метод объекта SaveDialog, вызывающий отображение диалога на экране. Этот метод возвращает логическое значение в зависимости от того, ввел пользователь правильное имя файла или закрыл диалог, нажав Esc. Если имя было введено, то выполняется метод сохранения в файл SaveToFile, предусмотренный у свойства Lines компонента Memo. На вход метода подается имя файла, а оно хранится в свойстве FileName диалога SaveDialog.
2.2. Деактивация элементов интерфейса
В нашей программе присутствует существенный промах. Пользователь может попытаться сохранить в файл результаты расчета до того, как этот расчет произведен. Ничего хорошего из этого не выйдет – будет создан файл нулевой длины. Было бы неплохо не давать возможности нажать на кнопку "Сохранить" до тех пор, пока расчет не выполнен. Такая возможность предусмотрена – любой элемент интерфейса можно временно сделать выключенным (он будет виден на форме, но не будет реагировать на действия пользователя). За включенность-выключенность отвечает свойство Disabled. В начальный момент расчет еще не выполнен, поэтому у кнопки "Сохранить" установите это свойство в True. А после выполнения расчета кнопку "Сохранить" надо оживить. Для этого в конец процедуры расчета надо добавить строку
Button2.Enabled:=True
2.3. Использование клавиши Tab
Клавиша Tab в программах для Windows используется для переключения между элементами интерфейса, что позволяет вводить данные только с клавиатуры, не пользуясь мышью. Порядок "обхода" элементов интерфейса на форме важен: будет очень неудобно, если после ввода Xmin и нажатия Tab активным окажется не поле ввода Xmax, а, скажем, кнопка "Расчет".
Для задания порядка обхода нажмите правую кнопку мыши в любом месте над формой и выберите из контекстного меню пункт Tab Order. В появившемся окне (рис. 5) перечислены все имеющиеся на форме визуальные компоненты в порядке их обхода. Две клавиши со стрелками позволяют перемещать компоненты внутри списка, добиваясь нужного порядка следования.

Рис. 5 – Окно задания порядка табуляции.
Для нашей формы порядок обхода таков: XminàXmaxàhàРасчетàСохранить. Чтобы в компонент Memo вообще нельзя было зайти, установите его свойство TabStop в False.
2.4. Всплывающие подсказки
Вам уже не раз встречались всплывающие подсказки (hints) – прямоугольнички с текстом, появляющиеся, если задержать курсор мыши над каким-либо элементом интерфейса в Delphi, Word и других программах. То же самое можно сделать и в нашей программе. Все визуальные компоненты имеют свойство Hint, в которое записывается текст сообщения. Для того, чтобы подсказка появлялась на экране, надо еще установить свойство ShowHint в True.
Самостоятельно сделайте всплывающие подсказки для всех элементов интерфейса нашей программы.
3. Задание на работу
Разработать приложение в соответствии с полученным заданием.
4. Содержание отчета
Отчет по лабораторной работе должен содержать исходный код разработанной программы и снимок экрана с результатами ее работы.
5. Список использованных источников
1. Delphi. Программирование на языке высокого уровня: учебник для вузов / . – М.[и др.]: Питер, 2007. – 640 с.
2. Delphi 7: [наиболее полное руководство] / [и др.]. –СПб.: БХВ-Петербург, 2007. – 1216 с.
ЛАБОРАТОРНАЯ РАБОТА №8
Программирование алгоритмов с ветвлениями
1. Цель и задачи работы
Целью данной лабораторной работы является получение студентами базовых навыков программирования приложений с графическим интерфейсом пользователя.
Задачами лабораторной работы являются знакомство студентов с интегрированной средой разработки и создания программ с ветвлениями.
2. Общие положения
Программа с ветвлениями состоит из нескольких "кусков". То, какой из этих "кусков" будет выполняться, зависит от результата проверки условия. Условие сравнивает между собой две величины (на равенство, неравенство, больше, меньше и т. д.). Например, при решении квадратного уравнения нужно проверять, не оказался ли дискриминант отрицательным.
Условие всегда дает два и только два варианта ответа: да (условие выполняется) или нет (условие не выполняется). Примеры условий приведены в Табл. 1. Сравнивать между собой можно не только числа, но и буквы, и строки символов. Большей считается буква, стоящая ближе к началу алфавита.
Табл. 1
Параметры | Условие | Результат |
a=10 b=20 | a<b | да |
a=-5 b=-10 | a>b | да |
a=10 b=10.01 | a=b | нет |
a='a' b='z' | a>b | да |
a='abc' b='cde' | a=b | нет |
Условие "не равно" записывается как "<>", "больше или равно" – ">=", меньше или равно – "<=".
2.1. Логический тип данных
Итак, в результате проверки условия можно получить ответ "да" или "нет". Чтобы этот ответ можно было записать в переменную, в Delphi предусмотрен особый тип данных – логический. Переменные логического типа могут принимать только два значения: TRUE (да, истина) и FALSE (нет, ложь. Вспомните русское слово "фальшь"). Логический тип данных в программе назван BOOLEAN в честь английского математика XIX века Дж. Буля (J. Bool), разработавшего основы алгебры логики. Логические переменные нельзя ввести с клавиатуры, но можно вывести на экран. Рассмотрим следующий пример программы:
VAR l:BOOLEAN; a, b:WORD;
BEGIN
a:=10;
b:=20;
l:=a>=b
END;
Так как 10 не больше или равно 20, переменная l примет значение FALSE (ложь).
Разумеется, переменные логического типа нельзя смешивать с переменными других типов. Например, в приведенном примере присваивание типа a:=a+l будет полной бессмыслицей (как можно сложить число и слово FALSE?) и вызовет ошибку при компиляции.
2.2. Организация ветвлений
Имея условие или переменную логического типа, можно заставить программу выполнять разные последовательности операторов в зависимости от результата вычисления условия. Например, напишем программу, которая запрашивает с клавиатуры два числа и сообщает, какое из них больше – первое или второе.
Ветвление в программе организуется двумя операторами: IF (как говорится в программистском фольклоре, узник замка Иф был программистом J) и CASE. Сначала рассмотрим главный оператор ветвления – IF. Его общий вид таков:
Полная форма | Сокращенная форма |
IF условие THEN оператор1 ELSE оператор2; | IF условие THEN оператор1; |
Если (а IF по-английски и означает "если") условие истинно, то выполняется оператор1. Если же оно ложно, то либо выполняется оператор2, либо, при сокращенной форме – оператор, следующий за IF.
Наша программа будет выглядеть так (для краткости опустим оператор TRY..EXCEPT):
VAR a, b:REAL;
BEGIN
ClrScr;
a:=FloatToStr(LabeledEdit1.Text);
b:=FloatToStr(LabeledEdit1.Text);
IF a>b THEN
Label1.Caption:='Первое число больше второго'
ELSE
Label1.Caption:='Второе число больше первого'
END;
Обратите внимание на запись с отступами: операторы, стоящие внутри IF, смещаются вправо. Delphi этого не требует, ему все равно, а вот человеку разбираться в записи с отступами гораздо легче. Еще один важный момент – точка с запятой ставится только после второго оператора. Ни перед, ни после ELSE точки с запятой быть не может!
При использовании сокращенной формы записи нельзя забывать, что оператор, следующий за IF, про условие ничего не знает и никак с IF не связан. Скажем, следующий вариант программы ошибочен:
IF a>b THEN
Label1.Caption:='Первое число больше второго';
Label1.Caption:='Второе число больше первого'
Второй оператор присваивания := никак не связан с IF и будет выполняться всегда. В итоге в любом случае программа будет выводить текст 'Второе число больше первого'. Сокращенную форму используют тогда, когда при невыполнении условия ничего делать не надо.
2.3. Объединение операторов
Формат записи оператора IF позволяет поместить внутрь его лишь один оператор, выполняющийся, когда условие истинно, и один – когда оно ложно. Часто же нужно выполнить не один, а много операторов. Например, при решении квадратного уравнения после проверки неотрицательности дискриминанта нужно вычислить действительные корни уравнения, что требует как минимум двух операторов присваивания. Следующая запись неверна и вызовет ошибку при компиляции:
d:=SQR(b)-4*a*c;
IF d>=0 THEN
x1:=-b+SQRT(d)/(2*a);
x2:=-b-SQRT(d)/(2*a)
ELSE
Label1.Caption:='Корни комплексные';
Как же быть? Очень просто – нужно превратить несколько операторов в один. Для этого их объединяют при помощи уже известных нам операторных скобок BEGIN и END. Запись вида
BEGIN
оператор 1;
оператор 2;
…
оператор n
END;
рассматривается как один оператор. Не путайте BEGIN и END, являющимися операторными скобками, с BEGIN и END, отмечающими начало и конец всей программы. Таким образом, правильная запись такова:
d:=SQR(b)-4*a*c;
IF d>=0 THEN
BEGIN
x1:=-b+SQRT(d)/(2*a);
x2:=-b-SQRT(d)/(2*a)
END
ELSE
Label1.Caption:='Корни комплексные';
Обратите внимание, что оператор Label1.Caption:='Корни комплексные' в операторные скобки не заключен. Причина очевидна: это один-единственный оператор, его не с чем объединять. Запись вида
IF a>b THEN
BEGIN
c:=a+10
END;
хотя и не вызовет ошибки, но является избыточной и свидетельствует о низкой квалификации программиста. Скобки BEGIN … END здесь совершенно лишние.
2.4. Сложные условия
Во многих случаях нужно одновременно проверять несколько условий. Например, перед расчетом площади треугольника по длинам сторон все три длины стороны a, b,c обязаны быть положительными числами, т. е. должно выполняться условие "a>0 и b>0 и c>0". Для записи сложных условий в Delphi предусмотрен набор логических операций над условиями (Табл. 2). Обязательное требование – сами условия при этом записываются в скобках!
Поясним действие логических операций. Операция AND ("и") возвращает значение "истина" только в том случае, если оба условия, которые она соединяет, истинны. Если хотя бы одно из условий не выполняется, AND вернет "ложь". Операция OR ("или") не столь строга – она возвращает значение истина, если либо одно, либо другое, либо оба разу соединяемых условия истинны. Родственная операция XOR (исключающее "или") очень похожа на OR с той разницей, что она исключает случай, когда оба условия выполняются (или одно, или другое6 но не оба сразу). Наконец, операция NOT (отрицание) применяется не к двум, а к одному условию и просто "переворачивает" его: (a=b) есть то же самое, что NOT(a<>b).
Табл. 2
Операция | a | b | Результат | Операция | a | b | Результат |
(a) AND (b) | TRUE | TRUE | TRUE | NOT(a) | TRUE | - | FALSE |
TRUE | FALSE | FALSE | FALSE | - | TRUE | ||
FALSE | TRUE | FALSE | - | - | |||
FALSE | FALSE | FALSE | - | - | |||
(a) OR (b) | TRUE | TRUE | TRUE | (a) XOR (b) | TRUE | TRUE | FALSE |
TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | ||
FALSE | TRUE | TRUE | FALSE | TRUE | TRUE | ||
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
Вот как может выглядеть запись проверки всех трех введенных сторон треугольника на положительность:
IF (a>0) AND (b>0) AND (c>0) THEN
BEGIN
… вычисления
END
ELSE
Label1.Caption:='Стороны должны быть больше нуля';
Тот же пример можно записать и по-другому:
IF (a<=0) OR (b<=0) OR (c<=0) THEN
BEGIN
Label1.Caption:='Стороны должны быть больше нуля';
Exit // выход из процедуры
END;
… вычисления
END; // конец процедуры
2.5. Множественное ветвление
Оператор IF разделяет программу на два набора операторов, выполняемых в зависимости от результата вычисления заданного условия. Бывают ситуации, когда этого недостаточно. Например, пусть мы пишем программу-калькулятор. Она запрашивает у пользователя два числа и код выполняемого над ними действия (1 – сложение, 2 – умножение, 3 – вычитание, 4 - деление). Конечно, можно обойтись и кучей операторов IF, например, так:
VAR c:BYTE;
…
c:=IntToStr(LabeledEdit1.Text);
IF c=1 THEN
r:=a+b;
IF c=2 THEN
r:=a*b
…
и т. д. Но выглядит такая программа запутанно. Здесь лучше применить оператор множественного ветвления CASE. Для его использования должны соблюдаться два правила: во-первых, во всех проверяемых условиях одна и та же переменная должна сравниваться с константами. Так оно и есть: переменная с сравнивается с единицей, двойкой и т. д. Во-вторых, тип переменной с должен быть ограниченным. Это означает, что можно перечислить все значения этого типа. Скажем, тип BYTE – ограниченный, так как переменная типа BYTE принимает значения только от 0 до 255 и все их можно перечислить. А вот переменная типа REAL принимает бесчисленное множество значений (число дробных чисел в любом интервале бесконечно) и ее нельзя использовать в операторе CASE. Его общий вид таков:
Полная форма | Сокращенная форма |
CASE переменная OF значение1: оператор1; значение2: оператор2; … значениеN: операторN; ELSE операторM; END; | CASE переменная OF значение1: оператор1; значение2: оператор2; … значениеN: операторN; END; |
Обратите внимание, что слово END относится к самому оператору CASE и не требует никакого парного себе BEGIN. Заменим кучу IF'ов одним CASE:
CASE c OF { c – переменная перечислимого типа }
1: r:=a+b; ( если с=1, выполняется оператор r:=a+b )
2: r:=a*b;
3: r:=a-b;
4: IF b<>0 THEN r:=a/b ELSE Label1.Caption:='Деление на ноль'
ELSE
Label1.Caption:='введен неверный код действия'
END;
В CASE перечисляются возможные значения переменной, а после них через двоеточие записывается один-единственный оператор (надо больше – пишем BEGIN..END), выполняющийся, если переменная, имя которой указано между словами CASE и OF, равна указанному перед двоеточием значению. В операторе CASE может быть часть "иначе" (ELSE), оператор в которой выполняется, если значение переменной не совпало ни с одним из заданных.
3. Задание на работу
Разработать приложение в соответствии с полученным заданием.
4. Содержание отчета
Отчет по лабораторной работе должен содержать исходный код разработанной программы, блок-схему алгоритма программы и снимок экрана с результатами ее работы.
5. Список использованных источников
1. Delphi. Программирование на языке высокого уровня: учебник для вузов / . – М.[и др.]: Питер, 2007. – 640 с.
2. Delphi 7: [наиболее полное руководство] / [и др.]. –СПб.: БХВ-Петербург, 2007. – 1216 с.
ЛАБОРАТОРНАЯ РАБОТА №9
Программирование алгоритмов с циклами
1. Цель и задачи работы
Целью данной лабораторной работы является получение студентами базовых навыков программирования приложений с графическим интерфейсом пользователя.
Задачами лабораторной работы являются знакомство студентов с интегрированной средой разработки и создания программ с ветвлениями.
2. Общие положения
Цикл в программировании позволяет выполнить одну и ту же последовательность операторов несколько раз. Циклы используются в трех случаях:
Обработка массивов данных, когда одни и те же операции выполняются над многими данными.
Возврат "вверх" (к началу программы). Например, после выдачи результата программа спрашивает пользователя "Повторить?" и при утвердительном ответе повторяет расчет. Это реализуется только с помощью цикла.
Повторение операторов до наступления какого-то заданного условия (нажатия клавиши, достижения требуемой точности вычислений и т. д.)
Кроме того, в ряде случаев циклы позволяют избежать повторения одних и тех же операторов. Если в программе есть повторяющиеся фрагменты – она написана неправильно.
2.1. Цикл с предусловием
Наиболее общим в Delphi является цикл с предусловием, реализуемый оператором WHILE…DO. Вот его общий вид:
WHILE условие DO
оператор;
В качестве условия может выступать любое логическое выражение или переменная типа BOOLEAN. Работает такой цикл следующим образом. Сначала проверятся условие (отсюда и название – цикл с предусловием). Если условие истинно, то выполняется оператор (он называется "тело цикла"), а затем программа "пятится назад", снова оказывается на операторе WHILE..DO, снова проверяет условие… и так далее до тех пор, пока условие не станет ложным. Как только это случится, цикл прекращается, и начинает выполняться оператор, следующий за телом цикла.
Цикл с предусловием имеет интересную особенность: если в начале его работы условие оказалось ложным, то цикл вообще не будет выполняться ни разу.
Рассмотрим пример использования цикла WHILE. Пусть мы суммируем ряд натуральных чисел 1+2+3+… и хотим узнать, на каком числе этого ряда сумма превысит 100. Программа будет выглядеть следующим образом:
VAR s:WORD; { сумма }
i: WORD; { текущее число ряда }
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 |


