|
По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Объектно-ориентированное программирование
В классе созданы по два метода перегрузки операций сложения и умножения. В первом случае складываются и перемножаются две матрицы. Во втором случае к матрице прибавляется вещественное число, и матрица умножается на вещественное число. На форму поместим кнопку и 8 компонент типа TLabel для вывода результатов. При щелчке по кнопке создаются 6 объектов типа "матрица", все они заполняются случайными числами. Третья матрица затем рассчитывается как сумма первых двух. Четвёртая матрица — резу льтат умножения первой матрицы на вторую. Пятая матрица получается из первой путем добавления к ней числа 10, а шестая — умножением первой матрицы на число 5. Первая и вторая матрицы также проверяются, не являются ли они единичными. Текст программы с комментариями приведён ниже, на рис. 9.5 показано окно работы программы.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics,
Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class (TForm)
Button1 : TButton;
Label2 : TLabel;
Label3 : TLabel;
Label4 : TLabel;
Label5 : TLabel;
Label6 : TLabel;
procedure Button1Click ( Sender : TObject );
procedure Memo1Change ( Sender : TObject );
private
{ private declarations }
public
{ public declarations }
end;
//объявление класса "матрица"
type
TMatrix = class
private
x : array [ 0.. 5, 0.. 5 ] of real; //элементы матрицы
public
constructor Create; //конструктор
//метод формирования строки, выводящей элементы матрицы
function MatrixToStr ( ) : String;
//функции проверки, является ли матрица единичной
function Pr_Edin ( ) : boolean;
end;
//объявление метода перегрузки операции "+" с
//классом "матрица"
//в данном случае складываются две матрицы
operator +(const a, b : TMatrix ) r : Tmatrix;
//объявление метода перегрузки операции "+" с
//классом "матрица"
//в данном случае к матрице добавляется вещественное число
operator +(const a : TMatrix; b : real ) r : TMatrix;
//объявление метода перегрузки операции "*"
//с классом "матрица"
operator * ( const a, b : TMatrix ) r : Tmatrix;
//объявление метода перегрузки операции "*" с
//классом "матрица"
//в данном случае матрица умножается на вещественное число
operator * ( const a : TMatrix; b : real ) r : TMatrix;
var
Form1 : TForm1;
matr1 : TMatrix;
matr2 : TMatrix;
matr3 : TMatrix;
matr4 : TMatrix;
matr5 : TMatrix;
matr6 : TMatrix;
implementation
//конструктор в классе "матрица", который
//заполняет матрицу случайными числами
constructor TMatrix. Create;
var i, j : integer;
begin
for i :=0 to 4 do
for j :=0 to 4 do
x [ i, j ] : =Random( 1 0 );
inherited Create;
end;
//Функции, проверяющая,
//является ли матрица единичной.
function TMatrix. Pr_Edin ( ) : boolean;
var i, j : integer;
begin
//предварительно решаем, что матрица единичная
Result := true;
for i :=0 to 4 do
for j :=0 to 4 do
//если на главной диагонали элемент не 1
//или вне главной диагонали элемент не 0,
if ( ( i=j ) and ( x [ i, j ]<>1)) or ( ( i <>j ) and ( x [ i, j ]<>0))
then
begin
//то в этом случае матрица не является единичной
Result:= false;
break; //выход из цикла
end;
end;
//метод перегрузки оператора "+" //сложение двух матриц
operator +(const a, b : TMatrix ) r : TMatrix;
var i, j : integer;
begin
r :=TMatrix. Create;
for i :=0 to 4 do
for j :=0 to 4 do
r. x [ i, j ] : = a. x [ i, i ]+b. x [ i, j ];
end;
//метод перегрузки оператора "*" -//перемножение двух матриц
operator * ( const a, b : TMatrix ) r : TMatrix;
var i, j, k : integer;
s : real;
begin
r :=TMatrix. Create;
for i :=0 to 4 do
for j :=0 to 4 do
begin
r. x [ i, j ] : = 0;
for k:=0 to 4 do
r. x [ i, j ] : = r. x [ i, j ]+a. x [ i, k ] * b. x [ k, j ];
end;
end;
//метод перегрузки оператора "+" -//сложение матрицы и вещественного числа
operator +(const a : TMatrix; b : real ) r : TMatrix;
var i, j : integer;
begin
r :=TMatrix. Create;
for i :=0 to 4 do
for j :=0 to 4 do
r. x [ i, j ] : = a. x [ i, j ]+b;
end;
//метод перегрузки оператора "*" -//умножение матрицы на вещественное число
operator * ( const a : TMatrix; b : real ) r : TMatrix;
var i, j : integer;
begin
r :=TMatrix. Create;
for i :=0 to 4 do
for j :=0 to 4 do
r. x [ i, j ] : = a. x [ i, j ] * b;
end;
//Метод формирования строки
//с элементами матрицы.
function TMatrix. MatrixToStr ( ) : String;
var s : string;
i, j : integer;
begin
s := ’ ’; //вначале строка пустая
for i :=0 to 4 do
begin
for j :=0 to 4 do
//добавление к s строки, которая представляет собой
//элемент матрицы и пробел
s := s+FloatTostrF ( x [ i, j ], ffFixed,5,2)+ ’ ’;
//формирование новой строки матрицы
s := s+ chr ( 1 3 );
end;
MatrixToStr := s;
end;
//Обработка кнопки Пуск:
//создание экземпляров класса Матрица,
//вычисление результирующих матриц путём
//сложения, умножения исходных матриц,
//умножение матрица на число
procedure TForm1. Button1Click ( Sender : TObject );
var Str1 : String;
begin
//Инициализация объектов:
//matr1, matr2 - исходные матрицы,
//заполняемые случайными числами;
//matr3 - матрица, получаемая
//сложением двух исходных матриц;
//matr4 - матрица, получаемая умножением
//двух исходных матриц;
//matr5 - матрица, получаемая добавлением
//к первой матрице числа 10;
//matr6 - матрица, получаемая умножением
//первой матрицы на число 5.
matr1 :=TMatrix. Create;
matr2 :=TMatrix. Create;
matr3 :=TMatrix. Create;
matr4 :=TMatrix. Create;
matr5 :=TMatrix. Create;
matr6 :=TMatrix. Create;
//Вычисление матриц matr3, matr4, matr5, matr6
//с помощью перегрузки операторов.
matr3 := matr1+matr2;
matr4 := matr1 * matr2;
matr5 := matr1 +10;
matr6 := matr1 * 5;
//Формирование строки вывода и её вывод
//в метку Label1 матрицы matr1.
Str1 := ’ Matrix1 ’+chr (13)+ matr1. MatrixToStr ( );
Label1. Caption := Str1;
//Проверка, является ли матрица matr1 единичной
//и вывод соответствующего сообщения.
if matr1. Pr_Edin()= true then
Str1 := ’ Matrix1 edinichnaya ’
else
Str1 := ’ Matrix1 ne edinichnaya ’;
Label5. Caption := Str1;
//Проверка, является ли матрица matr2 единичной
//и вывод соответствующего сообщения.
if matr2. Pr_Edin()= true then
Str1 := ’ Matrix2 edinichnaya ’
else
Str1 := ’ Matrix2 ne edinichnaya ’;
Label6. Caption := Str1;
Str1 := ’ Matrix2 ’+chr (13)+ matr2. MatrixToStr ( );
Label2. Caption := Str1;
//вывод элементов матрицы matr3=matr1+matr2
Str1 := ’ Matrix1+Matrix2 ’+chr (13)+ matr3. MatrixToStr ( );
Label3. Caption := Str1;
//вывод элементов матрицы matr4=matr1*matr2
Str1 := ’ Matrix1 * Matrix2 ’+chr (13)+ matr4. MatrixToStr ( );
Label4. Caption := Str1;
//вывод элементов матрицы matr5=matr1+10
Str1 := ’ Matrix1+10 ’+chr (13)+ matr5. MatrixToStr ( );
Label7. Caption := Str1;
//вывод элементов матрицы matr5=matr1*5
Str1 := ’ Matrix1 * 5 ’+chr (13)+ matr6. MatrixToStr ( );
Label8. Caption := Str1;
end;
initialization
{$I unit1.lrs}
end.
На форму поместим четыре компонента TEdit для ввода числителей и знаменателей двух обыкновенных дробей и компонент Memo1 для вывода результатов. Также разместим кнопку, при щелчке по которой инициализируются два объекта типа "обыкновенная дробь", затем они сравниваются и результаты выводятся в Memo1. Ниже приведён листинг программы с комментариями, на рис. 9.6 показаны результаты работы программы.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics,
Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class (TForm)
Button1 : Tbutton;
//поле для ввода числителя первой дроби
Edit1 : Tedit;
//поле для ввода знаменателя первой дроби
Edit2 : Tedit;
//поле для ввода числителя второй дроби
Edit3 : Tedit;
//поле для ввода знаменателя второй дроби
Edit4 : Tedit;
Label1 : TLabel;
Label2 : TLabel;
Label3 : TLabel;
Label4 : TLabel;
Memo1 : Tmemo; //поле для вывода результатов
procedure Button1Click ( Sender : TObject );
private
{ private declarations }
public
{ public declarations }
end;
//объявление класса "обыкновенная дробь"
type
TOb_Drob = class
private
Ch : integer; //числитель
Zn : integer; //знаменатель
public
constructor Create ( a, b : integer ); //конструктор
//метод формирования строки для вывода дроби
function DrobToStr ( ) : String;
end;
//Метод перегрузки оператора <
operator <(const a, b : TOb_Drob) r : boolean;
//Метод перегрузки оператора >
operator >(const a, b : TOb_Drob) r : boolean;
var
Form1 : Tform1;
//объявление переменных типа класса "обыкновенная дробь"
d1, d2 : TOb_Drob;
implementation
//конструктор
constructor TOb_drob. Create ( a, b : integer );
begin
Ch:=a; Zn:=b;
inherited Create;
end;
//описание метода перегрузки оператора < сравнения
//обыкновенных дробей
operator <(const a, b : TOb_Drob) r : boolean;
begin
if a. Ch* b. Zn <b. Ch * a. Zn then
r := true
else r := false;
end;
//описание метода перегрузки оператора > сравнения
//обыкновенных дробей
operator >(const a, b : TOb_Drob) r : boolean;
begin
if a. Ch* b. Zn > b. Ch * a. Zn then
r := true
else r := false;
end;
//описание метода формирования строки
//для вывода дроби на форму
function TOb_Drob. DrobToStr ( ) : String;
begin
if Zn<>0 then
if Ch_ Zn>0 then
DrobToStr := IntToStr (Ch)+ ’ / ’ + IntToStr ( Zn )
else
DrobToStr := ’_ ’+IntToStr ( abs (Ch))+ ’ / ’+
IntTostr ( abs ( Zn ) )
else
DrobToStr := ’ Dividing by a zero ’
end;
procedure TForm1. Button1Click ( Sender : TObject );
var Str1 : String;
a, b : integer;
begin
//чтение данных из полей ввода формы
a:= StrToInt ( Edit1. Text ); //числитель
b:= StrToInt ( Edit2. Text ); //значенатель
//инициализация первой дроби
d1:=TOb_Drob. Create ( a, b );
//чтение данных из полей ввода формы
a:= StrToInt ( Edit3. Text );
b:= StrToInt ( Edit4. Text );
//инициализация второй дроби
d2:=TOb_Drob. Create ( a, b );
//Формирование строки вывода и
//добавление ее в поле Memo1.
//Вывод исходной дроби d1.
Str1 := ’ Drob 1 ’+d1. DrobToStr ( );
Memo1. Lines.Add( Str1 );
//Вывод исходной дроби d2.
Str1 := ’ Drob2 ’+d2. DrobToStr ( );
Memo1. Lines.Add( Str1 );
//сравнение дробей с помощью перегрузки
//операторов < и > и вывод сообщения.
if d1<d2 then
Str1 := ’ Drob1 < Drob2 ’
else
if d1>d2 then
Str1 := ’ Drob1 > Drob2 ’
else
Str1 := ’ Drob1 = Drob2 ’;
Memo1. Lines.Add( Str1 );
end;
initialization
{$I unit1.lrs}
end.

