делфи 1. Программа. Этапы разработки
Скачать 187.37 Kb.
|
Алгоритм и программаНа первом этапе создания программы программист должен определить последовательность действий, которые необходимо выполнить, чтобы решить поставленную задачу, т. е. разработать алгоритм. Алгоритм – это точное предписание, определяющее процесс перехода от исходных данных к результату. Алгоритм решения задачи может быть представлен в виде словесного описания или графически – в виде блок-схемы. При изображении алгоритма в виде блок-схемы используются специальные символы (рис. 1.1). Рис. 1.1. Основные символы, используемые для представления алгоритма в виде блок-схемы Представление алгоритма в виде блок-схемы позволяет программисту уяснить последовательность действий, которые должны быть выполнены для решения задачи, убедиться в правильности понимания поставленной задачи. При программировании в Delphi алгоритм решения задачи представляет собой совокупность алгоритмов процедур обработки событий. В качестве примера на рис. 1.2 приведена совокупность алгоритмов программы Стоимость покупки, а на рис. 1.3 – ее диалоговое окно. После разработки диалогового окна и алгоритмов обработки событий можно приступить к написанию программы. Ее текст приведен в листинге 1.1. Рис. 1.2. Алгоритм программы вычисления стоимости покупки – совокупность алгоритмов обработки событий на компонентах формы Рис. 1.3. Окно (форма) программы Стоимость покупки Листинг 1.1. Программа Стоимость покупки. unit pokupka_1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCTRLs; type TForm1 = class(TForra) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; Label3: TLabel; procedure ButtonlClick(Sender: TObject); procedure Edit2KeyPress(Sender: TObject; var Key: Char); procedure EditlKeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Forml: TForm1; implementation {$R *.dfm} // подпрограмма procedure Summa; var cena: real; // цена kol: integer; // количество s: real; // сумма mes: string[255]; // сообщение begin cena: = StrToFloat(Form1.Edit1.Text); kol: = StrToInt(Forml.Edit2.Text); s: = cena * kol; if s > 500 then begin s: = s * 0.9; mes: = 'Предоставляется скидка 10%' + #13; end; mes: = mes+ 'Стоимость покупки: ' + FloatToStrF(s,ffFixed,4.2) +' руб.'; Forml.Label3.Caption: = mes; end; // щелчок на кнопке Стоимость procedure TForml.ButtonlClick(Sender: TObject); begin Summa; // вычислить сумму покупки end; // нажатие клавиши в поле Количество procedure TForml.Edit2KeyPress(Sender: TObject; var Key: Char); begin case Key of '0'.. '9',#8:; // цифры и клавиша #13: Summa; // вычислить стоимость покупки else Key: = Chr(O); // символ не отображать end; end; // нажатие клавиши в поле Цена procedure TForm1.EditlKeyPress(Sender: TObject; var Key: Char); begin case Key of '0'.. '9', #8:; // цифры и клавиша #13: Form1.Edit2.SetFocus; // клавиша Enter begin if Key = '.' then Key: = ', if Pos(', ',Edit1.Text) <> 0 then Key: = Chr(0); end; else // все остальные символы запрещены Key: = Chr(0); end; end; end. Компиляция Программа, представленная в виде инструкций языка программирования, называется исходной программой. Она состоит из инструкций, понятных человеку, но не понятных процессору компьютера. Чтобы процессор смог выполнить работу в соответствии с инструкциями исходной программы, исходная программа должна быть переведена на машинный язык – язык команд процессора. Задачу преобразования исходной программы в машинный код выполняет специальная программа – компилятор. Компилятор, схема работы которого приведена на рис. 1.4, выполняет последовательно две задачи: Проверяет текст исходной программы на отсутствие синтаксических ошибок. Создает (генерирует) исполняемую программу – машинный код. Рис. 1.4. Схема работы компилятора Следует отметить, что генерация исполняемой программы происходит только в том случае, если в тексте исходной программы нет синтаксических ошибок. Генерация машинного кода компилятором свидетельствует лишь о том, что в тексте программы нет синтаксических ошибок. Убедиться, что программа работает правильно можно только в процессе ее тестирования – пробных запусках программы и анализе полученных результатов. Например, если в программе вычисления корней квадратного уравнения допущена ошибка в выражении (формуле) вычисления дискриминанта, то, даже если это выражение будет синтаксически верно, программа выдаст неверные значения корней. Язык программирования Delphi. Типы данных. В среде программирования Delphi для записи программ используется язык программирования Delphi. Программа на Delphi представляет собой последовательность инструкций, которые довольно часто называют операторами. Одна инструкция от другой отделяется точкой с запятой. Каждая инструкция состоит из идентификаторов. Идентификатор может обозначать: Инструкцию языка (:=, if, while, for); переменную; константу (целое или дробное число); арифметическую (+, -, *, /) или логическую (and, or, not) операцию; подпрограмму (процедуру или функцию); отмечать начало (procedure, function) или конец (end) подпрограммы или блока (begin, end). Программа может оперировать данными различных типов: целыми и дробными числами, символами, строками символов, логическими величинами. Целый тип Язык Delphi поддерживает семь целых типов данных: shortint, smailint, Longint, Int64, Byte, word и Longword, описание которых приведено в табл. 1.1. Таблица 1.1. Целые типы.
Object Pascal поддерживает и наиболее универсальный целый тип – Integer, который Эквивалентен Longint. Вещественный тип Язык Delphi поддерживает шесть вещественных типов: Real48, single, Double, Extended, comp, Currency. Типы различаются между собой диапазоном допустимых значений, количеством значащих цифр и количеством байтов, необходимых для хранения данных в памяти компьютера (табл. 1.2). Таблица 1.2. Вещественные (дробные) типы.
Язык Delphi поддерживает и наиболее универсальный вещественный тип – Real, который э квивалентен Double. Символьный тип Язык Delphi поддерживает два символьных типа: Ansichar и Widechar: тип Ansichar – это символы в кодировке ANSI, которым соответствуют числа в диапазоне от 0 до 255; тип widechar – это символы в кодировке Unicode, им соответствуют числа от 0 до 65 535. Object Pascal поддерживает и наиболее универсальный символьный тип – Char, который эквивалентен Ansichar. Строковый тип Язык Delphi поддерживает три строковых типа: shortstring, Longstring и WideString: тип shortstring представляет собой статически размещаемые в памяти компьютера строки длиной от 0 до 255 символов; тип Longstring представляет собой динамически размещаемые в памяти строки, длина которых ограничена только объемом свободной памяти; тип WideString представляет собой динамически размещаемые в памяти строки, длина которых ограничена только объемом свободной памяти. Каждый символ строки типа WideString является Unicode-символом. В языке Delphi для обозначения строкового типа допускается использование идентификатора string. Тип string эквивалентен типу shortstring. В языке Delphi для обозначения строкового типа допускается использование идентификатора string. Тип string эквивалентен типу shortstring. Логический тип Логическая величина может принимать одно из двух значений True (истина) или False (ложь). В языке Delphi логические величины относят к типу Boolean. Переменная Переменная – это область памяти, в которой находятся данные, которыми оперирует программа. Когда программа манипулирует с данными, она, фактически, оперирует содержимым ячеек памяти, т. е. переменными. Чтобы программа могла обратиться к переменной (области памяти), например, для того, чтобы получить исходные данные для расчета по формуле или сохранить результат, переменная должна иметь имя. Имя переменной придумывает программист. В качестве имени переменной можно использовать последовательность из букв латинского алфавита, цифр и некоторых специальных символов. Первым символом в имени переменной должна быть буква. Пробел в имени переменной использовать нельзя. Следует обратить внимание на то, что компилятор языка Delphi не различает прописные и строчные буквы в именах переменных, поэтому имена SUMMA, Summa и summa обозначают одну и ту же переменную. Желательно, чтобы имя переменной было логически связано с ее назначением. Например, переменным, предназначенным для хранения коэффициентов и корней квадратного уравнения, которое в общем виде традиционно записывают: ах2 + bх + с = 0 Вполне логично присвоить имена а, b, с, x1 и х2. Другой пример. Если в программе есть переменные, предназначенные для хранения суммы покупки и величины скидки, то этим переменным можно присвоить имена: TotalSumm и Discount или ObSumma и Skidka. В языке Delphi каждая переменная перед использованием должна быть объявлена. С помощью объявления устанавливается не только факт существования переменной, но и задается ее тип, чем указывается и диапазон допустимых значений. В общем виде инструкция объявления переменной выглядит так: Имя: тип; Где: имя – имя переменной; тип – тип данных, для хранения которых предназначена переменная. Пример: а: Real; b: Real; i: Integer; В приведенных примерах объявлены две переменные типа real и одна переменная типа integer. В тексте программы объявление каждой переменной, как правило, помещают на отдельной строке. Если в программе имеется несколько переменных, относящихся к одному типу, то имена этих переменных можно перечислить в одной строке через запятую, а тип переменных указать после имени последней переменной через двоеточие, например: а,b,с: Real; x1,x2: Real; Константы В языке Delphi существует два вида констант: обычные и именованные. Обычная константа – это целое или дробное число, строка символов или отдельный символ, логическое значение. Числовые константы В тексте программы числовые константы записываются обычным образом, т. е. так же, как числа, например, при решении математических задач. При записи дробных чисел для разделения целой и дробных частей используется точка. Если константа отрицательная, то непосредственно перед первой цифрой ставится знак "минус". Ниже приведены примеры числовых констант: 123 0.0 -524.03 0 Дробные константы могут изображаться в виде числа с плавающей точкой. Представление в виде числа с плавающей точкой основано на том, что любое число может быть записано в алгебраической форме как произведение числа, меньшего 10, которое называется мантиссой, и степени десятки, именуемой порядком. В табл. 1.3 приведены примеры чисел, записанных в обычной форме, в алгебраической форме и форме с плавающей точкой. Таблица 1.3. Примеры записи дробных чисел.
Строковые и символьные константы Строковые и символьные константы заключаются в кавычки. Ниже приведены примеры строковых констант: 'Язык программирования Delphi' 'Delphi 7' '2.4' 'Д' Здесь следует обратить внимание на константу '2.4'. Это именно символьная константа, т. е. строка символов, которая изображает число "две целые четыре десятых", а не число 2.4. Логические константы Логическое высказывание (выражение) может быть либо истинно, либо ложно. Истине соответствует константа True, значению "ложь" – константа False. Именованная константа Именованная константа – это имя (идентификатор), которое в программе используется вместо самой константы. Именованная константа, как и переменная, перед использованием должна быть объявлена. В общем виде инструкция объявления именованной константы выглядит следующим образом: константа = значение; Где: константа – имя константы; значение – значение константы. Именованные константы объявляются в программе в разделе объявления констант, который начинается словом const. Ниже приведен пример объявления именованных констант (целой, строковой и дробной). const Bound = 10; Title = 'Скорость бега'; pi = 3.1415926; После объявления именованной константы в программе вместо самой константы можно использовать ее имя. В отличие от переменной, при объявлении константы тип явно не указывают. Тип константы определяется ее видом, например: 125 – константа целого типа; 0.0 – константа вещественного типа; ' выполнить ' – строковая константа; ' \' – символьная константа. Инструкция присваивания. Выражение. Инструкция присваивания является основной вычислительной инструкцией. Если в программе надо выполнить вычисление, то нужно использовать инструкцию присваивания. В результате выполнения инструкции присваивания значение переменной меняется, ей присваивается значение. В общем виде инструкция присваивания выглядит так: Имя: = Выражение; Где: Имя – переменная, значение которой изменяется в результате выполнения инструкции присваивания; := – символ инструкции присваивания. Выражение – выражение, значение которого присваивается переменной, имя которой указано слева от символа инструкции присваивания. Пример: Surama: = Сеnа * Kol; Skidka: = 10; Found: = False; Выражение Выражение состоит из операндов и операторов. Операторы находятся между операндами и обозначают действия, которые выполняются над операндами. В качестве операндов выражения можно использовать: переменную, константу, функцию или другое выражение. Основные алгебраические операторы приведены в табл. 1.4. Таблица 1.4. Алгебраические операторы.
При записи выражений между операндом и оператором, за исключением операторов DIV и MOD, пробел можно не ставить. Результат применения операторов +, -, * и / очевиден. Оператор DIV позволяет получить целую часть результата деления одного числа на другое. Например, значение выражения is DIV i равно 2. Оператор MOD, деление по модулю, позволяет получить остаток от деления одного числа на другое. Например, значение выражения 15 MOD 7 равно 1. В простейшем случае выражение может представлять собой константу или переменную. Примеры выражений: 123 0.001 i+1 А + В/С Summa*0.75 (В1+ВЗ+ВЗ)/3 Cena MOD 100 При вычислении значений выражений следует учитывать, что операторы имеют разный приоритет. Так у операторов *, /, DIV, MOD более высокий приоритет, чем у операторов + и -. Приоритет операторов влияет на порядок их выполнения. При вычислении значения выражения в первую очередь выполняются операторы с более высоким приоритетом. Если приоритет операторов в выражении одинаковый, то сначала выполняется тот оператор, который находится левее. Для задания нужного порядка выполнения операций в выражении можно использовать скобки, например: (r1+r2+r3)/(r1*r2*r3) Выражение, заключенное в скобки, трактуется как один операнд. Это означает, что операции над операндами в скобках будут выполняться в обычном порядке, но раньше, чем операции над операндами, находящимися за скобками. При записи выражений, содержащих скобки, должна соблюдаться парность скобок, т. е. число открывающих скобок должно быть равно числу закрывающих скобок. Нарушение парности скобок – наиболее распространенная ошибка при записи выражений. Тип выражения. Выполнение инструкции присваивания. Тип выражения определяется типом операндов, входящих в выражение, и зависит от операций, выполняемых над ними. Например, если оба операнда, над которыми выполняется операция сложения, целые, то очевидно, что результат тоже является целым. А если хотя бы один из операндов дробный, то тип результата дробный, даже в том случае, если дробная часть значения выражения равна нулю. Важно уметь определять тип выражения. При определении типа выражения следует иметь в виду, что тип константы определяется ее видом, а тип переменной задается в инструкции объявления. Например, константы 0, 1 и -512 – целого типа (integer), а константы 1.0, 0.0 и 3.2Е-05 – вещественного типа (real). В табл. 1.5 приведены правила определения типа выражения в зависимости от типа операндов и вида оператора. Таблица 1.5. Правила определения типа выражения.
Выполнение инструкции присваивания Инструкция присваивания выполняется следующим образом: Сначала вычисляется значение выражения, которое находится справа от символа инструкции присваивания. Затем вычисленное значение записывается в переменную, имя которой стоит слева от символа инструкции присваивания. Например, в результате выполнения инструкций: i: = 0; – значение переменной i становится равным нулю; а: = b+с; – значением переменной а будет число, равное сумме значений переменных ь и с; j: = j+1; – значение переменной j увеличивается на единицу. Инструкция присваивания считается верной, если тип выражения соответствует или может быть приведен к типу переменной, получающей значение. Например, переменной типа real можно присвоить значение выражения, тип которого real или integer, а переменной типа integer можно присвоить значение выражения только типа integer. Так, например, если переменные i и п имеют тип integer, а переменная d – тип real, то инструкции: i: = n/10; i: = 1.0; неправильные, а инструкция: d: = i+1; – правильная. Во время компиляции выполняется проверка соответствия типа выражения типу переменной. Если тип выражения не соответствует типу переменной, то компилятор выводит сообщение об ошибке: Incompatible types… and… Где вместо многоточий указывается тип выражения и переменной. Например, если переменная п целого типа, то инструкция n:= m/2 неверная, поэтому во время компиляции будет выведено сообщение: Incompatible types 'Integer' and.'Extended'. Стандартные функции. Математические функции. Для выполнения часто встречающихся вычислений и преобразований язык Delphi предоставляет программисту ряд стандартных функций. Значение функции связано с ее именем. Поэтому функцию можно использовать в качестве операнда выражения, например в инструкции присваивания. Так, чтобы вычислить квадратный корень, достаточно записать k: = Sqrt(n), где Sqrt – функция вычисления квадратного корня, n – переменная, которая содержит число, квадратный корень которого надо вычислить. Функция характеризуется типом значения и типом параметров. Тип переменной, которой присваивается значение функции, должен соответствовать типу функции. Точно так же тип фактического параметра функции, т. е. параметра, который указывается при обращении к функции, должен соответствовать типу формального параметра. Если это не так, компилятор выводит сообщение об ошибке. Математические функции Математические функции (табл. 1.6) позволяют выполнять различные вычисления. Таблица 1.6. Математические функции.
Величина угла тригонометрических функций должна быть выражена в радианах. Для преобразования величины угла из градусов в радианы используется формула (а*3.141525б)/180, где: а– величина угла в градусах; 3.1415926 – число л. Вместо дробной константы 3.1415926 можно использовать стандартную именованную константу PI. В этом случае выражение пересчета угла из градусов в радианы будет выглядеть так: a*Pi/180. Функции преобразования. Использование функций. Функции преобразования (табл. 1.7) наиболее часто используются в инструкциях, обеспечивающих ввод и вывод информации. Например, для того чтобы вывести в поле вывода (компонент Label) диалогового окна значение переменной типа real, необходимо преобразовать число в строку символов, изображающую данное число. Это можно сделать при помощи функции FloatToStr, которая возвращает строковое представление значения выражения, указанного в качестве параметра функции. Например, инструкция которая выводит значение переменной х в поле Label1: Label1.caption: = FloatTostr(x) Таблица 1.7. Функции преобразования.
Использование функций Обычно функции используют в качестве операндов выражений. Параметром функции может быть константа, переменная или выражение соответствующего типа. Ниже приведены примеры использования стандартных функций и функций преобразования. n: = Round((x2-x1)/dx); x1: = (-b + Sqrt(d)) / (2*а); m: = Random(10); cena: = StrToInt(Edit1.Text); Edit2.Text: = IntToStr(100); mes: = 'x1=' + FloatToStr(xl); Ввод данных Наиболее просто программа может получить исходные данные из окна ввода или из поля редактирования (компонент Edit). Ввод из окна ввода Окно ввода – это стандартное диалоговое окно, которое появляется на экране в результате вызова функции inputBox. Значение функции inputBox – строка, которую ввел пользователь. В общем виде инструкция ввода данных с использованием функции inputBox выглядит так: Переменная: = InputBox(Заголовок, Подсказка, Значение); Где: Переменная – переменная строкового типа, значение которой должно быть получено от пользователя; Заголовок – текст заголовка окна ввода; Подсказка – текст поясняющего сообщения; Значение – текст, который будет находиться в поле ввода, когда окно ввода появится на экране. Ниже в качестве примера приведена инструкция, используя которую можно получить исходные данные для программы пересчета веса из фунтов в килограммы. Окно ввода, соответствующее этой инструкции, приведено на рис. 1.5. s: = InputBox('Фунты-килограммы','Введите вес в фунтах','0'); Рис. 1.5. Пример окна ввода Если во время работы программы пользователь введет строку и щелкнет на кнопке ОК, то значением функции inputBox будет введенная строка. Если будет сделан щелчок на кнопке Cancel, то значением функции будет строка, переданная функции в качестве параметра значение. Следует еще раз обратить внимание на то, что значение функции inputBox строкового (string) типа. Поэтому если программе надо получить число, то введенная строка должна быть преобразована в число при помощи соответствующей функции преобразования. Например, фрагмент программы пересчета веса из фунтов в килограммы, обеспечивающий ввод исходных данных из окна ввода, может выглядеть так: s: = InputBox('Фунты-килограммы','Введите вес в фунтах',''); funt: = StrToFloat(s); Ввод из поля редактирования Поле редактирования – это компонент Edit. Ввод данных из поля редактирования осуществляется обращением к свойству Text. Рис. 1.6. Компонент Edit1 используется для ввода данных На рис. 1.6 приведен вид диалогового окна программы пересчета веса из фунтов в килограммы. Компонент Editl используется для ввода исходных данных. Инструкция ввода данных в этом случае будет иметь вид: Funt: = StrToFloat(Editl.Text); Вывод результатов. Вывод в окно сообщения. Наиболее просто программа может вывести результат своей работы в окно сообщения или в поле вывода (компонент Label) диалогового окна. Окна сообщений используются для привлечения внимания пользователя. При помощи окна сообщения программа может, к примеру, проинформировать об ошибке в исходных данных или запросить подтверждение выполнения необратимой операции, например, удаления файла. Вывести на экран окно с сообщением можно при помощи процедуры ShowMessage или функции MessageDlg. Процедура ShowMessage выводит на экран окно с текстом и командной кнопкой ОК. В общем виде инструкция вызова процедуры ShowMessage выглядит так: ShowMessage(Сообщение); Где Сообщение – текст, который будет выведен в окне. На рис. 1.7 приведен вид окна сообщения, полученного в результате выполнения инструкции: ShowMessage('Введите вес в фунтах.'); Рис. 1.7. Пример окна сообщения Следует обратить внимание на то, что в заголовке окна сообщения, выводимого процедурой ShowMessage, указано название приложения, которое задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла. Функция MessageDlg более универсальная. Она позволяет поместить в окно с сообщением один из стандартных значков, например "Внимание", задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. На рис. 1.8 приведено окно, выведенное в результате выполнения инструкции: r: = MessageDlg('Файл '+ FName + ' будет удален.', mtWarning, [mbOk,mbCancel], 0); Рис. 1.8. Пример окна сообщения Значение функции MessageDlg – число, проверив значение которого, можно определить, выбором какой командной кнопки был завершен диалог. В общем виде обращение к функции MessageDlg выглядит так: Выбор: = MessageDlg(Сообщение, Тип, Кнопки, КонтекстСправки) Где: Сообщение – текст сообщения; Тип – тип сообщения. Сообщение может быть информационным, предупреждающим или сообщением о критической ошибке. Каждому типу сообщения соответствует определенный значок. Тип сообщения задается именованной константой (табл. 1.8); Кнопки – список кнопок, отображаемых в окне сообщения. Список может состоять из нескольких разделенных запятыми именованных констант (табл. 1.9). Весь список заключается в квадратные скобки. КонтекстСправки – параметр, определяющий раздел справочной системы, который появится на экране, если пользователь нажмет клавишу F1. Если вывод справки не предусмотрен, то значение параметра КонтекстСправки должно быть равно нулю. Вывод результатов. Вывод в окно сообщения. Таблица 1.8. Константы функции MessageDlg.
Таблица 1.9. Константы функции MessageDlg.
Например, для того чтобы в окне сообщения появились кнопки ОК и Cancel, список Кнопки должен быть таким: [mbOK,mbCancel] Кроме приведенных констант можно использовать константы: mbokcancel, mbYesNoCancel и mbAbortRetryIgnore. Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации командных кнопок. Значение, возвращаемое функцией MessageDlg (табл. 1.10), позволяет определить, какая из командных кнопок была нажата пользователем. Таблица 1.10. Значения функции MessageDlg.
|