Visual Basic İçin Programcılık Dersleri (Bölüm 3)

Bu derste Visual Basic kodu yazıp derleme yapmaya kaldığımız yerden devam edeceğiz, değişken tanımlayıp namespace'lerden söz edeceğiz.

Bu derste Visual Basic kodu yazıp derleme yapmaya kaldığımız yerden devam edeceğiz, değişken tanımlayıp namespace'lerden söz edeceğiz.

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ı bu programı derleyip EXE dosya hazırlamıştık. Hatta örneğimizin son hali beklediğimiz sonucu vermemişti. Bu dersimizde ilk olarak bir önceki yani 2. 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.



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.



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. Tam bu noktada bir uyarıda bulunmak istiyorum: Bu kısacık kodda tanımladığım Integer tipindeki 2 değişkene Sayi1 ve Sayi2 adını verdim. Sayi1 ve Sayi2 daha önce yerli bir programcılık kitabı yazarı tarafından register edildiği için başınızın belaya girmesini istemiyorsanız Sayi1 ve Sayi2'yi değişken adı olarak kullanmayın. Kendimi garantiye almak için yani değişkenlere ad seçerken başka programcılık kitaplarından değişken adı çalmanın anlamsız olduğunu kanıtlamak için bu kodu bir de şöyle düzenledim.


Class Deneme

   Shared Sub Main()

     Dim Str1 As String

     Dim Str2 As String

     Dim Odun1 As Integer

     Dim Odun2 As Integer

     System.Console.Write("İlk sayıyı girin    : ")

     Str1 = System.Console.ReadLine()

     System.Console.Write("İkinci sayıyı girin : ")

     Str2 = System.Console.ReadLine()

      Odun1 = System.Int16.Parse(Str1)

      Odun2 = System.Int16.Parse(Str2)  

   End Sub 

End Class



Böylece değişken adı çalma suçlamasıdan kurtulduktan sonra kaldığımız yerden devam edelim. Hemen bir 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. 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'deki sınıfları kullanmak istediğinizi Imports deyimi ile işaret 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'deki sınıfları kullanmak istediğinizi aşağıdaki gibi Imports deyimi ile işaret 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. Her ne kadar birçok kaynakta yazıldığı gibi bazen alışkanlıktan Imports deyimiyle Namespace'in koda dahil edilmesinden söz edilse bile Imports deyimiyle koda dahil edilen birşey yoktur. Namespace'i içeren DLL dosyası veya referans yerinde durmaktadır.

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 Fener

   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. Uygulamada 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.



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.



Bu bilgilerin ayrı satırlara yazılmasını sağlamak için Write() yerine WriteLine() metodunu kullanabilirsiniz. WriteLine() metodu kendisine parametre olarak verilen bilgiyi konsola 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



Ey programcı olmak isteyen arkadaş: Burada anlatılanları birçok kitapta veya sitede görmüş olmalısınız. Hele hele Console sınıfının ReadLine gibi metotları hakkında bilgi içeren binlerce siteyi bulman mümkündür. Lütfen eğri otursanız bile doğru konuşun; sizce bu metnin anlatım biçiminden yani cümle şeklinden başka orijinal bir yanı var mıdır? Bence yoktur. Ya buna rağmen birileri çıkıp "Memik Yanık bu metni garanti benim kitaptan çalmış" derse nasıl bir tepki verirdiniz? Lütfen gülmeyiniz. Hem de Prof ünvanına sahip birileri bu iddiayı onaylarlarsa hiç şaşırmayınız. Bir sonraki derste Visual Basic için hazırlanmış Express Edition'dan söz edeceğiz.
  • Etiketler;
Memik Yanık
Hakkında bilgi yakın zamanda eklenecektir.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git