C# ile Ağaç Veri Yapısı Kullanarak Ürün Ağacı Tasarımı

Batuhan Düzgün tarafından yayınlanmıştır 25. January 2011 07:33

Merhaba arkadaşlar bu yazımda sizlerle birlikte Veri Yapıları'nda önemli bir konu olan Ağaç Yapısı'nı inceleyeceğim.Özellikle bu makalede Endüstri Mühendisliği'nde önemli bir yere sahip olan Ürün Ağaçları konusuna yazılım alanındaki önemli veri yapılarından biri olan Ağaç Yapısı kavramıyla bir çözüm getireceğiz.Ürün Ağaçları adı üstünde olduğu gibi bir ağaç şeklindedir.Ağaç üzerinde seviyeler vardır.Bir düğümün altında yer alan düğümler,o düğümün alt düğümleri olur.
 
Aşağıda Ürün Ağacına ait bir yapı sunulmuştur. 

Visual Studio'da "Windows Application" olan bir proje açalım.Ardından "Dugum" sınıfını tasarlayalım.  
 
Şimdi yazılımsal olarak problemimizi çözmeye çalışalım.İlk olarak şunu yapacağız,ürünlerin bilgilerini tutan bir düğüm yapısı tanımlayacağız.Tabi bu düğüm aynı zamanda alt sınıfları tutabilecek bir yapıya da sahip olmalı,bunu da List tipinde bir koleksiyon yardımıyla yapacağız.Düğüm sınıfına ait kodlar aşağıdaki gibidir.

class Dugum{

        privateList<Dugum>AltDugumlerListesi;//alt düğümleri tutacak olan Listtipinden koleksiyonumuz.

        privateDugum KokDugum;//altdüğümleri tutacak olan kök düğümümüz.

        privatestring UrunIsmi;//Ürününismini tutan değişken.

        privatedouble UrunMiktari;//Ürünmiktarını tutan değişken.

        privateint UrunSeviyesi;//Ürününağaçta hangi katmanda olduğunu tutacak olan değişkendir.

        public int URUNSEVIYESI

        {

            get{ return UrunSeviyesi; }

            set{ UrunSeviyesi = value; }

        }

        public double URUNMIKTAR

        {

            get{ return UrunMiktari; }

            set{ UrunMiktari = value; }

        }

        public string URUNISMI

        {

            get{ return UrunIsmi; }

            set{ UrunIsmi = value; }

        }

        public List<Dugum>ALTDUGUMLER //alt düğümelr listesini get bloğuyla ilekullanıma açıyoruz.

        {  //böylece kod güvenliğini sağlamış oluyoruz.

            //setkullanmadık çünkü sadece listeyi okuma işlemini yapmak istiyoruz.

            get{ return AltDugumlerListesi; }

        }

        publicDugum() { //Dugum sınıfının kurucusu içinde bu Listnesnesini oluşturuyoruz.

            this.AltDugumlerListesi= new List<Dugum>();

            //List'lersınırları olmayan dizilerdir.Tabi bu sınır belleğinizin boyutu ile orantılı.

        }

        public void KokDugumEkle(DugumKokDugum) {

            this.KokDugum= KokDugum;//Yukarıdan gelen düğümü kök düğüm olarakekliyoruz.

        }

        public void AltDugumEkle(DugumAltDugum) { //Kök düğüme alt düğüm eklemeyi sağlayanmetod'dur.

            this.AltDugumlerListesi.Add(AltDugum);//Gelen Dugum nesnesini alt düğüm olarak ekliyoruz.

        }

        public intGetAltDugumSayisi() {//kaç tane alt düğüm olduğunu öğrenebildiğimizmetod.

            returnthis.AltDugumlerListesi.Count;

        }

        //ağaç üzerindealt düğüm eklemek üzere belirlenecek olan düğümü bulmaya yarayan metod.

        public Dugum GetArananDugum(stringUrunIsmi) {

            DugumGecici=null;

            for(int i = 0; i < this.KokDugum.ALTDUGUMLER.Count;i++) {

                if(this.KokDugum.ALTDUGUMLER[i].URUNISMI ==UrunIsmi) {

                    Gecici = this.KokDugum.ALTDUGUMLER[i];

                }

            }

            if(Gecici == null) {

                Gecici = this.KokDugum;

            }

            returnGecici;

        }

    }
 
Şimdi ise aşağıdaki Form görüntüsüne ait olan bir arayüz tasarlayalım. 
 
 
 
Evet şimdi de formun arka planında ürün eklendikçe ürün ağacını oluşturacak olan kodları yazacağız.Form üzerinde çalışma mantığından biraz bahsetmek lazım aslında,form üzerinde yer alan combobox'tan kök düğüm olacak olan ürünü seçiyoruz,ardından bu kök düğüme alt düğüm olacak düğümlerin ürün ismi,ürün miktarı gibi bilgileri dolduruyoruz.Son olarak ise "Ürünü Ağaca Ekle" butonuna basarak,ilgili ürünü belirlediğimiz kök düğüme alt düğüm olarak eklemiş oluyoruz.
 

using System;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

 

namespaceUrunAgaciOlusturma

{

    public partial class Form1 : Form

    {

        DugumKokDugum; //Kök düğüm olacak olan düğümü tutan değişkendir.

        boolIlkDugumEklendimi = false; //ilk düğüm ise bu kök düğümdür,bir seferlik ağaç oluşturulurkenkullanılır.

        intAgacKatmani; //Ağacın seviyelerini tutan değişken.

        publicForm1()

        {

            InitializeComponent();

        }

        privatevoid Form1_Load(objectsender, EventArgs e)

        {

            AgacKatmani = 0; //ilk değer olarak sıfıra atanıyor.

            KokDugum = newDugum();//Ağacımızınkök düğümünü oluşturuyoruz.

        }

        privatevoid button1_Click(objectsender, EventArgs e)

        {

            if(!IlkDugumEklendimi)

            {

                //bukod bloğuna sadece ağacın ilk kök düğümü eklenirken yapılır.

                KokDugum.URUNISMI =txt_urun_ismi.Text.Trim(); //ürün ismini ekliyoruz.

                KokDugum.URUNMIKTAR = Convert.ToDouble(txt_urun_miktar.Text.Trim());//ürün miktarını ekliyoruz.

                KokDugum.URUNSEVIYESI = 0;//ürünün ağaca eklendiği seviye numarasını tutan değişken.

               KokDugum.KokDugumEkle(KokDugum); //Kök düğümolarak eklenir.

                IlkDugumEklendimi = true; //bu blok tamamenkapatılır.

                AgacKatmani++; //ağaç katman seviyesi bir artar.

               cmbbaglioldugu_dugum.Items.Add(KokDugum.URUNISMI);

                cmbbaglioldugu_dugum.Refresh();

               cmbbaglioldugu_dugum.SelectedItem =cmbbaglioldugu_dugum.Items[AgacKatmani-1];

 

                MessageBox.Show("Kök Düğüm Eklendi!");

            }

            else{

                DugumAltDugum = new Dugum();//alt düğüm olacak olan düğümü oluşturuyoruz.

                AltDugum.URUNISMI =txt_urun_ismi.Text.Trim();

                AltDugum.URUNMIKTAR = Convert.ToDouble(txt_urun_miktar.Text);

                AltDugum.URUNSEVIYESI =AgacKatmani;

               KokDugum.AltDugumEkle(AltDugum);

               cmbbaglioldugu_dugum.Items.Add(AltDugum.URUNISMI);

                cmbbaglioldugu_dugum.Refresh();

                cmbbaglioldugu_dugum.SelectedItem =cmbbaglioldugu_dugum.Items[AgacKatmani - 1];

                MessageBox.Show("Alt Ürün Ağaca Eklendi!");

            }

        }

        privatevoid cmbbaglioldugu_dugum_SelectedIndexChanged(object sender, EventArgse)

        {

            //bu kısımdacombobox'tan seçilen ürün değerine göre,ağaç üzerinde arama yapıp,bir düğüm döndürüyor.

            stringArananIfade = cmbbaglioldugu_dugum.SelectedItem.ToString();

            //kök düğümolarak ağaçta aranan düğüm bulunur ve atanır.

            KokDugum =KokDugum.GetArananDugum(ArananIfade);

            AgacKatmani++;

        }

    }

} 

 
Evet sonuçları break pointler koyarak kod üzerinde inceleyebilirsiniz.Bir sonraki makalemde görüşmek dileğiyle ...
 
Batuhan Düzgün
 
Sakarya Üniversitesi
 
Bilgisayar Mühendisliği 

Currently rated 5.0 by 4 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

C#

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  July 2018  >>
MoTuWeThFrSaSu
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

Yazıları geniş takvimde göster