Книга программиста/Задачи на FormsABC

Материал из Викиучебника — открытых книг для открытого мира

К оглавлению | Назад | Вперёд

Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.

Узнать сколько раз встречается данное число в матрице[править]

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.

Транспонирование матрицы[править]

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.