C# ile küme işlemleri

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...