C#ta küme işlemleri(Kesişim-Birleşim-Tümleyeni)

Projenin amacı:  küme işlemlerinin, programlama olarak esnek modellenmesi ve uygunlanması işlemidir.

Projede kullanılan veri tipleri: Projede esnek olması amacıyla integer bir tip içeren bir class yazılmıştır. Bellekte kümelere giriş yapılacak elemanlara hafıza ayırırken esnek olması için list yapısı kullanıldı. List yapısında yazdığımız class tipinde bir liste oluşturduk ve listeye eleman ekledik. Liste yerine veriyi saklamak için dizi kullanabilirdik fakat ozamanda diziye ne kadar kullanıcı veri girişini yapabileceğini tahmin edemediğimizde fazla/eksik yer olacaktı ve sürekli dizide boyutlandırma yapacaktık buda bizim performansımızı, bellek kullanımımızı olumsuz etkileyecektir. Hiç efektif bir program yazmamış olacaktık.

Proje yazımındaki bilgiler: Kullanıcının veri girişi kolay olması açısından numeric updown kullanıldı ve bizim değer aralığımızda veri ile dolduruldu. Kullanıcının el ile farklı bir değer girmemesi için veriyi kümelere eklerken kontrol mekanizması oluşturuldu. Kullanıcı kümelere veriyi eklerken kolay olması açısından kutucuk eklendi. İşlemleri yaparken arayüzde kullanıcı tektekte işlem yaptırabilir yada tümü seçeneğini seçip tüm işlemleride yaptırabilir. Kod tarafında ise veri girişi kısmında değer aralığındamı diye kontrol ediyoruz. Karmaşıklık olmaması için her bir işlem için bir metod oluşturuldu. Eğer programımızda işlem yaparken bir hata olursa kullanıcının etkilenmemesi ve programımızın hata vermemesi için kodlarımız try catch bloğu içine yazıldı. Birleşim işleminde listeleri birleştirmek için kullanılan union fonksiyonu ile listeler birleştirildi ve yazdırmak için ise foreach döngüsü ile birleşen liste üzerinde kontrol yapılarak listbox elemanımıza yazdırıldı.Kesişim işleminde liste işlemlerinde bulunan contais metodu ile bir elemanı belirli bir listede aratılma işlemi yapıldı ve eğer bir listedeki eleman diğer bir listede var ise listbox elemanına yazdırıldı. Kümelerde fark alma işlemlerini liste fonksiyonları içerisinde tanımlı bulunan expect fonksiyonu ile yaptık. Bu fonksiyon bir liste içerisinde bulunan diğer bir listeden farkını çıkartmaktadır. Bu fark alma işlemlerini yaptıktan sonra gelen değeri var değişken tipinde tutup, foreach döngüsü ile ilgili ekrana yazdırılma işlemi yapılmıştır.

Tümleyen işlemlerinde ise değer aralığı kadar sayıyı üretiyoruz ve üretirken ise her üretilen sayıyı o listede varmı diye kontrol ediyoruz. Eğer sayı var ise o sayıyı if bloğunda kontrol ediyoruz ve ekrana yazdırmıyoruz. Eğer üretilen sayı kümede yok ise ekrana yazdırıyoruz. Bu işlemde for,foreach,if döngüsü ve bir adet bayrak kullanılmıştır.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Ayrik_matematik_proje1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        List<tip> ak = new List<tip>();
        List<tip> bk = new List<tip>();
        
        private void btnekle_Click(object sender, EventArgs e)
        {
            try
            {
                if (npsayi.Value > 1 && npsayi.Value < 100 && npsayi.Value % 2 == 1)
                {
                    tip ee = new tip();
                    if (chcAkumesi.Checked && chcBkumesi.Checked)
                    {
                       
                        ee.sayi = (Int32)npsayi.Value;
                        ak.Add(ee);
                        bk.Add(ee);
                        lsta.Items.Add(npsayi.Value);
                        lstb.Items.Add(npsayi.Value);
                    }
                    else if (chcAkumesi.Checked)
                    {
                        ee.sayi = (Int32)npsayi.Value;
                        ak.Add(ee);
                        lsta.Items.Add(npsayi.Value);
                    }
                    else if (chcBkumesi.Checked)
                    {
                        ee.sayi = (Int32)npsayi.Value;
                        bk.Add(ee);
                        lstb.Items.Add(npsayi.Value);
                    }
                    else
                    {
                        MessageBox.Show("Lütfen Eklenecek bir küme seçin.");
                    }
                }
                else
                {
                    MessageBox.Show("Belirtilen değer aralıklarında sayı giriniz. 1 ile 100 arasında tek sayı giriniz.");
                }
            }
            catch (Exception ex)
            {
                 
            }
        }

        private void btnhesapla_Click(object sender, EventArgs e)
        {

            try
            {
                foreach (var item in checkedListBox1.CheckedIndices)
                {
                    if (item.ToString() == "0")
                    {
                        kesisim();
                        birlesim();
                        afb();
                        bfa();
                        atun();
                        btun();
                        break;
                    }
                    else if (item.ToString() == "1")
                    {
                        kesisim();
                    }
                    else if (item.ToString() == "2")
                    {
                        birlesim();
                    }
                    else if (item.ToString() == "3")
                    {
                        afb();
                    }
                    else if (item.ToString() == "4")
                    {
                        bfa();
                    }
                    else if (item.ToString() == "5")
                    {
                        atun();
                    }
                    else if (item.ToString() == "6")
                    {
                        btun();
                    }



                }
                if (checkedListBox1.CheckedItems.Count < 1)
                {
                    MessageBox.Show("Hesaplama için bir işlem türü seçiniz.");

                }



            }
            catch (Exception ex2)
            { 
            }
        }

        private void btun()
        {
            int flag = 0;
            for (int i = 3; i < 100; i=i+2)
            {
                flag = 0;
              
                foreach (var item in bk)
                {
                    if (i == item.sayi)
                    {
                        flag = 1;
                        break;
                    }
                }
                if (flag==0)
                {
                    lstbtum.Items.Add(i);
                }
            }
        }

        private void atun()
        {
            int flag = 0;
            for (int i = 3; i <100; i = i + 2)
            {
                flag = 0;

                foreach (var item in ak)
                {
                    if (i == item.sayi)
                    {
                        flag = 1;
                        break;
                    }
                }
                if (flag == 0)
                {
                    lstatum.Items.Add(i);
                }
            }
        }

        private void bfa()
        {
            var intersect = bk.Except(ak);

            foreach (var value in intersect)
            {
                lstbfrk.Items.Add(value.sayi);
            }
        }

        private void afb()
        {
            var intersect = ak.Except(bk);  
                                                          
            foreach (var value in intersect)
            {
                lstafrk.Items.Add(value.sayi);
            }
        }

        private void birlesim()
        {
            var value = ak.Union(bk);
            foreach (var satir in value)
            {
                lstbirlesim.Items.Add(satir.sayi);
            }
        }

        public void kesisim()
        {

           for (int i = 0; i < ak.Count; i++)
            {
                if (bk.Contains(ak[i]))
                    lstkesisim.Items.Add(ak[i].sayi);
            }
        }

        private void lsttemizle_Click(object sender, EventArgs e)
        {
          //  lsta.Items.Clear();
            lstafrk.Items.Clear();
            lstatum.Items.Clear();
           // lstb.Items.Clear();
            lstbfrk.Items.Clear();
            lstbirlesim.Items.Clear();
            lstbtum.Items.Clear();
            lstkesisim.Items.Clear();


        }
    }
}