WikiTurk
Editor Login | Register
Ekle

> Bilgisayar > Nesne Programlama > visual basic

Tahkikat-ı Enderun
(Relased 27.9.2009 18:17:57)
imageimageimage %109


VB.NETte Diziler


 Reklam



   Her Programlama dilinin temel konularından biri olan diziler konusunu VB.NET için inceledik. Dizi tanımlamaları dizilerin sınıflandırması dizilerle kullanılan fonksiyonlar hepsini bu makalede görmeniz mümkün.

   Öncelikle şunu belirtmek isterim ki bu benim yazgeliştir.comdaki ilk yazım. Amacım Vb.NET dili hakkında yaptığım incelemeleri bu sitenin seçkin okurları ile paylaşmak. Bu nedenle yazılarımla sizlere bir şeyler kazandırabilirsem kendimi amacıma ulaşmış bulacağım.

    Bu makalemde sizlere bir programlama dilinin değişmez konularından biri olan dizileri VB.NET dilindeki yerinden bahsedeceğim. Eğer dizi nedir diye bir tanım yapmak istersen bellekte aynı isim altında toplanmış.Aynı türden olan değişkenler kümesine dizi adı verilir. Bu tanım programcılıktaki dizi kavramını tanımlayacak yeterlikte bir tanımdır. Komut tabanlı dillerde dizi kavramına en uygun örnek matrislerdir. Özellikle matematiksel bir kavram olan matrisler bilgisayar programlarına aktarılırken bu dizilerden faydalanılır. Bu matrisin çeşitli parametreleri hesaplanırken hep diziler için öngörülmüş kural ve tanımlamalardan yola çıkılır.

            Şimdi gelelim VB.NET net içinde diziler dizi tanımlamalarına:

   Kavramları sınıflandırmak onları daha iyi anlamamıza daha iyi tanımlamamıza yardım eder. Bu nedenle her konuda olduğu gibi bu konuda da dizileri sınıflandıracağız. Dizileri pek çok şekilde sınıflandırmak mümkün ancak ben sadece dizileri eleman sayıları ve boyutları bakımından sınıflandırmayı uygun buldum.

Statik Diziler Dinamik Diziler Statik Diziler

   Statik diziler isminden de anlaşılacağı gibi statik yani durağan dizilerdir peki durağan olan nedir? Tabii ki dizinin eleman sayısı ve boyutudur. Yani dizinin eleman sayısı ve boyutu sabittir. Böylece sabit uzunlukta ve sabit boyutta bir dizi tipi tanımlamamıza yardımcı olur söz dizimi gayet basittir:

Public dizi(10) as integer

Bu söz dizimini kullanarak 10 değişkenli ve bir boyutlu bir dizi tanımlamış oluruz.

   Peki birden fazla boyutlu bir dizi tanımlamak istersek bunun söz dizimi nasıl olacak Bunun söz dizimi de aşağıdaki gibi olacaktır.

Public dizi(10,10) as integer

   Bu tanımlamayla 10 × 10 luk bir dizi tanımlamış olduk. Yazımın başında da söylediğim gibi bu dizi ile bir matris tanımlamak mümkündür.

Dinamik Diziler

   Dinamik dizilerin karakteristik özelliği eleman sayısı bakımından esnek oluşlarıdır. Eleman sayısı olarak önceden sabit bir değer içermezler. Yani son elemanları belli olmadı gibi herhangi bir boyut bilgisi de söz konusu değildir. Bu dizinin söz dizimi şu şekildedir.

Dim dizi() as integer

   Program akışı içerisinde dizinin gerçek boyutunu deklare etmek gerekirse "Redim" deyimi kullanılır.

ReDim dizi(i) as integer

   Bu kodlarla diziyi yeniden boyutlandırırken önceden dizi elemanları içerisine atanmış tüm değerler kaybolur. Bunu engellemek için yukarıdaki deyime "Preserve"  ifadesi eklenmelidir yani kod aşağıdaki şekli almalıdır.

ReDim Preserve dizi(i) as integer

Şeklinde olmalıdır.

   Evet şimdi yeni başlayan arkadaşlar için dizi kavramı oturmuştur. Peki şimdi biraz da dizi kavramının sınırlarında bahsedelim. Öncelikle kesin bir dille vurgulamak istiyorum bir dizi değişkeni tanımlandığı değişken türü ile sınırlıdır. Peki bir dizinin aynı boyut içerisindeki değişken sayısı yani eleman sayıları, yani indisi kaç tane olabilir?

   18446744073709551616 tane ile sınırlıdır. Ancak bu rakam sizi yanıltmasın bu dizideki indis sayısıdır. Örneğim 10 elemanlı bir dizinin indisler 0-9 arasındadır. Yani dizinin max indis değerleri 0- 18446744073709551615 arasındadır. Bu sayı rastgele üretilmiş bir sayı değildir. Bu sayının matematiksel formülü [(2^64)-1] olarak açıklanabilir. Bu değer de zaten long değişken tipinin üst sınırıdır.


   Ayrıca bir dizinin boyut sayısı birden fazla olabilir. Bunu az önce ifade etmiştim. Sınırları açıklıyorken bununda sınırı 32 dir. İndisler ve boyutlar için verdiğim değerler sadece VB.NET dili için geçerlidir. Diğer programlama dillerinde değişebilir. Bu nedenle başka bir programlama dilinde çalışırken bu makale baz alınmamalıdır.


   Dizilerde bazı zamanlarda dizinin üst sınırı program geliştiriciler tarafından bilinemeyebilir. Yada kontrol edilmek istenebilir. Program akışının sizden ne isteyeceğini hiçbir zaman tahmin edemezsiniz. Bir dizinin üst ve alt sınır indislerini döndüren iki adet fonksiyonumuz var. LBound ve UBound fonksiyonları


   LBound: Bir dizinin Alt sınırını belirler böylece alt sınırlar bilinerek işlem yapılmış olur.
   UBound : Bir dizinin üst sınırı belirlenerek işlem yapılmış olur.

   Peki bu fonksiyonları nasıl kullanacağız bir önceki örneklerde anlattıklarımla burada verilenleri gelin pekiştirelim ve sanal bir sorun yaratalım:

   Bizim programımızda öyle bir nokta olsun ki dizimizin üst sınırı 1-9 arasında ve dışarıdan giriliyor olsun böyle bir durumda dizimizin son ve ilk değişkenini bilmemiz zor olur her ne kadar dışarıdan girildiğinde bu değer öncelikle bir ara değişkene atanacak olsa da bizim bu durumu tekrar kontrol etmemiz kontrolün sağlığı açısından son derece önemlidir.

   Öncelikle dizi oluşturmak için özel bir prosedür yani yordam yazmamız gerekir.

Public Sub diziyap()
Dim I,s As Byte
bas:
i = InputBox("Kaç boyutlu bir dizi istiyorsunuz")
If i >= 10 Or i < 0 Then
GoTo bas
Else
ReDim Preserve dizi(i)
End If
End Sub

   Bu koddan da anlaşılacağı gibi bu kod sadece 1-9 arasında indis sayısına sahip bir dizi tanımlar. Gelin bu prosedürü bir ileri götürelim ve bunun içine dizinin elemanlarını da ilave edeceğimiz da geniş bir prosedür yazalım. Ama bir sorun var. Şimdi biz klasik bir yöntemle indis değerimizi For Next döngüsüne sokacağız.


For s = 1 To 9
ancak burada dizinin alt değerinin 1
üst değerinin 9 olduğunu nerden biliyorsunuz!
Next

   Evet sorun biraz karışık O halde biz şimdi dizinin üst değerini bilmiyoruz. Aslında i değişkeni içerisinde saklı ancak bizim yine de bunu kontrol ettirmemiz gerekir. Bu nedenle LBound ve UBound isimli fonksiyonlar kullanılır ve prosedür şu hale gelir.

Public dizi() As Integer
Public Sub diziyap()
Dim i, a, max, min As Byte
bas:
i = InputBox("Kaç boyutlu bir dizi istiyorsunuz")
If i >= 10 Or i < 0 Then
GoTo bas
Else
ReDim Preserve dizi(i)
End If
max = UBound(dizi, 1)
min = LBound(dizi, 1)
For a = min To max
dizi(a) = InputBox(a + ". dizi değerini gir")
Next
End Sub

   Bir de dizilerde sıralama yöntemleri var bu yöntemlere şöyle bir bakalım:

   Exchange Short:
   Peki Nedir bu ? Exchange Short tam olarak Türkçeye çevrildiğinde yer değiştirme sıralaması anlamını taşır. Gerçekten de dizilerde sıramla işlemi yapılırken bu yöntem en çok kullanılanıdır.

   i uzunluğunda bir d( i ) dizimiz olsun. Bu dizimizin elemanlarını küçükten büyüğe doğru sıralamak istiyoruz. O halde gerçekleştireceğimiz algoritma nasıl olmalıdır.? Önce dizinin ilk terimi son terimine kadar 2. 3. 4….i . terimlerin hepsiyle kendini karşılaştırır.Eğer kendinden küçük bir eleman varsa kendisi ile bu değeri yer değiştirir. Böylece 1 eleman dizi içindeki büyüklük bakımından ağırlık noktasını bulmuş olur. Daha sonra 2 eleman aynı işlemi yapar ve i . elemana kadar hepsi bu işlemi yaparlar. Sonuçta elimize geçen en önemli unsur. Bu diziler küçükten büyüğe doğru sıralanmış olmalarıdır.

   Öyle ki bunu şöyle küçük bir örnek ile açıklayalım. Vb.net i açın ve formun üzerine 2 adet textbox 2 ve 1 adet button koyun 1. textbox elimizdeki diziyi 2. textbox ise dizinin sıralanmış halini taşısın. Kodlar aşağıdaki gibi olacaktır.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim A()
As Integer
Dim i
As Integer
Dim t
As String
ReDim A(10)
For i = 0 To 9
A(i) = Rnd() * 1000
t = t + CStr(A(i)) & "-"
Next i
TextBox1.Text = t
sirala(A, 9)
t = ""
For i = 0 To 9
t = t + CStr(A(i)) & "-"
Next i
TextBox2.Text = t
End Sub Private Sub sirala(ByVal x() As Integer, ByVal n As Integer)
Dim i, j, t
As Integer
For i = 0 To n - 1
For j = i + 1 To n
If x(i) > x(j)
Then
t = x(i)
x(i) = x(j)
x(j) = t
End If
Next
Next
End Sub




Derecelendir
Kaynak www.yazgelistir.com
İçerik İhbarı



Open Source Document Project AUP&TOS