C# ile küme işlemleri
Bu yazımızda matematikteki küme işlemlerini gerçekleştiren bir class yazacağız.
Küme kavramını bilmeyen yoktur. İlkokul yıllarımızdan beri bildiğimiz bir konudur.
Ben de bir class içinde küme işlemlerinin gerçeklemesini yapayım istedim.
"Kume" classımız tam sayı dizisini küme olarak kabul edecek.
Şimdi yapabileceğimiz işlemleri sıralayalım ve örnek kodla kullanalım:
1. Bir tam sayı dizisinden küme oluşturma
int[] dizi1 = { 1, 2, 4, 6 }; Kume kume1 = new Kume(dizi1);
2. Eleman sayısını hesaplama
Console.WriteLine(kume1.ElemanSayisi); // 4
3. Kümeyi ekrana yazdırma
Console.WriteLine(kume1); // {1, 2, 4, 6}
4. Kesişim kümesi
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { 2, 3, 4, 5 }; Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); var kesisim = kume1 & kume2; Console.WriteLine(kesisim); // {2, 4}
5. Birleşim kümesi
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { 2, 3, 4, 5 }; Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); var birlesim = kume1 + kume2; // veya var birlesim = kume1 | kume2; Console.WriteLine(birlesim); // {1, 2, 4, 6, 3, 5}
6. Fark kümesi
kume1 in kume2 den farkı:
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { 2, 3, 4, 5 }; Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); var fark = kume1 / kume2; Console.WriteLine(fark); // {1, 6}
7. Boş küme kontrolü
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { }; // 1.küme elemanları Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); Console.WriteLine(kume1.BosKumeMi()); // False Console.WriteLine(kume2.BosKumeMi()); // True
8. Eşit küme kontrolü
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { 2, 3, 4, 5 }; int[] dizi3 = { 1, 2, 4, 6 }; Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); Kume kume3 = new Kume(dizi3); Console.WriteLine(kume1 == kume2); // False Console.WriteLine(kume1 == kume3); // True
9. Denk küme kontrolü
int[] dizi1 = { 1, 2, 4, 6 }; int[] dizi2 = { 2, 3, 4, 5 }; int[] dizi3 = { 1, 2, 6 }; Kume kume1 = new Kume(dizi1); Kume kume2 = new Kume(dizi2); Kume kume3 = new Kume(dizi3); Console.WriteLine(kume1 >= kume2); // True Console.WriteLine(kume1 >= kume3); // False
10. Kümeye eleman ekleme
int[] dizi1 = { 1, 2, 4, 6 }; Kume kume1 = new Kume(dizi1); kume1.Ekle(7); Console.WriteLine(kume1); // {1, 2, 4, 6, 7}
11. Belirli bir pozisyondaki elemanı öğrenme
int[] dizi1 = { 1, 2, 4, 6 }; Kume kume1 = new Kume(dizi1); Console.WriteLine(kume1[2]); // 4
12. Eleman mevcut mu kontrolü
int[] dizi1 = { 1, 2, 4, 6 }; Kume kume1 = new Kume(dizi1); Console.WriteLine(kume1 >> 4); // True Console.WriteLine(kume1 >> 5); // False
13. Elemanları sıralama
int[] dizi1 = { 1, 5, 3, 2 }; Kume kume1 = new Kume(dizi1); Console.WriteLine(kume1); // {1, 5, 3, 2} kume1.Sirala(); Console.WriteLine(kume1); // {1, 2, 3, 5}
14. Alt kümeleri hesaplama
int[] dizi1 = { 1, 5, 3, 2 }; Kume kume1 = new Kume(dizi1); Kume[] altKumeler = kume1.AltKumeler(); // tüm alt kümeler küme dizisi olarak döndürülür
15. Alt kümeleri yazdırma
int[] dizi1 = { 1, 5, 3, 2 }; Kume kume1 = new Kume(dizi1); Kume[] altKumeler = kume1.AltKumeler(); Kume.AltKumeleriYaz(altKumeler); /* {} {1} {5} {1, 5} {3} {1, 3} {5, 3} {1, 5, 3} {2} {1, 2} {5, 2} {1, 5, 2} {3, 2} {1, 3, 2} {5, 3, 2} {1, 5, 3, 2} */
Yapabileceğimiz işlemler bu şekilde.
Şimdi de Kume classımı paylaşayım sizlerle:
public class Kume { private int[] intKume; // integer kümesi public Kume() { // COnstructor, intKume = null; } public int this[int pozisyon] { get { return intKume[pozisyon]; } } public Kume(int[] parDizi) { // Constructor, dizi parametre veriliyor, küme oluşturuluyor. for (int i = 0; i < parDizi.Length; i++) Ekle(parDizi[i]); } public bool Ekle(int eleman) { // Kümeye eleman ekliyor. önceden varsa eklemez. int adet = 0; if (intKume != null) adet = intKume.Length; if (!VarMi(eleman)) { int[] yeniKume = new int[adet + 1]; for (int i = 0; i < adet; i++) yeniKume[i] = intKume[i]; yeniKume[adet] = eleman; adet++; intKume = yeniKume; return true; } return false; } bool VarMi(int eleman) { // verilen eleman kümede var mı? int adet = 0; if (intKume != null) adet = intKume.Length; for (int i = 0; i < adet; i++) if (intKume[i] == eleman) return true; return false; } public bool BosKumeMi() { return ElemanSayisi == 0; } public int ElemanSayisi { get { // Kümenin eleman sayısı int adet = 0; if (intKume != null) adet = intKume.Length; return adet; } } public override string ToString() { // Küme ekrana yazdırılıyor. string s = ""; int adet = 0; if (intKume != null) adet = intKume.Length; s += "{"; for (int i = 0; i < adet; i++) { s += intKume[i]; if (i < adet - 1) s += ", "; } s += "}"; return s; } public void Sirala() { // Küme küçükten büyüğe sıralanıyor. // Düzgün ekran çıktıları için kullanıldı. int adet = ElemanSayisi; for (int i = 0; i < adet - 1; i++) for (int j = i + 1; j < adet; j++) if (intKume[i] > intKume[j]) { int temp = intKume[i]; intKume[i] = intKume[j]; intKume[j] = temp; } } static bool DenkMi(Kume kume1, Kume kume2) { return kume1.ElemanSayisi == kume2.ElemanSayisi; } static bool EsitMi(Kume kume1, Kume kume2) { if (kume1.ElemanSayisi == 0 && kume2.ElemanSayisi == 0) return true; if (kume1.ElemanSayisi == 0 || kume2.ElemanSayisi == 0) return false; // verilen küme ile kendisini karşılaştırıyor. int adet1 = kume1.ElemanSayisi; int adet2 = kume2.ElemanSayisi; if (adet1 != adet2) return false; for (int i = 0; i < adet2; i++) if (!kume1.VarMi(kume2[i])) return false; return true; } public static Kume operator +(Kume kume1, Kume kume2) { return kume1 | kume2; } public static Kume operator |(Kume kume1, Kume kume2) { return kume1.Birlestir(kume2); } public static Kume operator &(Kume kume1, Kume kume2) { return kume1.Kesisim(kume2); } public static Kume operator /(Kume kume1, Kume kume2) { Kume yeniKume = new Kume(); for (int i = 0; i < kume1.ElemanSayisi; i++) { if (!kume2.VarMi(kume1[i])) yeniKume.Ekle(kume1[i]); } return yeniKume; } public static bool operator >=(Kume kume1, Kume kume2) { return Kume.DenkMi(kume1, kume2); } public static bool operator <=(Kume kume1, Kume kume2) { return Kume.DenkMi(kume1, kume2); } public static bool operator ==(Kume kume1, Kume kume2) { return Kume.EsitMi(kume1, kume2); } public static bool operator !=(Kume kume1, Kume kume2) { return !Kume.EsitMi(kume1, kume2); } public static bool operator >>(Kume kume1, int eleman) { return kume1.VarMi(eleman); } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); } Kume Birlestir(Kume kume2) { // verilen küme ile kendisini birleştirip // yeni bir küme elde ediliyor. Kume yeniKume = new Kume(); int adet1 = ElemanSayisi; int adet2 = kume2.ElemanSayisi; for (int i = 0; i < adet1; i++) yeniKume.Ekle(this[i]); for (int i = 0; i < adet2; i++) if (!VarMi(kume2[i])) yeniKume.Ekle(kume2[i]); return yeniKume; } Kume Kesisim(Kume kume2) { // Verilen küme ile kendisinden // Kesişim kümesi elde ediliyor. Kume yeniKume = new Kume(); int adet1 = ElemanSayisi; int adet2 = kume2.ElemanSayisi; for (int i = 0; i < adet2; i++) if (VarMi(kume2[i])) yeniKume.Ekle(kume2[i]); return yeniKume; } public Kume[] AltKumeler() { // Alt kümelerden bir küme dizisi üretiyor. int n = this.ElemanSayisi; int altKumeSayisi = (int)Math.Pow(2, n); Kume[] temp = new Kume[altKumeSayisi]; for (int i = 0; i < altKumeSayisi; i++) { temp[i] = new Kume(); for (int j = 0; j < n; j++) { if ((i & (int)Math.Pow(2, j)) > 0) { temp[i].Ekle(this[j]); } } } return temp; } public static void AltKumeleriYaz(Kume[] altkume) { // Static method // verilen küme dizisini ekrana yazar. for (int i = 0; i < altkume.Length; i++) { bool ilkdefa = true; Console.Write("{"); for (int j = 0; j < altkume[i].ElemanSayisi; j++) { if (!ilkdefa) Console.Write(", "); Console.Write(altkume[i][j]); ilkdefa = false; } Console.WriteLine("}"); } } }
Özellikle operator overloading olayını öğrenmek isteyenler class ı dikkatlice inceleyebilirler.
Selamlar...
#küme #operator #overloading