C# Programcılık Dersleri (Bölüm 3)

Biraz geçikmeyle olsa C# konulu 3. yazıyı sizler için gözden geçirdim.

C# - 3. Ders: Bazı Değişken Tipleri ve Namespace'ler
 
Biraz geçikmeyle olsa C# konulu 3. yazıyı sizler için gözden geçirdim. Bu yazıları neden mi kaleme almıştım? Programcılık kitaplarının ilk sayfalarında konuları sıfırdan ele alıp adım adım anlatınca bazı arkadaşlar kitabın anlatım düzeyine itiraz etmeye başladılar. Ben de çözüm olarak henüz yolun başında olanları gözeterek birkaç makale kaleme aldım. Tabi burada yer sorunu olmadığı için en küçük ayrıntıdan bile söz etmeye çalıştım.

Şimdi izninizle konunun biraz dışına çıkacağım: Tıp doktorları kendi aralarında tıp konuştuklarında kavramları sıkça kullanırlar ve kolayca anlaşırlar. Ne ki doktorun birisi hastasıyla konuştuğunda tıp kavramlarını kullanmaz ve halk dili ile hastasıyla diyalog kurmaya çalışır. Doktorumuz hastalarıyla tıp kavramlarını kullanmadan diyalog kurabiliyorsa başarılı olur. Camiadan bir çok kişi Memik Yanık'ı hep giriş düzeyi kitaplar yazmakla suçladırlar. Halbuki en zoru giriş düzeyi kitaplar yazmaktır. Bakalım şimdi de giriş düzeyi makaleler yazıyorum diye suçlayacaklar mıdır? Ötesi anlı şanlı üniversitelerimizin Profesör ünvanına sahip hocaları bu metinde verdiğim kısacık kodlarda tanımladığım değişkenleri çalma suçunu tekrar işlediğimi rapor edecekler midir?

Kaldığımız Yerden Devam Edelim

Bir önceki derste Not Defteri ile kısa bir C# programı hazırlayıp "ilk.cs" adıyla kaydetmiştik. Devamında bu CS uzantılı C# programını konsolda 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üzelteceğiz. Bir önceki dersimizde hazırladığımız örneğin son şeklini aşağıda verdim.
 

class Deneme

 {

   static void Main(string[] args)

    {

       int yil;

       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);

    }

 }

 

Not : Bu kısacık kodda "Yil" adında bir değişken tanımladım. Bildiğiniz gibi sene bilgisini aktarmak üzere değişken adı seçimini yapan programcıların aklına Yil'ın gelmesi yüksek bir ihtimaldir. Demek istediğim şudur: Eğer "Yil" değişkenini kendi namı hesabına kaydetmiş yani register etmiş birisi beni uyarısa burada "Yil" adını verdiğim değişken "yillar_yillar" veya "Kaybolan_yillar" gibi bir ad verebilirim(!).

Bu koda dikkat ederseniz konsoldan bilgi okuma işlemi 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

 {

   static void Main(string[] args)

    {

       int yil;

       System.Console.Write("Hangi Yıldayız : ");

       yil = System.Console.ReadLine();

       System.Console.Write("Girdiğiniz Yıl :");

       System.Console.WriteLine(yil);

    }

 }


 
Bu şekilde değiştirdiğimiz C# programını derlemeye çalışırsak hata meydana gelir. Çünkü ReadLine() metodu tarafından okunup geriye gönderilen bilgi String tipte olmasına rağmen burada int tipindeki değişkene aktarmaya çalışıyorum. Bu hatanın önüne geçmek için �yil� adını verdiğim değişken yerine string tipte bir değişken tanımlayıp kullandım. Daha önce az çok kod yazmış olanların bileceği gibi aşağıda verdiğim kodun hiç bir orijinal tarafı yok. Buna rağmen Prof ünvanlı birisi "bu kodda Memik Yanık başka kaynaklardan çalıntı yapmış diye rapor ederse, ona "haklısın hocam" demekten elimizden başka birşey gelmez.
 

class Deneme

 {

   static void Main(string[] args)

    {

       string str;

       System.Console.Write("Hangi Yıldayız : ");

       str = System.Console.ReadLine();

       System.Console.Write("Girdiğiniz Yıl :");

       System.Console.WriteLine(str);

    }

 }


 
Bu hali ile programımız 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 amaçla önce 2 string değişken tanımlayıp Console sınıfının 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 yazmak olduğu için matematiksel işlem öncesi String değişkenlerin içeriğini int tipindeki değişkenlere aktarmak gerekir. Bu amaçla bu C# programına ekleme yapıp int tipinde 2 değişken tanımladım. Ardından string değişkenlerin içeriklerini dönüştürüp int tipindeki bu değişkenlere aktardım.
 

class Deneme

 {

   static void Main(string[] args)

    {

      string str1;

      string str2;

      int sayi1;

      int sayi2;

      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);

    }

 }


 
Bu kodda sizin için yeni olan System adlı namespace'de yer alan Int16 yapısıdır. String bilgiyi int tipindeki değişkene aktarırken bu yapının Parse() metodunu kullandım. Bu dönüştürme işlemini yaparken Int16 yerine Int32 yapısının Parse() metodunu kullanabilirdim. Merak edenlere duyurmak isterim: Memik yıllar önce yayınlanan Clipper kitabından bu yana yazdığı bütün kitaplarda integer tipindeki değişkenlere ad ararken tercihini sayi1, sayi2'dan yana kullandı. Ne ki say1, sayi'yi değişken adı olarak seçmesi onun hırsız olarak suçlanmasına neden oldu? Bu kodda tanımlanan değişkenlere sayi1, sayi2 gibi adlar vermenin mecbur olmadığının kanıtlamak için bu kodu aşağıdaki gibi düzenledim. Hiç kaygılanmayın bu değişkenlere gavurca adlar seçildiğinde bile kod hatasız çalışıyor. Eğer çevrenizde "hayır bu kodun çalışabilmesi için değişken adının mutlaka sayi1, sayi2 olarak seçilmesi şarttır diyen öğretim üyelerine rastlarsanız "hocam haklısınız, C# derleyicisi sizden iyi mi bilecek deyin".


class Deneme

 {

   static void Main(string[] args)

    {

      string str1;

      string str2;

      int number1;

      int numberi2;

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

      str1 = System.Console.ReadLine();

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

      str2 = System.Console.ReadLine();

       number1 = System.Int16.Parse(str1);

       number2 = System.Int16.Parse(str2);

    }

 }



Hemen hatırlatmada bulunmak isterim: Her ne kadar bu örnekte kullanıcıya "sayı girin" mesajı verilmiş olunsa bile kullanıcı sayısal 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ırlanabilir. Tabii bu derste bundan Try-Catch deyimlerinden söz etmeyeceğiz.
 
Bu şekilde konsoldan girilen bilgileri Parse() metodu ile dönüştürüp int tipindeki değişkenlere aktardıktan sonra matematiksel işlem yapabiliriz. Matematiksel işlem sonucu bulunacak değeri aktarmak üzere int tipinde 3. bir değişken tanımladım.



Bu kodu dikkatice incelerseniz bir satırda aynı tipte birden fazla değişkeni tanımlamış olduğumuzu görürsünüz. Hemen hatırlatmak gerekirse; bu programı derleyip çalıştırıp sonra 1. sayı ile 2. sayının çarpımı sonucu elde edilen sayısal bilgi 2147.483.647'den büyük olursa hata meydana gelir.
 
Ayrıca string bilgileri Int16 yapısının Parse() metodu ile dönüştürdüğümüz için konsoldan girilen sayılar 32767'den büyük olmamalı. Int16 yapısı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 Console sınıfının 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

 {

   static void Main(string[] args)

    {

      string str1,str2, sonuc_str;

      int sonuc, sayi1, sayi2;

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

      str1 = System.Console.ReadLine();

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

    Â Â str2 = System.Console.ReadLine();

 

      sayi1 = System.Int32.Parse(str1);

      sayi2 = System.Int32.Parse(str2);

      sonuc = sayi1 * sayi2;

   Â Â Â sonuc_str = System.Convert.ToString(sonuc);

    }

 }


 
Dikkat ederseniz burada int 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. C# 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. Tabii bu kısa açıkmamayı yapmasaydım bazı üniversitelerin öğretim üyeleri "Memik Yanık Parse() metodunun nasıl kullanıldığını bilmesine imkan yoktur. Mutlaka başka Türkçe kitaplardan çalıntı yapmıştır" diyebilirlerdi.
 

class Deneme

 {

   static void Main(string[] args)

    {

      string str1,str2, sonuc_str;

      int sonuc, sayi1, sayi2;

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

      str1 = System.Console.ReadLine();

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

      str2 = System.Console.ReadLine();

 

      sayi1 = System.Int32.Parse(str1);

      sayi2 = System.Int32.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();

    }

 }


 
Biraz da Namespace'lerden söz edelim..
 
Şimdi yukarıda uzun uzun anlatılan örneği bir tarafa bırakıp başka bir örnek hazırlayacağım. C# programlarını yazarken Visual Studio veya C# için hazırlanmış Express Edition'dan yararlanma yoluna henüz gitmediğimiz için CS uzantılı C# kodunu yine Not Defteri ile hazırlayacağız. Hazırladığım basit C# programını aşağıda verdim. DOS penceresinde derlenip DOS penceresinden bilgi alış verişi yapan C# programlarına konsol uygulaması adı verilmektedir.
 

Class Sinif_1

{

  public static void Main()

  Â {

   Â Â Â System.Console.Write("Efes Pilsen Basketbol Takımı");

    Â Â System.Console.ReadLine();

   }

}


 
Bu şekilde hazırlanan C# programı DOS ortamında derlenip çalıştırılırsa belirtilen bilgi Write() metodu sayesinde DOS penceresine yani kosnola 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ı. Tabii bu 3 satılrık kodda ReadLine() yerine ReadKey() metodunu kullanırsanız uygulamanın çalışmasını sona erdirmek için
 
.NET Framework adı verilen sınıf kitaplığı ile gelen sınıfların Namespace adı verilen yapılarda saklandığını biliyorsunuz. C# programlarında kullanmak istediğiniz Class hangi Namespace'in içinde yer alıyorsa o namespace'ı using deyimi ile programa dahil etmelisiniz veya yukarıda yapıldığı gibi içerdiği sınıfları 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 sınıfın yer aldığı 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 using deyimi ile koda dâhil edebilirsiniz. using deyimi ile olmayan bir namespace'i C# programınıza dahil etmek istemeniz yani olmayan bir Namespace'in kaynaklarından yararlanmak istemeniz halinde derleme sırasında hata meydana gelir.
 

using System;

Class sinif_1

{

  public static void Main()

  {

    Console.Write("Efes Pilsen Basketbol Takımı");

    Console.ReadLine();

  }

}


 
C# 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 C# 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.
 

using System;

namespace SDN

 {

   class sinif_1

    {

      public static void Main()

       {

         Console.Write("Efes Pilsen Basketbol Takımı");

         Console.ReadLine();

       }

    }

  }


 
Yukarıda bold yapılan paragrafı ve bu kısa C# kodunu; C++ veya Java gibi nesneye yönelik programlama dilleri hakkında az çok bilgi sahibi olan birisine gösterseniz şaşırıp "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 C# veya nesneye yönelik programcılık konusunda yeni olanları düşünerek kaleme aldığım için yukarıda verdiğim kısa kod ve kalın(bold) yapılan açıklama karşısında duraklamanız normaldir. Bu düşünce ile aşağıda farklı renge boyanan paragrafı kaleme aldım.
 
C# veya Visual Basic'in .NET uyumlu sürümü ile program yazanların kaçmakla kurtulamayacakları 2 kavramdan birisi Class, diğeri ise Namespace'tir. Nesneye yönelik programcılığın temeli olan Class kavramı hakkında bu derslerde 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ü C# 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 C# programı hazırladım.
 

using System;

class sinif_1

 {

   public static void Main()

   {

   Â Â Console.Write("Program İlk sınıftaki Main ile başladı");

     Console.ReadLine();

   }

 }

 class sinif_2

  {

   public static void Main()

    {

     Console.Write("Program İkinci sınıftaki Main ile başladı");

     Console.ReadLine();

   }

 }


 
Bu örneğe biraz dikkat ederseniz Main() metodunun bu kez parametresiz olduğunu veya parantezin içine herhangi bir değişken adı yazmadığımı görürsünüz. Ayrıca bu örnekte Namespace hazırlamadığımı fark etmiş olmalısınız.

Bu şekilde hazırlanan C# 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 yalnızca bir bilgi yazdım. Şimdi konunun anlaşılmasına katkı olması için 4 bilgiyi yazacağım. Bu amaçla aşağıda verdiğim C# programını hazırladım.
 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

        Console.Write("Fenerbahçe");

        Console.Write("Galatasaray");

        Console.Write("Beşiktaş");

        Console.Write("Trabzonspor");

        Console.ReadLine();

      }

   }

 }


 
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 belirtilen ortama(burada konsol) yazdıktan sonra imleci bir sonraki satırın başına alır.
 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

        Console.WriteLine("Fenerbahçe");

        Console.WriteLine("Galatasaray");

        Console.WriteLine("Beşiktaş");

     Â Â Â Console.WriteLine("Trabzonspor");

        Console.Read();

      }

   }

 }


 
Write() metodu ile konsola yazılan metnin sonuna satır başı karakterini("n") ekleyerek aynı sonucu alabilirsiniz. Satır başı karakterinin nasıl kullanıldığını aşağıda görebilirsiniz.
 

using System;

namespace SDN

 {

  class sinif_1

    {

     public static void Main()

      {

         Console.Write("Fenerbahçen");

         Console.Write("Galatasaray n");

  Â Â Â Â Â Â Â Console.Write("Beşiktaş n");

     Â Â Â Â Console.Write("Trabzonspor n");

   Â Â Â Â Â Â Console.Read();

      }

   }

}



Ey programcı olmak isteyen arkadaşlar: Buna benzer yazıları 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 bulmak 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ı? Bence yok. Ya birileri çıkıp Memik Yanık bu metni garanti benim kitaptan çalmış derse? Lütfen gülmeyiniz: Hem de Prof ünvanına sahip birileri bu iddiayı onaylar. Bir sonraki derste C# 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!

tesekkurlerr c# yeni ogrenmeye baslayanlar için faydalı
Elinize ve anlatımınıza sağlık..ben ilk defa bu konulara bakıyorum,ilk burada gördüm bunların anlatımı,dolayısıyla kıyaslama yapamıyorum yapmakta bana fazla mantıklı gelmiyor..bence önemli olan bilginin farklılığı kadar genişliğidirde illaki bir kaç kişi,kaynak yada site vs. yerlere bağlı kalmamalı bu tür bilgiler..Aynı yada benzeri bilgiler farklı yerlerde çoğaldıkça topluma ulaşır.. Tekrardan elinize sağlık..
Sıradaki dersinizi heyeccanla bekliyorum anlatımınız gerçekten güzel..
bora merhaba. 2004 yılında yayınlanan C# kitabımda kullandığım 3-5 satırlık kodlarda tanımladığım değişkenlerin adlarını(i, j, sayi, dosya) çalmakla yargılandığımdan beri başka yazarlara göre konulara farklı yönden yaklaşmaya özellikle özen gösteriyorum. Önemli olan yazılanları ilk okumada anlamaktır. Gerisi ayrıntıdır..
Hocam bu profesöre takmışsınız resmen. Yazının başında ve sonunda yaptığınız göndermeler eğitim alanı rahatsız ediyor bilginize. Yani beni... Kim olduğunu bilmem aranızda geçeni de bilmem. Eğitimler süper ama kişisel şeyleri yansıtmayın hocam en azından eğitimlerde...Saygılar
dagcican merhaba. Yani diyorsunuz ki Memik Yanık kitabında Say1, Sayi2 adında değişkenler tanımladığı için dava edilsin, Prof unvalı birisi kalksın desin ki "evet memik yanık her ne kadar bu değişknleri yıllar önce yayınlanan kitaplarında kullanmış olsa bile başka yazarlara ait değişkenleri çalmıştır". Sonra da değişken adı hırsızı(!) olarak yazı yazarken bu adamlara gönderme bile yapma diyorsun bana.
Bende bir eğitimci olarak Memik Hoca'dan yanayım. Tabikide ortada bir haksızlık var ise Memik hoca gerekli yerlere eğitimin içeriğine zarar vermeden göndermeler yapacaktır. Dileyen bu dersleri takip eder, dilemeyense takip etmez.. O yüzden dagcican MESLEKTAŞIM. Lütfen eğitimin içeriğine adapte olalım bizlere emek veren memik hocayada bizlerde gerekli esnekliği sağlayalım. SAYGILARIMLA
Memik hocam'a bu konuda hak veriyorum. Bu tip olaylar yüzünden herhangi bir konuda arkadaşlarıma bilgivermeye çalışırken oturup dakikalarca değişken ismi düşünüyorum. Bu tarza iftiracı insanlar mümkün olan her fırsatta rencide edilmelidir diye düşünüyorum ki. Başkaları üzerinden rant sağlmaya çalışırken bir kez daha düşünsünler. Hocam derslerinizi büyük bir ilgiyle takip ediyorum. Yanlız bazen sanki 2 paragraf arasında kopukluk varmış gibi hissediyorum acaba herşeyi buraya geçirmiyormusunuz ??

Yukarı Git