PROGRAMLAMA DİLLERİNE GİRİŞ Ders 1: Programlamaya Giriş Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği
Ders Müfredatı Yapısal programlama dillerinden C# ile değişkenler, koşula göre işlemler, döngüler, diziler, prosedürler, fonksiyonlar ve dosyalama işlemleri gibi temel programlama kavramlarının öğretilmesi Nesneye Yönelik Programlama kavramı Görsel Programlamaya giriş (C#) Grafik Programlamanın OpenGL gibi bir kütüphane ile nasıl yapılacağının gösterilmesi Web-Tabanlı Programlama hakkında genel bilgi verilmesi Mantıksal Programlama hakkında genel bilgi verilmesi * OpenGL ve DirectX programlama dili değil, farklı programlama dilleri tarafından kullanılabilen grafik kütüphaneleridir.
BASIC BASIC (Beginner's All-Purpose Symbolic Instruction Code) 1963'te John George Kemeny ve Thomas Eugene Kurtz tarafından tasarlanmıştır Günümüzde de çeşitli türevleri kullanılmakta olan yüksek düzey bir programlama dilidir Farklı türevleri birçok işletim sisteminin parçası olarak sunulmuştur (MS-DOS: QBASIC, Commodore BASIC, Atari BASIC)
PASCAL Niklaus Wirth tarafından 1970'te geliştirilen yapısal programlama dilidir. Adını matematikçi Blaise Pascal'dan almıştır. Kolay öğrenilebilir yapısı nedeniyle bilgisayar programlama eğitimi verilirken yaygın olarak kullanılan bir dil olmuştur. Pascal tabanlı görsel bir programlama dili olan Delphi, bugün hala yaygın olarak kullanılmaya devam eden en önemli programlama dillerinden biridir.
C Ken Thompson ve Dennis M. Ritchie tarafından UNIX İşletim Sistemi'ni geliştirebilmek amacıyla B dilinden türetilmiş yapısal programlama dilidir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian W. Kernighan ve Dennis M. Ritchie tarafından 1978’de yayımlanan "C Programlama Dili" kitabından sonra olmuştur. İşletim sistemleri, gömülü sistemler, sürücü yazılımı ve hız gereken her türlü işlemde kullanılan bir dildir.
C++ Simula dili ile ortaya çıkan nesneye yönelik yaklaşım Bjarne Stroustrup tarafından C diline uyarlanmış ve ortaya C++ çıkmıştır (1983). Günümüzde en çok kullanılan dillerden biri olan C++, C dilinin hız ve esneklik gibi tüm iyi özelliklerini korumuştur. 1998 yılında ANSI/ISO tarafından Standard C++ yayınlanmıştır.
JAVA Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmış açık kodlu, nesneye yönelik, ortamdan bağımsız, yüksek verimli, çok işlevli, yüksek seviye, adım adım işletilen (interpreted) bir dildir. Interaktif TV’ler ve küçük cihazlarda kullanılmak üzere tasarlanan JAVA, platform bağımsızlığı sayesinde geniş kullanım alanı buldu. 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).
Visual Basic Visual Basic, 1991-1998 yılları arasında Microsoft tarafından QBASIC temel alınarak geliştirilmiş, olay yönlendirmeli (event driven), nesne tabanlı (object based) ve görsel (visual) bir programlama dilidir. VB ile; metin kutuları, seçim listeleri, komut düğmeleri gibi GUI (Graphical User Interface: Grafik Kullanıcı Arayüzü) programlama elemanları sürükle-bırak yöntemi ile hiçbir kod yazılmaksızın bir form üzerine yerleştirilebildiği için, bu dil “Görsel” sıfatına sahiptir.
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.
C# (C-Sharp) VB.NET gibi C# dili de ilk olarak 2002 yılında piyasaya sürülen Visual Studio .NET tümleşik geliştirme ortamında yer almıştır. 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.
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 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 Sürümleri Visual Studio .NET (2002) Visual Studio .NET 2003 Visual Studio 2005 Visual Studio 2008 Visual Studio 2010 Visual Studio 2012 Visual Basic 5.0, Visual C++ 5.0, Visual J++ 1.1, Visual FoxPro 5.0 Visual Basic 6.0, Visual C++ 6.0, Visual J++ 6.0, Visual FoxPro 6.0 Bu VS sürümlerinde Visual J++ dilinin yerini Visual J# aldı (2007’den sonra yeni sürüm çıkmadı). C# dili ise Visual C++ dilinin sonunu getirmedi. 90’lı yıllarda VS altındaki tüm diller farklı bir IDE kullanıyorken, 2002’den sonra hepsi (VB.NET, ASP.NET, C# ve Visual C++) aynı IDE’yi kullanıyor.
Visual Studio 2012 İ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 float 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: + - * / % + - * / % Karşılaştırma operatörleri: < > <= >= == != Mantıksal operatörler: && || Atama operatörleri: = += -= *= /= ++ -- mod alma eşit eşit değil ve veya Değişkenin değerini 1 arttırma, 1 azaltma Değişkenin değerini arttırma, azaltma, vs için kullanılırlar. Örneğin: A += 5; ile A = A + 5; aynıdır.
Alıştırma Sorusu 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
Alıştırma Sorusu 2 ÖRNEK ÇALIŞTIRMA 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.704000 Sonuç y koordinatı: -79.880800 ÖRNEK ÇALIŞTIRMA