Visual Basic Uygulamaları-4 Dİ Zİ LER (ARRAYS) ve Nesne Kü meleri Bellekte sürekli yer kaplayan aynı türden verilerin oluşturduğu kümeye dizi denir. Tanımdan da anlaşılacağı üzere bir dizinin dizi olabilmesi için; 1 Bellekte yer kaplaması 2 Aynı tür elemanlardan oluşmuş olması gerekir. Dizilerin her elemanı ayrı bir nesne gibi ele alınmalıdır. Dizi tanımlarken; o dizinin adını ve dizi içerisindeki elemanlara erişmek amacıyla onun kaçıncı eleman olduğunu belirten indisini ( index, subscript) yazmak gerekir. Visual Basic de diziler Boyut Aç anlamında, DIM komutu ile tanımlanırlar. Genelde dizilerin ilk elemanı 0. indisli elemanıdır. İçerisinde sayıları sakladığımız 5 elemanlı A dizisini aşağıdaki gibi gösterebiliriz: A( ) 4 2 9 10 1 0 1 2 3 4 A(4) ifadesi A Dizisinin 4 numaralı elemanı şeklinde okunabilir ve değeri bu örnek için 1 dır. A(2) ifadesi A dizisinin 2. indisli elemanı şeklinde okunabilir ve değeri bu örnek için 9 dur. Ve bu diziyi tanımlamak için VB dilinde Boyut aç A (4) anlamında DIM A(4) ifadesini kullanırız. Bu ifade ile bellekte birbiri ardına sıralanmış 5 adet sayısal türde değişken tanımlanmış olur. Değişken tanımlamada kullandığımız Dim deyimini dizi tanımlamada da kullanıyoruz. Dizi tanımlamak için DIM deyimi aşağıdaki şekilde; kullanılır. DIM Dizi_adı ( Dizinin eleman sayısı ) AS veri tipi
Visual Basic dilinde Dizinin başlangıç indisini bulmak için LBOUND, son indisini bulmak için de UBOUND deyimleri kullanılır. Bu deyimlerin kullanım şekilleri aşağıdaki gibidir; LBound ( dizi, [ boyut ] ) UBound ( dizi, [ boyut ] ) Örneğin; LBound(A) ifadesi A dizisinin ilk elemanını, UBound(A) ifadesi ise A dizisinin son elemanını ile verir. Dizi tanımlama şekilleri kullanılan programlama dillerine göre farklılık gösterse de temel mantık aynıdır. Yani dizinin adı, eleman sayısı (boyutu) ve tipi belirtilir. Visual Basic dilinde 10 elemanlı bir A dizisi farklı şekillerde tanımlanabilir; Dim A(9) Dim A (0 to 9) as integer 10 elemanlı variant türünde bir A dizisi. 10 elemanlı integer türünde bir A dizisi Ayrıca, Değişken tanımlamalarında olduğu gibi dizilerde de tanımlama sırasında ilk değerlerin verilmesi mümkündür. Örneğin aşağıdaki dizi tanımlamasında dizinin tüm değerleri tanımlama sırasında verilmektedir. Dim A() As Integer= {8, 9, 12, 4, 5, 7, 1, 0, 6, 11} Örnek 5.1. 8, 9, 12, 4, 5, 7, 1, 0, 6, 11 sayılarını A dizisine aktarıp ekranda gösteren programı yazınız. VB Dilinde Kodlanması (Visual Basic 2010 a göre); Dim A() As Integer= {8, 9, 12, 4, 5, 7, 1, 0, 6, 11} Dim i as Integer Console.WriteLine(" A dizisinin elemanları..:") For i = LBound(A) To UBound(A) For i= 0 to A.Length-1 Console.WriteLine(A(i)) Console.ReadKey() REDIM Deyimi: Dizinin eleman sayısı belli ise bu tip dizilere statik dizi denir ve Dim komutu ile tanımlanır. Eğer dizinin boyutu (eleman sayısı) programın her çalışmasında değişiyorsa bu tip dizilere dinamik dizi denir ve Dim komutu ile tanımlandıktan sonra ReDim komutu ile yeniden tanımlanırlar. Dizinin ne kadar büyüyeceğini bilemediğimiz durumlarda dinamik dizi tanımlaması kullanılır. Dizinin boyutunu ReDim komutu ile değiştirebiliriz fakat tipini değiştiremeyiz.
Bir dizinin boyutları değiştirilirken verileri korumakta kullandığınız Preserve anahtar sözcüğü kullanılır. Preserve anahtar sözcüğünün söz dizimi aşağıdaki gibidir. ReDim Preserve DiziAdı (Dim1Öğeler, Dim2Öğeler...) Aşağıdaki örnekler bir dinamik dizideki son boyutun büyüklüğünü dizide var olan verileri silmeden Preserve kullanarak nasıl artırabileceğinizi göstermektedir. Dim M ( ) As String M adlı bir dizinin üstte verildiği şekilde bildirimini daha önce yaptıysanız aşağıdakine benzer bir kod kullanarak diziyi yeniden boyutlandırıp veri eklemesi yapabilirsiniz. ReDim M ( 200 ) M( 200 ) = Ali Mutlu Aşağıdaki söz dizimini kullanarak M dizisinin büyüklüğünü 401 öğeye (0-400) genişletebilir ve var olan içeriğini koruyabilirsiniz. ReDim Preserve M (400) Örnek 5.5. Dışarıdan girilen N elemanlı bir dizinin tüm elemanlarını toplayan programı yazınız. Çözüm: Dizinin eleman sayısı belli olmadığı için (N değeri) dinamik dizidir ve ReDim komutu ile tanımlanır. VB Dilinde Kodlanması (Visual Basic 2010 a göre); Dim n, A() As Integer, toplam As Integer n = Val(InputBox("dizinin eleman sayısı")) ReDim A(n) toplam = 0 For i = 0 To n 1 'For i=lbound(a) To UBound(A) - 1 A(i) = Val(InputBox("dizinin elemanlarını giriniz")) toplam = toplam + A(i) Console.WriteLine("Dizi elemanlarının toplamı=" & toplam) Console.ReadKey() Örnek 5.6. N elemanlı bir A dizisini ters sırada B dizisine aktaran programı yazınız. Çözüm: Dizinin ters sırada aktarılması; baştan ve sondan karşılıklı gelen elemanlarının yerdeğiştirilmesi işlemidir. Yani dizinin 10. elemanı 1. elemanı ile, 9. elemanı 2. elemanı ile yerdeğiştirilecek ve oluşan yeni dizi, B dizisine aktarılacak. N elemanlı bir dizide bu işlemi B(I) = A( N+1 I ) şeklinde formülleştirebiliriz.
VB Dilinde Kodlanması (Visual Basic 2010); Sub Main() Dim A(), B(), N, i As Integer N = Val(InputBox(" N değerini giriniz : ")) ReDim A(N), B(N) Console.WriteLine(" A dizisi") For i = 1 To N A(i) = Val(InputBox("A dizisinin" & i & ".elemanı")) Console.Write(A(i) & " ") Console.WriteLine() Console.WriteLine(" B Dizisi") For i = 1 To N B(i) = A(N + 1 - i) Console.Write(B(i) & " ") Console.ReadKey() Programın ekran çıktısı: Örnek 5.7. n elemanlı bir dizinin elemanlarını Küçükten büyüğe doğru sıralayan programı yazınız (Visual Basic 2010). Sub Main() Dim A(), N, i As Integer N = Val(InputBox(" N değerini giriniz : ")) ReDim A(N) Console.WriteLine(" A dizisi") For i = 1 To N A(i) = Val(InputBox("A dizisinin" & i & ".elemanı")) Console.Write(A(i) & " ") Console.WriteLine() Console.WriteLine(" A Dizisinin Sıralı Hali ") Array.Sort(A) For i = 1 To N Console.Write(A(i) & " ") Console.ReadKey() Örnek 5.10. Bilgisayarın rasgele ürettiği 10 kişinin boy uzunluklarının (100 ile 200 cm arası) ortalamasını alan ve boy ortalamasına eşit, boy ortalamasından küçük ve büyük kişilerin sayısını veren programı yazınız.
Çözüm: (Visual Basic 2010 a göre) Sub Main() Dim SAY(10) As Integer Dim ortalama As Integer = 0 Dim toplam As Integer = 0 Dim ORTA As Integer = 0 Dim Bboy, Kboy As Integer For i = 1 To 10 SAY(i) = CInt(100 + Rnd() * 100) Console.WriteLine(SAY(i)) toplam = toplam + SAY(i) Console.WriteLine() ORTALAMA = toplam / 10 Console.WriteLine("BOY ORTALAMALARI=" & ortalama) For i = 1 To 10 If SAY(i) < ORTALAMA Then KBOY = KBOY + 1 ElseIf SAY(i) > ORTALAMA Then BBOY = BBOY + 1 ElseIf SAY(i) = ORTALAMA Then ORTA = ORTA + 1 End If Console.WriteLine("Ortalamadan Büyük Olan Boyların Sayısı:" & Bboy) Console.WriteLine("Ortalamadan Küçük Olan Boyların Sayısı:" & Kboy) Console.WriteLine("Ortalamaya Eşit Olan Boyların Sayısı:" & ORTA) Length, Rank, GetUpperBound, GetLength, BinarySearch, Sort Komutları Diziler array sınıfında tanımlanır, böylece array sınıfının tüm özellikleri diziler üzerinde kullanılabilir. Array sınıfının metotlarını kullanarak diziler üzerinde arama,sıralama gibi işlemleri gerçekleştirebiliriz. Bunları görmek için dizi adından sonra noktaya. basarak fonksiyonun özellikleri penceresine ulaşabilirsiniz. Length: Dizinin eleman sayısını verir. Son elemana ulaşmak için DiziAdi.length-1 yapısı kullanılır. Rank : Dizinin kaç boyutlu olduğunu verir. GetUpperBound : Dizinin en büyük indeksli elemanının indeks bilgisini verir. GetLength : Dizinin belirtilen boyutundaki eleman sayısını verir. BinarySearch : Dizide bir elemanı aramak için bu metodu kullanabiliriz. A dizisinde kemal elemanını aramak için; Array.BinarySearch(A, kemal ) Sort : Diziyi sıralamak için bu metodu kullanırız. Örneğin A dizisini sıralamak için; Array.Sort(A) yazılır.
İ Kİ BOYUTLU Dİ Zİ LER (MATRİ SLER) Bellekte ard arda sıralanmış satır ve sütunlardan oluşan yapıya iki boyutlu dizi ya da matris adı verilir. İki boyutlu dizileri aşağıdaki şekilde gösteririz. - 3 satır ve 5 sütundan oluşan bir A matrisini DIM A(3,5) deyimi ile tanımlarız Örnek 5.12. Aşağıdaki A matrisini oluşturup ekranda gösteren programı yazınız. 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 Çözüm: Daha önce de belirttiğimiz gibi matrislerle işlem yaparken ya satır içinde sütunlarda dolaşılır ya da sütun içinde satırlarda dolaşılır. Bu örneğimizde I satırları, J sütunları gösterirse, matris elemanlarının alacağı değerleri inceleyelim; Dikkat edersek A(i,j) = j değerini almaktadır. VB Dilinde Kodlanması (Visual Basic 2010 a göre) Sub Main() Dim A(3, 5) As Integer Dim i As Integer Console.WriteLine(" A matrisinin elemanları..:") For i = 1 To 3 For j = 1 To 5 A(i, j) = j Console.Write(A(i, j) & " ") Next j Console.WriteLine() Console.ReadKey() Programın ekran çıktısı: I J A(I,J) 1 1, 2, 3, 4, 5 1, 2, 3, 4, 5 2 1, 2, 3, 4, 5 1, 2, 3, 4, 5 3 1, 2, 3, 4, 5 1, 2, 3, 4, 5
Örnek 5.15. Bir matrisin satırları ile sütunlarını yer değiştiren programı yazınız. { Matematikte bu işlem transpose olarak adlandırılır ve A matrisinin transposesi A T ile gösterilir. } Çözüm: A(4,5) şeklindeki bir matrisin transposesi B(5,4) şeklinde görülür. VB Dilinde Kodlanması (Visual Basic 6.0); Private Sub Command1_Click() Cls Dim A(4, 5) As Integer Dim B(5, 4) As Integer For I = 1 To 4 For J = 1 To 5 A(I, J) = Val (InputBox("A Matrisinin elemanları")) B(J, I) = A(I, J) Bu satırda A matrisinin transposesi alınıyor Next J Next I For I = 1 To 5 For J = 1 To 4 Print B(I, J); Next J Print Next I Örnek 5.20. A ve B matrislerinin çarpımlarını C matrisine atan ve elemanlarını ekranda gösteren programı yazınız. { A 3*2 * B 2*3 = C 3*3 } Çözüm (Visual Basic 6.0): İki matrisin birbiri ile çarpılabilmesi için birincinin sütun sayısı ikincinin satır sayısına eşit olmalıdır. Eşit değilse çarpım belirsizdir. Eğer A matrisi m*n ve B matrisi n*p elemanlı ise çarpım matris C, m*p boyutunda olur. Matrislerin çarpımı aşağıdaki şekilde gerçekleşir.
VB Dilinde Kodlanması; Private Sub Command1_Click() Cls Dim A(3,3) As Integer, B(3, 3) As Integer, C(3, 3) As Integer For i = 1 To 3 For j = 1 To 2 A(i, j) = Val(InputBox("A matrisi")) Print A(i, j); Next j Print For i = 1 To 2 For j = 1 To 3 B(i, j) = Val(InputBox("B Matrisi")) Print B(i, j); Next j Print Print For i = 1 To 3 For j = 1 To 3 C(i, j) = 0 For k = 1 To 3 C(i, j) = C(i, j) + A(i, k) * B(k, j) Next k Next j For i = 1 To 3 For j = 1 To 3 Print C(i, j); Next j Print
NOT: Birinci For - Next döngüsü ile A(3,2) matrisinin elemanları girilip, ekranda gösterilirken, ikinci For Next döngüsü ile B(2,3) matrisinin elemanları girilip ekranda gösteriliyor. İç içe For Next döngüsü ile A matrisi ile B matrisinin çarpılmasından C(3,3) matrisi elde edilirken En son ki iç içe For Next döngüsü ile de Çarpım matrisi { C (3,3) } ekrana yazdırılıyor. Örnek 5.24. Bilgisayarın rasgele ürettiği 10 öğrencinin numarası ile vize ve final notlarını dizilerde tutarak; En yüksek ve en düşük not ortalaması ile sınıfın not ortalamasını hesaplayan programı yazınız. { vize notunun %30 u, final notunun ise %70 i alınacaktır} Çözüm: (Visual Basic 2010 a göre) Sub Main() Randomize() Dim nt(10, 2) As Integer, nu(10) As Integer, ort(10) As Integer Dim OrtSnf, toplam As Single, i, Enb, Enk As Integer Console.WriteLine("Öğrenci no " & "Vize Notu " & "Final Notu " & " Ortalaması ") For i = 1 To 10 nu(i) = i 'Val(InputBox("öğrencinin numarası")) nt(i, 0) = CInt(Rnd() * 100) ' Val(InputBox("öğrencinin vize notu")) nt(i, 1) = CInt(Rnd() * 100) ' Val(InputBox("öğrencinin final notu")) ort(i) = nt(i, 0) * 0.3 + nt(i, 1) * 0.7 Console.WriteLine(nu(i) & Space(11) & nt(i, 0) & Space(11) & nt(i, 1) & Space(11) & ort(i)) Console.WriteLine() Enb = ort(1) : enk = ort(1) : toplam = 0 For i = 1 To 10 If Enb < ort(i) Then Enb = ort(i) End If If Enk > ort(i) Then Enk = ort(i) End If toplam = toplam + ort(i) OrtSnf = toplam / 10 Console.WriteLine("en yüksek notu alan öğrenci=" & Enb) Console.WriteLine("en düşük notu alan öğrenci=" & Enk) Console.WriteLine("sınıf ortalaması =" & OrtSnf) Programın ekran çıktısı:
ÇOK BOYUTLU Dİ Zİ LER Günlük yaşamda karşılaştığımız problemleri çözmek için sadece tek ve çift boyutlu dizileri kullanmak yetersiz kalabilir. Bu durumda 3,4,5,., n boyutlu dizler tanımlanabilir. Çoğu durumda çok boyutlu dizi kullanımında üç boyutlu diziler yaygın olarak kullanılmaktadır. Çok boyutlu dizilerin tanımında aşağıdaki yapı kullanılır; DIM Dizi_adı ( Satır sayısı, Sütun Sayısı, Matris sayısı ) As Veri Türü Örnek olarak 3 boyutlu A dizisini DIM A(4, 5, 3) şeklinde tanımlarız. Bu ifade 4 satır, 5 sütunu olan 3 adet iki boyutlu matris için yer aç şeklinde okunur. A dizisi 4*5*3 (=60) elemana sahiptir. NOT: Üç boyutlu dizi, birden çok iki boyutlu matrisin ardı ardına gelerek oluşturduğu yapıdır.. Nesne Kü meleri Form üzerindeki tüm nesneleri içeren kümeye denetim kümesi adı verilir ve Controls olarak isimlendirilir. Form üzerindeki nesnelere toplu işlem yapmak gerektiğinde for each döngü yapısı kullanılır. For Each degisken In Controls İşlemler Next degisken Bir kümenin bir ya da daha fazla üyesinin üzerinde diğerlerinden farklı bir işlem yapmak istediğinizde o nesnenin Tag özelliğini kullanabilirsiniz. Örnek_ Nesne 1: Şekildeki gibi bir grup nesneyi butona bastığımızda sağa doğru hareket ettiren kodu yazınız.
Çözüm: Tasarım aşamasında sağa doğru gitmeyecek olan Buton nesnesinin Tag özelliği Buton yapılmıştır. Visual Basic Kodu: Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click For Each a In Controls If a.tag <> "Buton" Then a.left = a.left + 20 '20 twip sağa taşır End If Next a Örnek_ Nesne 2: Butona bastıkça ay nesnesi sola giderken diğer nesneleri sağa kaydıran program Çözüm: Tasarım aşamasında sağa doğru gidecek olan nesnelerin Tag özelliği b, sola gidecek olanlar ay yapılmıştır. For Each a In Controls If a.tag = "b" Then a.left = a.left + 20 ElseIf a.tag = "ay" Then a.left = a.left - 20 End If Next a Not: 1 twip = 1/20 point veya 20 twips = 1 point 1 twip = 1/567 centimeter veya 567 twips = 1 centimeter 1 twip = 1/1440 inch veya 1440 twips = 1 inch TIMER NESNESİ Timer nesnesi belirli zaman aralıklarında bazı olayların tekrarlanması (örneğin animasyonlar gibi) veya belli bir bekleme zamanı için kullanılır. Zaman dolunca Enabled özelliği False yapılarak, Timer kontrolü devre dışı bırakılır. İki önemli özelliği vardır;
Enabled Interval Timer ın çalışmasını ON/OFF yapar. Eğer True ise Timer, False değerini alıncaya kadar çalışacaktır. Timer kontrolünün milisaniye cinsinden zaman periyodu (1000 milisaniye = 1 saniye). Not: Timer nesnesi form üzerinde gözükmez Örnek: Kalp atışını ve sayısal saati gösteren bir program Çözüm: Tasarımda kullanılan nesneler: İki Timer, bir Label VB Kodu: Public Class Form1 Dim a As Double Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.Timer1.Enabled = True Me.Timer2.Enabled = True Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick Me.Label1.Text = TimeOfDay Me.PictureBox1.Width = 100 Me.PictureBox1.Height = 100 Me.Timer2.Enabled = True Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Me.PictureBox1.Width = 300 Me.PictureBox1.Height = 300 Me.Timer1.Enabled = True End Class