2. VB.NET dilinin temelleri
2.1. Giriş
VB.NET'i öncelikle klasik bir programlama dili olarak ele alacağız. Nesnelere daha sonra değineceğiz.
Bir programda iki şey bulunur
- veriler
- bu verileri işleyen komutlar
Genellikle verileri komutlardan ayırmaya çalışırız:
![]() |
2.2. VB.NET verileri
VB.NET şu veri türlerini kullanır:
- tamsayılar, gerçek sayılar ve ondalık sayılar
- karakterler ve karakter dizileri
- boole değerleri
- tarihler
- nesneler
2.2.1. Önceden tanımlanmış veri türleri
VB türü | Eşdeğer .NET türü | Boyut | Değer aralığı |
Boolean | System.Boolean | 2 bayt | True veya False. |
Byte | System.Byte | 1 bayt | 0 ile 255 arası (işaretsiz). |
Karakter | System.Char | 2 bayt | 0 ile 65.535 arası (işaretsiz). |
Tarih | System.DateTime | 8 bayt | 1 Ocak 0001 saat 00:00:00 ile 31 Aralık 9999 saat 23:59:59 arası. |
Ondalık | System.Decimal | 16 bayt | 0 ile +/-79 228 162 514 264 337 593 543 950 335 arasında (ondalık basamak yok); 0 ile +/-7,9228162514264337593543950335 arasında (28 ondalık basamaklı); sıfırdan farklı en küçük sayı +/-0,0000000000000000000000000001 (+/-1E-28) 'dir. |
Çift | System.Double | 8 bayt | -1,79769313486231E+308 ile -4,94065645841247E-324; pozitif değerler için ise 4,94065645841247E-324 ile 1,79769313486231E+308 arasındadır. |
Tamsayı | System.Int32 | 4 bayt | -2 147 483 648 ile 2 147 483 647 arası. |
Uzun | System.Int64 | 8 bayt | -9 223 372 036 854 775 808 ile 9 223 372 036 854 775 807 arası. |
Nesne | System.Object | 4 bayt | Object türündeki bir değişkene herhangi bir tür depolanabilir. |
Short | System.Int16 | 2 bayt | -32.768 ile 32.767 arası. |
Single | System.Single | 4 bayt | -3,402823E+38 ile -1,401298E-45 arası negatif değerler için; 1,401298E-45 ile 3,402823E+38 arası pozitif değerler için. |
Dize | System.String (sınıf) | 0'dan yaklaşık 2 milyar Unicode karakterine kadar. |
Yukarıdaki tabloda, 32 bitlik bir tamsayı için iki olası tür olduğu görülmektedir: Integer ve System.Int32. Bu iki tür birbirinin yerine kullanılabilir. Aynı durum, diğer türler olan VB ve .NET platformundaki eşdeğerleri için de geçerlidir. İşte bir program örneği:
Module types
Sub Main()
' tamsayılar
Dim var1 As Integer = 100
Dim var2 As Long = 10000000000L
Dim var3 As Byte = 100
Dim var4 As Short = 4
' gerçek sayılar
Dim var5 As Decimal = 4.56789D
Dim var6 As Double = 3.4
Dim var7 As Single = -0.000103F
' tarih
Dim var8 As Date = New Date(2003, 1, 1, 12, 8, 4)
' boole
Dim var9 As Boolean = True
' karakter
Dim var10 As Char = "A"c
' karakter dizisi
Dim var11 As String = "abcde"
' nesne
Dim var12 As Object = New Object
' görüntülemeler
Console.Out.WriteLine("var1=" + var1.ToString)
Console.Out.WriteLine("var2=" + var2.ToString)
Console.Out.WriteLine("var3=" + var3.ToString)
Console.Out.WriteLine("var4=" + var4.ToString)
Console.Out.WriteLine("var5=" + var5.ToString)
Console.Out.WriteLine("var6=" + var6.ToString)
Console.Out.WriteLine("var7=" + var7.ToString)
Console.Out.WriteLine("var8=" + var8.ToString)
Console.Out.WriteLine("var9=" + var9.ToString)
Console.Out.WriteLine("var10=" + var10)
Console.Out.WriteLine("var11=" + var11)
Console.Out.WriteLine("var12=" + var12.ToString)
End Sub
End Module
Çalıştırıldığında şu sonuçlar elde edilir:
var1=100
var2=10000000000
var3=100
var4=4
var5=4,56789
var6=3,4
var7=-0,000103
var8=01/01/2003 12:08:04
var9=True
var10=A
var11=abcde
var12=System.Object
2.2.2. Sabit verilerin notasyonu
145, -7, &FF (onaltılık) | |
100000L | |
134,789, -45E-18 (-45 × 10⁻¹⁸) | |
134.789F, -45E-18F (-45 10-18) | |
100000D | |
"A"c | |
"bugün" | |
true, false | |
01/01/2003 için New Date(2003, 1, 1) |
Aşağıdaki noktalara dikkat edilmelidir:
- 100000L, L harfi sayının uzun tamsayı olarak kabul edildiğini belirtir
- 134.789F, F harfi sayının tek hassasiyetli bir gerçek sayı olarak kabul edildiğini belirtir
- 100000D, D harfi sayının ondalık gerçek sayı olarak kabul edildiğini belirtir
- "A"c, "A" karakter dizisini 'A' karakterine dönüştürmek için
- Dize, " karakteriyle çevrelenmiştir. Dize " karakterini içermesi gerekiyorsa, [abcd"e] dizesini temsil etmek için bu karakter "abcd""e" örneğinde olduğu gibi iki kez kullanılır.
2.2.3. Veri Bildirimi
2.2.3.1. Bildirimlerin rolü
Bir program, bir ad ve bir tür ile tanımlanan verileri işler. Bu veriler bellekte depolanır. Programın derlenmesi sırasında, derleyici her veriye bir adres ve bir boyut ile tanımlanan bir bellek konumu atar. Bunu, programcı tarafından yapılan tanımlamalardan yararlanarak yapar. Ayrıca bu bildirimler, derleyicinin programlama hatalarını tespit etmesini sağlar. Örneğin, x bir karakter dizisiyse x=x*2 işlemi hatalı olarak bildirilir.
2.2.3.2. Sabitlerin Bildirilmesi
Bir sabitin tanımlama sözdizimi şöyledir:
const tanımlayıcı as tür=değer
örneğin [const PI as double=3.141592]. Neden sabitler tanımlanır?
- Sabitlere anlamlı bir isim verilirse programın okunması daha kolay olur: [const taux_tva as single=0.186F]
- "Sabit" değişirse, programı değiştirmek daha kolay olacaktır. Dolayısıyla önceki örnekte, KDV oranı %33'e çıkarsa, yapılması gereken tek değişiklik, değerini tanımlayan komutu değiştirmek olacaktır: [const taux_tva as single=0.336F]. Programda 0,186 değeri açıkça kullanılmış olsaydı, o zaman değiştirilmesi gereken çok sayıda komut olurdu.
2.2.3.3. Değişkenlerin tanımlanması
Bir değişken bir adla tanımlanır ve bir veri türüne aittir. VB.NET, büyük ve küçük harf ayrımı yapmaz. Dolayısıyla, FIN ve fin değişkenleri aynıdır. Değişkenler, tanımlandıkları sırada başlatılabilir. Bir veya daha fazla değişkenin tanımlanma sözdizimi şöyledir:
dim değişken1, değişken2, ..., değişkenn as tür_tanımlayıcısı
burada identificateur_de_type, önceden tanımlanmış bir tür veya programcı tarafından tanımlanmış bir türdür.
2.2.4. Sayılar ve karakter dizeleri arasındaki dönüştürmeler
nombre.ToString veya "" & sayı veya CType(sayı,String) | |
objet.ToString | |
Integer.Parse(dize) veya Int32.Parse | |
Long.Parse (dizi) veya Int64.Parse | |
Double.Parse (dizi) | |
Single.Parse (dize) |
Dize geçerli bir sayı değilse, dizenin sayıya dönüştürülmesi başarısız olabilir. Bu durumda, VB.NET adlı bir ölümcül hata (istisna) oluşur. Bu hata, aşağıdaki try/catch cümlesiyle yönetilebilir:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
end try
instruction suivante
İşlev bir istisna oluşturmazsa, bir sonraki komuta geçilir; aksi takdirde catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. İstisna yönetimine daha sonra tekrar değineceğiz. Aşağıda, sayılar ve karakter dizeleri arasında dönüştürme için kullanılan başlıca teknikleri gösteren bir program yer almaktadır. Bu örnekte işlev, parametresinin değerini ekrana yazdırır. Dolayısıyla affiche(S), S'nin değerini ekrana yazdırır.
' yönergeler
Option Strict On
' ithal edilen ad alanları
Imports System
' test modülü
Module Module1
Sub Main()
' ana prosedür
' yerel veriler
Dim S As String
Const i As Integer = 10
Const l As Long = 100000
Const f As Single = 45.78F
Dim d As Double = -14.98
' sayı --> dize
affiche(CType(i, String))
affiche(CType(l, String))
affiche(CType(f, String))
affiche(CType(d, String))
'boolean --> dize
Const b As Boolean = False
affiche(b.ToString)
' dize --> int
Dim i1 As Integer = Integer.Parse("10")
affiche(i1.ToString)
Try
i1 = Integer.Parse("10.67")
affiche(i1.ToString)
Catch e As Exception
affiche("Erreur [10.67] : " + e.Message)
End Try
' dize --> long
Dim l1 As Long = Long.Parse("100")
affiche("" + l1.ToString)
Try
l1 = Long.Parse("10.675")
affiche("" & l1)
Catch e As Exception
affiche("Erreur [10.675] : " + e.Message)
End Try
' dize --> double
Dim d1 As Double = Double.Parse("100,87")
affiche(d1.ToString)
Try
d1 = Double.Parse("abcd")
affiche("" & d1)
Catch e As Exception
affiche("Erreur [abcd] : " + e.Message)
End Try
' dize --> single
Dim f1 As Single = Single.Parse("100,87")
affiche(f1.ToString)
Try
d1 = Single.Parse("abcd")
affiche(f1.ToString)
Catch e As Exception
affiche("Erreur [abcd] : " + e.Message)
End Try
End Sub
' görüntüle
Public Sub affiche(ByVal S As String)
Console.Out.WriteLine("S=" + S)
End Sub
End Module
Elde edilen sonuçlar şunlardır:
S=10
S=100000
S=45,78
S=-14,98
S=False
S=10
S=Erreur [10.67] : Le format de la chaîne d'entrée est incorrect.
S=100
S=Erreur [10.675] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
S=100,87
S=Erreur [abcd] : Le format de la chaîne d'entrée est incorrect.
Dize biçimindeki gerçek sayılarda ondalık nokta yerine virgül kullanılması gerektiğine dikkat edilmelidir. Dolayısıyla şöyle yazılır: Dim d As Double = -14.98 ancak Dim d1 As Double = Double.Parse("100,87")
2.2.5. Veri tabloları
VB.NET dizisi, aynı türdeki verileri tek bir tanımlayıcı altında bir araya getirmek için kullanılan bir nesnedir. Bildirimi şu şekildedir:
Dim Dizi(n) as type veya Dim Dizi() as type = New type(n) {}
burada n, dizinin son elemanının indeksidir. Tableau(i) sözdizimi, i'nin [0,n] aralığına ait olduğu i numaralı veriyi belirtir. Tableau(i) verisine yapılan herhangi bir atıfta, i'in [0,n] aralığına ait olmaması durumunda bir istisna oluşur. Bir dizi, tanımlandığı anda aynı zamanda başlatılabilir. Bu durumda, son elemanın numarasını belirtmeye gerek yoktur.
Dim entiers() As Integer = {0, 10, 20, 30}
Dizilerin, dizideki eleman sayısını gösteren Length özelliği vardır. İşte bir örnek program:
Module tab0
Sub Main()
' birinci tablo
Dim tab0(5) As Integer
For i As Integer = 0 To UBound(tab0)
tab0(i) = i
Next
For i As Integer = 0 To UBound(tab0)
Console.Out.WriteLine("tab0(" + i.ToString + ")=" + tab0(i).tostring)
Next
' ikinci tablo
Dim tab1() As Integer = New Integer(5) {}
For i As Integer = 0 To tab1.Length - 1
tab1(i) = i * 10
Next
For i As Integer = 0 To tab1.Length - 1
Console.Out.WriteLine("tab1(" + i.ToString + ")=" + tab1(i).tostring)
Next
End Sub
End Module
ve programın çalıştırılması:
tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
İki boyutlu bir dizi şu şekilde tanımlanabilir:
Dim Dizi(n,m) as Type veya Dim Dizi(,) as Type=New Type(n,m) {}
burada n+1 satır sayısı, m+1 ise sütun sayısıdır. Tableau(i,j) sözdizimi, Tableau'nun i satırındaki j öğesini belirtir. İki boyutlu dizi de tanımlandığı sırada aynı anda başlatılabilir:
Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}
Her bir boyuttaki eleman sayısı, GetLenth(i) yöntemi ile elde edilebilir; burada i=0, 1. indekse karşılık gelen boyutu, i=1 ise 2. indekse karşılık gelen boyutu temsil eder, …İşte bir örnek program:
Module Module2
Sub Main()
' birinci tablo
Dim tab0(2, 1) As Integer
For i As Integer = 0 To UBound(tab0)
For j As Integer = 0 To tab0.GetLength(1) - 1
tab0(i, j) = i * 10 + j
Next
Next
For i As Integer = 0 To UBound(tab0)
For j As Integer = 0 To tab0.GetLength(1) - 1
Console.Out.WriteLine("tab0(" + i.ToString + "," + j.ToString + ")=" + tab0(i, j).tostring)
Next
Next
' ikinci tablo
Dim tab1(,) As Integer = New Integer(2, 1) {}
For i As Integer = 0 To tab1.GetLength(0) - 1
For j As Integer = 0 To tab1.GetLength(1) - 1
tab1(i, j) = i * 100 + j
Next
Next
For i As Integer = 0 To tab1.GetLength(0) - 1
For j As Integer = 0 To tab1.GetLength(1) - 1
Console.Out.WriteLine("tab1(" + i.ToString + "," + j.ToString + ")=" + tab1(i, j).tostring)
Next
Next
End Sub
End Module
ve programın çalıştırılmasının sonuçları:
tab0(0)=0
tab0(1)=1
tab0(2)=2
tab0(3)=3
tab0(4)=4
tab0(5)=5
tab1(0)=0
tab1(1)=10
tab1(2)=20
tab1(3)=30
tab1(4)=40
tab1(5)=50
Bir dizi dizisi şu şekilde tanımlanır:
Dim Dizi(n)() as Type veya Dim Dizi()() as Type = new Type(n)()
Yukarıdaki tanım, n+1 satırlık bir dizi oluşturur. Her bir Tableau(i) elemanı, tek boyutlu bir dizi referansıdır. Bu diziler, yukarıdaki tanım sırasında oluşturulmaz. Aşağıdaki örnek, bir dizi dizisinin oluşturulmasını göstermektedir:
' tabloların bir tablosu
Dim noms()() As String = New String(3)() {}
' başlatma
For i = 0 To noms.Length - 1
noms(i) = New String(i) {}
For j = 0 To noms(i).Length - 1
noms(i)(j) = "nom" & i & j
Next
Next
Burada noms(i), i+1 elemanlı bir dizidir. noms(i) bir dizi olduğu için, noms(i).Length onun eleman sayısıdır. İşte az önce tanıttığımız üç dizi türünü bir araya getiren bir örnek:
' yönergeler
Option Strict On
Option Explicit On
' ithalatlar
Imports System
' test sınıfı
Module test
Sub main()
' başlatılmış 1 boyutlu bir dizi
Dim entiers() As Integer = {0, 10, 20, 30}
Dim i As Integer
For i = 0 To entiers.Length - 1
Console.Out.WriteLine("entiers[" & i & "]=" & entiers(i))
Next
' başlatılmış 2 boyutlu bir dizi
Dim réels(,) As Double = {{0.5, 1.7}, {8.4, -6}}
Dim j As Integer
For i = 0 To réels.GetLength(0) - 1
For j = 0 To réels.GetLength(1) - 1
Console.Out.WriteLine("réels[" & i & "," & j & "]=" & réels(i, j))
Next
Next
' diziler dizisi
Dim noms()() As String = New String(3)() {}
' başlatma
For i = 0 To noms.Length°- 1
noms(i) =°New String(i) {}
For j = 0 To noms(i).Length - 1
noms(i)(j) = "nom" & i & j
Next
Next
' görüntüleme
For i = 0 To noms.Length°- 1
For j = 0 To noms(i).Length - 1
Console.Out.WriteLine("noms[" & i & "][" & j & "]=" & noms(i)(j))
Next
Next
End Sub
End Module
Çalıştırıldığında şu sonuçları elde ederiz:
entiers[0]=0
entiers[1]=10
entiers[2]=20
entiers[3]=30
réels[0,0]=0,5
réels[0,1]=1,7
réels[1,0]=8,4
réels[1,1]=-6
noms[0][0]=nom00
noms[1][0]=nom10
noms[1][1]=nom11
noms[2][0]=nom20
noms[2][1]=nom21
noms[2][2]=nom22
noms[3][0]=nom30
noms[3][1]=nom31
noms[3][2]=nom32
noms[3][3]=nom33
2.3. VB.NET için temel talimatlar
Aşağıdaki ayrım yapılır
1 bilgisayar tarafından yürütülen temel komutlar.
2 programın akışını kontrol eden komutlar.
Bir mikrobilgisayarın ve çevre birimlerinin yapısı incelendiğinde temel komutlar açıkça görülür.
![]() |
-
klavyeden gelen bilgilerin okunması
-
bilgilerin işlenmesi
-
Bilgilerin ekrana yazılması
-
disk dosyasından bilgi okuma
-
Bilgilerin bir disk dosyasına yazılması
2.3.1. Ekrana yazma
Ekrana yazma için çeşitli komutlar mevcuttur:
Console.Out.WriteLine(expression)
Console.WriteLine(expression)
Console.Error.WriteLine (expression)
burada expression, ekranda görüntülenmek üzere karakter dizisine dönüştürülebilen herhangi bir veri türüdür. Şimdiye kadar gördüğümüz örneklerde, yalnızca Console.Out.WriteLine(ifade) komutunu kullandık.
System.Console sınıfı, ekrana yazma işlemlerine (Write, WriteLine) erişim sağlar. Console sınıfı, StreamWriter türünde yazma akışları olan Out ve Error adlı iki özelliğe sahiptir:
- Console.WriteLine() işlevi, Console.Out.WriteLine() işlevine eşdeğerdir ve genellikle ekrana bağlı olan Out akışına yazma işlemi gerçekleştirir.
- Console.Error.WriteLine() işlevi, genellikle yine ekrana atanan Error akışına yazma işlemi gerçekleştirir.
Out ve Error akışları varsayılan olarak ekrana yönlendirilir. Ancak, birazdan göreceğimiz gibi, programın çalıştırılması sırasında bu akışlar metin dosyalarına yönlendirilebilir.
2.3.2. Klavyeyle girilen verilerin okunması
Klavye kaynaklı veri akışı, StreamReader türündeki Console.In nesnesi ile belirtilir. Bu tür nesneler, ReadLine yöntemi ile bir metin satırını okumaya olanak tanır:
Dim ligne As String = Console.In.ReadLine()
Klavyeyle girilen satır, ligne değişkenine kaydedilir ve daha sonra programme.Le tarafından işlenebilir. In akışı, Out ve Error akışları gibi bir dosyaya yönlendirilebilir.
2.3.3. Giriş-Çıkış Örneği
Aşağıda, klavye/ekran giriş-çıkış işlemlerini gösteren kısa bir program yer almaktadır:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
' modül
Module io1
Sub Main()
' Out akışına yazma
Dim obj As New Object
Console.Out.WriteLine(("" & obj.ToString))
' Hata akışına yazma
Dim i As Integer = 10
Console.Error.WriteLine(("i=" & i))
' klavyeden girilen bir satırı okuma
Console.Out.Write("Tapez une ligne : ")
Dim ligne As String = Console.In.ReadLine()
Console.Out.WriteLine(("ligne=" + ligne))
End Sub
End Module
ve çalıştırma sonuçları:
Talimatlar
Dim obj As New Object
Console.Out.WriteLine(obj.ToString)
sadece herhangi bir nesnenin görüntülenebileceğini göstermek amacıyla verilmiştir. Burada görüntülenenlerin anlamını açıklamaya çalışmayacağız.
2.3.4. G/Ç Yönlendirme
DOS/Windows altında şu üç standart aygıt bulunmaktadır:
- standart giriş aygıtı - varsayılan olarak klavyeyi ifade eder ve 0 numaralıdır
- standart çıkış aygıtı - varsayılan olarak ekranı ifade eder ve 1 numaralıdır
- standart hata aygıtı - varsayılan olarak ekranı ifade eder ve 2 numaralıdır
VB.NET'te, Console.Out yazma akışı aygıt 1'e yazar, Console.Error yazma akışı aygıt 2'ye yazar ve Console.In okuma akışı aygıt 0'dan gelen verileri okur. Windows'ta bir DOS penceresinde bir program çalıştırıldığında, yürütülen program için 0, 1 ve 2 numaralı aygıtların hangileri olacağı belirlenebilir. Şu komut satırını ele alalım:
pg programının argi argümanları kullanılarak, standart G/Ç aygıtlarını dosyalara yönlendirmek mümkündür:
0 numaralı standart giriş akışı, in.txt dosyasına yönlendirilir. Dolayısıyla programda Console.In akışı, verilerini in.txt dosyasından alacaktır. | |||
1 numaralı çıkışı out.txt dosyasına yönlendirir. Bu, programda Console.Out akışının verilerini out.txt dosyasına yazacağı anlamına gelir | |||
aynı şekilde, ancak yazılan veriler out.txt dosyasının mevcut içeriğine eklenir. | |||
2 numaralı çıkışı error.txt dosyasına yönlendirir. Bu, programda Console.Error akışının verilerini error.txt dosyasına yazacağı anlamına gelir | |||
aynı şekilde, ancak yazılan veriler error.txt dosyasının mevcut içeriğine eklenir. | |||
1 ve 2 numaralı aygıtların her ikisi de dosyalara yönlendirilir | |||
pg programının G/Ç akışlarını dosyalara yönlendirmek için pg programının değiştirilmesine gerek olmadığına dikkat edilmelidir. 0, 1 ve 2 numaralı aygıtların türünü belirleyen program OS'tir. Aşağıdaki programı ele alalım:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
' yönlendirmeler
Module console2
Sub Main()
' In akışını okuma
Dim data As String = Console.In.ReadLine()
' Out akışına yazma
Console.Out.WriteLine(("écriture dans flux Out : " + data))
' Hata akışı yazma
Console.Error.WriteLine(("écriture dans flux Error : " + data))
End Sub
End Module
Bu programı derleyelim:
dos>vbc es2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir
24/02/2004 15:39 416 es2.vb
11/03/2004 08:20 3 584 es2.exe
İlk çalıştırmayı yapalım:
dos>es2.exe
un premier test
écriture dans flux Out : un premier test
écriture dans flux Error : un premier test
Yukarıdaki çalıştırma, standart In, Out ve Error G/Ç akışlarının hiçbirini yeniden yönlendirmiyor. Şimdi bu üç akışı da yeniden yönlendirelim. In akışı, in.txt dosyasına, Out akışı out.txt dosyasına, Error akışı ise error.txt dosyasına yönlendirilecektir. Bu yönlendirme, komut satırında şu şekilde gerçekleştirilir:
komut satırında gerçekleştirilir. Yürütme işlemi şu sonuçları verir:
dos>more in.txt
un second test
dos>es2.exe 0<in.txt 1>out.txt 2>error.txt
dos>more out.txt
écriture dans flux Out : un second test
dos>more error.txt
écriture dans flux Error : un second test
Out ve Error akışlarının aynı aygıtlara yazmadıkları açıkça görülmektedir.
2.3.5. Bir ifadenin değerinin bir değişkene atanması
Burada variable=expression. işlemiyle ilgileniyoruz. İfade şu türlerden olabilir: aritmetik, ilişkisel, boole, karakter.
2.3.5.1. İşlemcilerin listesi
İşlem | Dil öğesi |
^, –, *, /, \, Mod, +, = | |
=, ^=, *=, /=, \=, +=, -=, &= | |
=, <>, <, >, <=, >=, Like, Is | |
&, + | |
Değil, Ve, Veya, XOR, AndAlso, OrElse | |
AddressOf, GetType |
2.3.5.2. Aritmetik ifade
Aritmetik ifadelerin işleçleri şunlardır:
^, –, *, /, \, Mod, +, = |
- : toplama, - : çıkarma, * : çarpma, / : gerçek bölme, \ : tam sayı bölme sonucu, Mod : tam sayı bölme kalanı, ^: üs alma. Dolayısıyla aşağıdaki program:
' aritmetik operatörler
Module operateursarithmetiques
Sub Main()
Dim i, j As Integer
i = 4 : j = 3
Console.Out.WriteLine(i & "/" & j & "=" & (i / j))
Console.Out.WriteLine(i & "\" & j & "=" & (i \ j))
Console.Out.WriteLine(i & " mod " & j & "=" & (i Mod j))
Dim r1, r2 As Double
r1 = 4.1 : r2 = 3.6
Console.Out.WriteLine(r1 & "/" & r2 & "=" & (r1 / r2))
Console.Out.WriteLine(r1 & "^2=" & (r1 ^ 2))
Console.Out.WriteLine(Math.Cos(3))
End Sub
End Module
şu sonuçları verir:
Çeşitli matematiksel fonksiyonlar vardır. İşte bunlardan bazıları:
| kare kökü |
| kosinüs |
| Sinüs |
| Tanjant |
| x'in y'inci kuvveti (x>0) |
| Üstel |
| Neper logaritması |
| mutlak değer |
Tüm bu fonksiyonlar, Math adlı bir sınıfta tanımlanmıştır. Bunları kullanırken, tanımlandıkları sınıfın adını ön ek olarak eklemek gerekir. Dolayısıyla şöyle yazılır:
Math sınıfının tam tanımı şöyledir:
e sabiti ile belirtilen doğal logaritma tabanını temsil eder. | |||
Bir dairenin çevresinin çapına oranını temsil eder; bu oran π sabiti ile belirtilir. | |||
Aşırı yüklenmiştir. Belirtilen bir sayının mutlak değerini döndürür. | |||
Belirtilen sayının kosinüsüne karşılık gelen açıyı döndürür. | |||
Sinüsü belirtilen sayı olan açıyı döndürür. | |||
Tanjantı belirtilen sayı olan açıyı döndürür. | |||
Tanjantı, belirtilen iki sayının bölünmesiyle elde edilen sayı olan açıyı döndürür. | |||
İki 32 bit sayının tam çarpımını oluşturur. | |||
Belirtilen sayıya eşit veya ondan büyük olan en küçük tamsayıyı döndürür. | |||
Belirtilen açının kosinüsünü döndürür. | |||
Belirtilen açının hiperbolik kosinüsünü döndürür. | |||
Üstüne yazılmıştır. İki sayının bölümünü döndürür ve kalanı çıktı parametresi olarak geçirir. | |||
e'nin belirtilen üssüne yükseltilmiş değerini döndürür. | |||
Belirtilen sayıya eşit veya ondan küçük en büyük tamsayıyı döndürür. | |||
Belirtilen bir sayının başka bir sayıya bölünmesinden kalan değeri döndürür. | |||
Üstü yazılmıştır. Belirtilen sayının logaritmasını döndürür. | |||
Belirtilen sayının 10 tabanında logaritmasını döndürür. | |||
Üstüne yazılmıştır. Belirtilen iki sayıdan büyük olanını döndürür. | |||
Aşırı yüklenmiş. İki sayıdan daha küçük olanını döndürür. | |||
Belirtilen sayıyı belirtilen üssün kuvvetine yükseltir. | |||
Üstüne yazılmıştır. Belirtilen değere en yakın sayıyı döndürür. | |||
Üstüne yazılmıştır. Bir sayının işaretini belirten bir değer döndürür. | |||
Belirtilen açının sinüsünü döndürür. | |||
Belirtilen açının hiperbolik sinüsünü döndürür. | |||
Belirtilen sayının karekökünü döndürür. | |||
Belirtilen açının tanjantını döndürür. | |||
Belirtilen açının hiperbolik tanjantını döndürür. | |||
Bir fonksiyon "aşırı yüklenmiş" olarak tanımlandığında, bu fonksiyonun çeşitli parametre türleri için mevcut olduğu anlamına gelir. Örneğin, Abs(x) fonksiyonu x'in Integer, Long, Decimal, Single, Float türleri için mevcuttur. Bu türlerin her biri için Abs fonksiyonunun ayrı bir tanımı vardır. Bu durumda fonksiyonun aşırı yüklenmiş olduğu söylenir.
2.3.5.3. Aritmetik ifadelerin değerlendirilmesinde öncelikler
Bir aritmetik ifadenin değerlendirilmesi sırasında operatörlerin önceliği şu şekildedir (en yüksek öncelikli olandan en düşük öncelikli olana doğru):
Kategori | İşlemciler |
İşlemci içermeyen tüm ifadeler: fonksiyonlar, parantezler | |
^ | |
+, - | |
*, / | |
\ | |
Mod | |
+, - |
2.3.5.4. İlişkisel ifadeler
İşlemciler şunlardır:
=, <>, <, >, <=, >=, Like, Is |
= : eşittir, <> : farklıdır, < : (kesinlikle) daha küçüktür, > : (kesinlikle) daha büyüktür, <= : küçük veya eşittir, >= : büyük veya eşittir, Like : bir şablona uyar, Is : nesnelerin özdeşliği. Tüm bu operatörlerin önceliği aynıdır. Soldan sağa doğru değerlendirilirler. Bir ilişkisel ifadenin sonucu bir Boole değeridir.
Dize karşılaştırması: Aşağıdaki programı ele alalım:
' ad alanları
Imports System
Module string1
Sub main()
Dim ch1 As Char = "A"c
Dim ch2 As Char = "B"c
Dim ch3 As Char = "a"c
Console.Out.WriteLine("A<B=" & (ch1 < ch2))
Console.Out.WriteLine("A<a=" & (ch1 < ch3))
Dim chat As String = "chat"
Dim chien As String = "chien"
Dim chaton As String = "chaton"
Dim chat2 As String = "CHAT"
Console.Out.WriteLine("chat<chien=" & (chat < chien))
Console.Out.WriteLine("chat<chaton=" & (chat < chaton))
Console.Out.WriteLine("chat<CHAT=" & (chat < chat2))
Console.Out.WriteLine("chaton like chat*=" & ("chaton" Like "chat*"))
End Sub
End Module
ve çalıştırıldığında elde edilen sonuç:
C1 ve C2 olmak üzere iki karakter varsayalım. Bunları <, <=, =, <>, >, >= operatörleriyle karşılaştırmak mümkündür. Bu durumda, karakterlerin sayılar olan Unicode değerleri karşılaştırılır. Unicode sıralamasına göre aşağıdaki ilişkiler geçerlidir:
boşluk < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' < .. < 'z'
Dizgiler karakter karakter karşılaştırılır. İki karakter arasında karşılaşılan ilk eşitsizlik, dizgiler üzerinde de aynı yönde bir eşitsizliğe yol açar. Bu açıklamalar ışığında, okuyucunun önceki programın sonuçlarını incelemesi önerilir.
2.3.5.5. Boole ifadeleri
İşlemciler şunlardır:
Not, And, Or, Xor, AndAlso, OrElse |
Not: mantıksal ve, Or: mantıksal veya, Not: olumsuzlama, Xor: dışlayıcı veya.
op1 AndAlso op2: op1 yanlışsa, op2 değerlendirilmez ve sonuç yanlış olur.
op1 OrElse op2: op1 doğruysa, op2 değerlendirilmez ve sonuç doğrudur.
Bu operatörlerin birbirleri arasındaki öncelik sırası şöyledir:
Not | |
Ve, AndAlso | |
Ve, OrElse | |
XOR |
Bir Boole ifadesinin sonucu bir Boole değeridir.
2.3.5.6. Bit İşlemleri
Bir yandan, aynı önceliğe sahip Boole operatörleriyle aynı operatörler bulunur. Ayrıca iki kaydırma operatörü de vardır: << ve >>. i ve j iki tamsayı olsun.
i'yi n bit sola kaydırır. Gelen bitler sıfırdır. | |
i'yi n bit sağa kaydırır. i işaretli bir tamsayıysa (signed char, int, long), işaret biti korunur. | |
i ve j'nin bit bazında mantıksal OR işlemini gerçekleştirir. | |
i ve j'nin bit bazında mantıksal OR işlemini gerçekleştirir. | |
i'yi 1'e tamamla | |
i ve j için OU EXCLUSIF'i oluşturur |
Şu programı ele alalım:
Module operationsbit
Sub main()
' bit işlemleri
Dim i As Short = &H123F
Dim k As Short = &H7123
Console.Out.WriteLine("i<<4=" & (i << 4).ToString("X"))
Console.Out.WriteLine("i>>4=" & (i >> 4).ToString("X"))
Console.Out.WriteLine("k>>4=" & (k >> 4).ToString("X"))
Console.Out.WriteLine("i and 4=" & (i And 4).ToString("X"))
Console.Out.WriteLine("i or 4 =" & (i Or 4).ToString("X"))
Console.Out.WriteLine("not i=" & (Not i).ToString("X"))
End Sub
End Module
Programın çalıştırılması şu sonuçları verir:
2.3.5.7. Atama işlemiyle birleştirilebilen operatörler
a+=b şeklinde yazılabilir; bu, a=a+b anlamına gelir. Atama işlemiyle birleştirilebilen operatörlerin listesi şöyledir:
^=, *=, /=, \=, +=, -=, &= |
2.3.5.8. Operatörlerin genel önceliği
Kategori | İşlemciler |
İşlemci içermeyen tüm ifadeler | |
^ | |
+, - | |
*, / | |
\ | |
Mod | |
+, - | |
& | |
<<, >> | |
=, <>, <, >, <=, >=, Like, Is, TypeOf...Is | |
Değil | |
Ve, AndAlso | |
Ve, OrElse | |
XOR |
Bir işleneni, aynı önceliğe sahip iki işleç arasına yerleştirildiğinde, işlemlerin gerçekleştirilme sırasını işleçlerin birleşim kuralı belirler. Tüm işleçler soldan birleşimlidir; bu, işlemlerin soldan sağa doğru gerçekleştirileceği anlamına gelir. Öncelik ve birleşim kuralı, parantez içindeki ifadeler kullanılarak kontrol edilebilir.
2.3.5.9. Tür Dönüştürmeleri
Bir veri türünden diğerine geçiş yapmayı sağlayan bir dizi önceden tanımlanmış işlev vardır. Bunların listesi şöyledir:
Bu işlevler, argüman olarak sayısal bir ifade veya bir karakter dizesi kabul eder. Sonucun türü aşağıdaki tabloda belirtilmiştir:
fonksiyon | sonuç | İşlev parametresinin değer aralığı |
Boolean | Herhangi bir geçerli dize veya sayısal ifade. | |
Bayt | 0 ile 255 arası; kesirler yuvarlanır. | |
Karakter | Herhangi bir geçerli String ifadesi; değer 0 ile 65.535 arasında olabilir. | |
Tarih | Tarih ve saatin herhangi bir geçerli gösterimi. | |
Double | -1,79769313486231E+308 ile -4,94065645841247E-324 arasında (negatif değerler için); 4,94065645841247E-324 ile 1,79769313486231E+308 arasında (pozitif değerler için). | |
Ondalık | +/-79 228 162 514 264 337 593 543 950 335, ondalık basamağı olmayan sayılar için. 28 ondalık basamaklı sayıların değer aralığı +/-7,9228162514264337593543950335'tir. Sıfırdan farklı en küçük sayı 0,0000000000000000000000000001'dir. | |
Tamsayı | -2 147 483 648 ile 2 147 483 647 arasındadır; kesirler yuvarlanır. | |
Uzun | -9 223 372 036 854 775 808 ile 9 223 372 036 854 775 807 arası; kesirler yuvarlanır. | |
| Nesne | Herhangi bir geçerli ifade. |
Kısa | -32 768 ile 32 767 arası; kesirler yuvarlanır. | |
Tek | -3,402823E+38 ile -1,401298E-45 arası negatif değerler için; 1,401298E-45 ile 3,402823E+38 arası pozitif değerler için. | |
String | Cstr işlevi tarafından döndürülen değerler, expression argümanına bağlıdır. |
İşte bir örnek program:
Module conversion
Sub main()
Dim var1 As Boolean = CBool("true")
Dim var2 As Byte = CByte("100")
Dim var3 As Char = CChar("A")
Dim var4 As Date = CDate("30 janvier 2004")
Dim var5 As Double = CDbl("100,45")
Dim var6 As Decimal = CDec("1000,67")
Dim var7 As Integer = CInt("-30")
Dim var8 As Long = CLng("456")
Dim var9 As Short = CShort("-14")
Dim var10 As Single = CSng("56,78")
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Console.Out.WriteLine("var10=" & var10)
End Sub
End Module
ve programın çalıştırılmasının sonuçları:
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
Aşağıdaki programda gösterildiği gibi CType(expression, type) işlevini de kullanabiliriz:
Module ctype1
Sub main()
Dim var1 As Boolean = CType("true", Boolean)
Dim var2 As Byte = CType("100", Byte)
Dim var3 As Char = CType("A", Char)
Dim var4 As Date = CType("30 janvier 2004", Date)
Dim var5 As Double = CType("100,45", Double)
Dim var6 As Decimal = CType("1000,67", Decimal)
Dim var7 As Integer = CType("-30", Integer)
Dim var8 As Long = CType("456", Long)
Dim var9 As Short = CType("-14", Short)
Dim var10 As Single = CType("56,78", Single)
Dim var11 As String = CType("47,89", String)
Dim var12 As String = 47.89.ToString
Dim var13 As String = "" & 47.89
Console.Out.WriteLine("var1=" & var1)
Console.Out.WriteLine("var2=" & var2)
Console.Out.WriteLine("var3=" & var3)
Console.Out.WriteLine("var4=" & var4)
Console.Out.WriteLine("var5=" & var5)
Console.Out.WriteLine("var6=" & var6)
Console.Out.WriteLine("var7=" & var7)
Console.Out.WriteLine("var8=" & var8)
Console.Out.WriteLine("var9=" & var9)
Console.Out.WriteLine("var10=" & var10)
Console.Out.WriteLine("var11=" & var11)
Console.Out.WriteLine("var12=" & var12)
Console.Out.WriteLine("var13=" & var13)
End Sub
End Module
Bu, aşağıdaki sonuçları verir:
var1=True
var2=100
var3=A
var4=30/01/2004
var5=100,45
var6=1000,67
var7=-30
var8=456
var9=-14
var10=56,78
var11=47,89
var12=47,89
var13=47,89
2.4. Programın işleyişini denetleme talimatları
2.4.1. Durdurma
Environment sınıfında tanımlanan Exit yöntemi, bir programın yürütülmesini durdurmaya yarar:
[Visual Basic]
Public Shared Sub Exit(ByVal exitCode As Integer )
çalışmakta olan işlemi durdurur ve exitCode değerini üst işleme döndürür. exitCode değeri üst işlem tarafından kullanılabilir. DOS durumunda, bu durum değişkeni, DOS olarak ERRORLEVEL sistem değişkenine aktarılır ve bu değer bir toplu iş dosyasında test edilebilir. Unix'te, exitCode'in değerini alan değişken $?'dir.
programın çalışmasını 0 durum değeriyle durdurur.
2.4.2. Basit seçim yapısı
- her eylem ayrı bir satırda yer alır
- else cümlesi bulunmayabilir.
Aşağıdaki örnekte gösterildiği gibi seçim yapıları iç içe geçirilebilir:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module if1
Sub main()
Dim i As Integer = 10
If i > 4 Then
Console.Out.WriteLine(i & " est > " & 4)
Else
If i = 4 Then
Console.Out.WriteLine(i & " est = " & 4)
Else
Console.Out.WriteLine(i & " est < " & 4)
End If
End If
End Sub
End Module
Elde edilen sonuç:
2.4.3. Durum yapısı
Sözdizimi şu şekildedir:
select case expression
case liste_valeurs1
actions1
case liste_valeurs2
actions2
...
case else
actions_sinon
end select
- [expression] türü, aşağıdaki türlerden biri olmalıdır:
- [case else] cümlesi bulunmayabilir.
- [liste_valeursi], ifadenin olası değerleridir. [listes_valeursi], condition1, condition2, ..., conditionx koşullarından oluşan bir listeyi temsil eder. [expression], koşullardan birini doğrularsa, [liste_valeursi] cümlesinin ardındaki eylemler yürütülür. Koşullar şu şekilde olabilir:
- val1 to val2: [expression], [val1,val2] etki alanına aitse doğrudur
- val1: [expression], val1'e eşitse doğrudur
- is > val1: [expression] > val1 ise doğru. [is] anahtar sözcüğü bulunmayabilir
- =, <, <=, >, >=, <> operatörleri için de durum aynıdır
- Yalnızca ilk koşulun karşılanmasıyla ilgili eylemler yürütülür.
Aşağıdaki programı ele alalım:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module selectcase1
Sub main()
Dim i As Integer = 10
Select Case i
Case 1 To 4, 7 To 8
Console.Out.WriteLine("i est dans l'intervalle [1,4] ou [7,8]")
Case Is > 12
Console.Out.WriteLine("i est > 12")
Case Is < 15
Console.Out.WriteLine("i est < 15")
Case Is < 20
Console.Out.WriteLine("i est < 20")
End Select
End Sub
End Module
Aşağıdaki sonuçları verir:
2.4.4. Tekrar yapısı
2.4.4.1. Tekrar sayısı biliniyor
For counter [ As datatype ] = start To end [ Step step ]
actions
Next [ counter ]
[counter] değişkeninin aldığı her bir değer için işlemler gerçekleştirilir. Aşağıdaki programı ele alalım:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module for1
Sub main()
Dim somme As Integer = 0
Dim résultat As String = "somme("
For i As Integer = 0 To 10 Step 2
somme += i
résultat += " " + i.ToString
Next
résultat += ")=" + somme.ToString
Console.Out.WriteLine(résultat)
End Sub
End Module
Sonuçlar:
Yineleme sayısı bilinen başka bir yineleme yapısı şöyledir:
For Each element [ As datatype ] In groupe
[ actions ]
Next [ element ]
- groupe bir nesne koleksiyonudur. Zaten bildiğimiz nesne koleksiyonu, dizi
- datatype, koleksiyondaki nesnelerin türüdür. Bir dizi için bu, dizinin elemanlarının türü olurdu
- element, döngüye özgü bir yerel değişkendir ve koleksiyondaki tüm değerleri sırayla alacaktır.
Dolayısıyla aşağıdaki kod:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module foreach1
Sub main()
Dim amis() As String = {"paul", "hélène", "jacques", "sylvie"}
For Each nom As String In amis
Console.Out.WriteLine(nom)
Next
End Sub
End Module
şunu görüntüler:
2.4.4.2. Tekrar sayısı bilinmiyor
Bu durum için VB.NET'te birçok yapı bulunmaktadır.
Do { While | Until } condition
[ statements ]
Loop
Koşul doğru olduğu sürece (while) veya koşul doğru olana kadar (until) döngü devam eder. Döngü hiç yürütülmeyebilir.
Do
[ statements ]
Loop { While | Until } condition
Koşul doğru olduğu sürece (while) veya koşul doğru olana kadar (until) döngü devam eder. Döngü her zaman en az bir kez yürütülür.
While condition
[ statements ]
End While
Koşul doğru olduğu sürece döngü devam eder. Döngü hiç yürütülmeyebilir. Aşağıdaki döngülerin tümü, ilk 10 tam sayının toplamını hesaplar.
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
2.4.4.3. Döngü yönetimi talimatları
do ... loop döngüsünden çıkar | |
for döngüsünden çıkma |
2.5. Bir programın yapısı VB.NET
Kullanıcı tarafından tanımlanmış bir sınıf veya ana işlev Main dışındaki işlevler kullanmayan bir VB.NET programı aşağıdaki yapıya sahip olabilir:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports espace1
Imports ....
Module nomDuModule
Sub main()
....
End Sub
End Module
- [Option Explicit on] yönergesi, değişkenlerin bildirilmesini zorunlu kılar. VB.NET'te ise bu zorunlu değildir. Bildirilmemiş bir değişken, bu durumda Object türündedir.
- [Option Strict on] yönergesi, veri kaybına yol açabilecek tüm veri türü dönüşümlerini ve sayısal türlerle dizeler arasındaki tüm dönüşümleri yasaklar. Bu durumda, dönüşüm işlevlerini açıkça kullanmak gerekir.
- Program, ihtiyaç duyduğu tüm ad alanlarını içe aktarır. Bu kavramı henüz ele almadık. Önceki programlarda sık sık şu tür komutlarla karşılaştık:
Aslında şöyle yazmamız gerekirdi:
burada System, [Console] sınıfını içeren ad alanıdır. Bir Imports komutuyla [System] ad alanını içe aktardığımızda, VB.NET, tanımadığı bir sınıfa rastladığında sistematik olarak bu ad alanını tarayacaktır. Aranan sınıfı bulana kadar, bildirilen tüm ad alanlarında aramayı tekrarlayacaktır. Bu durumda şöyle yazılır:
' ad alanları
Imports System
....
Console.Out.WriteLine(unechaine)
Bir program örneği şu şekilde olabilir:
' seçenekler
Option Explicit On
Option Strict On
'ad alanları
Imports System
' ana modül
Module main1
Sub main()
Console.Out.WriteLine("main1")
End Sub
End Module
Aynı program şu şekilde yazılabilir:
' seçenekler
Option Explicit On
Option Strict On
'ad alanları
Imports System
' test sınıfı
Public Class main2
Public Shared Sub main()
Console.Out.WriteLine("main2")
End Sub
End Class
Burada, bir sonraki bölümde tanıtılacak olan sınıf kavramını kullanıyoruz. Böyle bir sınıf, main adlı statik (shared) bir yordam içerdiğinde, bu yordam yürütülür. Bu yazımı buraya eklememizin nedeni, VB.NET'in ikiz dili olan C#'ın yalnızca sınıf kavramını tanımasıdır; c.a.d'e göre, yürütülen her kod mutlaka bir sınıfa aittir. Sınıf kavramı nesne yönelimli programlamaya aittir. Bunu her programın tasarımında zorunlu kılmak biraz sakıncalıdır. Bunu, önceki programın 2. sürümünde görüyoruz; burada, gerek olmadığı halde sınıf ve statik yöntem kavramlarını eklemek zorunda kalıyoruz. Bu nedenle, bundan sonra sınıf kavramını yalnızca gerekli olduğunda kullanacağız. Diğer durumlarda ise, yukarıdaki 1. sürümde olduğu gibi modül kavramını kullanacağız.
2.6. VB.NET programının derlenmesi ve çalıştırılması
VB.NET programının derlenmesi için yalnızca SDK.NET gereklidir. Şu programı ele alalım:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module boucles1
Sub main()
Dim i, somme As Integer
i = 0 : somme = 0
Do While i < 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do Until i = 11
somme += i
i += 1
Loop
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop Until i = 11
Console.Out.WriteLine("somme=" + somme.ToString)
i = 0 : somme = 0
Do
somme += i
i += 1
Loop While i < 11
Console.Out.WriteLine("somme=" + somme.ToString)
End Sub
End Module
Bu programın [boucles1.vb] adlı bir dosyada olduğunu varsayalım. Derlemek için şu adımları izleriz:
dos>dir boucles1.vb
11/03/2004 15:55 583 boucles1.vb
dos>vbc boucles1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
pour Microsoft (R) .NET Framework version 1.1.4322.573
Copyright (C) Microsoft Corporation 1987-2002. Tous droits réservés.
dos>dir boucles1.*
11/03/2004 16:04 601 boucles1.vb
11/03/2004 16:04 3 584 boucles1.exe
vbc.exe programı, VB.NET derleyicisidir. Burada, PATH'te DOS vardı:
dos>path
PATH=E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE;E:\Program Files\Microsoft Visual Studio .NET 2003\VC7\BIN;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin\prerelease;E:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin;E:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\bin;E:\WINNT\Microsoft.NET\Framework\v1.1.4322;e:\winnt\system32;e:\winnt;
dos>dir E:\WINNT\Microsoft.NET\Framework\v1.1.4322\vbc.exe
21/02/2003 10:20 737 280 vbc.exe
[vbc] derleyicisi, .NET sanal makinesi tarafından çalıştırılabilen bir .exe dosyası üretir:
2.7. IMPOTS örneği
Bir vergi mükellefinin vergisini hesaplayabilen bir program yazmayı hedefliyoruz. Beyan edeceği tek geliri maaşı olan bir vergi mükellefinin basitleştirilmiş durumunu ele alalım:
- evli değilse, çalışanın pay sayısı nbParts=nbEnfants/2 +1 olarak hesaplanır, evliyse nbEnfants/2+2 olarak hesaplanır; burada nbEnfants, çocuk sayısıdır.
- En az üç çocuğu varsa, yarım pay daha ekler
- vergilendirilebilir geliri R=0,72*S olarak hesaplanır; burada S, yıllık maaşıdır
- aile katsayısı QF = R/nbParts olarak hesaplanır
- Vergisi I hesaplanır. Aşağıdaki tabloyu ele alalım:
12620,0 | 0 | 0 |
13190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24.740 | 0,15 | 2072,5 |
31810 | 0,2 | 3309,5 |
39.970 | 0,25 | 4900 |
48360 | 0,3 | 6898,5 |
55790 | 0,35 | 9316,5 |
92970 | 0,4 | 12106 |
127.860 | 0,45 | 16754,5 |
151250 | 0,50 | 23147,5 |
172.040 | 0,55 | 30710 |
195.000 | 0,60 | 39312 |
0 | 0,65 | 49062 |
Her satırda 3 alan vardır. I vergisini hesaplamak için, QF<=alan1 olan ilk satır aranır. Örneğin, QF=23000 ise şu satır bulunur:
bulunur. I vergisi bu durumda 0,15*R - 2072,5*nbParts'e eşittir. Eğer QF, QF<=alan1 ilişkisini hiçbir zaman karşılamıyorsa, o zaman son satırdaki katsayılar kullanılır. Burada:
bu da I=0,65*R - 49062*nbParts vergi tutarını verir. Buna karşılık gelen VB.NET programı şöyledir:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module impots
' ------------ ana
Sub Main()
' vergi hesaplaması için gerekli veri tabloları
Dim Limites() As Decimal = {12620D, 13190D, 15640D, 24740D, 31810D, 39970D, 48360D, 55790D, 92970D, 127860D, 151250D, 172040D, 195000D, 0D}
Dim CoeffN() As Decimal = {0D, 631D, 1290.5D, 2072.5D, 3309.5D, 4900D, 6898.5D, 9316.5D, 12106D, 16754.5D, 23147.5D, 30710D, 39312D, 49062D}
' medeni durum bilgisi alınır
Dim OK As Boolean = False
Dim reponse As String = Nothing
While Not OK
Console.Out.Write("Etes-vous marié(e) (O/N) ? ")
reponse = Console.In.ReadLine().Trim().ToLower()
If reponse <> "o" And reponse <> "n" Then
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
Else
OK = True
End If
End While
Dim Marie As Boolean = reponse = "o"
' çocuk sayısı
OK = False
Dim NbEnfants As Integer = 0
While Not OK
Console.Out.Write("Nombre d'enfants : ")
reponse = Console.In.ReadLine()
Try
NbEnfants = Integer.Parse(reponse)
If NbEnfants >= 0 Then
OK = True
Else
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End If
Catch
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End Try
End While
' maaş
OK = False
Dim Salaire As Integer = 0
While Not OK
Console.Out.Write("Salaire annuel : ")
reponse = Console.In.ReadLine()
Try
Salaire = Integer.Parse(reponse)
If Salaire >= 0 Then
OK = True
Else
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End If
Catch
Console.Error.WriteLine("Réponse incorrecte. Recommencez")
End Try
End While
' pay sayısının hesaplanması
Dim NbParts As Decimal
If Marie Then
NbParts = CDec(NbEnfants) / 2 + 2
Else
NbParts = CDec(NbEnfants) / 2 + 1
End If
If NbEnfants >= 3 Then
NbParts += 0.5D
End If
' vergilendirilebilir gelir
Dim Revenu As Decimal
Revenu = 0.72D * Salaire
' aile katsayısı
Dim QF As Decimal
QF = Revenu / NbParts
' QF değerine karşılık gelen vergi diliminin belirlenmesi
Dim i As Integer
Dim NbTranches As Integer = Limites.Length
Limites((NbTranches - 1)) = QF
i = 0
While QF > Limites(i)
i += 1
End While
' vergi
Dim impots As Integer = CInt(i * 0.05D * Revenu - CoeffN(i) * NbParts)
' sonuç görüntülenir
Console.Out.WriteLine(("Impôt à payer : " & impots))
End Sub
End Module
Program, bir DOS penceresinde şu komutla derlenir:
dos>vbc impots1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4 pour Microsoft (R) .NET Framework version 1.1.4322.573
dos>dir impots1.exe
24/02/2004 15:42 5 632 impots1.exe
Derleme işlemi sonucunda impots.exe adlı bir yürütülebilir dosya oluşturulur. impots.exe dosyasının işlemci tarafından doğrudan çalıştırılamayacağına dikkat edilmelidir. Aslında bu dosya, yalnızca bir .NET platformunda çalıştırılabilen ara kod içerir. Elde edilen sonuçlar şunlardır:
dos>impots1
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : 3
Salaire annuel : 200000
Impôt à payer : 16400
dos>impots1
Etes-vous marié(e) (O/N) ? n
Nombre d'enfants : 2
Salaire annuel : 200000
Impôt à payer : 33388
dos>impots1
Etes-vous marié(e) (O/N) ? w
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? q
Réponse incorrecte. Recommencez
Etes-vous marié(e) (O/N) ? o
Nombre d'enfants : q
Réponse incorrecte. Recommencez
Nombre d'enfants : 2
Salaire annuel : q
Réponse incorrecte. Recommencez
Salaire annuel : 1
Impôt à payer : 0
2.8. Ana programın argümanları
Main ana yordamı, bir dize dizisini parametre olarak kabul edebilir:
Sub main(ByVal args() As String)
args parametresi, program çağrıldığında komut satırından geçirilen argümanları alan bir karakter dizisi dizisidir.
- args.Length, args dizisinin eleman sayısıdır
- args(i), dizinin i'inci elemanıdır
P programını şu komutla çalıştırırsak: P arg0 arg1 … argn ve P programındaki Main yordamı şu şekilde tanımlanmışsa:
Sub main(ByVal args() As String)
arg(0)="arg0", arg(1)="arg1" … gibi olur. İşte bir örnek:
' yönergeler
Option Strict On
Option Explicit On
' ad alanları
Imports System
Module arg
Sub main(ByVal args() As String)
' argüman sayısı
console.out.writeline("Il y a " & args.length & " arguments")
Dim i As Integer
For i = 0 To args.Length - 1
Console.Out.WriteLine("argument n° " & i & "=" & args(i))
Next
End Sub
End Module
Çalıştırıldığında şu sonuçlar elde edilir:
2.9. Sıralamalar
Bir sıralama, değer alanı tamsayı sabitlerinden oluşan bir veri türüdür. Bir sınavdaki notları yönetmesi gereken bir program düşünelim. Beş not vardır: Yeterli, AssezBien, İyi, TrèsBien, Mükemmel. O halde bu beş sabit için bir sıralama tanımlayabiliriz:
Enum mention
Passable
AssezBien
Bien
TrésBien
Excellent
End Enum
Sistem içinde, bu beş sabit, ilk sabit için 0, sonraki sabit için 1 vb. ile başlayan ardışık tamsayılarla kodlanır. Bir değişken, bu sıralamadaki değerleri alacağı şekilde tanımlanabilir:
' sıralamadan değer alan bir değişken
Dim maMention As mention = mention.Passable
Bir değişken, sıralamanın olası farklı değerleriyle karşılaştırılabilir:
' sıralama değeriyle test
If (maMention = mention.Passable) Then
Console.Out.WriteLine("Peut mieux faire")
End If
Sıralamanın tüm değerlerini elde edebiliriz:
For Each m In mention.GetValues(maMention.GetType)
Console.Out.WriteLine(m)
Next
Basit tür Integer'in Int32 yapısına eşdeğer olması gibi, basit tür Enum de Enum yapısına eşdeğerdir. Bu sınıf, parametre olarak geçirilen bir sıralı türün tüm değerlerini elde etmeyi sağlayan GetValues adlı statik bir yönteme sahiptir. Bu parametre, bir verinin türü hakkında bilgi veren bir sınıf olan Type türünde bir nesne olmalıdır. Bir v değişkeninin türü, v.GetType() ile elde edilir. Dolayısıyla burada maMention.GetType() işlevi, mentions ve Enum.GetValues(maMention.GetType()) ise mentions sıralamasının değerler listesini verir.
Aşağıdaki programda bu durum gösterilmektedir:
' yönergeler
Option Strict On
Option Explicit On
' ad alanları
Imports System
Public Module enum2
' bir sıralama
Enum mention
Passable
AssezBien
Bien
TrèsBien
Excellent
End Enum
' test sayfası
Sub Main()
' belirtilen sıralamadan değer alan bir değişken
Dim maMention As mention = mention.Passable
' değişken değerinin görüntülenmesi
Console.Out.WriteLine("mention=" & maMention)
' sıralama değeriyle test
If (maMention = mention.Passable) Then
Console.Out.WriteLine("Peut mieux faire")
End If
' sabit değerlerin listesi
For Each m As mention In [Enum].GetValues(maMention.GetType)
Console.Out.WriteLine(m.ToString)
Next
' tam ifadelerin listesi
For Each m As Integer In [Enum].GetValues(maMention.GetType)
Console.Out.WriteLine(m)
Next
End Sub
End Module
Çalıştırma sonuçları şöyledir:
2.10. İstisna Yönetimi
Birçok VB.NET işlevi, istisnalar, yani hatalar oluşturabilir. Bir işlevin istisna oluşturma olasılığı varsa, programcı, hatalara karşı daha dayanıklı programlar elde etmek amacıyla bu istisnayı yönetmelidir: Uygulamanın kontrolsüz bir şekilde "çökmesi" her zaman önlenmelidir.
Bir istisnanın yönetimi aşağıdaki şemaya göre gerçekleştirilir:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception e)
traiter l'exception e
end try
instruction suivante
İşlev bir istisna oluşturmazsa, bir sonraki komuta geçilir; aksi takdirde, catch cümlesinin gövdesine geçilir ve ardından bir sonraki komuta geçilir. Aşağıdaki noktalara dikkat edelim:
- e, Exception türünden türetilmiş bir nesnedir. IOException, SystemException vb. türleri kullanılarak daha kesin bir tanımlama yapılabilir: çeşitli istisna türleri mevcuttur. catch e as Exception yazarak, tüm istisna türlerini yönetmek istediğimizi belirtiriz. try cümlesinin kodu birden fazla istisna türü oluşturabiliyorsa, istisnayı birden fazla catch cümlesiyle yöneterek daha kesin bir tanımlama yapmak isteyebiliriz:
try
appel de la fonction susceptible de générer l'exception
catch e as IOException
traiter l'exception e
catch e as SystemException
traiter l'exception e
end try
instruction suivante
- try/catch maddelerine bir finally maddesi eklenebilir:
try
appel de la fonction susceptible de générer l'exception
catch e as Exception
traiter l'exception e
finally
code exécuté après try ou catch
end try
instruction suivante
İstisna olsun ya da olmasın, finally maddesinin kodu her zaman yürütülecektir.
- catch cümlesinde, mevcut olan Exception nesnesini kullanmak istemeyebilirsiniz. Bu durumda, catch e as Exception yazmak yerine catch yazılır.
- Exception sınıfında, meydana gelen hatayı ayrıntılı olarak açıklayan bir mesaj olan Message özelliği bulunur. Dolayısıyla bunu görüntülemek istersek şunu yazacağız:
catch e as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+e.Message);
...
end try
- Exception sınıfında, istisnanın türünü ve Message özelliğinin değerini belirten bir karakter dizesi döndüren ToString yöntemi bulunur. Böylece şu şekilde yazabiliriz:
catch ex as Exception
Console.Error.WriteLine("L'erreur suivante s'est produite : "+ex.ToString)
...
end try
Aşağıdaki örnek, mevcut olmayan bir dizi elemanının kullanılması sonucu oluşan bir istisnayı göstermektedir:
' seçenekler
Option Explicit On
Option Strict On
' ad alanları
Imports System
Module tab1
Sub Main()
' dizinin tanımlanması ve başlatılması
Dim tab() As Integer = {0, 1, 2, 3}
Dim i As Integer
' for döngüsüyle dizi görüntüleme
For i = 0 To tab.Length - 1
Console.Out.WriteLine(("tab[" & i & "]=" & tab(i)))
Next i
' for each döngüsüyle dizi görüntüleme
Dim élmt As Integer
For Each élmt In tab
Console.Out.WriteLine(élmt)
Next élmt
' istisna oluşturma
Try
tab(100) = 6
Catch e As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " & e.Message))
End Try
End Sub
End Module
Programın çalıştırılması sonucunda aşağıdaki çıktılar elde edilir:
dos>exception1
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
0
1
2
3
L'erreur suivante s'est produite : L'index se trouve en dehors des limites du tableau.
İşte, bir dize bir sayıya atanırken, dizenin bir sayı olmadığını gösterdiği durumlarda ortaya çıkan istisnayı işleyen başka bir örnek:
' seçenekler
Option Strict On
Option Explicit On
'içe aktarmalar
Imports System
Public Module console1
Public Sub Main()
' Ad soruluyor
System.Console.Write("Nom : ")
' yanıt okuma
Dim nom As String = System.Console.ReadLine()
' yaş soruluyor
Dim age As Integer
Dim ageOK As Boolean = False
Do While Not ageOK
' soru
Console.Out.Write("âge : ")
' cevabın okunması ve doğrulanması
Try
age = Int32.Parse(System.Console.ReadLine())
If age < 0 Then Throw New Exception
ageOK = True
Catch
Console.Error.WriteLine("Age incorrect, recommencez...")
End Try
Loop
' son ekran
Console.Out.WriteLine("Vous vous appelez [" & nom & "] et vous avez [" & age & "] ans")
End Sub
End Module
Bazı çalıştırma sonuçları:
dos>console1
Nom : dupont
âge : xx
Age incorrect, recommencez...
âge : 12
Vous vous appelez dupont et vous avez 12 ans
2.11. Bir fonksiyona parametrelerin aktarılması
Burada, bir fonksiyona parametrelerin nasıl aktarıldığına odaklanacağız. Şu fonksiyonu ele alalım:
Sub changeInt(ByVal a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
Fonksiyon tanımında, a, biçimsel parametre olarak adlandırılır. Bu parametre, yalnızca changeInt fonksiyonunun tanımlanması amacıyla kullanılmaktadır. Aynı şekilde b olarak da adlandırılabilirdi. Şimdi bu fonksiyonun bir kullanım örneğini ele alalım:
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Burada changeInt(age) komutunda, age, değerini a biçimsel parametresine aktaracak olan etkin parametredir. Burada, bir biçimsel parametrenin kendisine karşılık gelen etkin parametrenin değerini nasıl aldığıyla ilgileniyoruz.
2.11.1. Değerle aktarım
Aşağıdaki örnek, bir fonksiyonun/prosedürün parametrelerinin varsayılan olarak değer yoluyla aktarıldığını göstermektedir: yani, etkin parametrenin değeri, karşılık gelen biçimsel parametreye kopyalanır. Burada iki ayrı varlık söz konusudur. Fonksiyon biçimsel parametreyi değiştirirse, etkin parametre hiçbir şekilde değiştirilmez.
' seçenekler
Option Explicit On
Option Strict On
' bir fonksiyona değer olarak parametre aktarımı
Imports System
Module param1
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Sub changeInt(ByVal a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
End Module
Elde edilen sonuçlar şunlardır:
Etkin parametrenin 20 değeri, biçimsel parametre a'e kopyalandı. Bu parametre daha sonra değiştirildi. Etkin parametre ise değişmeden kaldı. Bu aktarım yöntemi, bir fonksiyonun giriş parametreleri için uygundur.
2.11.2. Referansla aktarım
Referansla aktarımda, etkin parametre ile biçimsel parametre tek ve aynı varlıktır. İşlev biçimsel parametreyi değiştirirse, etkin parametre de değiştirilir. VB.NET'te, biçimsel parametrenin önüne ByRef anahtar sözcüğü eklenmelidir. İşte bir örnek:
' seçenekler
Option Explicit On
Option Strict On
' bir fonksiyona değer yoluyla parametre aktarımı
Imports System
Module param2
Sub Main()
Dim age As Integer = 20
changeInt(age)
Console.Out.WriteLine(("Paramètre effectif age=" & age))
End Sub
Sub changeInt(ByRef a As Integer)
a = 30
Console.Out.WriteLine(("Paramètre formel a=" & a))
End Sub
End Module
ve yürütme sonuçları:
Etkin parametre, biçimsel parametredeki değişikliği takip etmiştir. Bu aktarım yöntemi, bir fonksiyonun çıktı parametreleri için uygundur.

