Книга программиста/Задачи на FormsABC
К оглавлению | Назад | Вперёд
Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.
Узнать сколько раз встречается данное число в матрице
правитьКомментарии к коду
- N - количество строк и столбцов матрицы
- Size - размер полей ввода
uses FormsABC;
const
N = 4;
Size = 70;
var
A: array [0..N - 1, 0..N - 1] of IntegerField;
Solve, RandomF: Button;
LowBorder, UpBorder: IntegerField;
Number: IntegerField;
Count: TextLabel;
procedure RandomFill();
begin
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
A[i, j].Value := Random(LowBorder.Value, UpBorder.Value);
end;
procedure SolveClick();
begin
var c := 0;
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
if A[i, j].Value = Number.Value then
Inc(c);
Count.Text := Format('Число {0} встречается в матрице {1} раз.', Number.Value, c);
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(360, 350);
var L1 := new TextLabel('Матрица:');
new FlowBreak(2);
for var i := 0 to N - 1 do
begin
for var j := 0 to N - 1 do
begin
A[i, j] := new IntegerField('', Size);
A[i, j].Value := 0;
end;
new FlowBreak();
end;
var L2 := new TextLabel('Максимумы:');
new FlowBreak(2);
Solve := new Button('Узнать количество');
Solve.Click += SolveClick;
RandomF := new Button('Заполнить случайными числами');
RandomF.Click += RandomFill;
new FlowBreak();
LowBorder := new IntegerField('Нижняя граница:');
UpBorder := new IntegerField('Верхняя граница:');
Number := new IntegerField('Число:');
new FlowBreak(2);
Count := new TextLabel('');
end.
Максимальные элементы столбцов матрицы
правитьuses FormsABC;
const
N = 4;
Size = 70;
var
A: array [0..N, 0..N - 1] of IntegerField;
Solve, RandomF: Button;
LowBorder, UpBorder: IntegerField;
procedure RandomFill();
begin
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
A[i, j].Value := Random(LowBorder.Value, UpBorder.Value);
end;
procedure SolveClick();
begin
for var j := 0 to N - 1 do
begin
var max := integer.MinValue;
for var i := 0 to N - 1 do
if A[i, j].Value > max then
max := A[i, j].Value;
A[N, j].Value := max;
end;
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(400, 400);
var L1 := new TextLabel('Матрица:');
new FlowBreak(2);
for var i := 0 to N - 1 do
begin
for var j := 0 to N - 1 do
begin
A[i, j] := new IntegerField('', Size);
A[i, j].Value := 0;
end;
new FlowBreak();
end;
var L2 := new TextLabel('Максимумы:');
new FlowBreak(2);
for var j := 0 to N - 1 do
A[N, j] := new IntegerField('', Size);
new FlowBreak();
Solve := new Button('Рассчитать максимумы');
Solve.Click += SolveClick;
RandomF := new Button('Заполнить случайными числами');
RandomF.Click += RandomFill;
new FlowBreak();
LowBorder := new IntegerField('Нижняя граница:');
UpBorder := new IntegerField('Верхняя граница:');
end.
Поменять местами строки матрицы
правитьuses FormsABC;
const
N = 4;
Size = 70;
var
A: array [0..N, 0..N - 1] of IntegerField;
Solve, RandomF: Button;
LowBorder, UpBorder: IntegerField;
StrI1, StrI2: IntegerField;
Warning: TextLabel;
procedure RandomFill();
begin
if LowBorder.Value > UpBorder.Value then
Warning.Text := 'LowBorder.Value должно быть меньше или равно UpBorder.Value.'
else
Warning.Text := '';
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
A[i, j].Value := Random(LowBorder.Value, UpBorder.Value);
end;
procedure SolveClick();
begin
for var j := 0 to N - 1 do
begin
var c := A[StrI1.Value, j].Value;
A[StrI1.Value, j].Value := A[StrI2.Value, j].Value;
A[StrI2.Value, j].Value := c;
end;
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(400, 440);
Warning := new TextLabel('');
new FlowBreak();
var L1 := new TextLabel('Матрица:');
new FlowBreak(2);
for var i := 0 to N - 1 do
begin
for var j := 0 to N - 1 do
begin
A[i, j] := new IntegerField('', Size);
A[i, j].Value := 0;
end;
new FlowBreak();
end;
var L2 := new TextLabel('Максимумы:');
new FlowBreak(2);
for var j := 0 to N - 1 do
A[N, j] := new IntegerField('', Size);
new FlowBreak();
Solve := new Button('Поменять местами две строки');
Solve.Click += SolveClick;
RandomF := new Button('Заполнить случайными числами');
RandomF.Click += RandomFill;
new FlowBreak();
LowBorder := new IntegerField('Нижняя граница:');
UpBorder := new IntegerField('Верхняя граница:');
new FlowBreak();
StrI1 := new IntegerField('Номер первой строки:');
StrI2 := new IntegerField('Номер второй строки:');
end.
Транспонирование матрицы
правитьКомментарии к коду
- N - количество строк матрицы
- M - количество столбцов матрицы
- Size - размер полей ввода
uses FormsABC;
const
N = 4;
M = 3;
Size = 70;
var
A: array [0..N - 1, 0..M - 1] of IntegerField;
B: array [0..M - 1, 0..N - 1] of IntegerField;
Solve, RandomF: Button;
LowBorder, UpBorder: IntegerField;
procedure RandomFill();
begin
for var i := 0 to N - 1 do
for var j := 0 to M - 1 do
A[i, j].Value := Random(LowBorder.Value, UpBorder.Value);
end;
procedure SolveClick();
begin
for var i := 0 to N - 1 do
for var j := 0 to M - 1 do
B[j, i].Value := A[i, j].Value;
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(400, 470);
var L1 := new TextLabel('Изначальная матрица:');
new FlowBreak(2);
for var i := 0 to N - 1 do
begin
for var j := 0 to M - 1 do
begin
A[i, j] := new IntegerField('', Size);
A[i, j].Value := 0;
end;
new FlowBreak();
end;
Solve := new Button('Транспонировать матрицу');
Solve.Click += SolveClick;
RandomF := new Button('Заполнить случайными числами');
RandomF.Click += RandomFill;
new FlowBreak();
LowBorder := new IntegerField('Нижняя граница:');
UpBorder := new IntegerField('Верхняя граница:');
new FlowBreak();
var L2 := new TextLabel('Транспонированная матрица:');
new FlowBreak(2);
for var i := 0 to M - 1 do
begin
for var j := 0 to N - 1 do
begin
B[i, j] := new IntegerField('', Size);
B[i, j].Value := 0;
end;
new FlowBreak();
end;
end.
Заливка матриц
правитьuses FormsABC;
const
N = 15;
var
A: array [0..N - 1, 0..N - 1] of Field;
ButterflyFill, HourglassFill: Button;
procedure ButterflyClick(); // Бабочка
begin
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
if (i <= N - j - 1) xor (i <= j) then
A[i, j].Text := 'X'
else
A[i, j].Text := '';
end;
procedure HourglassClick(); // Песочные часы
begin
for var i := 0 to N - 1 do
for var j := 0 to N - 1 do
if (i <= N - j - 1) and (i <= j) or (i >= N - j - 1) and (i >= j) then
A[i, j].Text := 'X'
else
A[i, j].Text := '';
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(400, 400);
for var i := 0 to N - 1 do
begin
for var j := 0 to N - 1 do
A[i, j] := new Field('', 20);
new FlowBreak();
end;
ButterflyFill := new Button('Бабочка');
ButterflyFill.Click += ButterflyClick;
HourglassFill := new Button('Песочные часы');
HourglassFill.Click += HourglassClick;
end.
Интегрирование
правитьuses FormsABC;
type
TFunction = function(x: real): real;
var
ABorder, BBorder: RealField;
Count: IntegerField;
Functions: ComboBox;
FunsList: List<TFunction>;
Outcome: RealField;
Solve: Button;
procedure SolveClick();
function Integrate(a, b: real; c: integer; func: TFunction): real; // Выполняет интегрирование функции f от a до b с шагом c.
begin
var s := (b - a) / c;
for var i := 0 to c - 1 do
Result += Abs(func(a + i * s));
Result *= s;
end;
begin
if (ABorder.Value <= BBorder.Value) and (Count.Value > 0) then
Outcome.Value := Integrate(ABorder.Value, BBorder.Value, Count.Value, FunsList[Functions.SelectedIndex]);
end;
begin
System.Windows.Forms.Application.EnableVisualStyles();
MainForm.SetSize(720, 100);
ABorder := new RealField('A:', 100);
BBorder := new RealField('B:', 100);
Count := new IntegerField('Количество:', 100);
Functions := new ComboBox();
Functions.Items.Add('Sin');
Functions.Items.Add('Cos');
Functions.Items.Add('Tg');
Functions.SelectedIndex := 0;
FunsList := new List<TFunction>();
FunsList.Add(Sin);
FunsList.Add(Cos);
FunsList.Add(Tan);
Outcome := new RealField('Результат:', 100);
Solve := new Button('Рассчитать площадь');
Solve.Click += SolveClick;
end.
Рисование мышью
правитьuses FormsABC;
uses System.Windows.Forms;
uses System.Drawing;
var
x, y: integer;
move: boolean;
canvas: PaintBox;
procedure MouseDown(e: MouseEventArgs) := move := true;
procedure MouseUp(e: MouseEventArgs) := move := false;
procedure MouseMove(e: MouseEventArgs);
begin
if move then
begin
canvas.Graphics().DrawLine(new Pen(Color.Black), x, y, e.X, e.Y);
canvas.Invalidate();
end;
x := e.X;
y := e.Y;
end;
begin
mainForm.Title := 'Рисование мышью';
mainForm.SetSize(600, 600);
mainForm.IsFixedSize := true;
parentControl := mainForm;
canvas := new PaintBox();
canvas.Dock := DockStyle.Fill;
canvas.MouseDown += MouseDown;
canvas.MouseUp += MouseUp;
canvas.MouseMove += MouseMove;
end.