SlideShare une entreprise Scribd logo
1  sur  114
Télécharger pour lire hors ligne
Karabük Üniversitesi
BLM111
PROGRAMLAMA DİLLERİ I
Yrd. Doç. Dr. İsmail KURNAZ
ikurnaz@karabuk.edu.tr
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.
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)
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
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
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
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.
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.
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.
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ı
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.
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)
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
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
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.
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.
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.
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.
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
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
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)
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
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ı
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.
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:
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.
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.
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: }
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: }
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;
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
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:
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
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:
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...
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: }
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
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:
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)
...
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);
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;
...
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
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:
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
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:
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:
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ı
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()
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 );
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: }
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.
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.
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:
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" );
}
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" );
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" );
}
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.
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu
Programlama I (C) Ders Notu

Contenu connexe

Tendances

θεματα προσομοιωσης αλγεβρα β λυκειου
θεματα προσομοιωσης   αλγεβρα β λυκειουθεματα προσομοιωσης   αλγεβρα β λυκειου
θεματα προσομοιωσης αλγεβρα β λυκειουΜάκης Χατζόπουλος
 
Eronhii emchiin jishig soril 1
Eronhii emchiin jishig soril 1Eronhii emchiin jishig soril 1
Eronhii emchiin jishig soril 1Gantulga Nyamdorj
 
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjee
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjeeNiigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjee
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjeeGantulga Nyamdorj
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣDimitris Psounis
 
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛ
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛ
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛΡεβέκα Θεοδωροπούλου
 
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmedБямбаа Авирмэд
 
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmedБямбаа Авирмэд
 
2. conception and_implantation
2. conception and_implantation2. conception and_implantation
2. conception and_implantationHishgeeubuns
 

Tendances (20)

θεματα προσομοιωσης αλγεβρα β λυκειου
θεματα προσομοιωσης   αλγεβρα β λυκειουθεματα προσομοιωσης   αλγεβρα β λυκειου
θεματα προσομοιωσης αλγεβρα β λυκειου
 
Medeeguijuuleg sudlal
Medeeguijuuleg sudlalMedeeguijuuleg sudlal
Medeeguijuuleg sudlal
 
Eronhii emchiin jishig soril 1
Eronhii emchiin jishig soril 1Eronhii emchiin jishig soril 1
Eronhii emchiin jishig soril 1
 
Huhed sudlal
Huhed sudlalHuhed sudlal
Huhed sudlal
 
Medeeguijuuleg 1
Medeeguijuuleg 1Medeeguijuuleg 1
Medeeguijuuleg 1
 
Suvilagch
SuvilagchSuvilagch
Suvilagch
 
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjee
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjeeNiigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjee
Niigmiin eruul mend, huuli erh zui,8 emnelgiin mergejiltnii es zuin hem hemjee
 
Khaldvart ovchin sudlal
Khaldvart ovchin sudlalKhaldvart ovchin sudlal
Khaldvart ovchin sudlal
 
Gemtel 1
Gemtel 1Gemtel 1
Gemtel 1
 
Aris sudlal
Aris sudlalAris sudlal
Aris sudlal
 
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣΗ ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
Η ΓΛΩΣΣΑ C++ - ΜΑΘΗΜΑ 2 - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΚΛΑΣΕΙΣ
 
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛ
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛ
ΘΕΜΑΤΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ Γ' ΛΥΚΕΙΟΥ ΕΠΑΛ
 
Emch 16 100
Emch 16 100Emch 16 100
Emch 16 100
 
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Б by byambaa avirmed
 
Tulenhii holdolt1
Tulenhii holdolt1Tulenhii holdolt1
Tulenhii holdolt1
 
Nemm 2019
Nemm  2019Nemm  2019
Nemm 2019
 
Setgetsiin ovchin sudlal
Setgetsiin ovchin sudlalSetgetsiin ovchin sudlal
Setgetsiin ovchin sudlal
 
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed
800.mn - 2012 Биологи ЭЕШ хувилбар Д by byambaa avirmed
 
Ih emch elselt 4
Ih emch elselt 4Ih emch elselt 4
Ih emch elselt 4
 
2. conception and_implantation
2. conception and_implantation2. conception and_implantation
2. conception and_implantation
 

En vedette

Mantık Devreleri
Mantık DevreleriMantık Devreleri
Mantık DevreleriPaylasOgren
 
Insertion sort analysis
Insertion sort analysisInsertion sort analysis
Insertion sort analysisKumar
 
Siralama algoritmalari ileri algoritma analizi
Siralama algoritmalari   ileri algoritma analiziSiralama algoritmalari   ileri algoritma analizi
Siralama algoritmalari ileri algoritma analiziVeysi Ertekin
 
Ayrık yapılar algoritmalar
Ayrık yapılar algoritmalarAyrık yapılar algoritmalar
Ayrık yapılar algoritmalarEmrah Gürcan
 
asymptotic analysis and insertion sort analysis
asymptotic analysis and insertion sort analysisasymptotic analysis and insertion sort analysis
asymptotic analysis and insertion sort analysisAnindita Kundu
 
Lz77 / Lempel-Ziv Algorithm
Lz77 / Lempel-Ziv AlgorithmLz77 / Lempel-Ziv Algorithm
Lz77 / Lempel-Ziv AlgorithmVeysi Ertekin
 
Yzm 2116 - Bölüm 2 (Algoritma Analizi)
Yzm 2116  - Bölüm 2 (Algoritma Analizi)Yzm 2116  - Bölüm 2 (Algoritma Analizi)
Yzm 2116 - Bölüm 2 (Algoritma Analizi)Deniz KILINÇ
 
Temel Düzeyde Visual Studio Eğitimleri
Temel Düzeyde Visual Studio EğitimleriTemel Düzeyde Visual Studio Eğitimleri
Temel Düzeyde Visual Studio EğitimleriUniverist
 

En vedette (9)

Mantık Devreleri
Mantık DevreleriMantık Devreleri
Mantık Devreleri
 
Insertion sort analysis
Insertion sort analysisInsertion sort analysis
Insertion sort analysis
 
Siralama algoritmalari ileri algoritma analizi
Siralama algoritmalari   ileri algoritma analiziSiralama algoritmalari   ileri algoritma analizi
Siralama algoritmalari ileri algoritma analizi
 
Ayrık yapılar algoritmalar
Ayrık yapılar algoritmalarAyrık yapılar algoritmalar
Ayrık yapılar algoritmalar
 
asymptotic analysis and insertion sort analysis
asymptotic analysis and insertion sort analysisasymptotic analysis and insertion sort analysis
asymptotic analysis and insertion sort analysis
 
Lz77 / Lempel-Ziv Algorithm
Lz77 / Lempel-Ziv AlgorithmLz77 / Lempel-Ziv Algorithm
Lz77 / Lempel-Ziv Algorithm
 
Yzm 2116 - Bölüm 2 (Algoritma Analizi)
Yzm 2116  - Bölüm 2 (Algoritma Analizi)Yzm 2116  - Bölüm 2 (Algoritma Analizi)
Yzm 2116 - Bölüm 2 (Algoritma Analizi)
 
Data Structures & Algorithm design using C
Data Structures & Algorithm design using C Data Structures & Algorithm design using C
Data Structures & Algorithm design using C
 
Temel Düzeyde Visual Studio Eğitimleri
Temel Düzeyde Visual Studio EğitimleriTemel Düzeyde Visual Studio Eğitimleri
Temel Düzeyde Visual Studio Eğitimleri
 

Similaire à Programlama I (C) Ders Notu

Temel Bilgisayar ve Günümüz Bilgisayarları ile Assembly
Temel Bilgisayar ve Günümüz Bilgisayarları ile AssemblyTemel Bilgisayar ve Günümüz Bilgisayarları ile Assembly
Temel Bilgisayar ve Günümüz Bilgisayarları ile AssemblyŞahabettin Akca
 
Bilgisayar Mimarisi 01, Feza BUZLUCA
Bilgisayar Mimarisi 01, Feza BUZLUCABilgisayar Mimarisi 01, Feza BUZLUCA
Bilgisayar Mimarisi 01, Feza BUZLUCAFeza BUZLUCA
 
Bilgi teknolojilerinde temel_kavramlar
Bilgi teknolojilerinde temel_kavramlarBilgi teknolojilerinde temel_kavramlar
Bilgi teknolojilerinde temel_kavramlarcosmosonur
 
Bilgisayar Nedir? Tarihi...
Bilgisayar Nedir? Tarihi...Bilgisayar Nedir? Tarihi...
Bilgisayar Nedir? Tarihi...efedincer
 
Bilişim teknolojileri dersnotu
Bilişim teknolojileri dersnotuBilişim teknolojileri dersnotu
Bilişim teknolojileri dersnotugulmer23
 
İşletim Sistemleri (Operating Systems)
İşletim Sistemleri (Operating Systems)İşletim Sistemleri (Operating Systems)
İşletim Sistemleri (Operating Systems)Murat KARA
 
Bilgi Teknolojisi Temel Kavramları
Bilgi Teknolojisi Temel KavramlarıBilgi Teknolojisi Temel Kavramları
Bilgi Teknolojisi Temel KavramlarıNurkapar
 

Similaire à Programlama I (C) Ders Notu (20)

Sunum 13 (1)
Sunum 13 (1)Sunum 13 (1)
Sunum 13 (1)
 
Sunum 13
Sunum 13Sunum 13
Sunum 13
 
Isl sis
Isl sisIsl sis
Isl sis
 
Temel Bilgisayar ve Günümüz Bilgisayarları ile Assembly
Temel Bilgisayar ve Günümüz Bilgisayarları ile AssemblyTemel Bilgisayar ve Günümüz Bilgisayarları ile Assembly
Temel Bilgisayar ve Günümüz Bilgisayarları ile Assembly
 
Bilgisayar Mimarisi 01, Feza BUZLUCA
Bilgisayar Mimarisi 01, Feza BUZLUCABilgisayar Mimarisi 01, Feza BUZLUCA
Bilgisayar Mimarisi 01, Feza BUZLUCA
 
Bilgi teknolojilerinde temel_kavramlar
Bilgi teknolojilerinde temel_kavramlarBilgi teknolojilerinde temel_kavramlar
Bilgi teknolojilerinde temel_kavramlar
 
Bilgisayar Nedir? Tarihi...
Bilgisayar Nedir? Tarihi...Bilgisayar Nedir? Tarihi...
Bilgisayar Nedir? Tarihi...
 
Bilişim teknolojileri dersnotu
Bilişim teknolojileri dersnotuBilişim teknolojileri dersnotu
Bilişim teknolojileri dersnotu
 
Bilgi Teknolojilerine Giriş
Bilgi Teknolojilerine GirişBilgi Teknolojilerine Giriş
Bilgi Teknolojilerine Giriş
 
CEIT 253
CEIT 253CEIT 253
CEIT 253
 
CEIT 253
CEIT 253CEIT 253
CEIT 253
 
CEIT 253
CEIT 253CEIT 253
CEIT 253
 
İşletim Sistemleri (Operating Systems)
İşletim Sistemleri (Operating Systems)İşletim Sistemleri (Operating Systems)
İşletim Sistemleri (Operating Systems)
 
Bilgisayara Giriş 1
Bilgisayara Giriş 1Bilgisayara Giriş 1
Bilgisayara Giriş 1
 
Ağ Temelleri
Ağ TemelleriAğ Temelleri
Ağ Temelleri
 
Donanım Sunusu - 2
Donanım Sunusu - 2Donanım Sunusu - 2
Donanım Sunusu - 2
 
Sistem3
Sistem3Sistem3
Sistem3
 
Temel bilgisayar
Temel bilgisayarTemel bilgisayar
Temel bilgisayar
 
Temel bilgisayar
Temel bilgisayarTemel bilgisayar
Temel bilgisayar
 
Bilgi Teknolojisi Temel Kavramları
Bilgi Teknolojisi Temel KavramlarıBilgi Teknolojisi Temel Kavramları
Bilgi Teknolojisi Temel Kavramları
 

Programlama I (C) Ders Notu

  • 1. Karabük Üniversitesi BLM111 PROGRAMLAMA DİLLERİ I Yrd. Doç. Dr. İsmail KURNAZ ikurnaz@karabuk.edu.tr
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.