программный: текстами программ [3].
Для решения задачи 1 был разработан алгоритм, представленный в графическом виде. На рисунке 3 (Блок-схема решения задачи1) представлен алгоритм решения задачи в виде блок-схемы, а на рисунке 4 (Блок-схема подпрограммы задачи1) представлена блок-схема подпрограммы для вычисления расстояния до ближайшей стороны.
+
+
Рисунок 3 - Блок-схема решения задачи 1
При решении задач часто приходится выполнять многократные вычисления не только по одним и тем же формулам, но и по одним и тем же алгоритмам, в которых изменяются значения только некоторых переменных. В этом случае повторяющиеся части целесообразно оформлять в виде отдельных модулей - подпрограмм, дополняющих основную программу. Использование подпрограмм не только освобождает от переписывания повторяющихся фрагментов программного текста, но и улучшает наглядность и структуру программы, позволяет перейти к модульному программированию и оптимизировать программу, создать личную библиотеку программных модулей. В Delphi подпрограммы оформляют в виде процедур и функций, которые входят в основную программу путем соответствующего описания. Для решения задачи была использована подпрограмма, оформленная в виде функции пользователя, рисунок 4 (Блок-схема подпрограммы задачи 1).
Функция пользователя это один из способов оформления подпрограммы или фрагмента программы, предназначенного для решения части общей задачи [4]. Функция пользователя предназначена для вычисления только одного значения и передается в основную программу как значение одной переменной с именем этой функции. Параметры, записываемые в обращении к функции, называются фактическими, а параметры, указанные в ее описании, формальными. В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой - её значение. Иначе значение функции не будет определено.
Рисунок 4 - Блок-схема подпрограммы задачи 1
На основании созданной математической модели задачи 2 составим алгоритм программного приложения.
Алгоритм приложения задачи 2 является линейным, в нём операции выполняются последовательно одна за другой, в естественном и единственном порядке следования. Все операции имеют последовательное соединение логической связью передачи информационных потоков [3].
Для простых приложений не требуются блок - схемы алгоритмов. Составим алгоритм в вербальной форме.
В связи с изменением геометрических характеристик системы в зависимости от переменной W, алгоритм предполагает наличие следующих действий:
ввод значения радиуса барабана (R);
определение констант (размеры стержней АВ и СD);
определение значения угла W;
определение положения точки начала координат О (х0, у0);
определение значения переменной W1;
определение координат точек, которые определяют положение механизма;
производим рисование элементов на экране;
закрытие программного приложения.
При написании программного кода задачи 1 использовался условный оператор. Он позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор - это средство ветвления вычислительного процесса.
Структура условного оператора имеет следующий вид [1]:
if <условие> then <оператор1> else <оператор2>,
где: if/ then/ else - зарезервированные слова (если, то, иначе);
<условие> - произвольное выражение логического типа;
<оператор1>, <оператор2> - любые операторы языка Object Pascal.
Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть True (истина), то выполняется <оператор1>, а <оператор2> пропускается; если результат есть False (ложь), наоборот, <оператор1> пропускается, а выполняется <оператор2>. Условными называются выражения, имеющие одно из двух возможных значений: истина или ложь. Такие выражения чаще всего получаются при сравнении переменных с помощью операций отношения =, <>, >, >=, <, <=. Сложные логические выражения составляются с использованием логических операций and (логическое И), or (логическое ИЛИ) и not (логическое НЕ).
В процессе создания программного приложения задачи1 использовались следующие функции:
функция преобразования типа
StrToFloat (const S: string): Extended;
преобразует строку S в вещественное число [4]. Строка должна содержать знак, цифры и десятичный разделитель в порядке, характерном для записи десятичных дробей. Также строка может содержать мантиссу, состоящую из знака, буквы Е и целого числа. Пробелы в начале и в конце строки игнорируются. Если S имеет другой формат, функция возвращает сообщение об ошибке;
функция обратного преобразования типа
FloatToStr (Value: Extended): String;
преобразует вещественное число в строку, возвращаемый результат типа string [4]. Строка, параметр использовать необязательно. При указании параметра задается формат отображения;
математическая функция
Abs (n);
абсолютное значение n [1] ;
математическая функция
Sqrt (n);
квадратный корень из n [1] (n ≥ 0);
математическая функция
Sqr (n);
возведение в квадрат n [1].
В приложении задачи 1 использованы методы обработки событий, происходящих на форме, код которых создан во время работы приложения:
procedure Button1Click (Sender: TObject); - нажатие на кнопку Button1;
procedure Button2Click (Sender: TObject); - нажатие на кнопку Button2;
procedure Button3Click (Sender: TObject); - нажатие на кнопку Button3.
Для определения расстояния до ближайшей стороны в задаче 1 была написана пользовательская функция function Rj (k, x, n, y, m: real): real;.
В процессе создания программного приложения задачи 2 использовались следующие функции:
функция преобразования типа
StrToInt (const S: string): Integer;
преобразует строку S, в которую записано целое число, в целочисленный тип [4] ;
функция преобразования типа
Round (x: real): integer;
преобразует вещественное число в целое [1] ;
математическая функция Sin (a); - синус угла а, заданного в радианах [1] ;
математическая функция Cos (a); - косинус угла а, заданного в радианах [1].
В приложении задачи 2 использованы методы обработки событий, происходящих на форме, код которых создан во время работы приложения:
procedure Button1Click (Sender: TObject); - нажатие на кнопку Button1;
procedure SpinEdit1Change (Sender: TObject); - изменение содержимого SpinEdit.
Методы объекта Canvas, обеспечивающие рисование на элементах формы:
MoveTo (x,y) - перемещает в указанную позицию (x,y) карандаш, не вычерчивает никаких графических примитивов;
LineTo (x,y) - рисует линию, рисование осуществляется из текущей позиции карандаша в позицию (х, у);
Rectangle (x1,y1,x2,y2) - рисует прямоугольник, параметры x1, y1, x2, y2 - координаты находящихся на одной диагонали углов прямоугольника;
Ellipse (x1,y1,x2,y2) - рисует эллипс, параметры x1, y1, x2, y2 - координаты диагональных углов области, внутри которой вычерчивается эллипс;
TextOut (x,y, <Текст>); - выводит текст на графическую поверхность, параметры (х, у) задают положение текста на экране, параметр <Текст> содержит строку текста, которую необходимо отобразить [1].
При рисовании графических примитивов использовался объект "карандаш" (Canvas. Pen), с помощью него прорисовка линий осуществлялась с различной толщиной и с различным стилем [1]:
Pen. Style: =<const>; - определяет вид линии (задается специальными константами: psSolid- сплошная линия, psDot- пунктирная линия с короткими штрихами, psDash- пунктирная линия с длинными штрихами);
Pen. Width: =<числовое значение в пикселях>; - задает толщину выводимой линии в пикселях.
Программный код разработанного приложения к задаче 1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Math;
type
TForm1 = class (TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label8: TLabel;
Button3: TButton;
Label9: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
procedure Button2Click (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure Button3Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *. dfm}
procedure TForm1. Button2Click (Sender: TObject);
begin
close;
end;
procedure TForm1. Button3Click (Sender: TObject);
begin
Label15. Caption: = ('');
end;
procedure TForm1. Button1Click (Sender: TObject);
var
x1,x2,x3,x0,y1,y2,y3,y0: real;
a,b,c,a1,b1,c1,a2,b2,c2,a3,b3,c3,t1,t2,t3: real;
d1,d2,d3,d: real;
h,g,w: real;
// подпрограмма определения расстояния до ближайшей стороны
function Rj (k,x,n,y,m: real): real;
var
d0: real;
begin
d0: =abs (k*x+n*y+m) / (sqrt (sqr (k) +sqr (n)));
Rj: =d0;
end;
begin
// ввод координат вершин треугольника
x1: =strtofloat (edit1. text);
y2: =strtofloat (edit2. text);
x2: =strtofloat (edit3. text);
y2: =strtofloat (edit4. text);
x3: =strtofloat (edit5. text);
y3: =strtofloat (edit6. text);
// ввод координат точки
x0: =strtofloat (edit7. text);
y0: =strtofloat (edit8. text);
// вычисление длин сторон треугольника
a: =sqrt (sqr (x2-x1) +sqr (y2-y1));
b: =sqrt (sqr (x3-x2) +sqr (y3-y2));
c: =sqrt (sqr (x1-x3) +sqr (y1-y3));
// проверка условий существования треугольника
h: = a+b; g: =b+c; w: =a+c;
if ( (a>=g) or (b>=w) or (c>=h)) then Label15. Caption: ='Нет решения'
elsebegin
// вычисление параметров уравнений сторон треугольника
a1: =y2-y1; b1: =x1-x2; c1: = (-x1) * (y2-y1) +y1* (x2-x1);
a2: =y3-y2; b2: =x2-x3; c2: = (-x2) * (y3-y2) +y2* (x3-x2);
a3: =y1-y3; b1: =x3-x1; c3: = (-x3) * (y1-y3) +y3* (x1-x3);
t1: =sqrt (sqr (a1) +sqr (b1));
t2: =sqrt (sqr (a2) +sqr (b2));
t3: =sqrt (sqr (a3) +sqr (b3));
// проверка условия существования формулы для нахождения кратчайшего расстояния