По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Объектно-ориентированное программирование
В классе созданы по два метода перегрузки операций сложения и умножения. В первом случае складываются и перемножаются две матрицы. Во втором случае к матрице прибавляется вещественное число, и матрица умножается на вещественное число. На форму поместим кнопку и 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.