PROGRAMLAMA DİLLERİNE GİRİŞ Ders 1: C# ile Programlamaya Giriş Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
Programlama Dili Nedir? Programlama dili, bir bilgisayara veya programlanabilir bir elektronik cihaza, hangi veri üzerinde işlem yapılacağı, verinin nasıl depolanıp iletileceği, hangi koşullarda hangi işlemlerin hangi sıra ile yapılacağı gibi konularda talimat vermeyi sağlayan ve belirli bir yazım kuralı (sentaks) olan dildir. Geçen dönem aldığınız «Bilgisayar Mühendisliğine Giriş» dersinin 4. haftasında Programlama Dilleri ile ilgili bazı temel bilgileri öğrenmiştiniz (dillerin sınıflandırılması gibi bazı bilgiler için ilgili sunuya tekrar göz atınız).
Dersin İçeriği Bu derste C# (C-Sharp) programlama dili temel düzeyde öğretilecektir. Uygulama (Application) programlama amaçlı kullanılan dillerden biri olan C# dili; Yapısal, Nesneye Yönelik ve Görsel bir üst seviye dildir. C# ve Visual Basic’in nesneye yönelik versiyonu olan VB.NET, ilk olarak 2002 yılında piyasaya sürülen Visual Studio .NET geliştirme ortamı altında yer almışlardır. C# dili VB.NET ile aynı özelliklere sahiptir (görsel programlamaya olanak sağladığı için Visual sıfatına sahiptir, ama çoğu zaman bu sıfat kullanılmaz) ama sentaks olarak C, C++ ve Java dillerini temel almıştır. * OpenGL ve DirectX programlama dili değil, farklı programlama dilleri tarafından kullanılabilen grafik kütüphaneleridir.
Sistem Programlama: C ve C++ 70’li yıllarda geliştirilen C ve 80’li yıllarda geliştirilen nesneye yönelik özellikler eklenmiş hali olan C++ günümüzde halen en çok kullanılan sistem programlama dilleridir. İşletim sistemleri, veri tabanı yönetim sistemleri, gömülü sistemler, aygıt sürücüleri, oyun motorları gibi yazılımlar geliştirilirken donanıma direkt erişim gerekebileceği için kimi zaman alt seviye bir dil olan Assembler tercih edilse de, çoğu zaman programlamanın daha kolay olması için orta seviye diller olan C ve C++ kullanılır. C++ 90’lı yıllara kadar uygulama programlama alanında da en çok kullanılan dil olmuştur.
Uygulama Programlama: Visual C++, Visual Basic ve Delphi 90’lı yıllarda Windows gibi GUI (Graphical User Interface: Grafik Kullanıcı Arayüzü) içeren işletim sistemleri yaygınlaştıkça, bu işletim sistemleri altında çalışan uygulama programlarını daha kolay bir şekilde geliştirmek için üst seviye dillere ihtiyaç doğmuştur. Bu amaç için Microsoft tarafından geliştirilen Visual C++ ve Visual Basic ile Borland tarafından geliştirilen Pascal tabanlı Delphi görsel programlama ortamları* ile metin kutuları, komut düğmeleri gibi GUI programlama elemanları sürükle-bırak yöntemi ile bir form üzerine yerleştirilebilmektedir. Fakat bu elemanlara tıklanması, içindeki metnin değişmesi gibi bir olay gerçekleştiğinde ne işlem yapılacağı kod ile yazılmaktadır. *Bu dillerin kendileri değil IDE’leri görseldir. Visual C++, görsel olmayan Dev-C ile de yazılabilir. Hiç kod yazmaya gerek kalmadan program oluşturabilen diller aslında görsel dildir.
Visual Basic .NET Visual Basic 6.0 programlama dilinin varisi olmakla birlikte, .NET Framework üzerinde çalışması nedeniyle farklı bir yapıdadır ve geriye doğru uyumluluğa sahip değildir (VB 6.0 ve önceki VB sürümleri ile yazılan kodları çalıştıramaz). VB 6.0 ve önceki sürümler sadece nesne tabanlı iken (nesneleri kullanabilir, fakat kalıtım gibi özelliklere sahip değildir), VB.NET nesneye yönelik (object oriented) bir programlama dilidir.
Java Sun Microsystems mühendislerinden James Gosling tarafından 90’ların ilk yarısında geliştirilen Java; açık kodlu, nesneye yönelik, platform bağımsız, üst seviye, adım adım işletilen (yorumlanan-interpreted) bir dildir. Platform bağımsızlığı sayesinde özellikle akıllı telefonlar öncesi kullanılan cep telefonları için uygulamalar ve oyunlar geliştirilirken Java yaygın biçimde kullanılmıştı. Java’nın sentaksı C ve C++ dillerine benzemekle birlikte daha basit bir nesne modeli ve daha az alt seviye olanakları içerir (işaretçi kullanımı yoktur). Bu nedenle sistem programlama amaçlı kullanılamaz.
J++, J# ve C# Visual J++, Microsoft tarafından 90’lı yıllarda bir Java IDE’si olarak tasarlanmıştır. Fakat Java dilinin standardına göre bazı uyumsuzluklara sahip olması nedeniyle Sun Microsystems ile davalık olmalarına neden olmuştur. 2002 sonrasında .NET çatısı altında birkaç yıl da J# ismi ile Java ortamına devam eden Microsoft, süregelen davalar nedeniyle 2007 yılında J# çalışmalarını sonlandırmıştır. C# dili, zaten J# ile benzer bir dil olduğu için ve o tarihe kadar daha popüler olduğu için her iki dili de geliştirmelerinin bir anlamı kalmamıştır.
Python Guido van Rossum tarafından 1990 yılında geliştirilmeye başlanan Python, nesneye yönelik, yorumlamalı, açık kaynak kodlu, platform bağımsız ve yüksek seviyeli bir programlama dilidir. Bu özellikleri ile Java’ya benzemesine rağmen girintilere dayalı basit sözdizimi sayesinde programlamaya ilk başlayanlar için öğrenilmesi daha kolaydır. 80’li ve 90’lı yıllarda programlamaya genelde BASIC ile başlanırken günümüzde başlangıç dili olarak Python popüler hale gelmiştir. 2000 yılında çıkan 2.0 sürümü ile kullanımı yaygınlaşmaya başlamıştır. Her ne kadar 2008 yılında 3.0 versiyonu yayınlansa da, 3.x serisi 2.x serisiyle uyumlu olmadığından halen 2.x serisi de yayınlanmaya devam etmektedir.
Ruby Java ve Python gibi Ruby dili de 90’lı yılların başında Yukihiro Matsumoto tarafından Japonya'da geliştirilmeye başlanmıştır. Fonksiyonel, nesneye yönelik, dinamik, reflektif gibi çoklu programlama paradigmalarını destekleyen Ruby, Python gibi 2000’li yıllardan sonra popüler olmaya başlamıştır. 2004 yılından itibaren geliştirilen açık kaynak kodlu bir web uygulama geliştirme çatısı olan Rails, Ruby diliyle yazılmıştır (Ruby on Rails).
Objective-C ve Swift Brad Cox ve Tom Love tarafından 1980’li yıllarda geliştirilen Objective-C, C++ dili gibi C diline nesneye yönelik programlama imkânı getirmiştir. C++ ile aynı yıllarda ortaya çıkmış olmasına rağmen 80’li ve 90’lı yıllarda fazla rağbet görmemiş, asıl popülerliğini Apple’ın işletim sistemleri olan OS X ve iOS uygulamaları için temel programlama dili olması ile 2000’li yıllarda elde etmiştir. Apple, 2014 yılında Objective-C’ye göre kullanımı daha kolay olan ve daha güçlü olduğu belirtilen Swift dilini tanıtmıştır. Bu dilin yaygınlaşması ile birlikte Objective-C’nin popülerliği azalmaktadır.
Derleyici (Compiler) Nedir? Bir programlama dili ile yazılmış program kodunu (kaynak kod: source code) bir ara koda çeviren yazılımdır. Bu ara kod genellikle OBJ dosyası (object file) olarak üretilir. Program Kodu OBJ Dosyası Derleyici
Bağlayıcı (Linker) Nedir? Derleyici tarafından üretilen ara kodları bağlayarak işletim sisteminin çalıştırabileceği makine kodlarına (exe: executable files, dll: dynamic link library) çeviren yazılımdır.
Yorumlayıcı (Interpreter) Nedir? Bir programın kaynak kodunu derlemek yerine doğrudan yürüten yazılımdır (Aslında arkaplanda derleme yapılır ama OBJ, EXE dosyaları üretilmez). Birçok programlama dili için hem derleyici hem de yorumlayıcı yazılımlar mevcuttur. Fakat genellikle BASIC Python, Ruby ve Java dillerinde yorumlayıcı daha çok kullanılır. Java dili, yorumlayıcı kullanması nedeniyle taşınabilir (platform bağımsız) bir yapıya sahip olmuştur. Derleme işlemi programı çalıştıran cihaz üzerinde yapılır: JIT (Just In Time) Compiler. Bunun için o cihazda Java Sanal Makinesi (JVM: Java Virtual Machine) yüklü olmalıdır.
Tümleşik Geliştirme Ortamı İngilizcesi: Integrated Development Environment (IDE) Kaynak kodu düzenleyicisi (source code editor), hata ayıklayıcı (debugger), derleyici (compiler) ve/veya yorumlayıcı (interpreter), bağlayıcı (linker) gibi uygulama geliştirme bileşenlerini tümleşik olarak sunan yazılımdır. Modern kaynak kodu düzenleyicileri, programı yazdığınız sırada arkaplanda çalışan; sözdizimi renklendirmesi, hata bulma ve otomatik tamamlama mekanizmalarına sahiptir. Microsoft tarafından geliştirilen Visual Studio ve açık kaynak kodlu Eclipse yazılımları, faklı diller ile uygulama geliştirme imkanı sağlayan günümüzdeki en gelişmiş IDE’lerdir. DOS tabanlı eski IDE’ler: QBASIC, Turbo Pascal, Turbo C Windows tabanlı basit IDE’ler: Dev-Pascal ve Dev-C++
Visual Studio 2015 İlk derslerimizde New Project ile yeni bir proje başlattıktan sonra Visual C# dili altında Console Application seçerek bir komut-istemi uygulaması başlatacağız. İlerleyen derslerde Windows Forms Application seçerek Görsel (Visual) uygulamalar da geliştireceğiz.
C# ile Console Application Gerekli olan kütüphanelerin tanımları Projemiz ile aynı isimde bir isim uzayı otomatik olarak yaratılır. Bu isim uzayının içinde Program adında bir sınıf ve onun içinde de Main adında bir fonksiyon yine otomatik olarak yaratılır.
C# ile Merhaba Dünya class Program { static void Main(string[] args) Console.Write("Merhaba Dünya"); } Main programın çalışmaya başladığı fonksiyondur. Sonraki derslerimizde başka fonksiyonlar yaratarak Main içinden nasıl çağrılacaklarını göstereceğiz. Eğer programı F5 tuşuna veya butonuna basarak başlatırsanız siyah ekran belirip kaybolur. Ekranın kalıcı olması için Ctrl ve F5 tuşlarına birlikte basarak başlatabilirsiniz ("Devam etmek için bir tuşa basın" yazar). Write yerine WriteLine kullanılırsa parametre olarak verilen yazı (string) yazıldıktan sonra imleç alt satıra iner:
Değişken (Variable) Programlarda kullanılan verileri saklamak ve gerektiğinde o veriler üzerinde işlem yapmak için değişkenler kullanılır. Bir değişken tanımı yapıldığında, programlama dili o değişkenin türüne göre istenilen büyüklükte bir hafıza bölgesini RAM’de tahsis eder. Tanımlanan değişkene bir değer atandığında, değişken için ayrılan hafıza bölgesine o değer yazılır. Eğer bir değişken herhangi bir fonksiyonun içinde değil de, örneğin main fonksiyonundan önce tanımlandıysa, o değişkene global değişken denir. Global bir değişkene programdaki tüm fonksiyonlar erişebilir.
Değişken Tanımlama ve Değişkene Değer Atama Değişken tanımları: int a; tamsayı türünde a adında bir değişken double b; ondalıklı sayı char c; karakter string d; karakter dizisi (yazı) Değişkenlere değer atanması: a = 5; b = 3.75; c = 'A'; d = "Ahmet123"; NOT: Değişken ismi solda, atanacak değer sağda olmalıdır (5 = a; doğru değildir): a = b; a değişkenine b değişkenindeki değeri atar b = a; b değişkenine a değişkenindeki değeri atar
Değişkenlerde Kısıtlamalar Değişken isminde : ; , . / ' # [ ] ! " $ % ^ & * ( ) { } karakterleri ve boşluk karakteri kullanılamaz. Ancak _ kullanılabilir. Değişken isminin ilk karakteri harf olmalıdır. Yani değişkenler rakamla veya _ ile başlamaz (sayi2 olur 2sayi olmaz). Bir fonksiyon veya prosedürde aynı değişken ismi birçok defa tanımlanamaz (farklı fonksiyonlarda tanımlanabilir). Programlama diline ait bir komut ismi, değişken ismi olarak tanımlanamaz. Genellikle değişken isminde sınır 255 karakterdir. Faklı tipte iki değişkenin birbirlerine atanması veri kaybına neden olabileceğinden bu durumlarda tip dönüşümü fonksiyonları kullanılmalıdır. VB.NET dilinde değişken isimlerinde büyük/küçük harf ayrımı yoktur. Abc, abc veya ABC aynı değişkeni ifade eder. C ve C# dillerinde büyük/küçük harf ayrımı vardır.
Sabit (Constant) Değişkenden farkı; tanımlandığı anda atanan değerinin program içinde değiştirilememesidir. Tanımlanması değişken tanımına benzer. Sadece önüne const eklenir. const float PI = 3.142857; Programda PI sabitine atanan ilk değeri sonraki satırlarda kullanabiliriz ama değiştiremeyiz. float A = PI*2; doğru PI = 3.15; hatalı
C# Veri Tipleri 1-bit veri tipi bool & Boolean Tamsayı işaretli işaretsiz 8-bit sbyte & SByte byte & Byte 16-bit short & Int16 ushort & UInt16 32-bit int & Int32 uint & UInt32 64-bit long & Int64 ulong & UInt64 Gerçel Sayı float & Single double & Double Unicode Karakter (16 bit) char & Char Unicode Karakter Dizisi string & String Bir tamsayının işaretli olması negatif değer alabildiğini gösterir. (Örn: sbyte -128 ile 127 arasında, byte ise 0 ile 255 arasında değer kabul eder)
Klavyeden Veri Alma Komutları Console.ReadLine ENTER basılana kadar girilen karakter dizisini (string) döndürür Console.Read ENTER basılana kadar girilen karakter dizisinin ilk karakterinin ASCII değerini döndürür Console.ReadKey Basılan tuşun değerini ConsoleKeyInfo olarak döndürür (ENTER tuşuna basılmasını beklemez) NOT: Console.Write("Merhaba Dünya"); satırından sonra Console.ReadKey(); yazsaydık F5 tuşu ile program başlatıldığında pencere hemen kapanmaz, bir tuşa basılana kadar beklerdi (Ctrl+F5 kullanımına gerek kalmazdı).
Dört İşlem Programı static void Main(string[] args) { int a, b; Console.Write("İlk sayıyı girin : "); a = Convert.ToInt32(Console.ReadLine()); Console.Write("İkinci sayıyı girin : "); b = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Toplam : " + (a + b)); Console.WriteLine("Fark : " + (a - b)); Console.WriteLine("Çarpım : " + (a * b)); Console.WriteLine("Bölüm : " + (a / b)); } Console.ReadLine() string türü değer döndür. Integer türünde olan a ve b değişkenlerine string türünde değer atanamayacağı için Convert.ToInt32 ile tamsayıya çevrilir (Int32.Parse ile de bu çevirim yapılabilirdi).
Tip Dönüşümü Convert ile string’i sadece tamsayıya değil ondalıklı sayılara da dönüştürebiliriz: Convert.ToSingle, Convert.ToDouble, … Sadece sayı türü veriler arasında cast olarak adlandırılan ve (tip adı) ifade şeklinde kullanılan bir dönüşüm daha vardır: double sayi = 5.7; Console.Write((int)sayi); Ekranda 5 görüntülenir (.7 için yuvarlama olmaz ondalık kısmı atılır). Eğer int -> float dönüşümü olsaydı kayıp olmazdı. Sadece büyük veri tipi küçük olana çevrilirse (double -> float, long -> int, int -> short, …) kayıp olur.
Tip Dönüşümü ile Bölme İşlemi Önceki programda ilk sayı 5 ikincisi 3 olarak girilirse bölme işleminde sonuç 1 çıkar. Eğer a ve b değişkenleri float gibi ondalıklı türde tanımlanırsa, veya tip dönüşümü kullanılarak ondalıklı sayıya dönüştürülürse sonuç 1.666667 çıkar: Console.WriteLine("Bölüm : " + ((float)a / (float)b));
Parametre (Argüman) Nedir? Örnek programımızda Console bir sınıf; Write, WriteLine ve ReadLine ise o sınıfın yöntemleridir (method). Yöntem aslında C dilindeki fonksiyona eşdeğerdir (bazen bunlarda komut ta diyoruz). Fonksiyonlar isimlerinden sonra gelen parantez içinde farklı değerler verilerek çağrılabilir. Virgül ile birbirinden ayrılan bu değerlere fonksiyonun parametreleri denir. Örneğimizde ReadLine fonksiyonu hiç parametre almamış, Write ve WriteLine ise string veri türünde bir parametre almışlardır. Bu parametrenin veri türü farklı olabilirdi ve bu fonksiyonlar başka parametreler de alabilirlerdi.
Write ve WriteLine ile formatlı yazdırma Console.Write ("Toplam : " + (a+b)); yerine Console.Write ("Toplam : {0}", (a+b)); yazılırsa yine aynı çıktıyı üretir. Bu hali ile Write fonksiyonu iki parametre almış olur. İlk parametre olan format string'i içinde yer alan {0} yerine ikinci parametre olan (a+b) sayı değerinin string'e dönüştürülmüş hali yazılır. Eğer birden çok değer string içinde aralara eklenecek ise {1}, {2}, … ve şeklinde kullanılabilir.
Dört İşlem Programı (Farklı Şekilde Çıktı) ... Console.WriteLine("{0} + {1} = {2}", a, b, (a + b)); Console.WriteLine("{0} - {1} = {2}", a, b, (a - b)); Console.WriteLine(a + " * " + b + " = " + (a * b)); Console.WriteLine("{0} / {1} = {2}", a, b, ((float)a / (float)b)); } Çarpma işleminde farklı bir yöntem kullanılmış olmasına rağmen aynı tipte çıktı elde edilmiştir. Diğer işlemlerde 1 format string'i ve 3 adet sayısal değer verilmişken, çarpma işleminde + operatörü ile birleştirilen değerler tek bir string ifade oluşturmaktadır. Bu operatör her iki yanında sayısal değer varsa aritmetik toplama işlemi yaparken, bir tanesi string ise ekleme yapar. NOT: Eskiden her iki yanında string varsa string birleştirme yapabiliyordu, dolayısı ile sayıları string türe dönüştürmek için ToString() kullanımı zorunlu idi: Console.WriteLine(a.ToString() + " * " + b.ToString() + " = " + (a * b).ToString());
Operatörler Aritmetik işlem operatörleri: + - * / % + - * / % Mantıksal operatörler: && || ! Karşılaştırma operatörleri: < > <= >= == != Atama operatörleri: = += -= *= /= ++ -- mod alma ve veya değil eşit eşit değil Değişkenin değerini belli bir sayı kadar arttırma (+=), belli bir sayı kadar azaltma (-=), belli bir sayı kadar çarpma (*=), belli bir sayı kadar bölme (/=), 1 arttırma (++) ve 1 azaltma (--) için kullanılırlar. Örneğin: a = a + 1; yerine a += 1; yazılabileceği gibi, kısaca a++; olarak ta yazılabilir.
Örnek : Ekran çıktısı ne olur? static void Main(string[] args) { int a = 10, b = 20; Console.WriteLine(++a); Console.WriteLine(a++); Console.WriteLine(a); Console.WriteLine("{0} {1}", a, b += a); Console.WriteLine(b=5); Console.WriteLine(b+=5); Console.WriteLine(b==5); Console.WriteLine(true && false); Console.WriteLine(!((true || false) && !true)); } Önce a'yı 1 arttırır sonra görüntüler Önce a'yı görüntüler sonra 1 arttırır ~((1 ᴠ 0) ᴧ ~1)
Ödev 1 Saniye olarak verilen değeri saat:dakika:saniye olarak gösteren programı yazın (ve akış diyagramını çizin) süreyi girin (sn): 100 0:1:40 süreyi girin (sn): 1000 0:16:40 süreyi girin (sn): 8000 2:13:20 ÖRNEK ÇALIŞTIRMA
Ödev 2 Başlangıç koordinatı, fırlatma hızı ve geçen süre verildiğinde bir nesnenin son koordinatını hesaplayan programı yazın ve akış diyagramını çizin (g=9.81). Başlangıç x koordinatı: -1,4 Başlangıç y koordinatı: 4,5 Fırlatma x hızı: 2,34 Fırlatma y hızı: 12,4 Geçen süre (sn): 5,6 Sonuç x koodinatı: 11,704 Sonuç y koodinatı: -79,8808 ÖRNEK ÇALIŞTIRMA Programda veri girerken Türkçe standardına göre ondalık ayıracı olarak virgül kullanmalıyız (4,5 gibi). Fakat program kodunu yazarken İngiliz standardına göre ayıraç olarak nokta kullanmalıyız (9.81 gibi).