Министерство транспорта Российской Федерации
Федеральное агентство железнодорожного транспорта
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Омский государственный университет путей сообщения (ОмГУПС (ОмИИТ))
ОТЧЕТ
по учебной практике
Студент
А.А. Штайгер
Омск 2015
Содержание
1. Разработка программы для построения графиков в декартовой системе координат
1.1 Задание
1.2 Листинг программы
1.3 Результат работы программы
2. Разработка программы для построения графиков в полярной системе координат
2.1 Задание
2.2 Листинг программы
2.3 Результат работы программы
3. Разработка программы для построения графиков в полярной системе координат
3.1 Задание
3.2 Листинг программы
3.3 Результат работы программы
4. Работа в графическом режиме (класс TCanvas)
4.1 Задание
4.2 Листинг программы
4.3 Результат работы программы
Заключение
1. Разработка программы для построения графиков в декартовой системе координат
1.1 Задание
Построить график функции f(x) на интервале [a,b].
,
1.2 Листинг программы
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, math;
//Функция, которая аналитически определяет график.
function f(x:real):real;
//Функция, которая изображает график.
procedure Graphika(a, b: real);
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
//Объявление переменных:
//x0, xk, y0, yk - отступы от границ
//x, y - массивы, определяющие координаты
//точек графика в "бумажной"
//u, v - массивы, определяющие координаты
//точек графика в "компонентной"
//системе координат;
//N - количество точек.
x0, y0, xk, yk, a, b :real;
x, y : array [0..1000] of real;
u, v : array [0..1000] of integer;
N : integer;
implementation
{$R *.lfm}
{ TForm1 }
// функция, которая будет изображена на компоненте Image1
function f (x : real) : real;
begin
if x<-1 then Result:=exp(1/5*(exp(x)+7))
else Result:=x*x-x+2;
end;
//функция, которая рисует график заданной функции на компоненте Image1.
procedure Graphika(a, b: real);
//Kx+1 - количество линий сетки,перпендикулярных оси ОХ.
//Ky+1 - количество линий сетки, перпендикулярных оси ОY.
const Kx=5;Ky=5;
var dx, dy, c, d, g, h, max, min :real;
i, tempx, tempy :integer; s : string;
begin
//Вычисление шага изменения по оси Х.
h:=(b-a)/(N-1);
//Формирование массивов x и y.
x[0]:=a;
y[0]:=f(x[0]);
for i:=1 to N do
begin
x[i]:=x[i-1]+h;
y[i]:=f(x[i]);
end;
//Вычисление максимального и минимального значений массива Y.
max:=y[0]; min:=y[0];
for i:=1 to N do
begin
if y[i]>max then max:=y[i];
if y[i]<min then min:=y[i];
end;
//формирование коэффициентов пересчета из "бумажной" в "компонентную" систему координат.
c:=(Form1.Image1.ClientWidth-x0-xk)/(b-a);
d:=x0-c*x[0];
g:=(Form1.Image1.ClientHeight-y0-yk)/(min-max);
h:=yk-g*max;
//Формирование массивов точек в экранной системе координат.
for i:=0 to N do
begin
u[i]:=trunc(c*x[i]+d);
v[i]:=trunc(g*y[i]+h);
end;
//Form1.Image1.Canvas.Color:= clGray;
Form1.Image1.Canvas .Pen .Mode:= pmNot;
//Рисование графика функции на компоненте Image1.
Form1.Image1.Canvas.MoveTo(u[0],v[0]);
Form1.Image1.Canvas.Pen.Width:= 2;
Form1.Image1.Canvas.Pen.Color:= clGreen;
for i:=1 to N do
Form1.Image1.Canvas.LineTo(u[i],v[i]);
Form1.Image1.Canvas.Pen.Width:= 1 ;
Form1.Image1.Canvas.Pen.Color:= clBlack;
//Рисование осей координат, если они попадают в область графика.
Form1.Image1.Canvas.MoveTo(trunc(x0),trunc(h));
if (trunc(h)>yk) and
(trunc(h)<trunc(Form1.Image1.ClientHeight-y0))
then
Form1.Image1.Canvas.LineTo(trunc
(Form1.Image1.ClientWidth -xk),trunc(h));
Form1.Image1.Canvas.MoveTo(trunc(d),trunc(yk));
if (trunc(d)>x0) and
(trunc(d)<trunc(Form1.Image1.ClientWidth-xk))
then
Form1.Image1.Canvas.LineTo(trunc(d),
trunc(Form1.Image1.ClientHeight -y0));
//Рисование линий сетки, вычисление расстояния между линиями сетки в "компонентной" системе координат,
//перпендикулярных оси ОХ
dx:=(Form1.Image1.ClientWidth -x0-xk)/KX;
//Выбираем тип линии для линий сетки,
for i:=0 to KX do
begin
//первую и последнюю линии сетки рисуем обычной сплошной линией,
if (i=0) or (i=KX) then
Form1.Image1.Canvas.Pen.Style:=psSolid
//остальные - рисуем пунктирными линиями.
else
Form1.Image1.Canvas.Pen.Style:=psDash;
//Рисование линии сетки, перпендикулярной оси Ох.
Form1.Image1.Canvas.MoveTo(trunc(x0+i*dx),
trunc(yk));
Form1.Image1.Canvas.LineTo(trunc(x0+i*dx),
trunc(Form1.Image1.ClientHeight -y0));
end;
//Вычисление расстояния между линиями сетки, перпендикулярными оси ОY, в "компонентной" системе координат.
dy:=(Form1.Image1.ClientHeight -y0-yk)/KY;
for i:=0 to KY do
begin
//Первую и последнюю линии сетки рисуем обычной сплошной линией,
if (i=0) or (i=KY) then
Form1.Image1.Canvas.Pen.Style:=psSolid
//остальные - рисуем пунктирными линиями.
else
Form1.Image1.Canvas.Pen.Style:=psDash;
//Рисование линии сетки, перпендикулярной оси ОY.
Form1.Image1.Canvas.MoveTo(trunc(x0),trunc(yk+i*dy));
Form1.Image1.Canvas.LineTo(trunc
(Form1.Image1.ClientWidth-xk),trunc(yk+i*dy));
end;
Form1.Image1.Canvas.Pen.Style:=psSolid;
//Вывод подписей под осями, определяем dx - расстояние между выводимыми под осью ОХ значениями.
dx:=(b-a)/KX;
tempy:=trunc(Form1.Image1.ClientHeight -y0+10);
for i:=0 to KX do
begin
//Преобразование выводимого значения в строку.
Str(a+i*dx:5:2,s);
//Вычисление х-координаты выводимого под осью ОХ значения в "компонентной" системе.
tempx:=trunc(x0+i*(Form1.Image1.ClientWidth -
x0-xk)/KX)-10;
//Вывод значения под осью ОХ
Form1.Image1.Canvas.TextOut(tempx,tempy,s);
end;
if (trunc(d)>x0) and
(trunc(d)<Form1.Image1.ClientWidth-xk) then
Form1.Image1.Canvas.TextOut(trunc(d)-5,tempy,'0');
//Определяем dy - расстояние между выводимыми левее оси ОY значениями.
dy:=(max-min)/KY;
tempx:=5;
for i:=0 to KY do
begin
//Преобразование выводимого значения в строку.
Str(max-i*dy:5:2,s);
//Вычисление y-координаты выводимого левее оси ОY значения в "компонентной" системе.
tempy:=trunc(yk-5+i*(Form1.Image1.ClientHeight- y0-yk)/KY);
//Вывод значения левее оси ОY.
Form1.Image1.Canvas.TextOut(tempx,tempy,s);
end;
if (trunc(h)>yk) and (trunc(h)<
Form1.Image1.ClientHeight-y0) then
Form1.Image1.Canvas.TextOut(tempx+10,
trunc(h)-5,'0');
tempx:=trunc(x0+i*(Form1.Image1.ClientWidth -x0-xk)/2);
Form1.Image1.Canvas.TextOut(tempx,10,
'График функции');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Graphika(a, b);
Form1.Image2.Visible:=true;;
end;
procedure TForm1.FormCreate(Sender: TObject);
var s:string;
kod:integer;
begin
Form1.Image1.Canvas.Brush.Color:=clWhite;
Form1.Image1.Canvas.FillRect(0,0,width,Height);
N:=100;
x0:=40;
xk:=40;
y0:=40;
yk:=40;
repeat
s:=InputBox('График непрерывной функции',
'Введите левую границу','-10');
Val(s,a,kod);
until kod=0;
repeat
s:=InputBox('График непрерывной функции',
'Введите правую границу','10');
Val(s,b,kod);
until kod=0;
end;
1.3 Результат работы программы
На рисунке 1 представлено главное окно программы.
Рисунок 1 - Главное окно программы
На рисунках 2 и 3 изображены окна задания левой и правой границ интервала.
Рисунок 2 - Окно задания левой границы
Рисунок 3 - Окно задания правой границы
На рисунке 4 представлен результат работы программы.
Рисунок 4 - Результат работы программы
2. Разработка программы для построения графиков в полярной системе координат
2.1 Задание
Построить график функции r(б) в полярной системе координат на интервале [б1, б2].
,
где R - длина вектора, м;
F - угол, рад.
2.2 Листинг программы
unit Unit1;
{$mode objfpc}{$H+}
Interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Types;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
n:string;
a,b,kod:integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
const
Scale = 20;
var
R, phi : Double;
X, Y : Integer;
CX, CY : Integer;
begin
CX := CenterPoint(ClientRect).X;
CY := CenterPoint(ClientRect).Y;
repeat
n:= InputBox('График функции в ПСК','Введите левую границу','0');
Val (n, a, kod) ;
until kod =0;
repeat
n:= InputBox ('График функции в ПСК','Введите правую границу','10');
Val(n, b, kod );
until kod =0;
phi := a;
with Self.Canvas do
while phi < b do
begin
R := abs(phi)*sin(phi);
X := CX + Trunc(Scale * R * Cos(phi));
y := CY - Trunc(Scale * R * Sin(phi));
Pixels[x, y] := clRed;
phi := phi + pi / 1800;
end;
Form1.Canvas.Pen.Width:=3;
Form1.Canvas.Pen.Color:=clBlack;
Form1.Canvas.MoveTo(CX,CY); // перемещаем позицию пера
Form1.Canvas.LineTo (width-20,CY); //рисование линии
Form1.Canvas.TextOut(CX,CY,'O');
Form1.Canvas.TextOut(width-20,CY-5,'A');
end;
end.
2.3 Результат работы программы
На рисунке 5 представлено главное окно программы.
Рисунок 5 - Главное окно программа
На рисунках 6 и 7 изображены окна задания левой и правой границ интервала. полярный текстовый редактор шрифт
Рисунок 6 - Окно задания левой границы
Рисунок 7 - Окно задания правой границы
На рисунке 8 представлен результат работы программы:
Рисунок 8 - Результат работы программы
3. Разработка программы для построения графиков в полярной системе координат
3.1 Задание
Создать программу - текстовый редактор (аналог Notepad). В основном меню программы должны присутствовать как минимум следующие команды: создание нового файла, открытие существующего файла, сохранение файла, сохранение файла под новым именем, изменение шрифта. В качестве основы редактора можно использовать компонент ТМемо.
3.2 Листинг программы
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Menus, ComCtrls, ColorBox;
type
{ TForm1 }
TForm1 = class(TForm)
ColorDialog1: TColorDialog;
FontDialog1: TFontDialog;
ImageList1: TImageList;
MainMenu1: TMainMenu;
Memo1: TMemo;
MenuItem1: TMenuItem;
MenuItem10: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
MenuItem7: TMenuItem;
MenuItem8: TMenuItem;
MenuItem9: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
procedure MenuItem10Click(Sender: TObject);
procedure MenuItem3Click(Sender: TObject);
procedure MenuItem4Click(Sender: TObject);
procedure MenuItem5Click(Sender: TObject);
procedure MenuItem6Click(Sender: TObject);
procedure MenuItem7Click(Sender: TObject);
procedure MenuItem8Click(Sender: TObject);
procedure MenuItem9Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
s:string;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.MenuItem8Click(Sender: TObject); //создать
begin
form1.Memo1.Lines.Clear;
form1.Caption:='Новый файл';
OpenDialog1.FileName:='';
end;
procedure TForm1.MenuItem4Click(Sender: TObject);//открыть
begin
if form1.OpenDialog1.Execute then
form1.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
form1.Caption:=OpenDialog1.FileName;
end;
procedure TForm1.MenuItem5Click(Sender: TObject); //сохранить
begin
if OpenDialog1.FileName<>'' then
begin
form1.Memo1.Lines.SaveToFile(OpenDialog1.FileName);
showmessage('Файл сохранен');
end
else begin
if form1.SaveDialog1.Execute then
form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);
form1.Caption:=SaveDialog1.FileName;
OpenDialog1.FileName:=SaveDialog1.FileName;
end;
end;
procedure TForm1.MenuItem6Click(Sender: TObject); //сохранить как
begin
if form1.SaveDialog1.Execute then
form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);
form1.Caption:=SaveDialog1.FileName;
OpenDialog1.FileName:=SaveDialog1.FileName;
end;
procedure TForm1.MenuItem7Click(Sender: TObject); //выход
begin
if MessageDlg('Сохранить перед закрытием?', mtCustom, [mbYes, mbNO], 0) = mrYes then
begin
if OpenDialog1.FileName<>'' then
begin
form1.Memo1.Lines.SaveToFile(OpenDialog1.FileName);
showmessage('Файл сохранен');
end
else begin
if form1.SaveDialog1.Execute then
form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);
form1.Caption:=SaveDialog1.FileName;
OpenDialog1.FileName:=SaveDialog1.FileName;
end;
end;
close;
end;
procedure TForm1.MenuItem9Click(Sender: TObject); // шрифт
begin
if form1.FontDialog1.Execute then
form1.Memo1.Font:=form1.FontDialog1.Font;
end;
procedure TForm1.MenuItem10Click(Sender: TObject); //цвет фона
begin
if form1.ColorDialog1.Execute then
Memo1.Color:=ColorDialog1.Color;
end;
procedure TForm1.MenuItem3Click(Sender: TObject); //справка
begin
showmessage('Текстовый редактор v1.3');
end;
end.
3.3 Результат работы программы
На рисунке 9 представлено главное окно программы.
Рисунок 9 - Главное окно программы
На рисунке 10 изображено выпадающее меню файл.
Рисунок 10 - Выпадающее меню «Файл»
На рисунке 11 представлено окно открытия файла.
Рисунок 11 - Окно открытия файла
На рисунке 12 изображено окно программы после форматирования шрифта и фона.
Рисунок 12 - Окно программы после форматирования шрифта и фона
На рисунке 13 изображено окно «Справка».
Рисунок 13 - Окно «Справка»
На рисунке 14 изображено окно выхода из программы.
Рисунок 14 - Окно выхода из программы
4. Работа в графическом режиме (класс TCanvas)
4.1 Задание
Создать программу с имитацией падения снежинок. Снежинки отображать в виде точек. Для каждой снежинки создать запись (или объект) содержащий следующие поля записи:
- x - координата по X;
- y - координата по Y;
- v - скорость.
При запуске программы, создается N снежинок. Для каждой случайным образом определяется положение и начальная скорость падения. По событию таймера, для каждой снежинки определяется новое положение на экране с учетом скорости, после чего скорость опять изменяется случайным образом.
При нажатии на форме левой кнопки мыши, направление движения снежинок изменяется в точку, где была нажата кнопка мышки.
4.2 Листинг программы
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,