Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дріс 13.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
189 Кб
Скачать
☆

Бинарлық операторлар

Бинарлық операторлар: +, -, *, /, %, &, |, ^, <<, >>

Операторлар деректері үшін мына ереже дұрыс: функцияның бір параметрі класс түрінде болуы керек; егер класс операторымен (мысалы) + анықталса, онда оператор += автоматты түрде орындалады.

***** +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= операторлаы бірден анықтау мүмкін емес.  *****

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public override string ToString()

{

return i.ToString();

}

public static SomeClass operator + (SomeClass s, int ii)

{

s.i += ii;

return s;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

Console.WriteLine(sc + 3);

sc += 2;

Console.WriteLine(sc);

}

}

Салыстыру операторлары ==, !=, <, >, <=, >= ылғида екі екіден жазылады: == және !=, <және >, <= және >=.

&& және || операторлары бірден анықталмайды. Мына операторлрды & және | қолдануға болады.

[]операторы орнына индексаторларды қолдануға болады.

Мына операторларды анықтау мүмкін емес: =, ., ?:, ->, new, is, sizeof, typeof

() операторы анықталмайды,бірақ оған өз өзгертуіңді қолдануға болады.

Айқындалмаған анықталу

Бұл анықталу түр келтірілмей қолданылады. Бұндай анықталулар ерекше жағдай туғызбауы және мәліметті жоғалтпауы керек.

Айқындалаған анықталу

Бұл анықталу түр келтіріліп қолданылады. Бұндай анықталулар ерекше жағдай туғызады және мәліметтерді жоғалтуы мүмкін.

Айқындалмаған және айқындалған анықталу мысалы

using System;

class SomeClass

{

int i;

public SomeClass(int value)

{

i = value;

}

public override string ToString()

{

return i.ToString();

}

// Int түріндегі SomeClass айқындалмаған анықталуы

public static implicit operator int(SomeClass s)

{

return s.i;

}

// int түріндегі SomeClass айқындалған анықталуы

public static explicit operator SomeClass(int ii)

{

SomeClass s = new SomeClass(ii);

return s;

}

}

class Test

{

static void Main()

{

SomeClass sc = new SomeClass(10);

// Айқындалмаған анықталу

int i = sc;

Console.WriteLine(i);

// Айқындалған анықталу

sc = (SomeClass)100;

Console.WriteLine(sc);

}

}

Практикалық мысал. Матрица класы.

Бұл бөлімде операторларды анықтау мысалы қарастырылады.

// CSharpMatrix.cs

using System;

namespace CSharpApplication.ClassMatrixSample

{

class Matrix

{

// Матрица

int [,] mtr = null;

// Размерности

int M = 0, N = 0;

// Бірінші өлшемді қайтаратын қасиет

public int FirstDimension

{

get

{

return M;

}

}

// Екінші өлшемді қайтаратын қасиет

public int SecondDimension

{

get

{

return N;

}

}

// Бос объектіні тексеру

public bool IsEmpty

{

get

{

return mtr == null;

}

}

// Мән берілмегендегі конструктор

public Matrix()

{

// Жұмысты жеңілдету үшін құрылған

}

// Кез келген матрицаны құру конструкторы

public Matrix(int M, int N)

{

if(M <= 0 || N <= 0)

return;

this.M = M;

this.N = N;

mtr = new int[M, N];

}

// Көшіру конструкторының аналогы

public Matrix(Matrix m)

{

M = m.M;

N = m.N;

// Array класының Clone() функциясы

// массивтің беттік көшірілуін орындайды

mtr = (int[,])m.mtr.Clone();

}

// Массив түріндегі объектіні құру конструкторы

public Matrix(int [,] m)

{

// Берілген массив өлшемін анықтау

M = m.GetLength(0);

N = m.GetLength(1);

mtr = (int[,])m.Clone();

}

// Массив көшірмесін құру

public Matrix Copy()

{

// Көшіру конструкторын шақыру

return new Matrix(this);

}

// Матрица элементтеріне қатынас орнататын индексатор

public int this [int i, int j]

{

// Шекараны тексеруден алынған элемент

get

{

if(i < 0 || i >= M || j < 0 || j >= N)

throw new IndexOutOfRangeException();

return mtr[i, j];

}

// Шекараны тексеруден кейін элементке жаңа мән беру

set

{

if(i < 0 || i >= M || j < 0 || j >= N)

throw new IndexOutOfRangeException();

mtr[i, j] = value;

}

}

// Анықталмаған оператор + екі матрицаны қосу үшін

public static Matrix operator + (Matrix m1, Matrix m2)

{

// Қате кеткен жағдайда бос объект қайтарылады

if(m1.M != m2.M || m1.N != m2.N)

return new Matrix();

// Матрицаларды көбейту

Matrix Result = new Matrix(m1);

for(int i = 0; i < Result.M; i++)

{

for(int j = 0; j < Result.N; j++)

{

Result.mtr[i, j] += m2.mtr[i, j];

}

}

return Result;

}

// Анықталмаған оператор* екі матрица көбейтіндісі

public static Matrix operator * (Matrix m1, Matrix m2)

{

// Қате кеткен жағдайда бос объект қайтарылады

if(m1.N != m2.M)

return new Matrix();

// Матрицалар көбейтіндісі

Matrix Result = new Matrix(m1.M, m2.N);

for(int i = 0; i < m1.M; i++)

{

for(int j = 0; j < m2.N; j++)

{

for(int k = 0; k < m1.N; k++)

{

Result.mtr[i, j] += m1.mtr[i, k] * m2.mtr[k, j];

}

}

}

return Result;

}

// Анықталмаған оператор + матрицаны санға қосу үшін

public static Matrix operator + (Matrix m1, int value)

{

Matrix Result = new Matrix(m1);

for(int i = 0; i < Result.M; i++)

{

for(int j = 0; j < Result.N; j++)

{

Result.mtr[i, j] += value;

}

}

return Result;

}

// Анықталмаған операто* матрицаны санға көбейту үшін

public static Matrix operator * (Matrix m1, int value)

{

Matrix Result = new Matrix(m1);

for(int i = 0; i < m1.M; i++)

{

for(int j = 0; j < m1.N; j++)

{

Result.mtr[i, j] *= value;

}

}

return Result;

}

// Матрицалар тең еместігін тексеру (элементтер бойынша)

public static bool operator != (Matrix m1, Matrix m2)

{

if(m1.M != m2.M || m1.N != m2.N)

return true;

for(int i = 0; i < m1.M; i++)

{

for(int j = 0; j < m1.N; j++)

{

if(m1.mtr[i, j] != m2.mtr[i, j])

return true;

}

}

return false;

}

// Матрицалар теңдігін тексеру (элементтер бойынша)

public static bool operator == (Matrix m1, Matrix m2)

{

return !(m1 != m2);

}

// Мұрагерлікті анықтау (айқындалмаған Object класынан)

// объектілер теңдігін тексеретін Equals функциясы

public override bool Equals(object obj)

{

try

{

return (bool) (this == (Matrix) obj);

}

catch

{

// Егер obj Matrix класына жатпаса

return false;

}

}

// Мұрагерлікті анықтау (айқындалмаған Object класынан)

// объектінің хэш-кодын қайтаратын GetHashCode функцичсы

public override int GetHashCode()

{

// Дұрыс емес нұсқа

return M ^ N;

}

// Матрицаны экранға шығару

public void Print()

{

string s = new string('-', 79);

Console.WriteLine(s);

for(int i = 0; i < M; i++)

{

for(int j = 0; j < N; j++)

{

Console.Write("{0,5}", mtr[i, j]);

}

Console.WriteLine();

}

Console.WriteLine(s);

}

}

}

// User.cs

using System;

using CSharpApplication.ClassMatrixSample;

namespace CSharpApplication.ClassTestSample

{

class Test

{

// Класс мүмкіндігін тестілеу

static void Main()

{

int [,] a = new int[,] {

{ 1, 2, 3 },

{ 4, 5, 6 },

{ 7, 8, 9 }

};

Matrix m = new Matrix(a);

Console.WriteLine("m");

m.Print();

Matrix m1 = new Matrix(m);

Console.WriteLine("m1");

m1.Print();

Matrix m2 = m1.Copy();

Console.WriteLine("m2");

m2.Print();

m1 += m2 * 2;

Console.WriteLine("m1");

if(m1.IsEmpty)

{

Console.WriteLine("Empty object!!!");

}

else

{

m1.Print();

}

Matrix m3 = new Matrix();

m3 *= m3;

Console.WriteLine("m3");

if(!m3.IsEmpty)

{

m3.Print();

}

else

{

Console.WriteLine("Empty object!!!");

}

if(m1 == m2)

Console.WriteLine("Equal");

else

Console.WriteLine("Not Equal");

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]