Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Programlama I (C) Ders Notu

3,293 views

Published on

Programlama I (C) Ders Notu

Published in: Software
  • Be the first to comment

  • Be the first to like this

Programlama I (C) Ders Notu

  1. 1. Karabük Üniversitesi BLM111 PROGRAMLAMA DİLLERİ I Yrd. Doç. Dr. İsmail KURNAZ ikurnaz@karabuk.edu.tr
  2. 2. BLM 111 Programlama Dilleri I 2 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi BİLGİSAYAR DONANIM ve YAZILIMI Bilgisayarın tarihçesi Bilgisayar, en basit bakış açısıyla bir matematiksel işlemci, yani hesap aracıdır. Aslında aygıtın yaptığı işlem; bilgileri saymak değil, işlemektir. Bazı kaynaklarda basit hesap makinesi olan boncuk dizini (abaküs), ilk bilgisayar olarak tanımlanmaktadır. Abaküs Geçmişi yaklaşık 2000 yıl öncesine dayanmaktadır. 1642 yılında Blaise Pascal (Fransa) tarafından yapılan hesap makinesine her ne kadar "dijital" (sayısal) dendiyse de bugünkü anlamda dijital kavramından çok uzaktı. Kaba tuşlarla sayı girişi yapılarak toplama ve çıkarma dışında bir işlem yapılamıyordu. Şekil 1.1. Abaküs 1671'de Gottfreid Wilhelm von Leibniz (Almanya) tarafından tasarlanan gelişmiş hesap makinesi, ancak 1694 yılında hayata geçirilebilmiş olup, özel dişliler aracılığıyla dört işlemi yapabiliyordu. Ancak Pascal ve Leibniz tarafından yapılan bu aygıtlar yaygın kullanım alanı bulamamışlardır. Ticari anlamda kullanılabilen ilk mekanik hesap makinesi 1820 yılında Charles Xavier Thomas tarafından yapılmıştır. Charles Babbage ise, uzun araştırmalar ve birkaç denemeden sonra buharla çalışan otomatik hesap makinesini 1823 yılında yapmıştır. Bu alanda ilk büyük gelişme; 1890'da Hermann Hollerith (ABD) tarafından yapılan ve delikli kart sistemiyle veri girişi yapılan bilgisayar olmuştur. Bu sistemde işlem hızının artması ve hataların azalması büyük bir ilerleme sayılmıştır. Asıl büyük ilerlemenin öncesini Howard Hathaway Aiken, 1937'de Mark 1 adını verdiği bilgisayarda yarı elektronik devreler kullanmakla yapmıştır. Mark 1'de delikli kart sistemiyle çalışmasına karşın; daha önceki benzerlerinden farklı olarak, logaritma ve trigonometri fonksiyonlarını da yapabilmekteydi. Yavaş olduğu halde, tam otomatik olarak çalışması ve uzun işlemleri çözebilmesi ona büyük avantaj sağlıyordu.
  3. 3. BLM 111 Programlama Dilleri I 3 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi İlk bilgisayar Eniac II. Dünya Savaşı sürecinde, ordunun daha hızlı bilgisayarlara gereksinim duyması, bilgisayar tarihinde bir devrim yaratan ENIAC'ın yapılmasına yol açmıştır. Şekil 1.2. İlk bilgisayar ENIAC ENIAC, J. Presper Eckert ve John W. Mauchly ekibiyle 1945 yılında yapıldı. En büyük özelliği; elektron tüpleri (bugünkü çiplerin atası) ve RAM (Random access memory) bellek kullanılması olmuştur. Tasarlanmış programları çalıştırabilme özelliğiyle ENIAC, geniş bir ev kadar (167 metrekare) yer kaplıyor ve saatte yaklaşık 180 kW elektrik harcıyordu. ENIAC'ın ardından kısa ömürlü olan ve DEVAC adı verilen bilgisayar ve ticari anlamda satışa sunulan ilk bilgisayar olan UNIVAC'ın yapılması, 1952 yılına dek uzanmıştır. İlk ticari bilgisayar Univac 1960'lı yıllardan sonra elektron tüplerinin yerini önce transistörler, daha sonra da yüzlerce transistörün birleşimi olarak tarif edilebilecek entegre devreler yer almıştır. Bugün bilgisayar teknolojisinde kullanılan mikroçipler ise, birçok entegre devrenin birleşip küçültülmüş halidir. Şekil 1.3. İlk ticari bilgisayar UNIVAC Kişisel bilgisayar Bilgisayarların çalışma prensibi; matematiksel işlem temeline dayanır. Çeşitli programlama dilleri ile hazırlanmış olan yazılımlar sayesinde, birçok alanda kullanılabilmektedir. İnternetin insan hayatına girip yaygınlaşmasıyla bilgisayarın önemi daha da artmıştır. Güncel bilgisayarlar kişiselleşerek Personal Computer (PC)
  4. 4. BLM 111 Programlama Dilleri I 4 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi adını alarak, cebe sığacak kadar küçülmüş ve hızları büyük aşamalar kaydetmiştir. Gelişen teknolojiyle birlikte bilgisayar fiyatları da giderek düşmektedir. Bilgisayarın Yapısı Bilgisayar, verileri saklayan, bunlar üzerinde çok hızlı işlem yapan ve istenen verileri sunan bir aygıttır. Donanım (hardware) ve yazılım(software) diye iki bölüme ayrılır. Donanım bilgisayarın fiziksel bileşenleridir. Yazılım ise donanımı oluşturan bileşenlerin çalışmasını ve işlevlerini yerine getirmesini sağlayan programlardır. Bir bilgisayar sisteminin genel olarak 4 bileşeni vardır. 1. Donanım (İşlemci (CPU), belek ve I/O üniteleri gibi) 2. İşletim Sistemi (Linux, MS-Dos, Windows Xp, Unix, OS/2 gibi) 3. Sistem Yazılımları (Derleyiciler, Veritabanı ve Network Yazılımları) 4. Uygulama Yazılımları (Kullanıcıların kendi geliştirdikleri yazılımlar) Bu noktada şu hususu açıklamak gerekir ki CPU (Central Processor Unit) bilindiği gibi bir bilgisayar sisteminin en temel bileşeni olup, aynı şekilde bilgisayar sistemlerindeki disk, yazıcı, dvd-rom, terminal (ana makineye bağlı, sıradan uç kullanıcılar) vs. gibi I/O (Input/Output) üniteleri donanım kısmı olmaktadır. Mikro İşlemcilerin Özellikleri Bilgisayarın beyni sayılan mikroişlemcileri birbirinden ayırt eden en önemli unsurlar onların işlevleri ve özellikleridir. Belli başlıları şunlardır; 1. Mikroişlemcinin bir defa da işleyebileceği kelime uzunluğu Mikroişlemcilerde kelime uzunluğu veya bit uzunluğu, paralel olarak işlenen veri bitlerinin sayısıdır. Kelime, işlemcideki genel amaçlı kaydedicilerin büyüklüğü ve aynı zamanda her bir bellek mahalli kapasitesidir. Büyük kelime uzunluğu, aynı anda birçok işlemin birlikte yapılması ve bazı uygulama program yazılımları için kolaylık demektir. İşlemciler, her bir saat çevriminde senkronize olarak o anda komut kuyruğunda bulunan komutları ve bunlara göre de bellekteki verileri işlerler. Bilgi bitleri mikroişlemcinin tipine göre bir, dört, sekiz, onaltı ve otuzikilik sıralar halinde işlenir. Bir mikro işlemcili sistemde çok basit problemler tek bit kodunda işlenebilir. Buna örnek olarak içerisinde işlemci bulunan soğuk içecek makineleri verilebilir ve tek bit esasına göre tasarlanmıştır. Küçük hesap makineleri ve cep bilgisayarları da basit aritmetik problemlerin çözümünde dört bit kullanılmaktadır. Normal bilgisayarlarda bütün bilgiler sekiz bit (Bayt ), onaltı bit(Word ) veya otuziki bit(Doubleword ) olarak
  5. 5. BLM 111 Programlama Dilleri I 5 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi işlenirler. Eğer komutlar veya veriler küçük gruplar halinde işlenirlerse hızda bir azalma olacak ve bu yüzden performans düşecektir. Kelime uzunluğu büyük olan işlemcide yapılan aritmetik işlemlerde doğruluk oranları kısa uzunluklu kelimelere nazaran çok yüksektir(4-bit %6, 8-bit % 0.4 ve 16-bit %0.001). Eğer işlemcinin kelime uzunluğu, tek bir kelimeyle ele alınan belirli bir problem için yetersizse, tek bir verinin işlenmesi için işlemci daha fazla zaman harcayacak ve veri işleme hızı düşecektir. 2. Mikro işlemcinin tek bir komutu işleme hızı. Bir mikroişlemcinin hızı saat Frekansıyla doğrudan ilgilidir. Fakat saat frekansı her zaman gerçek çalışma frekansını yansıtmaz. İşlemci hızını belirleyen birçok yol vardır. Bunlar çalışma çevriminin uzunluğudur ki (algetir-kodunu çöz-işlet-depola),bu ölçüm fazla kullanışlı değildir. Bilgisayar üreticileri daha çok hız ölçmek için özel bazı test programları geliştirmişlerdir. Başlıca mikroişlemci hızları mikrosaniye olarak 16, 25, 33, 100 Mhz ve MIPS’tir.(Saniyede işlenen milyon komut sayısı). Bir mikroişlemciyi diğerinden daha hızlı yapan unsurlar şunlardır. 1. MIB’in devre teknolojisi ve planı. Mesela katı-durum elektroniğinde kullanılan bazı teknolojiler diğerlerine nazaran daha hızlı cevap veren devreler üretmektedirler. 2. İkinci maddede açıklandığı gibi işlemcinin kelime uzunluğu, hızlı işlem demektir. 3. İşlemcinin komut kümesi çeşidi, bir işlemcide bir işlem tek bir komutla yapılırken diğerinde daha fazla komutla yapılabilir. 4. Genel olarak zamanlama ve kontrol düzeni. 5. Kesme alt programlarının çeşitleri. 6. Bilgisayar belleğine ve I/O cihazlarına erişim hızı. 1985’larda piyasaya sürülen İ386’larla birlikte SX ve DX,1989’larda sürülen I486 işlemcilerde de 2X33,2X50,2X66 ve 4X100 Mhz ifadeleri mikro işlemci işlemlerine renk kattı. SX’in bazı özelliklerinin 286’ya benzemesi ve dahili 32-bit yapıda 16-25 Mhz çalışması kendisine bu ismin takılmasını sağlarken, DX, yapısal olarak diğerinden farklılığı ve SX’ten daha dinamik (33-40 Mhz)çalışması ve network ortamına tam olarak uyabilmesi tercih sebebi sayıldı. I486’larda kullanılan takılar, SL olarak işlemcinin küçük bilgisayarlarda düşük gerilimle çalışmasından dolayı, SX dahili matematik işlemcisinin olmaması ve DX, matematik işlemcisinin ve ayrıca ön-belleğinin bulunması sebebiyle takıldı. 3. Mikroişlemcinin doğrudan adresleyebileceği bellek büyüklüğü. Bilgisayar sistemlerindeki ana bellek mikroişlemci tarafından adres yolu vasıtasıyla adreslenir. Adres yolu hattı ne kadar çoksa adresleme kapasitesi de ona göre büyük
  6. 6. BLM 111 Programlama Dilleri I 6 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi olur. Adres yolu doğrudan mikroişlemci yapısıyla ilgili olup mikroişlemciye göre standarttır. Fakat işlemci içerisindeki kaydedicilerin büyüklüğü bir devre oyunuyla adres yoluna çoğullanmakta ve büyütülebilmektedir. XT tipi bilgisayarlarda kaydediciler 16-bitlik olmasına rağmen adres bilgisi dört bit kaydırılarak 20-bitlik hatta verilip,1 MB’lık bellek adreslenebilmektedir. AT tipi bilgisayarlarda 24, 32, 46-bitlik adres hattı kullanılarak gerçek modda 4 Gigabayt ve korumalı modda 70 TeraBayt adreslenebilmektedir. Yukarıda anlatılan üç temel özellik yanında mikroişlemcileri dolaylı olarak etkileyen birçok unsurlar vardır. Bunlar: 4. Kullanıcı veya programcının mikroişlemci üzerinde çalışabileceği kaydedici sayısı ve farklı tipleri. Kullanıcı verileri bu kaydediciler üzerinde çalıştırır. Kaydedici sayısının fazla olması manevra kolaylığı ve esneklik sağlar. Genel amaçlı kaydediciler (AX, BX, CX ve DX ), işaretçi ve indeks kaydedicileri(SP, BP, SI, DI, IP),bayrak kaydedicileri (C, P, A, Z, S, T, D, I, D, O, IOPL, NT, RF, VM, AC) ve segment kaydedicileri (CS, DS, ES, SS, FS, GS). Bunların haricinde korumalı modda kullanılan Selektör, Tanımlayıcı ve bunlara ilişik olarak tablo kaydedicileri vardır(TR, LDTR, GDTR, IDTR). 5. Programcının elde edebileceği değişik tipteki komutlar. Mikroişlemci hızını etkileyen komutlar, veri manevra komutları, Giriş/Çıkış komutları, Aritmetik komutlar, Mantık komutları ve Test komutları gruplarından birisine dahildir. Mikroişlemcinin kütüphanesin de bulunan komutların çokluğu sisteme belki elastikiyet sağlar fakat asıl olan komutun az çevrimle işlemi tamamlamasıdır. 6. Programcının bellek adreslerken gerek duyacağı farklı adresleme modları. Doğrudan adresleme, Dolaylı adresleme ve indeksli adresleme gibi adresleme türleri programcıya ekstra kolaylıklar sağlar. Adresleme modları, üzerinde çalışılan bir datanın belleğe nasıl ve ne şekilde yerleştirileceği veya üzerinde çalışılacak bir datanın bellekten nasıl ve hangi yöntemle çağrılacağıdır. Bu işlem bir mektubun gideceği yere eliyle mi, bir nesne baz alınarak mı, sokaklar ve evler eklenerek mi gibi kısa bir tarifle ulaşmasıdır. 7. Uygulamalar için sistemin yazılım uyumluluğu. Linux, CP/MS DOS, MacOS, Windows, UNIX ve OS/2
  7. 7. BLM 111 Programlama Dilleri I 7 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 8. İlave edilecek devrelerle uyumluluğu. Mikroişlemcili sisteme eklenecek devrelerin en azından işlemci hızında çalışması gerekir. Sisteme ilave edilecek bir SİMM veya SİP kartındaki bellek entegrelerinin hızları nanosaniye(ns) cinsinden işlemci ile aynı hızda olması tercih edilmelidir. Aynı şekilde sisteme takılan ekran kartının hızlandırıcısı ve VideoRAM'l’rın(VRAM) hızları ve performansları mikroişlemci ile aynı veya çok akın olmalıdır. Mikroişlemcinin çok hızlı çalışması diğer elemanlardaki pasiflikten veya hastalıktan zamanla düşer. 9. Sitemi tasarlayanın kullanabileceği değişik tipteki destek devreleri. PIA, ACIA, CO-PROCESSOR, CACHE memory, DMA gibi. Yukarıda sıralanan belli başlı mikroişlemci özelliklerinin yanı sıra, işlemci besleme gerilimi(2.9V, 3V veya 5V),mikroişlemcinin büyüklüğü, harcadığı enerjiyle birlikte ısınarak soğutucu gerektirmesi, Paketlenmiş ön-bellek 256 KB SRAM ve pipeline özellikleri (komutları çalıştırma işleminin hızlandırma gayesiyle safhalara bölünerek gerçekleştirilmesi işlemi) sayılabilir. BELLEKCPU GİRİŞ/ÇIKIŞ Adres yolu Veri yolu Şekil 2.1. Bilgisayarın genel blok yapısı Bilgisayarda adres yolu tek, veri yolu çift yönlüdür.
  8. 8. BLM 111 Programlama Dilleri I 8 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Şekil 2.2. Bilgisayarın Yapısı Giriş Birimi: Bilgisayara dış ortamdan veri girilmesini sağlayan birimlerdir. Çıkış Birimi: Bilgisayar ortamında işlenen verilerin dış ortama aktarılmasını sağlayan birimlerdir. Merkezi İşlem Birimi (CPU): Bilgisayarın beynidir. Bilgisayar içindeki bütün işlemler CPU’da yapılır. Yani giriş biriminden girilen veriler CPU içinde işlenir ve Çıkış birimine aktarılır. Bellek: Bilgilerin kalıcı ya da geçici olarak saklandığı ortamlardır. RAM (Ranndom Access Memory) Bellek: Rastgele erişilebilir bellektir. Bu belleğe kalıcı olmayan bellek de denir. Elektrik kesildiğinde ya da bilgisayar kapatıldığında ram bellekteki veriler silinir. Ram bellek Ana bellek olarak da isimlendirilir. Bilgisayar işlem yaparken verileri bu bellek üzerinde tutar. Giriş biriminden girilen veriler önce Ram belleğe gelir. Daha sonra CPU verileri ihtiyaç duydukça buradan alarak işler. CPU içinde işlenen veriler yine Ram Belleğe gider. Daha sonra Ram bellekten Çıkış Birimine aktarılır. ROM (Read Only Memory) Bellek: Sadece okunabilir bellektir. Bu bellek üzerindeki bilgiler üretici firma tarafından yazılır. Kullanıcı tarafından üzerinde bulunan bilgiler değiştirilemez. Üzerinde bilgisayarın açılması için gerekli olan program vardır. Bu program bilgisayar açılırken temel giriş/çıkış birimlerini kontrol eder. Örneğin bilgisayara klavye takılı değilse kullanıcıyı uyarır ve bilgisayarın açılmasını engeller. Depolama Birimi(Yan Bellek): Kalıcı bellektir. Üzerine kaydedilen bilgiler elektrik kesildiğinde ya da bilgisayar kapatıldığında silinmez. Sabit Disk (Harddisk) , Disket, CD, Data kartuşları depolama birimine örnek olarak gösterilebilir. Sabit disk (Harddisk) bilgisayarın kasasının içinde bulunur ve bütün bilgiler onun üzerinde depolanır. Yani sabit disk bilgisayarın içindeki depolama birimidir.
  9. 9. BLM 111 Programlama Dilleri I 9 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Sabit disk, disket, cd gibi depolama birimlerinin kapasiteleri (ne kadar veri depolayabilecekleri) kapasite ölçüm birimleri ile ölçülür. Şimdi kapasite ölçüm birimlerine bakalım. Kapasite ölçüm birimleri küçükten büyüğe Bit, Byte (Bayt),KB(Kilo Byte), MB (Mega Byte), GB (Giga Byte), TB (Tera Byte). Bit: En küçük birim bit’tir. Bilgisayar içinde karakterler ikilik sayı siteminde 8 haneli bir sayıyla ifade edilir. İşte bu sayının her bir basamağına 1 Bit denir. Örneğin: A karakteri bilgisayar içinde 0100001 sayısıyla ifade edilir. İşte bu sayının her basamağına 1 Bit denir. O zaman Bilgisayar içindeki her bir karakter 8 bit’ten oluşur. A karakteri=8 Bit, + karakteri=8 bit. Byte (Bayt) : Bilgisayar içinde her karakter aynı zamanda 1 Byte’tır. Örneğin A karakteri=1 Byte. A karakteri =1 Byte A karakteri=8 Bit Yukarıdaki eşitliklere göre 1 Byte=8 Bit sonucu çıkarılabilir. 1 Byte=8 Bit 1 KB (Kilo Bayt)=1024 Byte 1 MB (Mega Bayt)=1024 KB 1GB (Giga Bayt)=1024 MB 1 TB (Tera Bayt)=1024 GB’dır. Soru: ANADOLU kelimesi kaç Byte ve kaç Bit’tir. Çözüm: ANADOLU kelimesi 7 karakterden oluşmaktadır. 1 Karakter=1 Byte olduğu için bu kelime 7 Byte’tır. 1Byte=8 bit olduğundan dolayı bu kelime 8x7=56 Bit’tir. Soru: 2048 KB kaç MB’dır? Çözüm: 1024 tane KB=1 MB olduğundan 2048 KB=2 MB’tır. Çünkü 2048’in içinde 2 tane 1024 vardır. Genel olarak günümüzdeki sabit disklerin GB (Giga bayt) seviyesinde kapasiteleri vardır. Örneğin 20 GB,40 GB, 60 GB gibi. Bilgisayarlar kendisine sorulan sorulara hemen cevap veren, bir sürü problemi çözen bir aygıt değildir. Bilgisayarda yapılan her tür iş, ilk önce insan aklının süzgecinden geçiyor, insanlar tarafından etraflıca tasarlanıyor, planlanıp programlanıyor.
  10. 10. BLM 111 Programlama Dilleri I 10 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Bu nedenle, önce bilgisayara problemin çözümü öğretilmelidir. Fakat bunun için bizim problemi çözmemiz gerekir. Ve daha sonra bir programlama dili ile bu çözüm bilgisayara aktarılmalıdır. Yazılım (Software) Bilgisayarın istenilen işlemleri yapabilmesi için gerekli olan komutlar topluluğuna YAZILIM adı verilir. Yazılımlar üç ana başlık altında inceleyebiliriz. a) Sistem Yazılımları: Bilgisayarın yapacağı işlerin kontrolünü, işlem yazılımlarının çalışmasını, bellek giriş ve çıkışlarını, çeşitli işlerin ardarda ve sürekli bir şekilde yapılmasını sağlar. Örneğin: MS-DOS, UNİX, WINDOWS-95 vb. b) Uygulama Yazılımları: Programcının bir problemin çözümü için her hangi bir programlama dili ile yazdığı programlara derleyici ve çalıştırıcı, yani sisteme sonradan ilave edilmiş programların tümüne uygulama yazılımları adı verilir. c) Programlama Dilleri: Herhangi bir dilde yazılan programı makine diline çeviren yazılımlardır. Program ise belli bir işi yapmak üzere bilgisayara ne yapması gerektiğini ileten komutlar topluluğudur. BİLGİSAYAR PROGRAMLAMAYA GİRİŞ Yazılım, programlamayı ve bu konuyla ilgili dokümantasyonları içeren genel bir terimdir. Yazılım deyince ilk olarak aklımıza programlama dilleri, bu diller kullanılarak yazılmış kaynak programlar ve çeşitli amaçlar için oluşturulmuş dosyalar gelir. Yazılım uygulama alanlarına göre 5 gruba ayrılabilir. Mesleki ve Ticari Yazılımlar Çeşitli mesleklerde çalışan kişilerin işlerini kolaylaştırmak için hazırlanan yazılımlardır. Bu tür yazılımlar verilerin oluşturulması, işlenmesi ve dosyalarda saklanması ile karakterize olurlar. İşlenen veri miktarları göreli olarak büyüktür. Dikkate değer bir veri tabanı uygulaması içeren bu yazılımlarda zamanın büyük kısmı
  11. 11. BLM 111 Programlama Dilleri I 11 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi giriş/çıkış işlemlerinde harcanır. Muhasebe programları, adres etiket programları, stok kontrol programları, hastane yazılımları bu gruba örnek verilebilir. Bilimsel Yazılımlar ve Mühendislik Yazılımları Bilimsel ve mühendislik problemlerinin çözümünde kullanılan yazılımlardır. Yoğun olarak sayı ve sayı dizileriyle uğraşılır. Matematiksel ve istatistiksel algoritmaların ağırlıklı olarak kullanıldığı bu tür yazılımlarda işlenecek veri miktarı göreli olarak düşüktür. Bilimsel ve mühendislik yazılımların matematiksel karmaşıklığı en önemli karakteristikleridir. Elektronik devrelerin çözümünü yapan programları, simülasyon programlarını, istatistik analiz paketlerini örnek olarak verebiliriz. Bu tür yazılımlarda yük ağırlıklı olarak Merkezi İşlem Birimine biner. Yapay ZekaYazılımları İnsan davranışlarını taklit etmeyi amaçlayan yazılımlardır. Bunlara örnek olarak satranç programları, uzman sistemler, doğal dilleri anlama programları ve robot programları verilebilir. Görüntüsel Yazılımlar Görüntü işlemlerinin ve algoritmalarının yoğun olduğu yazılımlardır. Oyun programları, animasyon programları bu çeşit yazılımlardır. Bu tür yazılımlarda ağırlıklı olarak bilgisayarın grafik arabirimi kullanılır. Sistem Yazılımları Bilgisayar donanımı ile arabirim oluşturan uygulama yazılımlarına hizmet veren yazılımlardır. İşletim sistemleri, derleyiciler, editörler, haberleşme programları sistem yazılımlarına örnek verilebilir. Bilgisayarın donanımına daha yakın programlardır. Programlama Dillerinin Sınıflandırılması Programlama dilleri çeşitli yönlerden sınıflandırılabilir. Programlama dilleri sıklıkla seviyelerine göre sınıflandırılır. Seviye, bir programlama dilinin insan algılamasına olan yakınlığının bir ölçüsüdür. Yüksek seviyeli diller insan algılayışına daha yakın, alçak seviyeli diller de bilgisayarın doğal çalışmasına daha yakın olan dillerdir. Dilin seviyesi yükseldikçe programcının işi de kolaylaşır. Çok yüksek seviyeli dillerde bir işin nasıl yapılacağına ilişkin değil, ne yapılacağına ilişkin komutlar bulunur. Seviyenin yükselmesi programcının işini kolaylaştırırken genel olarak verimliliği ve esnekliği azaltır.
  12. 12. BLM 111 Programlama Dilleri I 12 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Görsel programlama dilleri program kodunun kısmen ya da tamamen görsel biçimde çeşitli araçlar tarafından üretildiği dillerdir. Görselliğin ileri uçlarında program kodu bile bulunmayabilir. Windows sistemlerinde .NET çatısı altında C# ve Visual Basic gibi diller yoğun olarak kullanılmaktadır. Çok yüksek seviyeli dillere deklaratif diller de denir. Veritabanlarının yönetimlerinde kullandığımız dilleri bu gruba sokabiliriz. Yüksek seviyeli programlama dilleri daha algoritmik dillerdir. Bu dillerde önce işlerin nasıl yapılacağına ilişkin algoritmalar tasarlanır. Daha sonra bu algoritmalar program koduna çevrilir. Basic, Pascal, Fortran gibi diller bu grup dillerdir. Orta seviyeli diller hem kullanıcıya hem de bilgisayara yakın olan yapılar içerirler. Orta seviyeli diller, yüksek seviyeli dillerin kolaylıkları ile aşağı seviyeli dillerin esnekliğini ve doğallığını kullanırlar. C tipik bir orta seviyeli dildir. Orta seviyeli diller özellikle sistem programlarının yazımında kullanılırlar. Alçak seviyeli diller sembolik makine dillerini kapsar. Sembolik makine dillerinde (assembly) mikroişlemci komutlarının daha algılanablir olan sembolik biçimleri kullanılır. Bu dillerle bir programın tamamını yazmak oldukça zahmetlidir. Doğal makine dilleri ise tamamen 0 ve 1 rakamlarının dizilimlerinden oluşan komutları içerirler. Sayısal bilgisayarlarda her şey 2’lik sayı sistemi ile ifade edilir. Programlama Dillerinin Uygulama Alanlarına Göre Sınıflandırılması Bilimsel ve Mühendislik Diller: Bu diller daha çok bilimsel ve mühendislik problemlerinin çözümünde tercih edilirler. Pascal, C, Java ve Fortranı buna örnek olarak gösterebiliriz. İnsana yakın Bilgisayara yakın  Çok yüksek seviyeli programlama dilleri ya da görsel diller (Visual C# .NET, Visual Basic.NET, Java..)  Yüksek seviyeli programlama dilleri (Pascal, Cobol, Fortran, Basic  Orta seviyeli programlama dilleri ( C )  Alçak seviyeli programlama dilleri (Assembly)  Makine dilleri (1 ve 0 dan oluşur)
  13. 13. BLM 111 Programlama Dilleri I 13 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Veritabanı Programlama Dilleri: Bu diller veritabanlarının genel olarak yönetiminde kullanılan dillerdir. Dbase, Paradox, Foxpro, SQL kişisel bilgisayarlarda yaygın olarak kullanılır. Yapay Zeka Dilleri: Bu diller insan davranışını taklit etmeye yönelik yapay zeka tabanlı programların yazımında kullanılan mantıksal dillerdir. En ünlüleri: LISP ve PROLOG. Genel Amaçlı Diller: Çok çeşitli konularda uygulama geliştirmek amacıyla kullanılan dillerdir. C ve Java yı örnek gösterebiliriz. Sistem Programlama Dilleri: Sistem programlarının yzımında kullanılan dillerdir. C’yi ve sembolik makine dillerini bu grup içinde ele alabiliriz. Programlama Dillerinin Değerlendirilmesi Programlama dillerini birbirinden ayıran çeşitli özellikler vardır. Yazılımcıları yeni bir dil tasarlamaya iten en önemli etken, onun belli konularda sağlayacağı avantajlardan kaynaklanmaktadır. Programlama dillerini incelemek üç grup için çok önemlidir. 1- Dil tasarımcıları 2- Derleyici yazanlar 3- Profesyonel programcılar Programlama dillerinin değerlemesine ilişkin ölçütler 11 başlık halinde incelenebilir. 1) İfade Gücü Algoritmayı tasarlayan kişinin niyetlerini açık bir biçimde yansıtma yeteneğidir. İfade gücü okunabilirlik kavramıyla da sıkı bir ilişki içindedir. C ve Java gibi diller aynı zamanda ifade gücü yüksek dillerdir. 2) Veri Türleri ve Yapıları Çeşitli veri türlerini (tamsayı, gerçek sayı, karakter…) ve veri yapılarını (diziler, kayıtlar…) destekleme yeteneğidir. Veri yapıları veri türlerinin oluşturduğu mantıksal birliklerdir. Örneğin C ve Java veri yapıları açısından oldukça zengindir. 3) Giriş/Çıkış Kolaylığı Sıralı, indeksli ve rastgele dosyalara erişme, veri kayıtlarını geri alma, güncelleştirme ve sorgulama yeteneğidir.Veri tabanı programlama dillerinin
  14. 14. BLM 111 Programlama Dilleri I 14 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi DBASE, Oracle Forms, Paradox vs) bu yetenekleri diğerlerinden daha üstündür. Fakat C, giriş/çıkış kolaylığı kuvvetli olmayan bir dildir. C’de veri tabanlarının yönetimi için özel kütüphanelerin kullanılması gerekir. 4) Taşınabilirlik Bir programlama dilinde yazılmış kaynak kodun başka sistemlerde de sorunsuz derlenerek çalışabilmesi anlamına gelir. Yüksek seviyeli dillerin en önemli özelliklerinden biri olan taşınabilirlik ortak bir tasarımı ve standardizasyonu gerektirir. Dillerin taşınabilirliği genelde seviye düştükçe azalır. Bu durumda en az taşınabilir olan dillerin makine dili olduğunu söylebiliriz. Orta seviyeli olmasına rağmen C programlama dili taşınabilirlik açısından diğer dillere kıyasla en önemli yeri tutmaktadır. Taşınabilirlik konusu hiçbir dil için mükmmel denemez. Derleyici paketlerinin yeni uyarlamalarının çoğu bir takım yenilikleri de beraberinde getirir. Bu durumda programcının hangi komutların ve yapıların taşınabilir olduğunu bilmesi büyük önem taşır. 5) Modülerlik Kaynak programların alt programlara ayrılarak parçalanbilme özelliğine denir. Alt program kullanımının pek çok faydası vardır.  Alt programlama kodu küçültür.  Alt programlama algılamayı kolaylaştırır.  Alt programlama test olanaklarını artırır.  Alt programlama kaynak kodun güncelleştirilebilirliğini ve yeniden kullanılabilirliğini artırır. 6) Verimlilik Bir dilde yazılıp derlenmiş programların hızlı çalışabilmesidir. Her ne kadar derlenmiş kodun hızlı çalışması aslında derleyicilerin kendi verimliliğine bağlıysa da, dilin seviyesinin ve genel yapısının çalışma hızı üzerindeki etkisi yadsınamaz. Örneğin C ile yazılımş programların az yer kapladığı ve hızlı çalıştığı bilinir. 7) Okunabilirlik Okunabilirlik kaynak kodun çabuk ve kuvvetli bir biçimde algılanabilmesi anlamına gelir. Kaynak kodun kounabilirliğinde sorumluluk büyük ölçüde programı yazanın omuzları üzerindedir. Birçok kişinin ortak kodlar üzerinde çalıştığı projelerde okunabilirlik daha da önem kazanmaktadır. 8) Esneklik Esneklik, programlama dilinin programcıyı kısıtlamaması anlamına gelir. Esnek bir dilde derleme hataları daha azdır. Birçok işlem hata riskine karşın programcı için serbest bırakılmıştır. Programcı bu serbestlikten ancak iyi bir programcıysa
  15. 15. BLM 111 Programlama Dilleri I 15 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi fayda sağlayabilir. Fakat deneyimsiz bir programcıya zarar da verebilir. Örneğin C dili çok esnek bir dildir, karakter türüyle tamsayı türü karşılıklı olarak birbine atanabilir. Programcı bu özelliği yerinde kullanarak bundan algoritmik bir kazanç sağlayabilir. 9) Öğrenme Kolaylığı Her programlama dilini öğrenmenin zorluğu aynı değildir. Yüksek seviyeli dillerin eğitimi, düşük seviyeli dillerin eğitiminden daha kolaydır. C#, Visual Basic gibi dillerin bu derece sevilmesinin nedenlerinden biri de çabuk öğrenilebilmesidir. C, eğitimi zor ve zahmetli bir dildir. 10) Yapısallık Yapısal programlama, bir programlama tekniğinin adıdır. Yapısal programlamada bloklar halinde yazım ön plandadır. Yapısal programlamada alt programların önemi büyüktür. Yapısal diller aynı zamanda modüler dillerdir. Modüler tasarımda programlar küçük parçalara ayrılarak soyutlama sağlanır. İfade gücü, okunabilirlik, taşınabilirlik gibi özellikler de yapısal programlamayı desteklemektedir. 11) Nesne Yönelimlilik Nesne yönelimlilik (object orientation) bir programlama tekniğidir. Bugün programlama dillerinin büyük bölümünün nesne yönelimli uyarlamaları mevcuttur. C programlama dilinin nesne yönelimli programlamayı destekleyen uyarlamasına C++ denir. PROBLEM ÇÖZME ve ALGORİTMALAR Problem Çözme Problem çözmede, soruna hemen girişmek yerine, dikkatli ve sistematik yaklaşım ilke olmalıdır. Problem iyice anlaşılmalı ve mümkün olduğu kadar küçük parçalara ayrılmaladır. Descartes tarafından "Discourse on Method" isimli kitabında anlatılan problem çözme teknikleri; 1. Doğruluğu kesin olarak kanıtlanmadıkça, hiçbir şeyi doğru olarak kabul etmeyin; tahmin ve önyargılardan kaçının. 2. Karşılaştığınız her güçlüğü mümkün olduğu kadar çok parçaya bölün. 3. Düzenli bir biçimde düşünün; anlaşılması en kolay olan şeylerle başlayıp yavaş yavaş daha zor ve karmaşık olanlara doğru ilerleyiniz. 4. Olaya bakışınız çok genel, hazırladığınız ayrıntılı liste ise hiçbir şeyi dışarıda bırakmayacak kadar kusursuz ve eksiksiz olsun.
  16. 16. BLM 111 Programlama Dilleri I 16 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Algoritmalar Algoritma, bir görevin nasıl yerine getirileceğini tanımlayan adımlar kümesi olarak tanımlanabilir. Günlük hayatta gerçekleştirdiğimiz birçok iş aslında bir algoritmaya dayanır. Örneğin, kek pişirmek, çamaşır makinesini kullanmak, araba kullanmak vs. Bilgisayarların bir görevi yerine getirebilmesi için ilgili görevi yerine getirecek algoritmanın bulunması ve bilgisayara uygun bir biçimde sunulması gerekir. Program, algoritmanın uygun biçimde bilgisayar ortamında temsil edilmesidir. Program geliştirme süreci, geliştirilen programın makine uyumlu biçimde kodlanması ve kodlanan programın bilgisayara atarılması işlemlerine genel olarak Programlama denir. Programlar ve onların temsil ettiği algoritmalar toplu olarak Yazılım olarak tanımlanırken, yazılımların çalıştırıldığı cihazlar da Donanım olarak tanımlanır. Algoritma çalışmaları matematiğin bir konusu olarak başladı. Aslında algoritma çalışmaları matematikçiler için günümüz bilgisayarlarının geliştirilmesinden çok uzun yıllar önce önemli bir aktivite olarak ortaya çıkmıştır. Burada amaç belli bir tipteki tüm problemin çözümünü tanımlayan bir talimat kümesi oluşturmaktı. Erken dönemde yapılan bu araştırmalardan en iyi bilineni iki çok haneli sayının bölümünü hesaplayan algoritmadır. Bir diğer örnek iki tam sayının ortak bölenlerinin en büyüğünü bulan ve Yunan matematikçi Öklit tarafından geliştirilen Öklit algoritmasıdır (Şekil 1.1) Şekil 1.1. Öklit algoritması 1950’ler ve 1960’larda akış diyagramları (algoritmaların birbirine oklarla bağlanan geometrik şekillerle ifade edilmesi) tasarım aracı olarak temel alınmıştır. Ancak, akış diyagramları bribiri üzerinden geçen oklar yüzünden sıklıkla karmaşık hale gelmesi ve algoritmanın anlaşılmasını güçleştirdiği için yerini başka temsil tekniklerine bırakmışlardır. Bunlardan biri algoritmaları iyi tanımlanmış cümlelerle temsil eden pseudocode’dur. Asıl amacın algoritma dizaynı değil de görsellik olduğu durumda akış diyagramları günümüzde halen kullanılmaktadır. Şekil 1.2’de akış diyagramlarında kullanılan simgeler ve anlamları verilmiştir. Her simge genel olarak yapılacak bir işi veya komutu temsil eder. Tanım: Bu algoritma, girişleri iki tamsayı olarak kabul eder ve bu iki sayının ortak bölenlerinin en büyüğünü bulmaya çalışır. Yöntem: Adım-1. M ve N sırasıyla iki tamsayıdan büyük ve küçük olanları olsun. Adım-2. M’yi N’e böl ve kalan R’yi bul. Adım-3. Eğer R, 0 değilse M’ye N değerini ver, N’ye de R değerini ver ve 2. Adıma dön; aksi durumda ortak bölenlerin en büyüğü o anda N’ye atanan değerdir.
  17. 17. BLM 111 Programlama Dilleri I 17 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi BAŞLA DUR Klavye Kart Kağıt Ekran İşlem Fonksiyon Çağırma Koşullu Dallanma Döngü Sakla Doğrudan Ardışıl Şekil 1.2. Akış diyagramı simgeleri Pseudocode Pseudocode, genel olarak algoritma geliştirme sürecinde fikirlerin konuşma diline yakın cümlelerle ifade edilebildiği bir notasyon sistemidir. Pseudocode oluşturmanın bir yolu algoritma geliştirme işlemi sonunda algoritmanın kodlanacağı programlama dilinin yazım kurallarını serbestleştirerek (özenmeden) kullanmak olabilir. Bu yaklaşım genelde kullanılacak programlama dilinin önceden belli olduğu durumlarda kullanılır. Algoritma Problem Örnekleri Örnek 1.1 : 1'den 100'e kadar olan sayıların toplamını veren algoritma. 1. Toplam T, sayılar da i diye çağırılsın. 2. Başlangıçta T'nin değeri 0 ve i'nin değeri 1 olsun. 3. i'nin değerini T'ye ekle. 4. i'nin değerini 1 arttır. 5. Eğer i'nin değeri 100'den büyük değil ise 3. adıma git. 6. T'nin değerini yaz. Aynı algoritmayı aşağıdaki gibi yazabiliriz.
  18. 18. BLM 111 Programlama Dilleri I 18 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 1. T=0 ve i=0 2. i'nin değerini T'ye ekle. 3. i'yi 1 arttır. 4. i<101 ise 2.adıma git. 5. T'nin değerini yaz. Algoritmayı bir de akış şeması ile gerçekleyelim. T=0 İ=0 İ’nin Değerini T’ye ekle İ’yi bir arttır İ<101 T’yi yaz Örnek 1.2 : ax2+bx+c=0 tipi bir denklemin köklerini veren algoritma. Girdi : a, b ve c katsayıları Çıktı : denklemin kökleri 1. a, b ve c katsayılarını al. 2. D = b2-4ac değerini hesapla. 3. D<0 ise gerçel kök yok. 7. adıma git. 4. x b D a1 2  ( ) / ( ) 5 . x b D a2 2  ( ) / ( ) 6. değerlerini yaz. 7. Dur. Döngü Gösterimi Tekrarlanan adımlar Koşul sağlandığı sürece n.1 ... n.2 ... tekrarlanan adımlar n.3 ... Örnek 1.3 : İki tamsayının çarpma işlemini sadece toplama işlemi kullanarak gerçekleyin.
  19. 19. BLM 111 Programlama Dilleri I 19 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Girdi : iki tamsayı Çıktı : sayıların çarpımı 1. a ve b sayılarını oku 2. c =0 3. b>0 olduğu sürece tekrarla 3.1 c=c + a 3.2 b = b-1 4. c değerini yaz ve dur Örnek 1.4 : Bir tamsayının faktoriyelini hesaplayınız. Girdi : Bir tamsayı Çıktı : sayının faktoriyel İlgili formul: Faktoriyel(n)=1*2*...*n 1. n değerini oku 2. F=1 3. n >1 olduğu sürece tekrarla 3.1. F=F*n 3.2. n= n-1 4. F değerini yaz Örnek 1.5 : İki tamsayının bölme işlemini sadece çıkarma işlemi kullanarak gerçekleyin. Bölüm ve kalanın ne olduğu bulunacak. 1. a ve b değerlerini oku 2. m=0 3. a>=b olduğu sürece tekrarla 3.1. a=a-b 3.2. m = m + 1 4. kalan a ve bölüm m 'yi yaz Örnek 1.6 : 100 tane sayıyı okuyup, ortalamasını bul 1. T=0,i=0 2. i<101 olduğu sürece tekrarla 2.1. m değerini oku 2.2. T = T + m 2.3. i = i + 1 3. T = T / 100 4. Ortalama T ‘yi yaz 5. Dur Örnek 1.7 : Bir sınava giren öğrencilerin not ortalamasının hesaplanması 1. Tüm sınav kağıtlarını inceleyip notların toplamını hesapla
  20. 20. BLM 111 Programlama Dilleri I 20 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 2. Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla 3. Ortalamayı yaz. 1. Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et 2. Sıradaki sınav kağıdının notunu notların toplamına ekle 3. İncelenen sınav kağıdı sayısını Bir arttır 4. İncelenecek sınav kağıdı var ise 2. Adıma git 5. Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hasapla 6. Ortalamayı yaz 1. Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et 2. Her bir sınav kağıdı için 2.1. Sıradaki sınav kağıdının notunu notların toplamına ekle 2.2. İncelenen sınav kağıdı sayısını bir arttır 3. Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla 4. Ortalamayı yaz Koşul Gösterimi Koşul doğru ise n.D.1 n.D.2 doğru olduğunda işlenen adımlar n.D.3 aksi halde n.Y.1 n.Y.2 yanlış olduğunda işlenen adımlar n.Y.3 Kök bulma örneğinde 3. Adımı tekrar yazarsak 3. D>=0 ise 3.D.1 x b D a1 2  ( ) / ( ) 3.D.2 x b D a2 2  ( ) / ( ) aksi halde 3.Y.1 Reel kök yoktur Örnek 1.8 : Aracın otopark ücretinin hesaplanması. Araçların en fazla 24 saat kaldığını varsayın. 0 - 2 saat 150 bin 2 - 8 saat 300 bin 8-24 saat 500 bin
  21. 21. BLM 111 Programlama Dilleri I 21 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 1. Aracın kaç saat kaldığını öğren ( t olsun ). 2. t <= 2 ise 2.D.1. ücret = 150 bin Aksi halde 2.Y.1. t<=8 ise 2.Y.1.D.1. ücret = 300 bin Aksi halde 2.Y.1.Y.1. ücret = 500 bin 3. Ücreti yaz 4. Dur Örnek 1. 9: Sınavdaki en büyük notun bulan algoritma. 1. En büyük = ilk sınav kağıdındaki not (ya da olabilecek en düşük değer kabul edilebilir). 2. İncelenecek sınav kağıdı var ise 2.1. Sınav kağıdındaki not > En büyük ise En büyük = Sınav kağıdındaki not 3. En büyük değerini yaz. 4. Dur Algoritmanın yazımı daha simgesel olabilir. Ni i. Öğrencinin notu olsun. 1. EB = N1 2. i = 2 3. İncelenecek sınav kağıdı var ise 3.1. Ni>EB => EB = Ni 3.2. i = i + 1 4. EB’ yi yaz. 5. Dur Örnek 1.10 : Programın C dili ile yazılıp çalışır hale getirilmesi. 1. Programı bilgisayara gir 2. Kaynak dosya olarak kaydet 3. Kaynak dosyayı derle ( compile) 4. Derleme sonucunda hata var ise 4.1. Hataları düzelt 4.2. 3. Adıma git 5. Oluşan amaç dosyasına diğer dosyaları bağla (link)
  22. 22. BLM 111 Programlama Dilleri I 22 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 6. Bağlama sonucunda hata var ise 6.1. Hataları düzelt 6.2. Hatalar kaynak dosya ile ilgili ise 2. adıma aksi halde 5. adıma git 7. Program çalıştırılmaya hazır
  23. 23. BLM 111 Programlama Dilleri I 23 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi C Programlama Dili C Programlama Dili genel amaçlı orta seviyeli ve yapısal bir programlama dilidir. 1972 yılında Dennis Ritchie tarafından Bell Telefon Labaraturvarında tasarlanmıştır. C, özellikle sistem programlamada sembolik makine dili(Assembler) ile tercih edilmektedir. İşletim sistemleri, derleyiciler ve debug programları gibi aşağı seviyeli sistem programlarının yazılımında yoğun olarak C programlama dili kullanılır. Bu dil ilk olarak bir programlama dili olarak düşünülmemişti ve özel bir amacı vardı: UNIX işletim sistemini tasarlamak (UNIX işletim sisteminin 1000 satırlık bölümü C ile yazılmıştır). Günümüzde Nesneye Yönelik programlama dilleri (C++, Java gibi) ve script dilleri (JavaScript, JavaApplet, PHP gibi) gibi programlama dilleri tamamen C tabanlıdır. Kısacası Standart C dilini (ANSI C) ogrenmekle bu dillerin tamamına iyi bir hazırlık yapmış olursunuz. Derlerimizde tamamen ANSI C konu edilmiştir. C dilini seçmemiz için sebepler:  C güçlü ve esnek bir dildir. C ile işletim sistemi yazabilir, kelime işlemciler oluşturabilir veya grafik çizebilirsiniz.  C taşınabilir bir dildir. Yani herhangi bir C kodu hiçibir değişikliğe uğramadan, veya çok az bir değişimle, başka bir derleyicide derlenebilir. Örneğin, Windows işletim sistemlerinde yazılan bir C kodu, Linux, UNIX veya VAX gibi işletim sistemlerinde de derlenebilir.  C yapısal bir dildir. C kodları fonksiyon olarak adlandıralan altprogramlardan oluşmuştur. Kaynak Kodun Derlenmesi C kaynak kodları(programları) uzantısı .c olan dosyalarda saklanır ve derlenir. Bazı işletim sistemleri ile kullanılan C Derleyicileri ve bu derleyicilerde ilk.c dosyasının nasıl derlendiği Tablo 1.1 de verilmiştir. Not: Eğer ismi geçen derleyicinin bir editörü varsa ilk.c bu editör de derlenebilir. Işletim Sistemi Derleyici Komut Çalıştırma MS-DOS / Windows Microsoft C cl ilk.c ilk.exe Borland Turbo C tcc ilk.c ilk.exe Borland C bcc ilk.c ilk.exe Zortec C ztc ilk.c ilk.exe UNIX Tabanında var cc ilk.c run ilk Linux Tabanında var c ilk.c run ilk Tablo 1.1. İşletim sistemleri, bazı derleyiciler ve derleme komutları
  24. 24. BLM 111 Programlama Dilleri I 24 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi İlk C Programı Aşağıda verilen C programı derlendikten sonra, ekrana 'Merhaba Dünya!' yazacaktır. Satır başlarına yerleştirilen 1:, 2: 3: ... rakamlarının yazılmasına gerek yoktur. Bu rakamlar sadece programdan daha sonra program ile ilgili açıklama yapılırken, ilgili satirda bulunan kodlar izah edilirken, kullanılacaktır. 1: /* ilk.c programi */ 2: #include <stdio.h> 3: 4: main() 5: { 6: printf("Merhaba Dünya!n"); 7: return 0; 8: } ilk.c nin Borland Turbo C Derleyicisi ile derlenmesi ve çalıştırılması: Editörde -> Ctrl+F9 MS-DOS komut satırında -> tcc ilk.c [RETURN] ilk.exe [RETURN] ilk.c nin çıktısı: Merhaba Dünya! ilk.c programın da verien 1. satırda /* ... */ ifadeleri görülmektedir. Bu ifadeler arasında yazılan herhangi bir metin, işlem vb. satırlar, derleyici tarafından işlenmez(görülmez). Yani /* */ ifadeleri açıklama operatörüdür. 2. satırda yazılı olan #include ifadesi, programda eklenecek olan başlık dosyasını işaret eder. Bu örnekte verilen başlık dosyası (header file) stdio.h dir. Bu dosya standard giriş çıkış kütüphane dosyasıdır (STandarD-Input-Output). Bu tip dosyaların uzantısı .h dir. 4. satırdaki main() ve 6. satırdaki printf() birer fonksiyondur. main() özel bir fonksiyondur ve programın yürütülmesine bu programdan başlanır. Dolayısıyla her C programında bir tane main() adlı fonksiyon olmalıdır. printf() ise standart kütüphane bulunan ekrana yazdırma fonksiyondur. stdio.h bu fonksiyon için kullanılmıştır. 7. satırdaki return 0 ifadesi programın sonlandığını göstermek için kullanılır. Çoğu zaman kullanılmasına gerek yoktur.
  25. 25. BLM 111 Programlama Dilleri I 25 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi C Kodlarının Temel Özellikleri Bir C programı aşağıda verilen özellikleri mutlaka taşımalıdır.  Her C programı main() fonksiyonunu içermelidir.  Satırın sonuna ; işareti konmalıdır.  Her fonksiyonun başlangıcı ve bitişi sırasıyla { ve } sembolleri ile belirlenir.  C dilinde yazılan kodlarda küçük-büyük harf ayrımı vardır (case sensitive). Örneğin A ile a derleyici tarafından farklı değerlendirilir.  Açıklama operatörü /* */ sembolleridir.  Değişken isimleri en fazla 32 karakterden oluşabilir. 32 karakterden uzun değişken isimlerinin ilk 32 karakteri değerlendirilir. Geriye kalan karakterler işleme tabi tutulmaz.  Değişken adları ingiliz alfabesinde bulunan karakterler (A-Z) veya (a-z) ile yazılmalıdır.  Değişken adları herhangi bir rakam ile başlayamaz. Ilk karakter bir harf olamalıdır. Aşağıda verilen kelimeler C deyimleridir (reserved words) ve değişken ismi olarak kullanılamaz. auto enum short volatile break extern signed while case float sizeof char for static const goto struct continue if switch default int typedef do long union double register unsigned else return void Kod Yazımı İçin Tavsiyeler  Program açıklamaları ve döküman hazırlama program yazıldıkça yapın! Bu unutulmaması gereken çok önemli husustur.  Değişken, sabit ve fonksiyon adları anlamlı kelimelerden seçilip yeterince uzun olmalıdır. Eğer bu isimler bir kaç kelimeden oluşacak ise, kelimeler alt çizgi ( _ ) ile ayrılmalıdır veya her kelime büyük harfle başlamalıdır. Örneğin: int son_alinan_bit; void KesmeSayisi(); float OrtalamaDeger = 12.7786;  Sabitlerin bütün harflerini büyük harfle yazın. Örneğin:
  26. 26. BLM 111 Programlama Dilleri I 26 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi #define PI = 3.14; int STATUS 0x0379;  Her alt yapıya girerken TAB tuşunu kullanın. Bu okunabilirliği arrtıracaktır. Örneğin: for(i=0;i<10;i++) { for(j=0;j<i;j+=2) { do{ k = i+j; }while(k!=0); } }  Aritmetik operatörler ve atama operatörlerinden önce ve sonra boşluk karakteri kullanın. Bu, yazılan matematiksel ifadelerin daha iyi anlaşılmasını sağlayacaktır.Örneğin: Hmax = pow(Vo,2) / (2*g); Tf = 2*Vo/g; Vy = Vo - g*t; y = Vo*t - (g*t*t)/2.0; z = ( a*cos(x) + b*sin(x) )*acos(y);  Program bittikten sonra tekrar tekrar programınızı inceleyerek, programınızı daha iyi şekilde yazma yollarını arayın ve aynı fonksiyonları daha kısa algoritmalarla ve daha modüler şekilde elde etmeye çalışın. Programınızın anlaşılması için elinizden ne geliyorsa yapın. Bilginizi ve eserinizi başkalarına en iyi şekilde aktarın. Operatörler Operatörler, değişkenler veya sabitler üzerinde matematiksel ve karşılaştırma işlemlerini yapan simgelerdir. Aritmetiksel Operatörler Değişken veya sabitler üzerinde temel aritmetik işlemleri gerçekleyen operatörlerdir. Bunlar Tablo 1.2’de listelenmiştir.
  27. 27. BLM 111 Programlama Dilleri I 27 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Operator Açıklama Ornek Anlami + toplama x+y x ve y nin toplamı - cikarma x-y x ve y nin farkı * carpma x*y x ve y nin çarpımı / bolme x/y x ve y nin oranı % artık bölme x%y x/y den kalan sayı Tablo 1.2. Aritmetik Operatörler Atama Operatörleri Bu operatörler bir değişkene , bir sabit eşitlemek için kullanılır. Birleşik atama: bazı ifadelerde işlem operatörü ile atama operatörü birlikte kullanılarak, ifadeler daha kısa yazılabilir. Eğer ifade değişken = değişken [operatör] ifade; şeklinde ise, daha kısa bir biçimde değişken [operatör]= ifade; olarak yazılabilir. Bunlar Tablo 1.3’de listelenmiştir. Operator Açıklama Ornek Anlamı = atama x=7; x=7; += ekleyerek atama x+=3; x=x+3; -= eksilterek atama x-=5; x=x-5; *= çarparak atama x*=4; x=x*4; /= bölerek atama x/=2; x=x/2; %= bölüp, kalanını atama x%=9; x=x%9; ++ bir arrtırma x++; veya ++x; x=x+1; -- bir azaltma x--; veya --x; x=x-1; Tablo 1.3. Atama Operatörleri Karşılaştırma Operatörleri ve Mantıksal Operatörler Sayısal değerleri veya karakterleri karşılaştırmak için kullanılır. Bunlar Tablo 1.4’de listelenmiştir.
  28. 28. BLM 111 Programlama Dilleri I 28 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Operator Açıklama Ornek Anlamı > büyüktür x>y x, y den büyük mü? < küçüktür x<y x, y den küçük mü? == eşittir x==y x, y ye eşit mi? >= büyük-eşittir x>=y x, y den büyük yada eşit mi? <= küçük-eşittir x<=y x, y den küçük yada eşit mi? != eşit değil x!=y x, y den farklı mı? && mantıksal VE x>2 && x<y x 2 den büyük VE y den küçük mü? || mantıksal VEYA x>2 || x<y x 2 den büyük VEYA y den küçük mü? Tablo 1.4. Karşılaştırma Operatörleri ve Mantıksal Operatörler Bit Düzeyinde İşlem Yapan Operatörler Sayısal veya karakter değişkenlerin üzerinde bit düzeyinde mantıksal işlem yapan operatörlerdir. Bunlar Tablo 1.5’de listelenmiştir. Operator Açıklama Ornek Sonucu & ve 10 & 25 (00001010 & 00011001) 8 (00001000) | veya 10 | 25 (00001010 | 00011001) 27 (00011011) ^ özel veya 10 ^ 25 (00001010 ^ 00011001) 19 (00010011) ~ değil ~10 (00001010) 245 (11110101) >> sağa kaydırma 12 >> 3 (00001100 >> 3) 1 (00000001) << sola kaydırma 12 << 3 (00001100 << 3) 96 (01100000) Tablo 1.5. Bit düzeyinde işlem yapan operatörler Operatörlerin kullanımı ile ilgili aşağıda örnek bir program verilmiştir. 1: /* Aritmetik ve atama operatörlerinin kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: int x, y; /* yerel değikenlerin bildirimi */ 7: 8: x = 1; /* x in başlangıç değeri */ 9: y = 3; /* y nin başlangıç değeri */ 10: 11: printf(" x = %d ve y = %d,n olarak veriliyor.", x, y, z); 12: 13: x = x + y; 14: printf("x <- x + y atamsının sonucunda x %d dirn", x); 15: 16: x = 1; /* x e tekrar 1 değeri atanıyor */ 17: x += y; 18: printf("x += y atamasının sonucunda x %d dirn", x); 19: 20: return 0; 21: }
  29. 29. BLM 111 Programlama Dilleri I 29 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Yukarıda verilen program x = x + y ataması ile x += y atamasın aynı anlamda olduğu gösterir. 8. ve 9. satırlarda x ve y değişkenlerine başlangıç değerleri atanmıştır. Bu değerler 11. satırda printf() fonsiyonu ile ekrana yazdırılmıştır. 13. ve 17. satırdaki ifadeler ekrana yazdırıldığında sonucun değişmediği görülür. Değişkenler ve Sabitler Değişkenler bellekte bilginin saklandığı gözlere verilen sembolik adlardır. Her değişkenin tuttuğu değerin nasıl bir veri olduğunu gösteren bir tipi vardır. C dilinde temelde birkaç tane değişken tipi vardır. Bunlar Tablo 1.1’de listelenmiştir. Değişken tipi Açıklama Bellekte işgal ettiği boyut (byte) char tek bir karakter için 1 int tamsayı için 2 yada 4 float tek duyarlı gerçel sayı için (6 basamak hassasiyet) 2 yada 4 double çift duyarlı gerçel sayı için (12 basamak hassasiyet) 4 yada 8 Tablo 1.1. Değişken tipleri ve bellekte kapladıkları alanlar Fakat bazı özel niteleyiciler vardır ki bunlar yukarıdaki temel tiplerin önüne gelerek onların türevlerini oluşturur. Bunlar short, long, unsigned dır. Bu niteleyiciler sayesinde değişkenin bellekte kaplayacağı alan isteğe göre değiştirilebilir. Kısa (short), uzun (long), ve normal (int) tamsayı arasında yalnızca uzunluk farkı vardır. Eğer normal tamsayı 16 bit (2 byte) ise uzun tamsayı 32 bit uzunluğundadır. Kısa tamsayı 16 biti geçmeyecek uzunluktadır. Değişken tiplerinin bellekte kapladığı alan sizeof operatörü ile öğrenilebilir. Aşağıdaki program bu amaçla yazılmıştır. 1: /* sizeof operatörünün kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: printf( "nchar : %d byte", sizeof( char )); 7: printf( "nint : %d byte", sizeof( int )); 8: printf( "nshort : %d byte", sizeof( short )); 9: printf( "nlong : %d byte", sizeof( long )); 10: printf( "nunsigned char : %d byte", sizeof( unsigned char )); 11: printf( "nunsigned int : %d byte", sizeof( unsigned int )); 12: printf( "nunsigned short : %d byte", sizeof( unsigned short )); 13: printf( "nunsigned long : %d byte", sizeof( unsigned long )); 14: printf( "nfloat : %d byte", sizeof( float )); 15: printf( "ndouble : %d byte", sizeof( double )); 16: printf( "nlong double : %d byte", sizeof( long double )); 17: 18: return 0; 19: }
  30. 30. BLM 111 Programlama Dilleri I 30 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Değişken ve Sabitlerin Bildirimi Bazı uygulamalarda değişkenin bir başlangıç değerinin olması istenir. Böyle durumlarda değişken bildirilirken başlangıç değeri verilebilir. Örneğin: char isim='X', z; int sayi=0, n=10; float toplam=0.0, sonuc=22.14; Sabit bildirimi, başlangıç değeri verilen değişken bildirimi gibi yapılır. Ancak; veri tipinin önüne const anahtar sözcüğü koyulmalıdır. Örneğin: const float PI = 3.142857; const double NOT= 12345.8596235489; const int EOF= -1; const char[] = "devam etmek için bir tuşa basın..."; gibi sabit bildirimleri geçerli olup bunların içerikleri program boyunca değiştirilemez. Yalnızca kullanılabilir. Genellikle, sabit olarak bildirilen değişken isimleri büyük harflerle, diğer değişken isimlerinin ise küçük harflerle yazılması(gösterilmesi) C programcıları tarafından geleneksel hale getirilmiştir. Birçok C programında sabitler #define önişlemci komutu ile de tanımlandığını görebilirsiniz. Bu komutla sabit bildirimi, bir program parçasına ve makro fonksiyon tanımlaması yapılabilir. Bir program geliştirilirken simgesel sabitlerin kullanılması programın okunurluğunu arttır ve bazen gerekli de olabilir. Aşağıda verilen simgesel sabit bildirimleri geçerlidir. #define MAX 100 #define DATA 0x0378 #define YARICAP 14.22 Değişken Bildirim Yerleri ve Türleri Yerel(local) Bildirim Yerel değişkenler kullanıldığı fonksiyon içerisinde bildirilir. Yalnızca bildirildiği fonksiyon içerisinde tanınır ve kullanılabilir. int topla(int a,int b) { /* yerel (local) değişken c nin bildirimi */ int c; c = a + b; return c;
  31. 31. BLM 111 Programlama Dilleri I 31 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi } Genel(general) Bildirim Genel değişkenler bütün fonksiyonların dışında bildirilir. Bir değişken program boyunca sürekli olarak kullanılıyorsa genel olarak bildirilmelidir. #include <stdio.h> void karesi(); /* ** m ve n global tip değişkendir. ** bu iki değişken tüm program boyunca kullanılmaktadır */ int m,n; main(){ m=7; karesi(); printf("%d nin karesi %d dir",m,n); } void karesi() { n = m*m; } Tip Dönüşümleri Bir formül içerisinde bir çok değişken veya sabit olabilir. Bu değişken ve sabitler birbirinden farklı tipte olursa, hesap sonucunun hangi tipte olacağı önemlidir. Bir bağıntıda, içeriği dönüşüme uğrayan değişkenler eski içeriklerini korurlar. Dönüştürme işlemi için geçiçi bellek alanı kullanılır; dönüştürülen değer kullanıldıktan sonra o alan serbest bırakılır. char kr; int tam; long int ltam; unsigned int utam; short int stam; float f; double d; bildirimlerine göre: bağıntı sonuç tipi ------- ---------- kr+5 int kr+5.0 double d+tam double f+d-2 double utam-tam unsigned ltam*tam long tam/2 int
  32. 32. BLM 111 Programlama Dilleri I 32 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi tam/2.0 double bir değişkenin sabit değerin veya bağıntının önüne tür (cast) yazılarak sonucun hangi tip çıkması istendiği söylenebilir. Genel yazım biçimi: (tür tipi) bağıntı; örneğin x int, a ve b float tipinde iki değişken olsun: int x=3; float a,b; ... a = x/2; b = (float) x/2; işleminin sonucunda a değişkenine 1.0, b değişkenine 1.5 değeri aktarılır. yani x/2 ile x/2.0 aynı anlamda değildir. Temel Giriş/Çıkış İşlemleri Temel giriş/çıkış fonksiyonları kullanılırken stdio.h başlık dosyası programın başına eklenmelidir. Bu fonsiyonlardan en çok kullanılanlar aşağıda verillmiştir. Fakat bunların dışında olan bir kaç fonksiyon daha vardır. printf() Fonksiyonu Standart C kütüphanesinin bir parçası olan printf() fonksiyonu, değişkenlerin içeriğini veya bit mesajı ekrana bir düzenle(formatla) standart çıkışa(stdout) yazmak için belki de en çok kullanılan fonksiyondur. Daha önce yazılan örnek programlarda printf() fonksiyonu kullanılmıştı. Şimdi bu fonsiyonun nasıl kullanıldığı açıklanacaktır. Basit olarak eğer ekrana Hata oluştu!.. şeklinde bir mesaj yazdırmak için, printf fonksiyonu çağırmak ve fonksiyon içinde, çift tırnaklar arasına, bu iletiyi yazmak yeterli olacaktır. Yani: printf("Hata Oluştu!.."); Çoğu zaman ekrana, programda kullanılan bir değişkenin değeri yazdırılmak istenebilir. Örneğin ekranda bir alt satıra geçerek bir x değişkeninin sayısal değerini ekrana yazdırma işlemini gerçekleştirmek istediğinizi varsayalım. Bu durumda printf() fonksiyonun kullanımı şu şekilde olacaktır: printf("nx in değeri %d dir",x); x=12 için bu işlemin sonucunda ekrana şu ileti çıkacaktır:
  33. 33. BLM 111 Programlama Dilleri I 33 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi x in değeri 12 dir Bu örnekte printf fonsiyonuna iki parametre aktarılmıştır. Birincisi ekranda gösterilecek ve çift tırnaklar arasına yazılan ifadeler, ikincisi ise ekranda sayısal değeri gösterilmek istenen değişken(x). Ayrıca bir alt satıra geçme işlemi n ile gerçekleştirilmiştir. Daha genel bir ifade ile printf fonksiyonu iki kısımdan oluşur. Şöyle ki: printf("karakter dizisi formatı",değişkenler); Burada, birinci parametre karakter dizisi formatı, değişkenler kısmı ise ikinci parametredir. karakter dizisi formatı üç kısımdan oluşmaktadır:  Düz metin(literal string): yazdırılmak istenen ileti.  Konrol karakterleri(escape squence): değişkenlerin ve sabitlerin nasıl yazılacağını belirtmek ve imlecin alt satıra geçirilmesi gibi bazı basit işlemlerin gerçekleştirilmesi için kullanılır. Bu karakterler Tablo 5.1 de listelenmiştir.  Tip belirleyici(conversion specifier): % işaretinden oluşur(%d gibi). Ekrana yazdırılmak istenen değişkenin tipi, % işaretinden sonra belirtilir (Bkz. Tablo 5.2 ). Yani % işaretinin hemen ardına yazılan bir veya bir kaç karakter, ilgili değişken ve sabitin nasıl yazılacağını düzenleme bilgisidir. Karakter Anlamı a Ses üretir(alert) b imleci bir sola kaydır(backspace) f Sayfa atla. Bir sonraki sayfanın başına geç(formfeed) n Bir alt satıra geç(newline) r Satır başı yap(carriage return) t Yatay TAB(Horizontal TAB) v Dikey TAB(vertical TAB) " Çift tırnak karakterini ekrana yaz ' Tek tırnak karakterini ekrana yaz karakterini ekrana yaz %% % karakterini ekrana yaz Tablo 1.1. Kontrol karakterleri Tip Karakteri Anlamı Tip %c tek bir karakter char %d işaretli ondalık tamsayı int, short %ld uzun işaretli ondalık tamsayı long
  34. 34. BLM 111 Programlama Dilleri I 34 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi %u işaretsiz ondalık tamsayı unsigned int, unsigned short %f Gerçel sayı float, double %s karakter dizisi (string) char %lu işaretsiz uzun tamsayı unsigned long Tablo 1.2. Tip karakterleri Tip karakterlerini kullanarak, not=12, pi=3.14 ve kr='A' değişkenleri printf() fonksiyonu ile ekrana yazdırılmak istensin. Bunun için: ... int not=12; float pi=3.14; char kr='A'; ... printf("Not=%d , pi=%f ve kr=%c dir",not,pi,kr); ... printf() fonksiyonu ile yazdırabilecek ifadeler için bir sınır yoktur. parametreler herhangi bir C deyimi olabilir. Örneğin x ve nin toplamı söyle yazılabilir: z = x + y; printf("%d",z); Bu ifade şu şekilde de yazılabilir: z = x + y; printf("%d",x+y); printf fonksiyonu kullanımı aşağıdaki programda verilmiştir. 1: /* sayısal değerleri ekrana yazdırmak için printf fonksiyonunun kullanımı */ 2: #include <stdio.h> 3: 4: /* global değişken tanımlamaları */ 5: int a = 2, b = 10, c = 50; 6: float f = 1.05, g = 25.5, h = -0.1 ,yuzde; 7: 8: main() 9: { 10: printf("nTAB kullanılmadan yazılan tamsayılar : %d %d %d", a, b, c); 11: printf("nTAB kullanılarak yazılan tamsayılar : t%d t%d t%d", a, b, c); 12: 13: printf("nÜç reel sayının tek satırda yazılması : %ft%ft%f", f, g, h); 14: printf("nÜç reel sayının üç satırda yazılması: n nt%fnt%fnt%f", f, g, h); 15: 16: yuzde = (25/220)*100.0; 17: printf("n220 ün %%25 i %f dir", yuzde); 18: printf("n%f/%f işleminin sonucu = %fn", g, f, g / f); 19: 20: printf("n program sonunda beep sesi çıkar...a"); 21:
  35. 35. BLM 111 Programlama Dilleri I 35 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 22: return 0; 23: } TAB kullanılmadan yazılan tamsayılar : 2 10 50 TAB kullanılarak yazılan tamsayılar : 2 10 50 Üç reel sayının tek satırda yazılması : 1.050000 25.500000 -0.100000 Üç reel sayının üç satırda yazılması: 1.050000 25.500000 -0.100000 220 nin %25 i 11.363636 dir 25.500000/1.050000 işleminin sonucu = 24.285715 program sonunda beep sesi çıkar... Program, printf() fonksiyonu ile değişkenlerin ekrana nasıl yazıldığını ve kontrol karakterlerinin kullanımını göstermektedir. 5. ve 6. satırda değişkenler global olarak bildirilmiştir. 10. ve 11. satırlarda üç tamsayının ekrana sırasıyla yanyana TAB’lı(t) TAB’sız olarak yazdırılmıştır. 13. ve 14. satırlarda ise üç reel sayının yan yana ve alt alta kullanımı gösterilmiştir. 17. satırda yüzde değişkenine atanan değerin nasıl yazılacağı görülmektedir. 18. satırda g/f oranının başka bir değişkene aktarılmadan da yazdırılabileceğine dair bir örnektir. Program sonlanmadan önce beep sesinin duyulmasını 20. satırdaki a kontrol karakteri sağlamıştır. Bazen bir reel sayı ekrana sadece üç basmak hassasiyetle yazdırılmak istenebilir. Bunun için %f tip karakterinden önce hassasiyet(virgülden öce ve sonra) yazılır. Şöyle ki: float x = 12.123548; printf("%f in üç basamak hassasiyetli hali %5.3f dür.",x,x); 12.123548 in üç basamak hassasiyetli hali 12.124 dür. puts() Fonksiyonu #include <stdio.h> puts( katar ); katar olarak belirtilen karakter topluluğunu ekrana yazdıktan sonra, imleci alt satıra geçirir. Örneğin: puts("puts() fonksiyonunun gösterimi!"); şekinde kullanılırsa çıkış şöyle olacaktır. puts() fonksiyonunun gösterimi! puts() fonksiyonu Tablo 2.7 de verilen kontrol karakterleri ile kullanılabilir. puts("Bu birinci satır...nBu ikinci satır..."); Bu birinci satır...
  36. 36. BLM 111 Programlama Dilleri I 36 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Bu ikinci satır... scanf() Fonksiyonu Birçok programda ekrana verilerin yazılmasının yanı sıra klavyeden veri okunması gerekebilir. scanf() fonksiyonu bu amaçla kullanılan fonksiyondur. printf() gibi scanf() fonksiyonuda Tablo 5.1 ve Tablo 5.2 de verilen karakterleri kullanır. Örneğin klavyeden bir x tamsayısı scanf("&d",&x); satırını yazmak yeterli olacaktır. burada & işareti adres operatörü olarak adlandırılır. Klavyeden iki farklı sayı okunmak istendiğinde scanf() fonksiyonu şöyle kullanılır: scanf("%d %f",&x,&y); veriler 16 1.568 yada 16 1.568 veya 16 1.568 şekilinde okunabilir. Aşağıdaki programda scanf() fonksiyonunun kullanımı gösterilmiştir. 1: /* scanf() fonksiyonu ile int, char ve float tipindeki verilerin okunması */ 2: #include <stdio.h> 3: 4: main() 5: { 6: int x; 8: float y; 9: char kr; 10: 11: printf("Bir tamsayı girin :"); 12: scanf("%d",&x); 13: printf("Bir karakter girin :"); 14: scanf("%c",&kr); 15: printf("Bir reel sayı girin :"); 16: scanf("%f",&y); 17: 18: printf("tamsayı :%dnkarakter :%cnreel sayı :%f olarak girdin."); 19: 20: return 0; 21: }
  37. 37. BLM 111 Programlama Dilleri I 37 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi gets() Fonksiyonu Klavyeden bir karakter topluluğu, katar, okumak için kullanılır. Okuma işlemi yeni satır karakteriyle karşılaşılıncaya kadar sürer. puts()-gets() arsındaki ilişki, printf()- scanf() arasındaki gibidir. puts() ile ekrana bir katar yazdırılırken, gets() ile okunur. Örneğin: ... char ktr[10]; puts("Bir şeyler yazın:"); gets(ktr); ... Yukarıdaki program parçası, klavyeden girilen karakterlerin, gets() fonksiyonu ile ktr katarına aktarmak için kullanılır. ktr[10] şeklindeki kullanım girilen katarın içerisinden ilk 10 karakteri değerlendir manasındadır. getchar() Fonksiyonu Standart girişten bir karakter okur. Programı istenen bir yerde durdurup, bir karakter girinceye kadar bekletir.Örneğin: ... for(i=0;i<10;i++) { getchar(); printf("%dn",i); } ... Yukarıdaki program parçası 0-9 arası sayıları sırasıyla ekranda göstermek için kullanılır. Fakat her rakamı yazdırılmadan önce klavyeden herhangi bir karakter girip ENTER tuşuna basılması beklenir. Bu beklemegetchar() fonksiyonu ile gerçekleştirilir. Temel Kontrol Yapıları C dilinde if, switch ve ? olmak üzere üç tip karşılaştırma işlemi yapılır. Ancak ? bir operatördür. if karşılaştırma deyimi ile, diğer programlarda olduğu gibi if- else yapısı kurulabilir. switch deyimi, bir değişkenin içeriğine göre program akışını yönlendirme işlemini yapar. if, if-else Yapısı Bu deyimler koşullu işlem yapma deyimidir. if ve else tek bir karşılaştırma deyimi olup else kullanımı isteğe bağlıdır. Eğer bu koşul olumlu ise if den sonraki bölüm
  38. 38. BLM 111 Programlama Dilleri I 38 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi yürütülür ve else den sonraki bölüm atlanır. Koşul olumsuz ise if den sonraki küme atlanır ve eğer varsa, else den sonraki kümedeki işlemler gerçekleştirilir. if(koşul) { ... deyimler; (küme) ... } Program 1.1.’de basit olarak if deyiminin kullanımı gösterilmiştir. Programda bu deyim kullanılırken kümenin başngıcı ce bitişini gösteren, küme parantezleri kullanılmamıştır. Eğer if deyiminden sonra icra edilecek deyimler tek satırdan oluşuyorsa, bu işaretlerin kullanılmasına gerek yoktur. Yada if deyimden sonra { ve } işaretleri kullanılmamışsa, bu deyimi takip eden sadece ilk satır işleme konur. Program 1.1. If deyiminin kullanımı 1: /* if deyiminin kullanımı */ 2: 3: #include <stdio.h> 4: 5: int x, y; 6: 7: main() 8: { 9: /* test etmek için iki değer girin */ 10: 11: printf("nBir tamsayı değeri girin, x: "); 12: scanf("%d", &x); 13: printf("nBir tamsayı değeri girin, y: "); 14: scanf("%d", &y); 15: 16: /* değerleri karşılaştır ve sonucu ekrena yaz */ 17: 18: if (x == y) 19: printf("x, y ye eşitn"); 20: 21: if (x > y) 22: printf("x, y den büyükn"); 23: 24: if (x < y) 25: printf("x, y den küçükn"); 26: 27: return 0; 28: } Bir tamsayı değeri girin, x: 100 Bir tamsayı değeri girin, y: 10 x, y den büyük Bir tamsayı değeri girin, x: 10 Bir tamsayı değeri girin, y: 100 x, y den küçük Bir tamsayı değeri girin, x: 10 Bir tamsayı değeri girin, y: 10 x, y ye eşit 5. satırında global olarak bildirilen x ve y tamsayı değişkenleri, 12 ve 14. satırlarda scanf fonksiyonu ile klavyeden okutulmuştur. 18, 21 ve 24. satırlarda kullanılan if deyimlerindeki koşul ifadeleri ile x, y sayıları karşılaştırılmış ve sonuç ekrana uygun bir biçimde gösterilmiştir. if deyiminin else ile birlikte kullanımı şu şekildedir:
  39. 39. BLM 111 Programlama Dilleri I 39 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi if(koşul) { ... deyimler;(küme1) ... } else { ... deyimler;(küme2) ... } Program 1.2 if-else yapısı irdelenmiştir. Bu program dijital elektronikte kullanılan VEYA mantık kapısının bir similasyonudur. İki girişli VEYA kapısının davranışı; eğer girişlerin her ikisi de 0 ise çıkış 0, aksi takdirde sonuç 1 olacak şeklindedir. VEYA kapısının görevini veya_kapisi(x,y) fonksiyonu üslenmiştir. Burada x ve y giriş değişkenleridir. Fonksiyonun geri dönüş değeri iki tanedir. Çünkü kapının çıkışı, girişlerdeki dijital seviyelere bağlı olarak, iki durumludur, (1-0). Progam 1.2. If-else yapısı 1: /* Dijital VEYA kapısı simulasyonu */ 2: 3: #include <stdio.h> 4: 5: int veya_kapisi( int x,int y ); 6: 7: int x,y,z; 8: 9: main() 10: { 11: x = 1; /* mantıksal 1 */ 12: y = 0; /* mantıksal 0 */ 13: 14: z = veya_kapisi(x,y); /* VEYA işlemi yapılıyor... */ 15: 16: printf("%d ve %d nin VEYA işlemi : %d dirn",x,y,z); 17: 18: return 0; 20: } 21: 22: int veya_kapisi(x,y) 23: { 24: if( x==0 && y==0 ) return 0; 25: else return 1; 26: } 11. ve 12. satırlarda tamsayı olarak tanımlanan x ve y değişkenlerine sırasıyla 1 ve 0 değerleri atanmıştır. z değişkenine ise veya_kapisi(x,y) fonksiyonun geri dönüş değeri atanmıştır. 24. satırda, VE operatörü ile iki farklı durum tek koşul yapısında birleştirilmiştir. Bu şekilde bütün mantık kapıları tanımlanırsa, bir çok dijital elektronik devryi tasarlamak mümkün olur. Eğer program içinde kullanılacak koşulların sayısı 2 den çok ise şu yapı kullanılır: if(koşul) { ... deyimler;(küme1) ...
  40. 40. BLM 111 Programlama Dilleri I 40 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi } else if { ... deyimler;(küme2) ... } else if { ... deyimler;(küme3) ... } . . . else { ... deyimler;(kümeN) ... } Program 1.3 , ikinci dereceden bir polinomun köklerini hesaplamaktadır. Programda delta değerinin 0 dan küçük olması durumda köklerin karmaşık sayıya dönüşeceğide göz önüne alınmıştır. Bu program if, else if veelse yapısı göstermek için oldukça iyi bir örnektir. Program 1.3. İkinci dereceden polinomun köklerini hesaplayan program 1: /* Diskirminant hesabı. 2: ** ax^2 + bx + c = 0 denkleminin, 3: ** karmaşık sayılı kökler dahil, çözümü. 4: */ 5: #include <stdio.h> 6: #include <math.h> /* sqrt için */ 7: 8: float a,b,c,delta,x1,x2,x,kok_delta; 9: main() 10: { 11: printf("a, b, c değerlerini girin:n"); 12: scanf("%f %f %f",&a,&b,&c); 13: 14: delta = b*b - 4*a*c; 15: 16: if( delta > 0.0 ) 17: { 18: x1 = ( -b + sqrt(delta) )/( 2*a ); 19: x2 = ( -b - sqrt(delta) )/( 2*a ); 20: 21: printf("nReel kökler :"); 22: printf("nx1 = %f ve x2 = %f",x1,x2); 23: } 24: 25: else if( delta < 0.0 ) 26: { 27: kok_delta = ( sqrt(-delta) ) / (2*a);
  41. 41. BLM 111 Programlama Dilleri I 41 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 28: x = -0.5*b/a; 29: 30: printf("nKarmaşık kökler :"); 31: printf("nx1 = %f + %fi ve x2 = %f - %fi",x,kok_delta,x,kok_delta); 32: } 33: 34: else 35: { 36: x = -0.5*b/a; 37: 38: printf("nKökler eşit :"); 39: printf("nx1 = x2 = %f",x); 40: } 41: 42: return 0; 43: } a, b, c değerlerini girin: 2. 3.5 -4.89 Reel kökler : x1 = 0.916822 ve x2 = -2.666822 a, b, c değerlerini girin: 4. 4. 1. Kökler eşit : x1 = x2 = -0.500000 a, b, c değerlerini girin: 1. 1. 1. Karmaşık kökler : x1 = -0.500000 + 0.866025i ve x2 = -0.500000 - 0.866025i 12. satırda denklemin reel katsayıları a, b ve c klavyeden okunmaktadır. Daha sonra delta değerinin üç farklı durumu için elde edilecek kökler hesaplanır. 25. satırdaki delta değerinin 0 dan küçük olduğu durum, reel olmayan kökleri hesaplamak için kullanılır. switch - case Yapısı Bu deyim bir değişkenin içeriğine bakarak, programın akışını bir çok seçenekten birine yönlendiren bir deyimdir. case(durum) deyiminden sonra değişkenin durumu yazılır ve akabinde gelen satır işlenir. Bütün durumların aksi söz konu olduğunda gerçekleştirilmesi istenen deyimler default deyiminden sonraki kısımda bildirilir. Genel yazım biçimi; switch(degisken) { case sabit1: ... deyimler; ... case sabit2: ... deyimler; ...
  42. 42. BLM 111 Programlama Dilleri I 42 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi . . . case sabitN : ... deyimler; ... default: ... varsayılan_deyimler; ... } Program 1.4. switch fonksiyonun basit bir kullanımı. 1: /* switch - case yapısının kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: char kr; 7: 8: printf("Lütfen bir karakter girinn"); 9: kr = getchar(); /* tek bir karakterin okunması */ 10: 11: switch (kr){ 12: case 'a': 13: printf("a harfine bastınızn"); 14: case 'b': 15: printf("b harfine bastınızn"); 16: default: 17: printf("a veya b ye basmadınızn"); 18: } 19: return 0; 20: } Lütfen bir karakter girin c a veya b ye basmadınız Lütfen bir karakter girin a a harfine bastınız b harfine bastınız a veya b ye basmadınız Lütfen bir karakter girin b b harfine bastınız a veya b ye basmadınız Program 1.4’de klavyeden okunan tek bir karakter değişkenin içeriğine bakılıp uygun dallanmalar yaptırılmıştır. 9. satırda değişken getchar() fonksiyonu ile okutulmuştur. Eğer a veya b karakterlerinden biri girilirse, ekrana bu harflerin girildiğine dair mesaj yazılacak, aksi takdirde bu karakterin dışında bir karakterin giriş olarak kullanıldığı gösteren bir mesaj yazılacaktır. Örneğin c karakteri klavyeden girilmiş ise a veya b ye basmadınızgibi. Fakat a karakterleri girildiğinde ekrana her üç durumda yazdırılmaktadır. Bunun sebebi, case 'a': durumunda sırasıyla 13, 15 ve 17. satırların işleme konmasıdır. Bunu engellemek için 13. satırdan sonra programın başka bir yere yönlendirilmesi gerekir. Bu yönlendirme bir sonraki derste anlatılacak
  43. 43. BLM 111 Programlama Dilleri I 43 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi olan break deyimi ile yapılır. break bir işlemin sona erdirilmesi için kullanılan bir deyimdir. Program 1.4’de verilen programda case 'a': durumu için 13, 15 ve 17. satırlar da işleme konumuştu. Eğer klavyeden a değişkeni girip ekrana sadece a harfine bastınız iletisi yazdırılmak isteniyorsa, 13. satıra break deyimi ilave edilmelidir. break deyiminin kullanımı aşağıda verilmiştir. Program 1.5. break deyiminin kullanımı 1: /* switch - case yapısı ve break kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: char kr; 7: 8: printf("Lütfen bir karakter girinn"); 9: kr = getchar(); /* tek bir karakterin okunması */ 10: 11: switch (kr){ 12: case 'a': 13: printf("a harfine bastınızn");break; 14: case 'b': 15: printf("b harfine bastınızn");break; 16: default: 17: printf("a veya b ye basmadınızn");break; 18: } 19: return 0; 20: } Lütfen bir karakter girin a a harfine basırınız Program 1.5 in Program 1.4 ten farkı 13, 15 ve 17. satırların sonuna break deyimlerinin konmuş olmasıdır. Derleyici bu deyim ile karşılaştığında, bulunduğu yapının içinden koşulsuz olarak ayrılır ve takip eden işleme başlar. Program 1.5 te break ile switch - case yapısı terkedilmiştir. Program 1.6 switch-case yapısın fonksiyonlarla kullanımı ile ilgili önemli bir örnektir. Programda, menü puts fonksiyonları kullanılarak ekrana yazdırılmış ve arkasından bir karakter okunarak, menüden hangisinin seçildiği kr değişkenine aktarılmıştır; switch- case yapısı ile uygun olan fonksiyonlara dallandırılmıştır. Program 1.6. switch-case yapısının fonksiyonlarla kullanımı 1: /* switch-case yapısının fonksiyonlarla kullanımı */ 2: 3: #include <stdio.h> 4:
  44. 44. BLM 111 Programlama Dilleri I 44 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 5: char menu(void); 6: int topla( int a,int b ); 7: int carp( int a,int b ); 8: 9: main() 10: { 11: char oku; 12: int x,y,sonuc; 13: 14: x = 10; /* x e bir değer atanıyor */ 15: y = 20; /* y e bir değer atanıyor */ 15: 16: oku = menu(); 17: switch( oku ) 18: { 19: case '1': 20: sonuc = topla(x,y); 21: printf("Toplamları : %d",sonuc); 22: break; 23: case '2': 24: sonuc = carp(x,y); 25: printf("Çarpımları : %d",sonuc); 26: break; 27: case '3': 28: printf("Program sonu..."); 29: exit(); 30: } 31: } 32: 33: /* menu fonksiyonu */ 34: char menu(void) 35: { 36: char kr; 37: puts("[1]. Toplama"); 38: puts("[2]. Carpma"); 39: puts("[3]. Çıkış"); 40: puts("Seçiminiz ?"); 41: 42: kr = getchar(); 43: return kr; 44: } 45: 46: /* topla fonksiyonu */ 47: int topla( int a,int b ) 48: { 49: return (a+b); 50: } 51: 52: /* carp fonksiyonu */ 53: int carp( int a,int b ) 54: { 55: return (a*b); 56: } [1]. Toplama [2]. Çarpma [3]. Çıkış Seçiminiz ? 1 Toplamları : 30
  45. 45. BLM 111 Programlama Dilleri I 45 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Program 1.6 da 14. ve 15. satırlarda tanımlanan x ve y tamsayılarına başlangıç değerleri atanmıştır (x ve y scanf fonksiyonu ile klavyeden okutulabilirdi). oku karakter değişkenine menu fonksiyonunun geri dönüş değeri (kr) atanmış ve switch fonksiyonuna 17. satırda parametre olarak aktarılmıştır. 19. satırdaki durum gerçekleştiğinde x ve y sayılarının toplamları topla fonksiyonu ile sonuc değişkenine aktarılmıştır. Bu değişkenin içeriği 21. satırda ekrana yazılmıştır. 22. satırdaki break deyimi ile switch-case yapısı terkedilmiştir. Yani switch deyiminden sonraki satır (main fonksiyonuna ait } işareti) işleme konuştur. Program sonlanmıştır. Aynı şeyler 23. satırdaki durum içinde geçerlidir. 27. satırdaki durum gerçekleştiğinde ekrana Program sonu... ifadesi yazılır ve exit() fonksiyonu ile şartsız olarak program sonlandırılır. ? Karşılaştırma Operatörü C dilinde if-else karşılaştırma deyiminin yaptığı işi sınırlı olarak yapan bir operatördür. Genel yazım biçimi: (koşul) ? deyim1 : deyim2; İlk önce koşul sınanır. Eğer koşul olumluysa (1 ise) deyim1 aksi takdirde deyim2 değerlendirilir. deyim1 ve deyim2 de atama işlemi yapılamaz. Ancak koşul deyiminde atama işlemi yapılabilir. deyim1 ve deyim2 yerine fonksiyon da kullanılabilir. Aşağıda bu deyimin kullanımına ait örnekler verilmiştir. x = ( a > b ) ? a : b; Yukarıdaki ifadede koşul a'nın b'den büyük olmasıdır. Eğer olumluysa x adlı değişkene a, değilse b değeri atanır. Bu şekilde kullanım if-else yapısı ile kurulmak istenirse: if( a > b ) x = a; else x = b; şeklinde olacaktır. Program 1.7. ? - if-else yapısının kullanımı 1: /* ? ve if-else yapısının kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: int x,y,z; 7: 8: printf("x : ");scanf("%d",&x); /* x okunuyor */ 9: printf("y : ");scanf("%d",&y); /* y okunuyor */ 10:
  46. 46. BLM 111 Programlama Dilleri I 46 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 11: if( x ) /* x 0 dan farklı mı? */ 12: z = ( y > x ) ? x*y : x+y; /* y>x ise z=x*y, değilse z=x/y */ 13: else 14: z = 0; 15: 16: printf("z = %d",z); 17: 18: return 0; 19: } x : 0 y : 6 z = 0 x : 5 y : 9 z = 45 x : 8 y : 2 z = 10 Program 1.7 nin 6. satırda tamsayı olarak tanımlanan x,y,z değişkenleri 8. ve 9. satırlarda okutulmuştur. 11. satırdaki if deyimindeki koşul biraz farklıdır. Genel olarak koşul bu şekilde bildirilirse, koşulun 0 dan farklı olup olmadığı sınanır. Yani if( x ) ile if( x!=0 ) aynı anlamdadır. Bu kullanım çok yagındır. Eğer x 0 dan farklı ise koşul olumlu olarak değerlendirilecektir. 12. satırda ? ile bir sınama yapılmaktadır. Eğer y, x den büyük ise z değişkenine x*y, aksi takdirde x+y değeri atanmaktadır. Eğer x=0 ise 14. satırda z değişkenine 0 değeri atanmaktadır. if ve else deyimlerinden sonra { ve } karakterlerinin kullanılmadığına dikkat edin. Eğer bu şekilde kullanılırsa, bu deyimlerden sonra gelen ilk satır işleme konur. 11. satırdaki koşul doğru ise 12. satır, aksi takdirde 14. satır işleme konur. Döngüler Bu tip deyimler bir kümenin belli bir koşul altında yinelenmesi için kullanılır. while, do...while ve for olmak üzere üç tip döngü deyimi vardır. C de diğer programlama dillerinde olduğu gibi, bu deyimlerle istenildiği kadar iç-içe döngü yapısı kullanılabilir. while Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması çevrim başında yapılır. Koşul olumlu olduğu sürece çevrim yinelenir. İki veya daha çok koşul mantıksal operatörler birleştirilerek verilebilir. Bu deyimin kullanımı Program 1.8 de gösterilmiştir. Genel yazım biçimi:
  47. 47. BLM 111 Programlama Dilleri I 47 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi while(koşul) { ... döngüdeki deyimler; [küme] ... } Program 1.8. while döngüsünün kullanımı 1: /* while kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: 7: int x=0; 8: 9: while(x <= 10) 10: printf("%dn",x++); 11: 12: return 0; 14: } 0 1 2 3 4 5 6 7 8 9 10 Program 1.8 in amacı, 0-10 arasındaki sayıları ekrana yazdırmaktır. 9. satırdaki while ifadesinden sonra { işareti kullanılmamıştır. Bu durumda, sadece takip eden satır (10. satır) döngü nün içine dahil edilir. do ... while Bu deyim while dan farkı, koşulun döngü sonunda sınanmasıdır. Yani koşul sınanmadan çevrime girilir ve döngü kümesi en az bir kez yürütülür. Koşul olumsuz ise döngüden sonraki satıra geçilir. Bu deyimin kullanımı Program 1.9 da gösterilmiştir. Genel yazım biçimi: do { ... döngüdeki deyimler; ... }while(koşul); Program 1.9. do-while döngüsünün kullanımı
  48. 48. BLM 111 Programlama Dilleri I 48 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 1: /* do-while kullanımı */ 2: #include <stdio.h> 3: 4: main() 5: { 6: int sayi; 7: 8: do 9: { 10: printf("Bir sayı girin : "); 11: scanf("%d",&sayi); 12: printf("Bu sayının iki katı : %dn",2*sayi); 13: 14: }while( sayi>0 ); /* koşul */ 15: 16: puts("Çevrim sona erdi."); 17: 18: return 0; 19: } Bir sayı girin : 2 Bu sayının iki katı : 4 Bir sayı girin : 5 Bu sayının iki katı : 10 Bir sayı girin : 9 Bu sayının iki katı : 18 Bir sayı girin : 0 Bu sayının iki katı : 0 Çevrim sona erdi. 14. satırdaki koşul olumlu olduğu sürece (klavyeden girilen sayi > 0 olduğu sürece), klavyeden yeni bir değer 11. satırda okunur. Aksi takdirde sayi <=0 ise çevrimin sona erdiğine dair mesaj 16. satırdaki puts fonksiyonu ile verilir. for Diğer döngü deyimleri gibi bir öbeği bir çok kez tekrarlamakta kullanılır. Koşul sınaması while da olduğu gibi döngüye girmeden yapılır. Bu döngü deyimin içinde diğerlerinden farklı olarak başlangıç değeri ve döngü sayacına sahip olmasıdır. Bu deyimin kullanımı Program 1.10 da gösterilmiştir Genel yazım biçimi: for( başlangıç ; koşul ; artım ) { ... döngüdeki deyimler; ... } Program 1.10. for döngüsü ile faktoriyel hesabı 1: /* for döngüsünün kullanımı */ 2: #include <stdio.h> 3: 4: long faktoriyel(int n); 5: 6: main()
  49. 49. BLM 111 Programlama Dilleri I 49 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 7: { 8: int x; 9: 10: printf("nFaktoriyeli hesaplanacak sayı girin : "); 11: scanf("%d",&x); 12: 13: if(x<0) 14: printf("Sayı 0 dan hüçük; faktoriyeli hesaplanamaz."); 15: else 16: printf("faktoriyeli : %ld dir",faktoriyel(x)); 17: 18: return 0; 19: } 20: 21: /* n! değerini hesaplar */ 22: long faktoriyel(int n) 23: { 24: long i,fact=1; 25: 26: /* bu döngu ile fact = n! = 1*2*3*...*n değeri hesaplanır */ 27: for(i=1;i<=n;i++) 28: { 29: fact *= i; 30: } 31: 32: return fact; /* geri dönüş değeri long tipinde */ 33: } Faktoriyeli hesaplanacak sayı girin : 3 faktoriyeli : 6 dir Faktoriyeli hesaplanacak sayı girin : 10 faktoriyeli : 3628800 dir Faktoriyeli hesaplanacak sayı girin : 0 faktoriyeli : 1 dir Faktoriyeli hesaplanacak sayı girin : -4 Sayı 0 dan hüçük; faktoriyeli hesaplanamaz. 11. satırda okunan x tamsayısının faktoriyeli 16. satırda ekrana yazdırılır. Eğer x < 0 ise 14. satırdaki mesaj ekrana çıkar. faktoriyel() fonksiyonu kendisine parametre olarak gelen değişkenin, facktoriyelini 27. satırdaki for döngüsünü kullanarak hesaplar. Fonksiyonun geri dönüş değeri long tipinde tanımlanmıştır. Çünkü faktoriyel değeri 2 bayt tan büyük bir tamsayı olabilir. Bir programda birden çok döngü yapısı iç içe kullanılabilir. İç içe döngülerin kullanımı Program 1.11 de gösterilmiştir. Program 1.11. iç-içe for döngülerinin kullanılması 1: /* iç-içe for döngüleri */ 2: 3: #include <stdio.h> 4: 5: void kutu_ciz( int, int); 6: 7: main() 8: { 9: kutu_ciz( 8, 35 );
  50. 50. BLM 111 Programlama Dilleri I 50 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 10: 11: return 0; 12: } 13: 14: void kutu_ciz( int satir, int sutun ) 15: { 16: int sut; 17: for ( ; satir > 0; satir--) 18: { 19: for (sut = sutun; sut > 0; sut--) 20: printf("X"); 21: 22: printf("n"); 23: } 24: } XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Program 1.11 de sadece 20. satır defalarca işleme konur. Program çalıştırıldığında 8*35=280 adet X, ekrana bastırılır. 5. satırda kutu_ciz() fonksiyonunun prototipi tanımlanmıştır. Bu fonksiyonun parametreleri (satir, sutun) ile çizilecek olan kutunun ebatları belirlenir. 8 satır ve 35 sütun için main() fonsiyonundan 9. satırda çağırılmıştır. 17. satırda ilk for döngüsü çevrime başlar. Fakat bir başalangıç değeri belirtilmemiştir, çünkü bu değer(satir) fonksiyondan buraya aktarılır. 19. satırda ikinci for döngüsü çevrime başlar ve 20. satır bu döngünün içinde değerlendirilir. Yani satir'in herbir değeri için, bütün sutun değerleri tekrarlanır. İkinci döngü tamamlandığında 22. satırda alt satıra geçilir ve birinci çevrim yeni bir değer için yinelenir. printf() fonksiyonu ile desimal(taban-10) syılarıların nasıl yazdırılacağı bundan önceki kısımlarda gösterilmişti. Program 1.12 de Hexadesimal(taban-16) sayıların bu fonksiyon kullanılarak yazdırılması gösterilmiştir. Program 1.12. Desimal ve heksadecimal sayıların bastırılması 1: /* 0-15 desimal sayıların, hexadesimal sayı sistemine çevrilmesi. 2: ** %d -> desimal , 10 tabanındaki sayı 3: ** %x -> hexadesimal (küçük_harf), 16 tabanındaki sayı 4: ** %X -> hexadesimal (büyük_harf), 16 tabanındaki sayı 5: */ 6: #include <stdio.h> 7: 8:: main() 9: { 10: int i; 11: 12: printf("Hex(büyük harf) Hex(küçük harf) Desimaln"); 13: for (i=0; i<16; i++){ 14: printf("%X %x %dn", i, i, i); 15: }
  51. 51. BLM 111 Programlama Dilleri I 51 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi 16: return 0; 17: } Hex(büyük harf) Hex(küçük harf) Desimal 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 A a 10 B b 11 C c 12 D d 13 E e 14 F f 15 Sonsuz Döngü Bir döngü işlemini sonsuz kere tekrarlarsa bu döngü sonzuz döngü olarak adlandırılır. Böyle bir döngü için, koşul çok önemlidir. Örneğin while döngüsü için: ... while(1) { printf("Sonsuz döngü içindeyim...n"); } ... yada ... while(7>3) { printf("Sonsuz döngü içindeyim...n"); } Her iki durumda da çevrimler, sonsuz döngü durumundadır. Çünkü while(1) ve while(7>3) deki ifadelerde, koşul hep olumludur. Bu, durumda çevrim sonsuz döngüye girer. for döngüsünde, başlangıç, koşul ve artım parametrelerinden herhangi birini kullanmak isteğe bağlıdır. Her hangi biri verilmediğinde döngünün nasıl davranacağı iyi yorumlanmalıdır. Örneğin for döngüsünün hiçbir parametresi verilmezse, döngü sonsuz çevrime girer. Yani: for(;;) printf("Sonsuz döngü içindeyim...n"); gibi.
  52. 52. BLM 111 Programlama Dilleri I 52 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Break Bir C programında, bir işlem gerçekleştirilirken, işlemin sona erdirilmesi bu deyim ile yapılır. Örneğin, döngü deyimleri içindekiler yürütülürken, çevrimin, koşuldan bağımsız kesin olarak sonlanması gerektiğinde bu deyim kullanılır. Örneğin: ... do{ scanf("%d",&x); if(x==0) break; printf("%d",x); }while(1); ... yukarıdaki program parçasında, do ... while döngüsünün koşu hep olumludur. Bu durumda döngü sonnsuzdur. Fakat döngü içinde if deyimindeki koşul gerçekleşirse, dögü koşuluna bakılmaksızın döngü terkedilir. bu işlemi sağlayan break deyimidir. Continue Bir döngü içerisinde continue deyimi ile karşılaşılırsa, ondan sonra gelen deyimler atlanır. Yani döngü, bir sonraki çevrime girer. Örneğin: ... for(x=-50;i<=50;x++){ if(x<0) continue; /* x<0 ise alttaki satırı atla */ printf("%f",sqrt(x)); } ... Program parçasının çıktısı: 0.000000 1.000000 1.414213 1.732050 . . . 7.071067 Fonksiyon ve Yordamlar C gibi prosedürel dillerin önemli konularından birisi fonksiyonlardır. Java veya C# gibi dillerde metot (method) ismini alırlar. Adı n'olursa olsun, görevi aynıdır. Bir işlemi birden çok yaptığınızı düşünün. Her seferinde aynı işlemi yapan kodu yazmak oldukça zahmetli olurdu. Fonksiyonlar, bu soruna yönelik yaratılmıştır. Sadece bir kereye mahsus yapılacak işlem tanımlanır. Ardından dilediğiniz kadar, bu fonksiyonu çağırırsınız. Üstelik fonksiyonların yararı bununla da sınırlı değildir.
  53. 53. BLM 111 Programlama Dilleri I 53 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Fonksiyonlar, modülerlik sağlar. Sayının asallığını test eden bir fonksiyon yazıp, bunun yanlış olduğunu farkederseniz, bütün programı değiştirmeniz gerekmez. Yanlış fonksiyonu düzeltirsiniz ve artık programınız doğru çalışacaktır. Üstelik yazdığınız fonksiyonlara ait kodu, başka programlara taşımanız oldukça basittir. Fonksiyonlar, çalışmayı kolaylaştırır. Diskten veri okuyup, işleyen; ardından kullanıcıya gösterilmek üzere sonuçları grafik hâline dönüştüren; ve işlem sonucunu diske yazan bir programı baştan aşağı yazarsanız, okuması çok güç olur. Yorum koyarak kodun anlaşılabilirliğini, artırabilirsiniz. Ancak yine de yeterli değildir. İzlenecek en iyi yöntem, programı fonksiyon parçalarına bölmektir. Örneğin, diskten okuma işleminidisten_oku( ) isimli bir fonksiyon yaparken; grafik çizdirme işini grafik_ciz( ) fonksiyonu ve diske yazdırma görevini de diske_yaz( ) fonksiyonu yapabilir. Yarın öbür gün, yazdığınız kodu birileri incelediğinde, sadece ilgilendiği yapıya göz atarak, aradığını çok daha rahat bulabilir. Binlerce satır içinde çalışmaktansa, parçalara ayrılmış bir yapı herkesin işine gelecektir. main( ) Fonksiyonu Şimdiye kadar yazdığımız bütün kodlarda, main( ) şeklinde bir notasyon kullandık. Bu kullandığımız ifade, aslında main( ) fonksiyonudur. C programlama dilinde, bir kodun çalışması main( ) fonksiyonun içersinde olup olmamasına bağlıdır. Bir nevi başlangıç noktası olarak düşünebiliriz. Her programda sadece bir tane main( ) fonksiyonu bulunur. Başka fonksiyonların, kütüphanelerin, kod parçalarının çalıştırılması main( ) içersinde direkt veya dolaylı refere edilmesiyle alakalıdır. main( ) fonksiyonuna dair bilgimizi pekiştirmek için bir program yazalım. Aşağıdaki çizimi inceleyip, C programlama diliyle bunu çizen programı oluşturalım. Ev veya kule benzeri bu şekli aşağıdaki, kod yardımıyla gösterebiliriz:
  54. 54. BLM 111 Programlama Dilleri I 54 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi /* Ev sekli cizen program */ #include<stdio.h> int main( void ) { printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( "----------n" ); printf( "| |n" ); printf( "| |n" ); printf( "| |n" ); printf( "----------n" ); return 0; } Burada blinmesi gereken main( ) fonksiyonunun özel bir yapı olduğudur. Hazırladığımız program, main( ) fonksiyonuyla çalışmaya başlar. main( ) fonksiyonu içersinde yer almayan kodlar çalışmaz. Fonksiyon Oluşturma Kendinize ait fonksiyonlar oluşturabilirsiniz. Oluşturacağınız fonksiyonlar, vereceğiniz işlemi yapmakla görevlidir ve çağrıldıkça tekrar tekrar çalışır. Yukardaki ev örneğine geri dönelim. Her şeyi main( ) içinde, tek bir yerde yazacağımıza, çatıyı çizen ayrı, katı çizen ayrı birer fonksiyon yazsaydık daha rahat olmaz mıydı? Ya da birden çok kat çizmemiz gerekirse, tek tek kat çizmekle uğraşmaktansa, fonksiyon adını çağırmak daha akıllıca değil mi? Bu soruların yanıtı, bizi fonksiyon kullanmaya götürüyor. Şimdi yukarda yazdığımız kodu, iki adet fonksiyon kullanarak yapalım: /* Ev sekli cizen program */ #include<stdio.h> // Evin catisini cizen fonksiyon. void catiyi_ciz( void ) { printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( "----------n" ); }
  55. 55. BLM 111 Programlama Dilleri I 55 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi // Evin katini cizen fonksiyon. void kat_ciz( void ) { printf( "| |n" ); printf( "| |n" ); printf( "| |n" ); printf( "----------n" ); } // Programin calismasini saglayan // ana fonksiyon. int main( void ) { catiyi_ciz( ); kat_ciz( ); return 0; } Yazdığımız bu kod, ilk başta elde ettiğimiz çıktının aynısını verir. Ama önemli bir fark içerir: Bu programla birlikte ilk defa fonksiyon kullanmış olduk! Fonksiyon kullanmanın, aynı şeyleri baştan yazma zahmetinden kurtaracağından bahsetmiştik. Diyelim ki bize birden çok kat gerekiyor. O zaman kat_ciz( ) fonksiyonunu gereken sayıda çağırmamız yeterlidir. /* Ev sekli cizen program */ #include<stdio.h> // Evin catisini cizen fonksiyon. void catiyi_ciz( void ) { printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( " / n" ); printf( "----------n" ); } // Evin katini cizen fonksiyon. void kat_ciz( void ) { printf( "| |n" );
  56. 56. BLM 111 Programlama Dilleri I 56 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi printf( "| |n" ); printf( "| |n" ); printf( "----------n" ); } // Programin calismasini saglayan // ana fonksiyon. int main( void ) { catiyi_ciz( ); // 3 adet kat ciziliyor. kat_ciz( ); kat_ciz( ); kat_ciz( ); return 0; } Yukarda yazılı kod, bir üstekinden pek farklı durmasa bile, bu sefer üç katlı bir evin çıktısını elde etmiş olacaksınız. Yaptığımız örneklerde, kullanılan void ifadesi dikkatinizi çekmiş olabilir. İngilizce bir kelime olan void, boş/geçersiz anlamındadır. C programlama dilinde de buna benzer bir anlam taşır. kat_ciz( ); fonksiyonuna bakalım. Yapacağı iş için herhangi bir değer alması gerekmiyor. Örneğin verilen sayının asallığını test eden bir fonksiyon yazsaydık, bir değişken almamız gerekirdi. Ancak bu örnekte gördüğümüz kat_ciz( ); fonksiyonu, dışardan bir değere gerek duymaz. Eğer bir fonksiyon, çalışmak için dışardan gelecek bir değere ihtiyaç duymuyorsa, fonksiyon adını yazdıktan sonra parantez içini boş bırakabiliriz. Ya da void yazarak, fonksiyonun bir değer almayacağını belirtiriz. ( Sürekli olarak main( ) fonksiyonuna void koymamızın sebebi de bundandır; fonksiyon argüman almaz. ) İkinci yöntem daha uygun olmakla birlikte, birinci yöntemi kullanmanın bir mahsuru yok. Aşağıda bulunan iki fonksiyon aynı şekilde çalışır: // Evin katini cizen fonksiyon. // void var void kat_ciz( void ) { printf( "| |n" ); printf( "| |n" ); printf( "| |n" ); printf( "----------n" ); } // Evin katini cizen fonksiyon. // void yok void kat_ciz( ) { printf( "| |n" ); printf( "| |n" ); printf( "| |n" ); printf( "----------n" ); }
  57. 57. BLM 111 Programlama Dilleri I 57 KBUZEM Karabük Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi void ifadesinin, değer alınmayacağını göstermek için kullanıldığını gördünüz. Bir de fonksiyonun değer döndürme durumu vardır. Yazdığınız fonksiyon yapacağı işlemler sonucunda, çağrıldığı noktaya bir değer gönderebilir. Değer döndürme konusunu, daha sonra işleyeceğiz. Şimdilik değer döndürmeme durumuna bakalım. Yukarda kullanılan fonksiyonlar, geriye bir değer döndürmemektedir. Bir fonksiyonun geriye değer döndürmeyeceğini belirtmek için, void ifadesini fonksiyon adından önce yazarız. Böyleyece geriye bir değer dönmeyeceği belirtilir. Fonksiyonlarla İlgili Diğer Konular (Aritmetik Fonksiyonlar, Bellek Adresleri, Pointer, Referansla Argüman Aktarımı, Rekürsif Fonksiyonlar) Bazı Aritmetik Fonksiyonlar Geçen dersimizde, fonksiyonları ve bunları nasıl kullanılacağını görmüştük. Ayrıca kütüphanelerin hazır fonksiyonlar içerdiğinden bahsetmiştik. Bazı matematiksel işlemlerin kullanımı sıkça gerekebileceği için bunları bir liste hâlinde vermenin uygun olduğuna inanıyorum. Böylece var olan aritmetik fonksiyonları tekrar tekrar tanımlayarak zaman kaybetmezsiniz.  double ceil( double n ) : Virgüllü n sayısını, kendisinden büyük olan ilk tam sayıya tamamlar. Örneğin ceil(51.4) işlemi, 52 sonucunu verir.  double floor( double n ) : Virgüllü n sayısının, virgülden sonrasını atarak, bir tam sayıya çevirir. floor(51.4) işlemi, 51 sayısını döndürür.  double fabs( double n ) : Verilen n sayısının mutlak değerini döndürür. fabs(- 23.5), 23.5 değerini verir.  double fmod( double a, double b ) : a sayısının b sayısına bölümünden kalanı verir. (Daha önce gördüğümüz modül (%) operatörü, sadece tam sayılarda kullanılırken, fmod fonksiyonu virgüllü sayılarda da çalışır.)  double pow( double a, double b ) : Üstel değer hesaplamak için kullanılır; ab değerini verir.  double sqrt( double a ) : a'nın karekökünü hesaplar.

×