Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на Дельфи.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

29. Напишите программу, которая на поверхности формы вычерчивает график функции, например 2 sin(X) e*/5. Вид окна во время работы профаммы приведен на рис. 1.25.

Рис. 1.25. Окно программы График функции

// Функция, график которой надо построить Function f(x:real):real; begin f:=2*Sin(x)*exp(x/5); end;// строит трафик функции procedure GrOfFunc; var xl,x2:real; // границы изменения аргумента функции yl,y2:real; // границы изменения значения функции x:real; // аргумент функции у:real; // значение функции в точке х dx:real; // приращение аргумента l,b:integer; // левый нижний угол области вывода графика w,h:integer; // ширина и высота области вывода графика mx,my:real; // масштаб по осям X и Y хО,уО:integer; // точка — начало координатbegin // область вывода графика " 1:=10; // X — координата левого верхнего // угла b:=Forml.ClientHeight-20; // Y — координата левого верхнего // угла h:=Forml.ClientHeight-40; // высота w:=Forml.Width-40; // ширина xl:=0; // нижняя граница диапазона аргумента х2:=25; // верхняя граница диапазона аргумента dx:=0.01; // шаг аргумента // найдем максимальное и минимальное значения // функции на отрезке [xl,x2] yl:=f(xl); // минимум y2:=f(xl); //максимум х:=xl; repeat у := f(x); if у < yl then yl:=y; if у > у2 then y2:=y; x:=x+dx; until (x>=x2); // вычислим масштаб my:=h/abs(y2-yl); // масштаб по оси Y mx:=w/abs(x2-xl); // масштаб по оси X // оси хО:=1; уО:=b-Abs(Round(yl*my)); with forml.Canvas do begin // оси MoveTo(l,b);LineTo(l,b-h); MoveTo(xO,yO);LineTo(xO+w, yO) ; TextOut (l+5,b-h,FloatToStrF(y2,ffGeneral,6,3) ) ; TextOut(1+5,b,FloatToStrF(yl,ffGeneral, 6,3) ) ; // построение графика x:=xl; repeat y:=f(x); Pixels[xO+Round(x*mx),yO-Round(y*my)]:=clRed; x:=x+dx; until (x>=x2); end; end; procedure TForml.FormPaint(Sender: TObject); begin GrOfFunc; end;// изменился размер окна программы procedure TForml.FormResize(Sender: TObject); begin // очистить форму forml.Canvas.FillRect(Rect(0,O,ClientWidth,ClientHeight)); // построить график GrOfFunc; end;

30. Напишите программу, которая выводит на экран гистограм му, например, результатов контрольной работы. Пример окна программы во время ее работы приведен на рис. 1.26.

Рис. 1.26. Окно программы Гистограмма

implementation •{$R *.dfm}const NR = 4; // кол-во строк в таблице var n: array[1..NR] of real; // значения категорий p: array[1..NR] of real; // процент категории в общей сумме h: array[1..NR] of integer; // высота столбиков диаграммы // цвет столбиков диаграммы BarColor: array[1..4] of TColor = (clRed,clGreen,clBlue,clYellow);// ввод и обработка // если исходные данные введены, то Obr = TRUE function Obr : boolean; var sum: real; // сумма категорий га: integer; // номер категории, имеющей максимальное значение i: integer; begin obr := FALSE; // пусть исх. данные не введены // скопируем содержимое второго столбца // в массив исходных данных for i:=l to NR do // здесь возможно исключение (ошибка) преобразования, // если пользователь не ввел данные begin try n[i] := StrToFloat(Forml.StringGridl.Cells[1,i]); except on EConvertError do begin ShowMessage('Надо ввести данные во все' + #13 + 'ячейки второй колонки.'); exit; end; end; end; // вычислим сумму категорий (эл-тов второго столбца) sum := 0; for i:=l to NR do sum := sum + n [ i ]; // вычислим процент каждой категории for i:=l to NR do p[i] := n[i] / sum; // определим категорию с максимальным значением m := 1; for i := 2 to NR do if n[i] > n[m] then m:=i; // пусть максимальному значению соответствует // столбик высотой в Imagel.Height-20 пикселов // вычислим высоту остальных столбиков for i :=1 to NR do h[i] := Round((Forml.Imagel.Height - 20) * n[i] /n[m]) ; // все готово // можно строить диаграмму obr := TRUE; end; // диаграмма procedure diagr; const WR = 25; // ширина столбика DP. = 10; // расстояние между столбиками var х,у. integer; .// левый нижний угол столбика i: integer; begin with Forml. Imagel do begin x:=10; y.=Height; Canvas.Brush.Color := clWindow; Canvas.Rectangle(0,0,Width,Height); // *** рисуем столбики *** for i:=l to 4 do begin Canvas.Brush.Color := BarColor[i]; // цвет столбика « Canvas.Rectangle(x,у,x+WR,y-h[i]); // столбик Canvas.Brush.Color := clWindow; // чтобы область // за текстом // не была окрашена // подпись данных (над столбиком) Canvas.TextOut(x,y-h[i]-15, FloatToStrF(p[i]*100,ffGeneral,3,2)+'%'); x := x + WR + DR; end; // *** легенда *** // здесь х — координата левой границы // последнего столбика х := х + 20; у:=20; // 20 пикселов от верхнего края Imagel for i:=l to 4 do begin Canvas.Brush.Color := BarColor[i]; // цвет прямоугольника 11 легенды Canvas.Rectangle(x,у,x+25,y+14); // прямоугольник легенды Canvas.Brush.Color := clWindow; Canvas.TextOut(x+WR+10,у, Forml.StringGridl.Cells[0,i]); у := у + 20; end; end; // with Forml.Imagel end;procedure TForml.FormCreate(Sender: TObject); begin // определим заголовки колонок StringGridl.Cells[0,0] := 'Категория'; StringGridl.Cells[1,0] := 'Кол-во1; StringGridl.Width := StringGridl.ColWidths[01 + StringGridl.ColWidths[l]+5;end;// нажатие клавиши в ячейке таблицы (компонента StringGrid) // в результате нажатия клавиши <Enter> курсор переходит // в следующую ячейку procedure TForml.StringGridlKeyPress(Sender: TObject; var Key: Char); begin // Col, Row — номер колонки и строки, // в которой находится курсор (нумерация с нуля). // ColCount и RowCount — кол-во колонок и строк if Key = #13 then begin // нажата клавиша <Enter> if StringGridl.Col < StringGridl.ColCount - 1 then // ячейка не в последнем столбце StringGridl.Col := StringGridl.Col + 1 // к след. столбцу else // ячейка в последнем столбце if ( StringGridl.Row < StringGridl.RowCount — 1) then begin // в первый столбец следующей строки StringGridl.Col :=0; StringGridl.Row := StringGridl.Row +1; end else Buttonl.SetFocus; exit; // во вторую колонку разрешается вводить // только числа if StringGridl.Col = 1 then // клавиша нажата в ячейке '// второй колонки case Key of 1 0' . . ' 9', # 8 :; iii i . begin Key := DecimalSeparator; if Pos(DecimalSeparator, StringGridl.Cells[StringGridl.Row, StringGridl.Col]) о О then Key := Char(O); end; else Key := Char(O); end; end;// щелчок на кнопке Построить procedure TForml.ButtonlClick(Sender: TObject); begin if Obr // исходные данные введены then diagr; // строим диаграмму end;end.

31. Напишите программу, которая выводит на поверхность фор мы круговую диаграмму, отражающую, например, товарооборот книжного магазина (рис. 1.27).

32. Напишите программу, которая в отдельном окне строит гра фик функции. Функция задается таблицей, первая строка кото рой содержит значения аргументов, вторая — соответствующие значения функции. Рекомендуемый вид главной формы приве ден на рис. 1.28. Вид формы, на поверхности которой вычерчи вается график, представлен на рис. 1.29.

Рис. 1.27. Круговая диаграмма, отражающая товарооборот книжного магазина

Рис. 1.28. Главная форма приложения График

Рис. 1.29. Форма, на поверхности которой будет построен график

// Модуль главной формы приложенияunit grafikOl;interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;type TForml = class(TForm) StringGridl: TStringGrid; Labell: TLabel; Buttonl: TButton; CheckBoxl: TCheckBox; procedure ButtonlClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations ) public • / Public declarations ) end;var Forml: TForml;// Процедуру gr вызывает процедура обработки // события onPaint для формы Form2, на поверхности // которой вычерчивается график и которая // находится в другом модуле. Поэтому объявление // функции надо поместить в раздел Interface. procedure gr; // чтобы процедуру можно было вызвать // из другого модуля implementationuses grafikO2;{$R *.dfm}/ Во время создания формы установить свойства компонента StringGrid: FixedRows := 0; RowCount := 2; Opt ions. goEdit ing := True; Options. goTab := True; const COLCOUNT = 15; var // аргументы и значения функции х: array[1..COLCOUNT] of real; у: array[1..COLCOUNT] of real;// строит график по содержимому массивов х,у procedure gr; var i: integer; xl,x2:real; // границы изменения аргумента функции yl,y2:real; // границы изменения значения функции l,b:integer; // левый нижний угол области вывода графика w,h: integer; // ширина и высота области вывода графика mx,my:real; // масштаб по осям X и Y хО,уО:integer; // точка пересечения координатных осей рх,ру: integer; // координаты точки графика на поверхности // формы np: integer; // кол-во точек графикаbegin Form2.Canvas.Rectangle(0,0,Form2.ClientWidth,Form2.ClientHeight); // область вывода графика l:=10; // X — координата левого верхнего угла b:=Form2.ClientHeight-20; //Y — координата левого нижнего угла h:=Form2.ClientHeight-40; // высота w:=Form2.Width-40; // ширина // определим границы изменения аргумента // и количество точек (элементы массива X // должны образовывать возрастающую последовательность) xl:=x[l]; i:=l; while (x[i+l] > x[i]) and (i < COLCOUNT) do 1.— i+l; x2:= x[i]; //x[COLCOUNT-1]; np:=i; // количество точек if np < 2 then begin ShowMessage('Количество точек графика не может быть меньше двух'); exit; end;// найдем максимальное и минимальное значения функции yl:=0; //у[1]; // минимум у2:=0; //у[1]; // максимум for i: =1 to np do begin if y[i] < yl then yl:=y[i]; if y[i] > y2 then y2:=y[i]; end;// вычислим масштаб my:=h/abs(y2-yl); // масштаб по оси Y mx:=w/abs(x2-xl); // масштаб по оси X// точка пересечения координатных осей xO:=l+Abs(Round(xl*mx)); yO:=b-Abs(Round(yl*my));with form2.Canvas do begin MoveTo(xO,b);LineTo(xO,b-h); // ось Y MoveTo(l,yO) ;LineTo(l+w,yO) ; // ось X TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3)); TextOut(1+2,b+2,FloatToStrF(yl,ffGeneral,6,3})г // построить график for i :=1 to np do begin px := xO+Round(x[i]*mx); py := yO-Round(y[i]*my); Form2.Canvas.Pen.Color := clRed; Rectangle(px-2,py-2,px+2,py+2) ; // маркер if Forml.CheckBoxl.Checked then // соединительная линия if i = 1 then MoveTo(px,py) else LineTo(px,py);  Form2.Canvas.Pen.Color := clBlack; // значение функции и аргумент TextOut(px-5,py-15,FloatToStr(y[i]) ) ; TextOut(px-5,yO+2, FloatToStr(x[i])); MoveTo(px,py) ; // вернуть перо в точку рх, ру, // т. к. TextOut меняет положение пера end; end; end;procedure TForml.FormCreate(Sender: TObject); var i: integer; begin StringGridl.ColCount := COLCOUNT; StringGridl.Cells[0,0] := ' X1; StringGridl.Cells[0,1] := ' Y1; // отладка: заполним таблицу for i:=l to COLCOUNT do begin StringGridl.Cells[i,0] := IntToStr(i-1); StringGridl.Cells[i, 1] := IntToStr(i-1); end; end;// щелчок на кнопке Построить procedure TForml.ButtonlClick(Sender: TObject); var i: integer; begin // перепишем содержимое таблицы в массивы // аргументов и значений функции for i:=l to COLCOUNT-1 do begin x[i] := StrToFloat(Forml.StringGridl.Cells[i,0]); y[i] := StrToFloat(Forml.StringGridl.Cells[i,l]); end; // функцию вывода графика вызывает процедура // обработки события OnPaint для Form2 if not Form2.Showing then Form2.Show // отобразить окно Form2 else Form2.Repaint; end;end. // Модуль формы, на поверхности которой // вычерчивается график unit grafikO2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, grafikOl; // *** эта ссылка вставлена вручную!type TForm2 = class(TForml procedure FormPaint(Sender: TObject); procedure FormResize(Sender: T?>bject); private { Private declarations } public { Public declarations ) end;var Form2: TForm2;implementation{$R *.dfm}// событиеОпРаint происходит при первом появлении // окна на экране и тогда, когда окно // или его часть надо перерисовать procedure TForm2.FormPaint(Sender: TObject); begin gr; // вывести график end;// событие OnResize происходит, если // пользователь изменил размер окна procedure TForm2.FormResize{Sender: TObject); begin gr; // вывести график end;end.