- •Общие замечания
- •6. Написать программу, которая вычисляет скорость (км/час), с'которой бегун пробежал дистанцию. Рекомендуемый вид формы приведен на рис. 1.3. Количество минут задается целым числом, секунд — дробным.
- •17. Напишите программу "Электронные часы", на поверхности формы которой отображается текущее время (рис. 1.14).
- •18. Напишите программу "Электронные часы", в окне которой отображается текущее время и дата (рис. 1.15).
- •Графика
- •23. Напишите программу, которая на поверхности формы рису ет олимпийский флаг (рис. 1.19).
- •24. Напишите программу, которая на поверхности формы рисует флаг Российской Федерации. .
- •25. Напишите профамму, в диалоговом окне которой, в точке щелчка кнопкой мыши, вычерчивается контур пятиконечной звезды (рис. 1.20).
- •29. Напишите программу, которая на поверхности формы вычерчивает график функции, например 2 sin(X) e*/5. Вид окна во время работы профаммы приведен на рис. 1.25.
- •33. Напишите программу, по поверхности окна которой перемещается графический объект, например кораблик (рис. 1.30). Вид окна программы приведен на рис. 1.31.
- •34. Напишите программу, которая на поверхность формы выво дит изображение идущих часов с часовой, минутной и секунд ной стрелками. Окно и форма приложения приведены на рис. 1.32.
- •35. Напишите программу, которая в диалоговом окне выводит изображение идущих часов с часовой, минутной и секундной стрелками (рис. 1.33).
- •36. Напишите программу, по поверхности формы которой дви жется изображение (рис. 1.34). Изображение перемещающегося объекта и фоновый рисунок (рис. 1.35) должны загружаться из файла.
- •40. Напишите программу, используя которую можно просмот реть иллюстрации, находящиеся в одном из каталогов компью тера. Вид окна программы приведен на рис. 1.40.
- •Мультимедиа
- •45. Напишите программу, используя которую можно прослу шать звуковые файлы Windows. Рекомендуемый вид диалогового окна программы приведен на рис. 1.46.
- •Игры и полезные программы
- •55. Напишите программу "Собери картинку" — аналог игры "15", в которой игрок будет перемещать не цифры, а фрагменты кар тинки (рис. 1.59).
- •62. Напишите программу тестирования, в которой выбор пра вильного ответа осуществляется при помощи переключателя (рис. 1.69).
- •Базы данных
- •68. Напишите программу, используя которую можно подгото вить и распечатать накладную. Рекомендуемый вид формы про граммы приведен на рис. 1.77.
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.
