Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 764 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 9:

Объектно-ориентированное программирование

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
ЗАДАЧА 9.2. Создать класс работы с квадратными матрицами, в котором перегрузить операции сложения и умножения. В классе создать метод проверки, что матрица является единичной.

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

Рис. 9.5. Результаты работы программы задачи 9.2
ЗАДАЧА 9.3. Создать класс "обыкновенная дробь", в котором перегрузить операции < и >.

На форму поместим четыре компонента 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.
Результаты работы программы задачи 9.3

Рис. 9.6. Результаты работы программы задачи 9.3
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.