Visual Basic: 3. Ders

Bu konuyu okuyanlar

Berkin Bozdoğan

Müdavim
Katılım
18 Mayıs 2005
Mesajlar
4,926
Reaksiyon puanı
38
Puanları
0
Memik Yanık, derslerine devam ediyor. İlk programın yazılması ve ardından da .EXE olarak kaydedilmesinden sonra sırada en son yazılan örneğin hata ayıklaması var.

Bir önceki derste Not Defteri ile kısa bir Visual Basic programı hazırlayıp “ilk.vb” adıyla kaydetmiştik. Devamında bu VB uzantılı programı derleyip EXE dosya hazırlamıştık. Hatta örneğimizin son hali beklediğimiz sonucu vermemişti. Bu dersimizde ilk olarak o derste yaptığımız örneği düzeltelim. Bir önceki dersimizde hazırladığımız örneğin son şeklini aşağıda verdim.

Class Deneme
Shared Sub Main()
Dim Yil As Integer
System.Console.Write("Hangi Yıldayız : ")
Yil = System.Console.Read()
System.Console.WriteLine()
System.Console.Write("Girdiğiniz Yıl :")
System.Console.WriteLine(yil)
End Sub
End Class



Bu koda dikkat ederseniz konsoldan bilgi okuma işlemi Console sınıfının Read() metodu ile yapılmaktadır. Read() metodu konsoldan okuma yaparken girilen bilginin ilk karakterinin ASCII kodunu geriye göndermektedir. Bu örnek program çalıştırılıp “Hangi Yıldayız :” sorusuna “A” ile cevap verilirse ekrana 65 yazılır. Çünkü “A” hafinin ASCII kodu 65’dir.

vb_ders_3_resim_1.jpg

Console sınıfının ReadLine() metodu ise farklı bir şekilde çalışmaktadır ve konsoldan yani DOS penceresinden okuduğu bilginin String tipte olduğunu varsaymaktadır. Bu nedenle yukarıda verdiğimde örnekte değişiklik yapıp okuma işlemini Read() yerine ReadLine() metodu ile yapmaya çalıştım.

Class Deneme
Shared Sub Main()
Dim Yil As Integer
System.Console.Write("Hangi Yıldayız : ")
Yil = System.Console.ReadLine()
System.Console.WriteLine()
System.Console.Write("Girdiğiniz Yıl :")
System.Console.WriteLine(yil)
End Sub
End Class


Bu şekilde değiştirdiğimiz Visual Basic programını derlersek hata meydana gelmesini beklerken Visual Basic derleyicisi derleme sırasında hata rapor etmez. Bu örnekte ReadLine() metodu konsoldan okuduğu bilgiye String muamelesi yapmasına rağmen okunan bilgi bu örnekte Integer tipindeki “Yil” adlı değişkene aktarılmaktadır. Bu Visual Basic programını derleyip çalıştırıp Integer tipindeki değişkene aktarılmaya uygun olmayan bilgiyi konsola yazıp ReadLine() metodu ile Integer tipindeki değişkene aktarırsanız çalışma anında hata meydana gelir.

Visual Studio veya Visual Basic için geliştirilen Express Edition ile çalışırken ayarlama yapıp derleyicinin ileride çıkması muhtemel olan bu sorunlara derleme sırasında engel olabilirsiniz. Kafanızı karıştırmamak için DOS penceresinde derleme yaparken derleyicinin bu tip hataları nasıl yakaladığından söz etmeyeceğim. Ayrıca Visual Basic derleyicisinin yukarıda verdiğim kodu derlerken hata vermek üzere ayarlandığını varsayacağım.

Yukarıda verdiğim kodda ReadLine() metodu tarafından okunup geriye gönderilen String bilgiyi dönüştürüp Integer tipindeki değişkene aktarmak yerine String bir değişken tanımlayıp ReadLine() metodunun konsoldan okuduğu bilgiyi String değişkene aktaracağım.


Class Deneme
Shared Sub Main()
Dim Str As String
System.Console.Write("Hangi Yıldayız : ")
Str = System.Console.ReadLine()
System.Console.WriteLine()
System.Console.Write("Girdiğiniz Yıl :")
System.Console.WriteLine(Str)
End Sub
End Class

Bu hali ile program istediğimiz sonucu verir. Bu örnekte konsoldan girilen “yıl” bilgisi matematiksel işlemlerde kullanılmadığı için rakamlardan meydana gelse bile String yani karaktersel bilgi olarak değerlendirmenin bir sakıncası olmaz.

Şimdi bu örnekte değişiklik yapıp kullanıcıdan 2 sayısal bilgi isteyip bunları birbirleri ile çarptıktan sonra sonucu ekrana yani konsola yazacağım. Bu düşünce ile önce 2 String değişken tanımlayıp ReadLine() metodu ile okunan bilgileri bu değişkenlere aktardım.

vb_ders_3_resim_2.jpg

Bu program bu hali ile kaydedilip çalıştırılırsa konsoldan girilen bilgiler String değişkenlere aktarılır. Bu örnekteki amacımız kullanıcının sayısal bilgi girmesini ve bu sayıları birbiri ile çarpıp ekrana getirmek olduğu için matematiksel işlem öncesi String değişkenlerin içeriğini Integer tipindeki değişkenlere aktarmak gerekir. Bu amaçla bu Visual Basic programına ekleme yapıp 2 Integer değişken tanımladım. Ardından String değişkenlerin içeriklerini dönüştürüp Integer tipindeki bu değişkenlere aktardım.

Class Deneme
Shared Sub Main()
Dim Str1 As String
Dim Str2 As String
Dim Sayi1 As Integer
Dim Sayi2 As Integer
System.Console.Write("İlk sayıyı girin : ")
Str1 = System.Console.ReadLine()
System.Console.Write("İkinci sayıyı girin : ")
Str2 = System.Console.ReadLine()
Sayi1 = System.Int16.Parse(Str1)
Sayi2 = System.Int16.Parse(Str2)
End Sub
End Class

Bu kodda sizin için yeni olan System adlı Namespace’de yer alan Int16 sınıfıdır. String bilgiyi integer tipindeki değişkene aktarırken bu sınıfın Parse() metodunu kullandım. Bu dönüştürme işlemini yaparken Int16 yerine Int32 sınıfının Parse() metodunu kullanabilirdim.

Hemen hatırlatmada bulunmak isterim: Her ne kadar bu örnekte kullanıcıya sayı girin mesajı verilmiş olsa bile kullanıcı sayılsal bilgi yerine karaktersel bilgi girerse Parse() metodu dönüştürme yapamayacağı için hata meydana gelir. Bu tip muhtemel hataların önene geçmek için hata kontrol blokları hazırlanır.

Bu şekilde konsoldan girilen bilgileri Parse() metodu ile integer tipindeki değişkenlere aktardıktan sonra matematiksel işlem yapabiliriz. Matematiksel işlem sonucu bulunacak değeri aktarmak üzere 3. bir integer değişken tanımladım.

Class Deneme
Shared Sub Main()
Dim Str1 As String
Dim Str2 As String
Dim Sayi1, Sayi2, Sonuc As Integer
System.Console.Write("İlk sayıyı girin : ")
Str1 = System.Console.ReadLine()
System.Console.Write("İkinci sayıyı girin : ")
Str2 = System.Console.ReadLine()
Sayi1 = System.Int16.Parse(Str1)
Sayi2 = System.Int16.Parse(Str2)
Sonuc = Sayi1 * Sayi2
End Sub
End Class


Bu kodu dikkatice incelerseniz bir satırda aynı tipte birden fazla değişken tanımlamış olduğumu görürsünüz. Uyarmak gerekirse; bu programı derleyip çalıştırıp sonra 1. sayı ile 2. sayının çarpımı sonucu elde edilecek sayısal bilgi 2147.483.647’den büyük olursa hata meydana gelir.

Ayrıca String bilgileri Int16 sınıfının Parse() metodu ile dönüştürdüğümüz için konsoldan girilen sayılar 32767’den büyük olmamalı. Int16 sınıfının Parse() metodu yerine Int32 sınıfının Parse() metodunu kullansaydım 1. veya 2. sayı 2147.483.647 gibi büyük bir değer olabilirdi.

Çarpma işlemi sonucu bulunan değeri WriteLine() metodu sayesinde direk konsola yazmak mümkün olmasına rağmen amacım bazı konuları anlatmak olduğu için üçüncü bir String değişken tanımlayıp çarpma işlemi sonucu bulunan değeri dönüştürüp bu değişkene aktardım. Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.


Class Deneme
Shared Sub Main()
Dim Str1 As String
Dim Str2 As String
Dim Sonuc_str As String
Dim Sayi1, Sayi2, Sonuc As Integer
System.Console.Write("İlk sayıyı girin : ")
Str1 = System.Console.ReadLine()
System.Console.Write("İkinci sayıyı girin : ")
Str2 = System.Console.ReadLine()
Sayi1 = System.Int16.Parse(Str1)
Sayi2 = System.Int16.Parse(Str2)
Sonuc = Sayi1 * Sayi2
Sonuc_str = System.Convert.ToString(Sonuc)
End Sub
End Class


Dikkat ederseniz integer tipindeki değişkenin içeriğini string tipindeki değişkene aktarabilmek için Convert sınıfının ToString() metodundan yararlandım. Visual Basic’in .NET uyumu sürümü ile az çok uğraşmış olanlar bu işlemin daha kısa bir yolunun olduğunu ileri sürebilirler. Bu arkadaşlar haklıdırlar: Dönüştürme yaparken Convert sınıfının ToString() metodu yerine Object sınıfının ToString() metodunu kullanabilirsiniz. Object sınıfının ToString() metodunun nasıl kullanıldığını daha sonra anlatacağım. ToString() metodu ile integer bilgiyi string bilgiye dönüştürdükten sonra WriteLine() metodu ile konsola yazdım.


Class Deneme
Shared Sub Main()
Dim Str1 As String
Dim Str2 As String
Dim Sonuc_str As String
Dim Sayi1, Sayi2, Sonuc As Integer
System.Console.Write("İlk sayıyı girin : ")
Str1 = System.Console.ReadLine()
System.Console.Write("İkinci sayıyı girin : ")
Str2 = System.Console.ReadLine()
Sayi1 = System.Int16.Parse(Str1)
Sayi2 = System.Int16.Parse(Str2)
Sonuc = Sayi1 * Sayi2
Sonuc_str = System.Convert.ToString(Sonuc)
System.Console.WriteLine("Sayıların çarpımı : " + sonuc_str)
System.Console.Write("Devam etmek için bir tuşa basın")
System.Console.Read()
End Sub
End Class


Biraz da Namespace’lerden Söz Edelim

Şimdi yukarıda adım adım anlatılan örneği bir tarafa bırakıp başka bir örnek hazırlayacağım. Visual Basic programlarını veya projelerini hazırlarken Visual Studio veya Visual Basic için hazırlanmış Express Edition’dan yararlanma yoluna henüz gitmediğimiz için VB uzantılı Visual Basic programlarını Not Defteri ile hazırlıyoruz. Hazırladığım basit Visual Basic programını aşağıda verdim.

Class Sinif_1
Shared Sub Main()
System.Console.Write("Fenerbahçe Basketbol Takımı")
System.Console.ReadLine()
End Sub
End Class

Bu şekilde hazırlanan Visual Basic programı DOS penceresinde derlenip çalıştırılırsa belirtilen bilgi Write() metodu sayesinde DOS penceresine yazılır. Bir sonraki satırda kullanılan ReadLine() metodu sayesinde enter tuşuna basılıncaya kadar program çalışmaya devam eder. Bu örnekte ReadLine() yerine Read() metodu kullanılsaydı değişen bir şey olmazdı.

.NET Framework adı verilen sınıf kitaplığı ile gelen sınıfların Namespace adı verilen yapılarda saklandığını biliyorsunuz. Visual Basic programlarında kullanmak istediğiniz Class hangi Namespace’in içinde yer alıyorsa o Namespace’ı Imports deyimi ile koda dahil etmelisiniz veya yukarıda yapıldığı gibi kullanmak istediğiniz Namespace’in adını metodun önüne her seferinde yazmalısınız.

DOS penceresi ile ilgili Console sınıfı System adlı Namespace’te yer aldığı için Write() metodundan önce bu Namespace’in adını yazdım. Söz konusu Namespace’teki sınıfları programınızda çok kez kullanıyorsanız her seferinde Namespace’in adını bu şekilde yazmak yerine aşağıda yapıldığı gibi ilgili Namespace’i Imports deyimi ile koda dâhil edebilirsiniz.


Imports System
Class Sinif_1
Shared Sub Main()
Console.Write("Fenerbahçe Basketbol Takımı")
Console.ReadLine()
End Sub
End Class

Imports deyimi ile olmayan bir namespace’i Visual Basic programınıza dahil etmek istemeniz halinde derleme sırasında hata meydana gelir ve programın derlenmesi tamamlanmaz.

Visual Basic programlarınızda .NET Framework ile gelen Namespace’lerdeki hazır sınıfları kullanmanın ötesinde kendi hazırladığınız class’ları bir Namespace’in içine koymanız gerekir. Yukarıda bunu yapmamış olmamıza rağmen herhangi bir hata meydana gelmedi. Çünkü programcı yazdıklarını bir Namespace’e yerleştirmediği zaman Visual Basic derleyicisi kendiliğinden bir Namespace hazırlamaktadır. Şimdi yukarıda verdiğim programdaki “Sinif_1” adını verdiğim Class’ı bir Namespace’e dahil edeceğim.

Imports System
Namespace SDN
Class Sinif_1
Shared Sub Main()
Console.Write("Fenerbahçe Basketbol Takımı")
Console.ReadLine()
End Sub
End Class
End Namespace

Yukarıda bold yapılan paragrafı ve bu kısa Visual Basic kodunu C++, C# veya Java gibi nesneye yönelik programlama dilleri hakkında az çok bilgi sahibi birisine gösterseniz “bunda önemli olan nedir veya üzerinde durulacak ne var ki?” diye size soru yöneltmesi yüksek ihtimaldir. Çünkü konuya kendi açısından bakacaktır.

Bu dersleri Visual Basic ve nesneye yönelik programcılık konusunda yeni olanları düşünerek kaleme aldığım için yukarıda verdiğim kısa kodu ve bold yapılan açıklama karşısında şaşırılması normaldir. Bu düşünce ile aşağıda farklı renge boyanan paragrafı kaleme aldım.

Visual Basic’in .NET uyumlu sürümü ile program yazanların kaçmakla kurtulamayacakları kavramların birisi Class, diğeri ise Namespace’tir. Nesneye yönelik programcılığın temeli olan Class kavramı hakkında henüz doğru dürüst bilgi verilmemiş olmakla birlikte sanırım Class kavramı hakkında kafanızda beliren soruların üzerinde durmamayı şimdilik başarıyorsunuz Class bir yana bir de Namespace’ten söz edilince kafanızdaki sorular önem kazanmaya başlamış olabilir.

Birden Fazla Main() Metodu

Uygulamanızda birden fazla Class varsa Main() metodunun hangi Class’ta olduğunun önemi yoktur. Çünkü Visual Basic derleyicisi Main() metodunun hangi Class’ta olduğunu arayıp buluyor. Uygulamadaki birden fazla sınıfta Main() metodu varsa hangisinin kullanılacağının belirtilmesi gerekir. Bu konuda bilgi vermek için aşağıdaki gibi bir Visual Basic programı hazırladım.

Imports System
Class Sinif_1
Shared Sub Main()
Console.Write("Program İlk sınıftaki Main ile başladı")
Console.ReadLine()
End Sub
End Class
Class Sinif_2
Shared Sub Main()
Console.Write("Program İkinci sınıftaki Main ile başladı")
Console.ReadLine()
End Sub
End Class

Bu şekilde hazırlanan Visual Basic programı bilinen şekilde derlendiğinde hata meydana gelir. Derleme satırında hangi sınıftaki Main() metodunun kullanılmak istendiği belirtilmelidir. Bu konsol uygulaması aşağıdaki gibi derlenirse uygulama ilk sınıftaki Main() metodundan itibaren çalışmaya başlar.

vb_ders_3_resim_3.jpg

Write ve WriteLine Metotları

Yukarıda verdiğim örneklerde konsola her seferinde yalnızca bir bilgi yazdım. Şimdi konunun anlaşılması için 4 bilgiyi yazacağım. Bu amaçla aşağıda verdiğim Visual Basic programını hazırladım.

Imports System
Class Sinif_1
Shared Sub Main()
Console.Write("Fenerbahçe")
Console.Write("Galatasaray")
Console.Write("Beşiktaş")
Console.Write("Trabzonspor")
Console.ReadLine()
End Sub
End Class

Bu programda Write() metodu ile konsola 4 bilgi arka arkaya yazılmakta ve ReadLine() metodu ile programın işletimi askıya alınmaktadır. Write() metodu ile konsola bilgi yazıldıktan sonra imleç yazma işleminin tamamlandığı yerde bekleyeceği için bu program derlenip çalıştırılırsa aşağıdaki gibi bir sonuç elde edilir.

vb_ders_3_resim_4.jpg

Bu bilgilerin ayrı satırlara yazılmasını sağlamak için Write() yerine WriteLine() metodunu kullanabilirsiniz. WriteLine() metodu kendisine parametre olarak verilen bilgiyi belirtilen ortama (burada konsol) yazdıktan sonra imleci bir sonraki satırın başına alır.

Imports System
Class Sinif_1
Shared Sub Main()
Console.WriteLine("Fenerbahçe")
Console.WriteLine("Galatasaray")
Console.WriteLine("Beşiktaş")
Console.WriteLine("Trabzonspor")
Console.ReadLine()
End Sub
End Class

Yazan: Memik Yanık
SDN - http://shiftdelete.net
 

Son mesajlar

Üst