
1.1.
Bilgisayar Nedir?
1.2.
Bilgisayar Yazılımı
1.3.
Programlama Dilleri
1.4.
Yazılım Geliştirme
1.4.1. Problemin Anlaşılması ve Çözümlenmesi1.5. Basit bir problem
1.4.2. Tasarım
1.4.3. Kodlama
1.4.4. Sınama ve Kanıtlama (Testing and Verifying)
İlk üretilen bilgisayarlar, oldukça büyük ve yavaştı. Ama gün geçtikçe küçüldüler ve güçleri de hızla arttı. Örneğin, yirmi-otuz yıl önceki ancak bir odaya sığabilecek bir bilgisayarın yaptığı işlerden çok daha fazlasını, bugünkü kişisel bilgisayarlar, daha hızlı bir şekilde yapabilmektedir. Bu yüzden, bilgisayarlar günümüzde çok değişik alanlarda ve ortamlarda kullanılmaktadır. Hemen hemen her evde ve işyerinde artık bir bilgisayar görmek olasıdır.
Bir bilgisayar sisteminin fiziksel yapısını oluşturan, klavye, ekran, işlemci, disk, bellek gibi parçaların hepsi birden bilgisayar donanımı olarak adlandırılmaktadır. Bilgisayarın çalışmasını denetleyen birer komutlar kümesi olan programlar da bilgisayar yazılımı olarak adlandırılır. Bir bilgisayar sisteminin, bu iki parçaya da ihtiyacı vardır. Her biri, diğeri olmadan hiçbir işe yaramaz. Günümüzde, donanım fiyatları hızla düşmekte, ama yazılım maliyetleri tam tersine artmaktadır. Bu dersteki amacımız bilgisayar yazılımı geliştirmek olduğundan, biz yalnızca bilgisayar yazılımı ile ilgileneceğiz.
İşletim sistemleri :
Kullanıcı ile bilgisayar arasındaki iletişimi sağlayan programlardır. Bilgisayar sisteminin bütün hareketlerini denetler ve sistemdeki MİB ve ana bellek gibi kaynakların yönetimi ile ilgilenirler. Örneğin, sizin kullandığınız Windows’95 ya da Windows NT birer işletim sistemidir. Diğer bazı işletim sistemleri şunlardır : UNIX, DOS, Solaris, MacOS.
Uygulama Programları :
İşletim sistemi dışında kalan diğer programlara verilen genel bir addır. Örneğin, MSWord, havayolları rezervasyon sistemi, bilgisayar oyunları, programlama dillerinin derleyicileri, bizim yazacağımız C programları birer uygulama programıdır.
Programlama dillerini üç genel kategoriye ayırabiliriz :
Makina dili :
Her bilgisayar MİB’inin anlayacağı kendi makina dili vardır. Örneğin, Pentium işlemcinin makina dili, Sparc işlemciden farklıdır. Makina dilindeki bir komut, bit (0 ya da 1) gruplarından oluşur. Örneğin, makina dilinin bir komutu iki değerin toplanması ya da bir değerin ana belleğin bir bölgesinde saklanması gibi basit işlemleri içerir. İnsanların makina dilinde program yazması hemen hemen olanaksızdır. Örneğin, bir makina dilinde iki sayının toplanması,01000110011101000111101010000010010101101000010
biçiminde ifade edilebilir.
Assembly dili :
Bir assembly dili, makina dilindeki komutları İngilizce benzeri bir dille ifade eder. Genelde assembly dilindeki her komut makina dilindeki bir komuta denk düşer. Assembly dilindeki bir program assembler diye bilinen bir yazılım tarafından makina diline çevrilir. Assembly dilinde program yazmak da makina dilinde olduğu gibi zor ve zaman alıcıdır. Assembly dilinde iki sayının toplanması,
LOAD A
ADD B
STORE C
biçiminde ifade edilir.
Yüksek Seviyeli Programlama Dilleri ( YSPD ) :
Makina dilinde çok sayıda komutla yapılabilecek bir iş, yüksek seviyeli programlama dilinin bir komutu ile yapılabilir. Bu yüksek seviyeli diller, İngilizce ya da Türkçe gibi doğal bir dil değil, kendi yapısı ve dilbilgisi kuralları olan, insanlar için anlaşılması kolay olan dillerdir. Bu derste öğreneceğimiz C, bir yüksek seviyeli programlama dilidir.
Yüksek seviyeli programlama dilinde yazılan bir program, derleyici (compiler) dediğimiz yazılımlar tarafından, makina dilindeki denk bir programa dönüştürülür. Bilgisayar tarafından çalıştırılacak olan program, makina dilindeki programdır. Her programlama dili için ayrı bir derleyici vardır. C'de yazacağınız programlar C derleyicisi ile makina diline çevirilecek ve bu makina dilindeki program çalıştırılacaktır.
C gibi diğer bazı yüksek seviyeli programlama dilleri arasında Pascal, Fortran, Basic, Java, C++, Cobol, Lisp ve Prolog sayılabilir. Bu dillerin birkaçında, iki sayının toplanması şöyle ifade edilir:
C:=A+B; (Pascal)
C=A+B; (C ve Java)
C=A+B (Fortran)
Bazen yüksek seviyeli programlama dilinde yazılmış bir program, makina diline çevrilmek yerine başka bir ara dile çevrilebilir. Bu ara dildeki komutlar, hiçbir makinaya bağımlı değildir. Bu ara dildeki programlar, o dilin yorumlayıcısı (interpreter) olarak bilinen yazılımlar tarafından çalıştırılır. Bunun amacı, ara dildeki programların değişik bilgisayarlarda hiçbir değişikliğe uğramadan kullanılabilmesidir. Örneğin Java derleyicisi Java programlarını böyle ara bir dile çevirir ve bu dildeki programlar bir Java yorumlayıcısı tarafından çalıştırılır.
Bir program yazmadan önce, ilk yapacağımız iş, o problemi nasıl çözeceğimize karar vermek ve çözümün adımlarını belirlemek olmalıdır. Bu işte bize yardımcı olabilecek çeşitli problem çözme teknikleri vardır. Bu tekniklerden yararlandığımızda, yarattığımız çözümü bir programa dönüştürmek kolay olacaktır. En temel problem çözme tekniği, yukarıdan-aşağı tasarım yöntemidir. Bu yöntemde ilk verilen problem, küçük alt problemlere bölünür. Bu alt problemler, gerekirse, daha küçük (basit) alt problemlere bölünürler. En sonunda elde edilen alt problemler, ayrı ayrı çözülürler ve bu çözümler ana problemin çözümünü elde etmek için birleştirilirler. Bu yöntem, algoritma yazımından söz ederken örneklerle açıklanacaktır.
Bir problemi çözmek için yazacağımız programı oluştururken, genelde, aşağıdaki yazılım geliştirme aşamalarından geçmek zorundayız:
1.4.1. Problemin Anlaşılması ve Çözümlenmesi :
İlk yapacağımız iş, problemin tam olarak ne olduğunu anlamaktır. Bu nedenle, problemin çözümünden neler beklediğimizi ve yaratacağımız çözümün girdi ve çıktılarının neler olacağını kesin olarak belirlemeliyiz.
1.4.2. Tasarım :
Tasarım aşaması programı oluşturmadaki en önemli adımlardan biridir ve çok kolay değildir. Tasarım için ne kadar çok vakit harcarsak, programı yazma ve çalıştırma aşamalarında o kadar az sorun yaşarız ve programı o kadar çabuk çalıştırırız. Bu aşamada, problemi çözmek için kullanılacak çözüm adımlarını iyice düşünmemiz ve bu çözüm adımlarını gösteren bir liste yapmamız gerekir. Bir problemin çözüm adımlarını gösteren bu listeye algoritma denir. Böyle bir liste tasarlamak için geliştirilmiş pek çok yöntem vardır. Bunlardan biri de yukarıdan-aşağı tasarım tekniğidir. Bu teknikle önce problemin ana adımları çıkarılır; daha sonra, her adım için, gerekiyorsa, daha detaylı biz çözüm tasarlanır. Böylece verilen büyük problem daha küçük ve çözümü daha kolay küçük problemlere bölünmüş olur. Bu çözümlerin ardarda sıralanmasıyla problem için bir algoritma geliştirmiş oluruz.Oluşturulan algoritma pseudocode denilen, Türkçe ve İngilizce gibi doğal ama sınırlı yapısı olan bir dilde yazılabilir. Bir programlama diline çevirmeden önce, bu algoritmanın doğru bir çözüm olduğu kanısında olmalıyız. Bu aşamayı atlayarak doğrudan programlamaya geçmek, büyük programlar yazarken işimizi çok zorlaştıracaktır.
1.4.3. Kodlama :
Bu aşamada, kağıt üzerinde geliştirdiğimiz algoritmayı bir programlama diline çeviririz ve programı bilgisayara gireriz. Biz C dilini bu aşamada kullanacağız. Bu yüzden, C programlama dilinin yapısını bilmemiz gerekecektir. Algoritmamızın her adımı, ona karşılık gelen C program parçasına çevrilecektir. Oluşturulan program büyük ihtimalle ilk denemede çalışmayacak, çeşitli hatalar verecektir. Kodlama aşamasında bu hataları bulmak ve düzeltmek gerekir.
1.4.4. Sınama ve Kanıtlama (Testing and Verifying) :
Geliştirdiğimiz programın doğruluğunu sınayarak istediğimiz gibi çalışıp çalışmadığını görmek zorundayız. Bu amaçla, program üzerinde çeşitli testler yaparak, programın o testlere nasıl karşılık verdiğine bakarız. Bunu sağlamak için program değişik girdilerle çalıştırılır ve ürettiği sonuçlara bakılır. Sonuçlar beklendiği gibiyse, programın doğru çalıştığı kanıtlanmış olur; değilse doğru çalışmayan parçaları bularak düzeltmemiz gerekir. Bu bazen tasarımda düzeltmeler yapmayı bile gerektirebilir.
Problemin Anlaşılması ve Çözümlenmesi:
Kuzey, güney, doğu, batı olmak üzere dört yön var. Her yön için ayrı sayaç tutarsak, her öğrencinin cevabına göre doğru sayacın değerini bir arttırırız. Öğrenciler bitince bu dört sayacın değerini bastırırız.Tasarım:
Girdiler: öğrencilerin cevapları
Çıktılar: 4 tane sayılan değer
Bu problemi yukarıdan-aşağı tasarım yöntemini kullanarak çözeceğiz. Çözüm adımlarını bir algoritma gibi göstereceğiz. İlk önce problemimizi aşağıdaki üç ana adıma ayıralım.1. Anket için hazırlık yap.
2. Anketi başlat: Öğrencileri sıraya diz ve nereden geldiklerini tek tek sor.
3. Sonuçları bastır.Bu üç adımı biraz daha ayrıntılı vermemiz gerekir. Bunu da aşağıdaki şekilde yapabiliriz.
1. Anket için hazırlık yap.
1.1. Bir kağıda dört kutu çiz ve bunları K, G, D, ve B olarak adlandır.2. Anketi başlat.
1.2. Her kutunun içine ilk değer olarak sıfır yaz.2.1. Öğrencilere sıraya girmelerini söyle.3. Her kutunun içindeki değeri bastır.
2.2. Sırada öğrenci olduğu sürece aşağıdaki işlemleri yap.2.2.1. Sıradaki öğrenciye nereden geldiğini sor.
2.2.2. Doğru kutudaki değere bir ekle.
Kodlama ve Sınama ve kanıtlama:
Bu örnekte görüldüğü gibi problemin çözümü için bazı adımların birkaç kez yinelenmesi gerekebilir. (2.2.1. ve 2.2.2. adımları sırada öğrenci olduğu sürece tekrar tekrar yapılmalıdır. 3. adıma ancak sırada başka öğrenci kalmamışsa geçilebilir. Bunun ve diğer işlemlerin C'da nasıl yapılacağını ilerideki derslerimizde göreceğiz)
Bu son iki aşamayı C'yi öğrendikten sonra siz yapabilirsiniz.
Açıkladığımız yazılım geliştirme aşamalarının ilk iki adımı birkaç örnekle
daha incelemek isterseniz
örnekler'i
tıklayınız.
Herhangi bir C programını hazırlamak ve çalıştırmak için aşağıdaki aşamalardan geçmemiz gerekecektir:
Şimdi bu program hazırlama aşamalarını kısaca açıklayalım.
Yazacağımız C programını bir editör yardımı ile bir kütüğün içine koymalıyız. Kullanacağımız editör vi, emacs, MS editör ya da notepad gibi bir kütüğü ASCII text olarak yaratabilecek olan bir editör olabilir (MS-Word, WordPerfect gibi yazılımlar kullanılmamalıdır). Ya da editörü ile beraber gelen bir paket derleyici ortamında yaratılabilir. Borland Turbo C++ ortamındaki editör yardımıyla yaratılan kütüğün adı .cpp eki ile biter (bu isimlendirme sisteme bağlıdır; bazı sistemler .c eki koyabilir). Bu ek o kütüğün bir C programı sakladığını gösterir. Örneğin, Test1.cpp ve Test2.cpp birer C programı saklayan kütüklerin adları olabilir.
Bir editör yardımı ile bir C programını saklayan Test1.cpp kütüğünü yaratmış olduğumuzu varsayalım. İkinci adım, bu kütüğü C derleyicisiyle derlemektir. Bir başka deyişle, yüksek seviyeli dille yazılan programımızı, makina diline çevirmemiz gerekmektedir. Eğer yazdığımız programda hiçbir yazım hatası yoksa, C derleyicisi makina dilinde bir program üretecektir. Bu programı saklayan kütüğün adı Test1.obj olabilir (bu isimlendirme de sisteme bağlı). Bu kütüğün içindekileri ekranda göremez, bastıramaz ve bir editörde değiştiremezsiniz. Çünkü bu kütüğün formatı farklıdır. Eğer programımızda yazım ya da gramer hataları varsa, Test1.obj kütüğü üretilmeyecek ve C derleyicisi programımızdaki hataları, hata mesajları ile bize bildirecektir. Bu durumda programımızdaki hataları bulup hataya neden olan yerleri yine editör yardımıyla düzeltmeliyiz. Düzeltmeleri yaptıktan sonra, programımızı yeniden derlemeliyiz. Bu işe programımızdaki bütün yazım hataları temizlenene kadar devam etmeliyiz. Hatasız programlar için yaratılan Test1.obj kütüğü yazdığımız C programının makina dili türünden gösterimidir. Bu dilin komutları makinaya bağlıdır ve yalnızca çalıştığınızın aynısı olan ortamlarda ve makinalarda çalıştırılabilir.
C ve benzeri yüksek seviyeli programlama dilleri programcıların işine yarayacak birçok hazır program parçacıkları sunarlar. Bunlar program yazarken bazı işlemleri yapmada büyük kolaylık sağlarlar. Bağlayıcı (linker) dediğimiz bir program derleyicinin yarattığı makina dilindeki programı bu hazır program parçacıklarından gerekli olanları ile birleştirir ve çalıştırılmaya hazır bir bütün program oluşturur.
Çalıştıracağımız program, yaratılan Test1.obj kütüğündeki program olacaktır. Bunu çalıştımak için yükleyici (loader) dediğimiz yazılım programı belleğe yükler ve MİB'den programı başlatmasını ister. Bazı sistemler bu işlemin işletim sistemi ortamında bir komutla yapılmasına izin verirler. Tümleşik geliştirme ortamında ise editör, derleyici, bağlayıcı ve yükleyici hep birlikte bir paket olarak sunulur. Bu tip ortamlarda programcı programını editörde yazdıktan sonra menüler yardımı ile derleyip çalıştırabilir.
Biz bu derste kullanacağımız Borland Turbo C++ tümleşik geliştirme ortamınında da kurgulama, derleme ve çalıştırma aşamalarını menüler yardımıyla yapacağız. Gelecek haftadan itibaren C programlarının yapısını incelemeye ve basit programlar yazmaya başlayacağız. Ders notlarını anlamanız için bu hafta bu yazılımı mutlaka bilgisayarınıza yüklemiş ve sitede verilen örnek programları çalıştırmış olmanız gerekiyor. Borland Turbo C++'yi yüklemek ve kullanmak için yapmanız gerekenleri burayı tıklayarak öğrenebilirsiniz.
![]() |
|||||||||||||||||||||||||||||||||||||||||||||
|
Amaç :
Bu derste C programlarının genel yapısını, temel yapı taşlarını ve bazı çalıştırılabilir ifadelerini örneklerle inceleyeceğiz. Bu bölümde bir C programının yapısını inceleyeceğiz. Şekil 2.1'de verilen C programı derleyicinin editöründe yazılıp, ornek.cpp kütüğünün içinde saklandıktan sonra, menüden Compile seçilerek derlenir ve bu derleme sonucunda ornek.obj kütüğü yaratılır. Bu kütükte saklanan makina dilindeki program, menüden Run seçilerek çalıştırılır.
Şekil 2.1:
Basit Bir C Programı
Satır numaraları açıklama yapmak
için kullanılmıştır. Şekil 2.1'deki programda ' /* ' ile başlayıp ' */ ' biten kısımlardaki herşey açıklamalardır. Programlama açısından hiçbir önemi olmayan bu satırlar yalnızca programı açıklamak için kullandığımız bilgileri kapsar. C derleyicisi bu bölümleri açıklama olarak görür ve dikkate almaz. Programımızın içinde, kodun okunmasını kolaylaştırmak için, istediğimiz kadar boş satır kullanabiliriz. C derleyicisi bu boş satırları gözönüne almaz. Şimdi bu örnek programı kullanarak C programlarının genel yapısını inceleyelim. Bu C programı iki kısımdan oluşur: Önişlemci bildirimleri ve main işlevi. Önişlemci bildirimleri # ile başlayan komutlardır. Bunlar C'nin önişlemcisi tarafından kullanılır. C'nin önişlemcisi program derlenmeden önce programın metininde bu komutları kullanarak bazı değişiklikler yapar ve program ondan sonra derlenir. #include ve #define C'de en çok kullanılan önşlemci bildirimleridir. C dili program yazmada yararlı olabilecek birçok hazır işlevi programcının kullanımına sunar. Bu hazır işlevler C'nin değişik kütüphanelerinde saklanır. Her kütüphanede adı .h uzantısıyla biten bir üstbilgi kütüğü vardır. #include bildirimi programın C'nin kütüphanelerinden birine erişimini sağlar. Bu bildirim ile C önişlemcisi bir kütüphanenin üstbilgi kütüğündeki bazı tanımları programa aktarır ve program bu değişikliklerden sonra derlenir. Örneğin şekildeki programda kullanılan #includeönişlemciye bu programda kullanılan bazı işlev isimlerinin ( printf ve scanf gibi) stdio.h adlı üstbilgi kütüğünde olduğunu bildirir. Diğer önişlemci bildirimi #define UZUNLUK 10C önişlemcisinin, program içinde UZUNLUK sözcüğünün geçtiği her yerde bu sözcüğü 10 rakamı ile değiştirmesini sağlar. Örnek programımızda UZUNLUK yalnızca char yourName[UZUNLUK];satırında kullanılmış. Bu durumda C önişlemcisi bu satırı char yourName[10]olarak değiştirecektir. #define bildiriminde programımızda kullanacağımız, değeri program çalıştığı sürece değişmeyecek olan sabit değerleri tanımlayabiliriz. Bu programda UZUNLUK 10 olarak belirtildiği için programımız sadece 10 harfe kadar olan isimleri okuyabilir. Her C programının bir main işlevi içermesi gerekir. Bu işlevin başlangıcı int main(void)ya da int main()sözcükleriyle belirtilir ve { ile } arasında kalan kısım işlevin gövdesidir. Bu programı çalıştırdığımızda ilk olarak bu main işlevine girilecek ve programın komutları o noktadan itibaren sırayla çalışmaya başlayacaktır. C'de her işlevin gövdesi iki kısımdan oluşur: tanımlamalar kısmı ve çalıştırılabilir ifadeler. Tanımlamalar kısmında işlevin bellekte kullanacağı alanların isimleri tanımlanır ( yourName gibi) ve bu bilgiler derleyici tarafından kullanılır. Çalıştırılabilir ifadeler algoritma basamaklarının C'deki yazılımlarıdır ve makina koduna bunlar çevirilip çalıştırılırlar. main işlevi noktalama işaretleri ve bazı özel semboller ( *,= gibi) içerir. Örneğin noktalı virgül ( ; ) işareti her çalıştırılabilir ifadenin sonunu gösterir. { ve } işaretleri işlevin başlangıç ve bitiş yerlerini belirtir. Genelde her işlevde bir return ifadesi olmak zorundadır. Programımızda açıklamaların dışındaki satırlarda görülen bütün sözcükler ya özel sözcüklerdir ya da tanımlayıcılardır. Özel sözcüklerin hepsi küçük harflerle yazılırlar ve C'de hepsinin bir anlamı vardır. Bu sözcükler bilinen anlamlarından farklı bir amaçla kullanılamazlar. Programda geçen özel sözcükler ve anlamları aşağıdaki tabloda özetlenmiştir. C'deki özel sözcüklerin tamamını kitabımızın Appendix E kısmında ya da burada bulabilirsiniz.
İşlev isimleri, bellek bölgelerinin isimleri (değişken ya da sabit isimleri) tanımlayıcılar olarak adlandırılır. İki türlü tanımlayıcı vardır: standart tanımlayıcılar ve kullanıcının tanımladığı tanımlayıcılar. Standart tanımlayıcıların da özel sözcükler gibi özel anlamları vardır. Örneğin programda printf ve scanf C'nin stdio (standard input/output) kütüphanesinde tanımlanmış iki işlevin ismileridir. Bunların özel sözcüklerden farkı anlamlarının programcı tarafından değiştirilebilir olmasıdır. Programlarımızda kullandığımız ya da hesapladığımız verileri tutan bellek bölgelerine kendimiz isimler veririz. Bunlara kullanıcının tanımladığı tanımlayıcılar denir. Örnek programda yourName ve UZUNLUK bu tip tanımlayıcılardır. Tanımlayıcılara istediğimiz isimleri verebiliriz. Yalnız şu kurallara dikkat etmemiz gerekir:
Bazı geçersiz tanımlayıcılar: 1a (rakamla başlıyor), b+1 ('+' karakteri tanımlayıcıda kullanılamaz) C büyük harf küçük harf ayrımına duyarlı olduğundan, aynı harfin büyük harfi küçük harfinden farklıdır. Bu nedenle örneğin test1 , Test1 ve TEST1 üç farklı tanımlayıcı olarak algılanır. Tanımlayacağımız her değişken bellekte bir bölgeye denk gelecektir. Bir değişkenin türü o değişkene denk düşen bellek bölgesinin büyüklüğünü ve o bölgenin içindeki bilginin nasıl yorumlanacağını gösterir. Bir değişkene yeni bir değer verdiğimizde, verdiğimiz bu değer o değişkene denk düşen bellek bölgesine eski değeri yok ederek saklanır. Örneğin, int x;tanımlaması, x değişkeni için 32 bitlik bir bellek bölgesinin kullanılacağını ve bu bölgenin içindeki bitlerin bir tamsayı (integer) olarak yorumlanacağını gösterir. Aşağıdaki atama ifadesi ile x değişkenine 10 değerini verebiliriz: x = 10;Bu atama ifadesinden sonra, x değişkenine denk gelen bellek bölgesi 10 sayısını 32 bit’lik bölgeyi kullanarak bir tamsayı olarak tutacaktır. Bu bellek bölgesi sonradan yeni bir atama ifadesi ile değiştirilebilir. Örneğin, x = 20; atama ifadesi x değişkenin içine 20 sayısını koyacaktır ve eski değer olan 10 buradan silinecektir. 2.2.1 . İkilik Düzendeki (Binary) Sayılar: Bilgisayardaki her değer, ikilik düzendeki sayılar ile gösterilir. İkilik düzendeki tek bir rakam (0 ya da 1) bir bit olarak adlandırılır. Her bir bit iki değişik durumu gösterir. Bit dizgileri daha büyük sayıları göstermekte kullanılır. Her bit dizgisinin kaç değişik değeri gösterebileceği o dizgideki bit sayısına bağlıdır. Eğer bir bit dizgisinde N bit varsa, o dizgi 2N değişik değeri gösterebilir. Örneğin bit sayısına göre kaç değişik değer gösterilebileceği aşağıdaki tabloda verilmiştir:
Gördüğünüz gibi dizgiye her bit eklediğimizde, o dizginin gösterebileceği değişik değerin sayısı iki katına çıkar. Tanımlayacağımız her değişken bellekte bir bit dizgisi olarak tutulacaktır ve bu bit dizgisinin nasıl yorumlanacağı ise o değişkenin türüne bağlı olacaktır. Örneğin veri türü int olan bir değişken 32 bitlik bir bit dizgisi olarak tutulacaktır ve bu bit dizgisi artı ya da eksi bir tamsayı olarak yorumlanacaktır. C'deki her veri türü bir değerler kümesinden ve onların üzerinde yapılabilecek işlemlerden oluşur. Her veri türünün int , double , char gibi bir adı olacaktır. Bellekte tutulan her değer belirli bir veri türü kullanılarak yorumlanacaktır. C’deki her değişkenin bir türü olacaktır ve bir değişkenin türünün ne olacağını tanımlama (declaration) ifadesi ile belirtiriz. Örneğin, int x, y;tanımlama ifadeleri x, y, z değişkenlerinin türlerinin tamsayıların gösteriminde kullanılan bir veri türü olan int olacağını ve d değişkeninin türünün ise reel sayıların gösteriminde kullanılan bir veri türü olan double olacağını belirtir. C'de kullanılan her literalin (sabit sayı) de bir veri türü vardır. Örneğin, 5 bir tamsayıyı (yani int ) ve 5.0 bir reel sayıyı (yani double ) gösteren birer literaldir. Bellekte 5 ve 5.0 gösteren bit dizgileri tamamen farklı iki dizgi olacaklardır. C'de standart veri türleri char,double,int gibi önceden tanımlanmış veri türleridir. double ve int reel ve tamsayıları programlarımızda göstermek için kullanılır. char ise her türlü karakter bilgisini saklamak için kullanılan bir veri türüdür. Standart veri türleri ile tanımlanan değişkenler için gerekli bellek, tanımlama (declaration) sırasında otomatik olarak ayrılır. C 'de standart veri türleri dışında programcı kendisi değişik veri türleri de tanımlayabilir (enumerated types). Ayrıca dinamik veri türleri de vardır (pointers). Dinamik veri türü olarak tanımlanan bir değişken için gerekli bellek bölgesi tanımlama anında değil de programın çalışma zamanında ayırılır. Biz bu derste sadece standart veri türlerini anlatacağız. Önce sayısal veri türlerini, daha sonra da karakter veri türünü tanıtacağız. C programlama dilinde aşağıdaki anahtar sözcüklerle ifade edilen 10 standart veri türü vardır: short, unsigned short, int, unsigned, long, unsigned long, float, double, long double, char Tamsayılar için standart veri türleri: Tamsayıların gösteriminde altı değişik veri türü kullanabiliriz. Bu veri türleri şunlardır:
|
|||||||||||||||||||||||||||||||||||||||||||||
C programlama dilinde tamsayıları aşağıdakiler gibi
yazabiliriz:
5, 3344, -89C'de int veri türü değerleri aynı zamanda mantıksal değerler olan doğru ve yanlışı ifade etmek için de kullanılır. Bir int değer pozitif ise doğru; sıfır ya da negatif ise yanlış olan bir durumu gösterebilir. Örneğin, int bir değer bir lambanın açık ya da kapalı olması gibi iki değişik değeri olan durumları göstermekte kullanılabilir. Pozıtif ise lamba açık; değilse kapalı olarak kabul edilebilir. int değerlerinin bu tip kullanımını daha sonraki derslerimizde detaylı olarak inceleyeceğiz. Reel sayılar için standart veri türleri: Reel sayılar için kullanılan üç standart veri türü vardır:
|
|||||||||||||||||||||||||||||||||||||||||||||
|
float
veri türü sayının 6
rakamını,
double
veri türü 15 rakamını,
long double
veri türü ise 19 rakamını
saklayabilir.
Reel sayıları yazmak için noktalı notasyonu ya da bilimsel notasyon olarak bilinen e-notasyonunu kullanabiliriz. Bazı reel sayıları aşağıdaki gibi yazabiliriz: 5.0 7.34 0.5e+12 -15.35e-15e-notasyonunda yazılan 0.5e+12 sayısı 0.5x1012 sayısına, -15.35e-15 sayısı -15.35x10 -15 sayısına eşittir. char veri türü, harf, rakam ya da noktalama işareti gibi herhangi bir karakter değeri temsil eder. Her karakter sabiti iki tırnak işareti ( '' ) arasına yazılır. Örneğin, bazı karakter sabitleri aşağıdaki gibi yazılabilir: 'A' 'B' 'a' 'b' '0' '1' '*' ':' '"' ' 'Sondan ikinci karakter çift tırnak işaretini.("), sonuncu ise boşluk karakterini göstermek için kullanılır (iki tırnak içine bir boşluk yazılır). Karakter değerleri char veri türü ile tanımlanmış bir değişkenin içinde saklanır. C değişik karakter değerlerinin karşılaştırılması ya da üzerlerinde aritmetik işlem yapılması gibi işlemler yapmaya izin verir. 2.2.3. Değişkenlerin Tanımlanması Bir değişken belirli bir veri türünü tutan bir bellek bölgesini gösteren bir tanımlayıcıdır. Bütün değişkenler kullanılmadan önce tanımlanmalıdır. Bir tanımlama ifadesi aynı veri türüne sahip olacak bir ya da daha fazla değişkenin tanımlanmasında kullanılır. Bir tanımlama ifadesinin yapısı aşağıdakiler gibi olmalıdır: veri-türü değişken-adı;Örneğin, int sum;Birinci tanımlama ifadesi sum değişkeninin türünün int olacağını, ikinci tanımlama ifadesi x ve y değişkenlerinin türünün int olacağını ve üçüncü ifade de z değişkeninin türünün double olacağını gösterir. Bir tanımlama ifadesinde birden fazla değişken tanımlanacaksa, bu değişkenler virgüllerle ayrılır. Değişkenlere ilk değerleri istenirse tanımlanma anında verilebilir. Örneğin, int sum = 0;tanımlama ifadeleri aynı zamanda sum , x ve y değişkenlerine ilk değerlerini verirler. Atama ifadesi, bir değişkene yeni bir değer vermek için kullanılır. Genelde aritmetik hesapların yapılmasında kullanılır. Bir atama ifadesinin yapısı aşağıdaki gibidir: değişken = deyim;C'de = işareti atama işlecidir. Sağdaki deyimin (expression) değeri bulunur ve bulunan değer soldaki değişkenin içine konur. Deyim sadece bir değişken ya da sabit de olabilir. Örneğin, int x, y;komutları ilk önce x değişkenin içine 5 değerini koyar; daha sonra x değişkenin içindeki değeri y değişkenin içine kopyalar ve en son olarak da x değişkenin içine 6 değerini, içindeki eski değeri silerek koyar. ![]() Genel olarak bir deyim, işleçler (operators) ve işlenenlerden (operands) oluşan bir dizgidir. C'deki bazı aritmetik işleçler şunlardır:
x = y + 1;atama ifadelerinde, önce y+1 deyimini hesaplamak için y ’nin içindeki değer 1 ile toplanır ve sonuç x değişkeni içinde saklanır; sonra x*z deyimini hesaplamak için de x ’in içindeki değer z ’nin içindeki değer ile çarpılır ve sonuç y değişkeninin içinde saklanır. 2.3.1 . İşleçlerin Öncelikleri (Operator Precedence) Eğer bir deyimde birden fazla işleç varsa bu işleçleri hangi sırada yapacağımız işleçlerin önceliğine göre belirlenir. Örneğin, x = y + z * 5;ifadesinde ilk önce çarpma işlemini mi, yoksa toplama işlemini mi yapacağız? Bu iki değişik sıra deyim sonucunun tümüyle iki farklı değerde olması demektir. C programlama dilinde çarpma işlecinin önceliği toplama işlecininkinden daha yüksek olduğu için ilk önce çarpma işlemi yapılacaktır. Yani ilk önce z ve 5 çarpılacak ve elde edilen sonuç ile y toplanacaktır. Bazen bir deyimde ardarda gelen iki işlecin önceliği aynı olabilir. Bu durumda, işleçlerin hangi sırada yapılacağını gösteren birleşme (associativity) kuralına bakılarak işlem sırası belirlenir. Örneğin C'de toplama ve çıkartma aynı önceliğe sahiptir. Aşağıdaki ifadede toplama işlemleri soldan sağa doğru yapılacaktır: x = y + z + 5;Yani ilk önce x ve y toplanacak ve o toplamın sonucu 5 ile toplanacaktır. Bu örnekte toplamaların hangi sırada yapılacağı sonucu etkilemeyebilir; ama aşağıdaki örnekte etkileyecektir: x = y - z + 5;Yukarıdaki örnekte - ve + işleçleri aynı önceliğe sahip olduklarından, bu işlemleri soldan sağa doğru yaparız (ilk önce – işlemi, sonra + işlemi). İşleç öncelikleri parantezler kullanılarak değiştirilebilir. Örneğin, x = (y+z) * 5;komutunda parantezleri kullanarak + işleci, * işlecinden daha önce yapılmaya zorlanmıştır. Ders kitabımızın 2.5. kısmında C'deki işleçlerin öncelik sırası anlatılmıştır. Örnekler:
2.3.2. Atama İfadesinde Türlerin Uyuşması Normal olarak bir atama ifadesinin solundaki değişkenin türü ile sağındaki deyimin türü aynı olmak zorundadır. Eğer sol taraftaki değişken türü int ise, sağ taraftaki deyimin türü de int olmak zorundadır. Örneğin, int x;atama ifadesiyle bir double değeri, bir int değişkeni içine saklanmak istendiğinden, C derleyicisi bu atama ifadesine hata mesajı verecektir. Bunun nedeni herhangi bir double değeri, bir bilgi kaybı olmadan bir int değeri olarak saklanamaz. Ancak bazı durumlarda C derleyicisi, değişkenin türü ile deyim türünün aynı olmasında ısrar etmez. Örneğin, int x;komutuna C derleyicisi hata vermez. x değişkenin içindeki int değeri otomatik olarak bir double değere çevrilir ve bu double değer, y değişkenin içinde saklanır. Bu, otomatik tür değiştirme (automatic type casting) olarak bilinir. Örneğin, bütün tamsayı veri türlerindeki değerler otomatik olarak double değerine dönüştürülebilir. Bir tamsayı veri türündeki değer, o veri türünden daha fazla bellek kullanan tamsayı veri türüne otomatik olarak dönüştürülebilir. Örneğin, bir short değeri otomatik olarak int ya da long değerine dönüştürülebilir. Deyimlerin hesaplanması anında da otomatik tür değiştirme meydana gelebilir. Örneğin, 5 + 3.2deyiminin değeri hesaplanırken, 5 ilk önce double bir değere dönüştürülür ve bu double değerle 3.2 double değeri toplanır. Diğer bir deyişle, bu deyimdeki toplama işlemi, double değerlerin toplama işlemidir. Bu deyimin sonucunun türü de double olacaktır. Hemen hemen bütün programlar dışarıdan girdi aygıtları vasıtasıyla veri alırlar ve hesapladıkları verileri kullanıcıya ekran, yazıcı gibi çıktı aygıtları vasıtasıyla sunarlar. Programın dış dünyadan veri almasına girdi işlemi; hesapladığı sonuçları sunmasına da çıktı işlemi denir. C'de bütün girdi ve çıktı işlemleri girdi/çıktı işlevleri dediğimiz özel programlar tarafından yapılır. En çok kullanılan girdi/çıktı işlevleri C'nin standart girdi/çıktı kütüphanesinin bir parçası olarak sunulmuştur. Bu programlara #includeönişlemci yönlendirmesiyle erişebiliriz. Bu derste en temel girdi ve çıktı işlevleri olan scanf ve printf 'in nasıl kullanıldıklarını göstereceğiz. Bir programın sonuçlarını görebilmek için, sonuçları tutan değişkenlerin değerlerini ya da mesajları bir çıktı aygıtında gösterebilmek gerekir. Bu amaçla printf işlevini kullanırız. Örneğin, printf( " bir dizgi.n " );işlev çağırma komutu, bilgisayarın ekranına çift tırnak (") sembolleri arasında kalan kısmı yazar ve imleç bir sonraki satıra geçer. Yani, ekranda, bir dizgi.yazısını görürüz. Burada kullanılan n satır değiştirme damgasıdır (newline escape sequence). Bu karakter dizisi o andaki çıktı satırını sonlandırır ve imleci yeni satıra geçirir. Bir sonraki printf işlevini çağırma komutu verileri yeni satıra yazar. Eğer çıktımızı ekrana yazdırırken bir sonraki çıktı için alt satıra gitmek istemezsek, n kullanmamalıyız. Örneğin, printf( " bir dizgi. " );işlev çağırma komutu, ekrana bir dizgi yazdıktan sonra, imleç bir alt satıra gitmeyecek o yazıdan hemen sonraki noktada bulunacaktır. Örneğin, printf( " bir dizgi. " );işlev çağırma komutları ekrana bir dizgi.diger dizgiyazısını yazacaktır. Ama, printf( " bir dizgi.n " );komutları ekrana bir dizgi.yazılarını yazacaktır. printf işlevini çağırma ifadesinin genel yapısı aşağıdaki gibidir: printf( biçimleme dizgisi, çıktı_listesi)Biçimleme dizgisi çift tırnak içinde yazılır, çıktı listesinde de değişkenler virgüllerle ayrılarak sıralanır. Örneğin printf("Toplam uzunluk %f kilometredir. n",kms);ifadesi çalıştığında, eğer kms değişkeninin değeri 10.0 ise, ekranda Toplam uzunluk 10.0 kilometredir.yazısı görülecektir. Burada %f damgası double veri türünde bir değişken değeri için yer tutma görevini yapar. printf biçimleme dizgisini ekrana yazarken %f yerine çıktı listesindeki double değişkenin değerini yazar. printf işlevi değişkenlerin değerlerini yer tutucu damgalar vasıtasıyla yazar. Bütün yer tutucular % işareti ile başlar. Her veri türü için ayrı bir yer tutucu damga vardır. Aşağdaki tablo char , int ve double veri türleri için kullanılan yer tutucu damgaları göstermektedir. Diğer yer tutucu damgaları ve değiştirme damgalarını kitabımızın 598-599. sayfalarında bulabilirsiniz.
Biçimleme dizgisi birden fazla yer tutucu damga içerebilir. Eğer çıktı listesinde birden fazla değişken ya da sabit varsa biçimleme dizgisi aynı sayıda yer tutucu damga içermelidir. C bunlarla değişkenleri soldan sağa olmak üzere sırasıyla eşleştirir. Örneğin, i ve j'nin int veri türünde değişkenler olduklarını ve değerlerinin sırasıyla 5 ve 9 olduğunu varsayarsak, printf("%d %c %d esittir %d", i, '+', j, i+j);ifadesi, 5 + 9 eşittir 14yazacaktır.Bu ifadedeki biçimleme dizgisi ekrana yazılırken ilk %d i 'nin değeri ile, %c '+' ile, ikinci %d j'nin değeri ve üçüncü %d i+j değeri ile yer değiştirmiştir. Örnek programımızda gördüğünüz scanf("%s", yourName);ifadesi scanf işlevini standart girdi aygıtından yourName değişkenine veri kopyalamak için çağırır. Standart girdi aygıtı çoğu kez klavyedir. Dolayısıyla bilgisayar kullanıcı klavyeden ne veri girerse onu yourName değişkeninin içinde saklamaya çalışacaktır. scanf işlevini çağırma ifadesinin genel yapısı printf işlevini çağırma ifadesininkine benzer: scanf( biçimleme dizgisi, girdi _listesi)Biçimleme dizgisi scanf 'e ne tür bir veri girileceğini söyler. Örnekte görülen " %s " yer tutucu damgası yourName değişkeni için bir karakter dizisi beklendiğini belirtir. Tamsayı okuyacak olsaydık biçimleme dizgisine " %d ", reel sayı için " %lf ", karakter veri için ise " %c " yazacaktık. Örneğin, scanf("%c%c", &harf1, &harf2);ifadesi veri türü char olduğunu varsaydığınız harf1 ve harf2 değişkenlerine klavyeden girilen iki karakter değerini kopyalayacaktır. scanf("%d%lf", &age, &average);ifadesi ise int veri türündeki age değişkeni ile double veri türündeki average değişkenine değerlerini klavyeden okur. Bu örneklerde programdaki ifadeden farklı olarak değişkenlerin başına & işareti koyduk. & işareti önüne koyulduğu değişkenin bellekteki adresini döndüren bir işlemcidir. Bu işareti char , int ve double veri türündeki değişkenleri okurken koymamız gerekir. Ancak örnek programımızdaki tanımlama kısmında yaptığımız gibi bir dizi(array) tanımlamışsak veya bir değişkeni tanımlarken * kullanıldıysa bu işarete gerek yoktur. Bunun neden böyle olduğunu daha sonraki derslerimizde açıklayacağız! Klavyeden kaç tane veri alınacağı biçimleme dizgisindeki yer tutucu damgaların sayısıyla belirtilir. Verileri okuma işleminde verilerin türleri çok önemlidir. C int ya da reel sayıları okurken sayıların başındaki boşlukları atlar ve sayının bir parçası olamayacak ilk karaktere kadar (boşluk ya da baska herhangi bir karakter) olan karakterleri sayı olarak okur. char veri türü okunurken ise her boşluk ayrı bir karakter olarak görülür. char veri türü okurken de boşlukları atlamak istersek, kaç boşluk atlamak gerekiyorsa o kadar boşluk karakterinin biçimleme dizgisine yazmamız gerekir. Bir programa klavyeden veri girerken biçimleme dizgisinde belirtilenden daha fazla veri girersek fazladan girilen veriler bellekte saklanır ve programda (varsa) bir sonraki scanf ifadesi tarafından okunur. Daha az veri girersek, program biz gerekli veri bilgisini tamamlayana kadar bekler. 2.4.3. Çıktıların biçimlendirilmesi
Bu bölümde programımızın
çıktılarının ekrandaki görüntülerini nasıl kontrol edeceğimizi
göstereceğiz. printf(" Sonuc = %3d kilo %4d gramdır.n", k, g);ifadesi, eğer k değişkeninin değeri 21, g değişkeninin değeri 50 ise Sonuc = 21 kilo 50 gramdır. çıktısını verecektir. Burada 21 değeri 3 karakterlik bir alana, 50 değeri de 4 karakterlik bir alana yazılmıştır. Reel sayıların görünüşünü ayarlamak için hem kaplayacağı toplam kolon sayısını hem de noktadan sonra kaç basamak basılacağı bilgisini vermek gerekir. Toplam alanı belirtirken noktanın kaplayacağı bir kolonu da saymak gerekir. Örneğin 3.14159 değerini taşıyan pi değişkenini printf(" PI = %5.2f n", pi);ifadesiyle yazmak istersek, ekranda PI = 3.14 görülecektir. " %5.2f " damgasıyla pi değişkenini toplam 5 kolonluk alana noktadan sonra 2 basamak bırakarak yazmak istediğimizi söylüyoruz. Çıktıda = işaretinden sonra 2 boşluk vardır. Biri biçimleme dizgisinde yazdığımız boşluktur, diğeri ise pi 'yi yazmak için kullandığımız toplam 5 kolonluk alandan kalan boşluktur. Aşağıdaki program girdi/çıktı işlemlerini örneklemek amacıyla verilmiştir.
Bu programı kendi bilgisyarınıza yüklemek için buraya tıklayınız. Bu program, her sayıyı okumadan önce, ekrana, printf işlevi ile kullanıcıya ne yapacağını söyleyen bildirimi bastırır ve kullanıcının yazdığı sayı okunarak değişkenin içinde saklanır. Sayılar okunup değişkenler içinde saklandıktan sonra, toplamları ve farkları atama ifadeleri ile bulunur. Bulunan sonuçlar, printf işleviyle ekrana gönderilir. Bu örnek programı kendi bilgisayarınızda çalıştırın. Daha sonra biçimleme dizgisini değiştirerek sonuçların ekranda nasıl gösterildiğini inceleyin.
Sayfa Başına Bu haftadan itibaren kendi programlarımızı yazmaya başlayacağız. İdeal bir durumda, yazdığımız program bilgisayarda ilk denememizde hiç hata vermeden tam istediğimiz gibi çalışabilir. Ama bu büyük ihtimalle hiç olmayacağı için karşılaşacağımız hata çeşitlerini bilmemizde yarar vardır. Üç hata çeşidi ile karşılaşabiliriz: Derleme sırasındaki hatalar, çalıştırma sırasındaki hatalar ve mantık (ya da tasarım) hataları. Derleme hataları program derlenirken ortaya çıkan hatalardır. Bunlar aynı zamanda syntax hataları olarak da bilinir. Programınızı yazarken yazım hataları yaparsanız (imla hatası gibi), C'nin kurallarına uymazsanız (örneğin ; ya da { ve } gibi işaretleri yanlış yerlerde kullanmak gibi) derleme hataları alırsınız. Bunlar bulması ve düzeltmesi en kolay hatalardır. C'de en sık yapılan yazım hatalarından birkaçını sıralayalım. C'de komut içeren her ifade ';' işareti ile bitirilmelidir. Bu C'nin ifadeleri birbirinden ayırabilmesi için gereklidir. Eğer ';' unutulursa C derleyicisi hata mesajı verecektir. Açıklamalar mutlaka ' /* ' ile başlamalı ve ' */ ' ile bitmelidir. Programların bölümlerinin başlangıç ve sonlarını belirleyen '{' ve '}' işaretlerini unutmak ya da yanlış kullanmak da en yaygın hatalardır. Programda kullanılan bir değişkenin tanımlanması unutulursa bu da bir derleme hatasına sebep olur. Çalıştırma hataları program derlendikten sonra çalıştırılırken alınan hatalardır. Programınızı syntax hatalarından temizledikten sonra çalıştırdığınızda programın çıktısı yerine hata mesajı alırsanız ya da programınız hiç sonuç vermeden ekran kilitlenmiş gibi boş kalırsa çalıştırmada bir hata var demektir. Bu tip hataların nedeni daha zor bulunur, çünkü nedenler programın içeriğine göre çok çeşitlidir. Örneğin programınızda bir bölme işlemi vardır ve programın çalışma sırasında bölen değer sıfır oluyordur. İşte bu durumda sıfıra bölme işlemi çalıştırma hatası verecektir. Bu tip hataları programlama yeteneğiniz arttıkça bulmanız ve düzeltmeniz kolaylaşacaktır. Mantık hataları da algoritma tasarımı sırasında ya da algoritmayı programa kodlarken yapılan bir hatadan kaynaklanır. Mantık hataları genelde derleme ve çalıştırma hatalarından kurtulduktan sonra ortaya çıkar. Bu aşamada programınız çalışır ve bir çıktı verir. Ancak çıktıyı incelediğinizde bunun sizin istediğiniz çıktı olmadığını görürsünüz. Örneğin çıktılar düzgün bir sırada alt alta çıkmamıştır, ya da rakamlar hatalı hesaplanmıştır ya da program eksik çıktı vermiştir. Bu tip hataları düzeltmek için programın bazı kısımlarını yeniden yazmak hatta bazen algoritmayı değiştirmek gerekebilir. |
|||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Amaç: Bu hafta seçeneğe dayalı işlemlerin nasıl yapılacağı gösterilecek.
3.1. KoşullarKoşullar sonucu 1 (doğru) ya da 0 (yanlış) olan mantıksal deyimlerdir. Basit bir mantıksal deyim karşılaştırma (relational) işleçleri kullanılarak yaratılabilir. Örneğin,x < y mantıksal deyimi, x ve y değişkenlerinin < karşılaştırma işleci kullanılarak birleştirilmesiyle yaratılmıştır. Eğer x değişkenin değeri, y değişkenin değerinden daha küçükse, bu mantıksal deyimin sonucu 1 (doğru) olacaktır; aksi halde bu deyimin sonucu 0 (yanlış) olacaktır.
Genelde bir mantıksal deyim
bir karşılaştırma işleciyle yaratıldığında aşağıdaki yapıda
olur:
Genelde buradaki
deyim1
ve
deyim2
birer aritmetik deyim
olabilir ve onların sonuçları
karşılaştırma-işleci
kullanılarak karşılaştırılabilir. C'de kullanılan karşılaştırma
işleçleri şunlardır:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Örneğin,
x
değişkeni 10 değerini ve
y
değişkeni 5 değerini
tutuyor olsun. Bu durumda aşağıdaki mantıksal deyimlerin değerleri şöyle
olacaktır:
Daha karmaşık mantıksal deyimler,
mantıksal işleçler (logical operators) kullanılarak
yaratılabilir. Bu mantıksal işleçlerden çoğu iki mantıksal deyimden yeni
bir mantıksal deyim yaratırlar; bir tanesi ise tek mantıksal deyimden yeni
bir mantıksal deyim yaratır. C programlama dilindeki mantıksal işleçlerden
bazıları şunlardır:
Bu mantıksal işleçlerin sonucu bu
işleçlerin doğruluk tablolarına (truth tables) göre bulunur. Bu işleçlerin
doğruluk tabloları aşağıdaki gibidir:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bu tabloda da görüldüğü gibi C mantıksal bir deyimin
sonucunu daima 0 ya da 1 olarak hesaplar. Ancak C sıfır olmayan
herhangi bir değeri de 'doğru' olarak görür. Şimdilik biz doğru değeri hep
1 tamsayısı ile göstereceğiz. Örneğin,
x
değişkeni 10 değerini
ve
y
değişkeni 5 değerini tutuyor olsun. Bu durumda aşağıdaki mantıksal
deyimlerin değerleri şöyle olacaktır:
Mantıksal işleçlerin de aritmetik işleçler gibi bir öncelik sırası vardır. Şimdiye kadar gördüğümüz işleçler öncelik sırasına göre şöyle sıralanır: 1. ! - (unary minus)1 numaradaki işleçler önceliği en yüksek işleçler, 8 numaradaki işleç önceliği en düşük işleçdir. Örneğin, x>1 || y>2 && z>3mantıksal deyiminde && işlemi || işleminden önce yapılacaktır. Çünkü onun önceliği daha yüksektir. Bütün işleçlerin öncelik sırası kitabımızın Appendix C bölümünde bulunabilir. Bu öncelik sırasını açık hale getirmek ya da değiştirmek istersek parantezler kullanabiliriz. Örneğin yukarıdaki ifadeyi (x>1 || y>2) && z>3şeklinde yazarsak, || işlemi && işleminden önce yapılacaktır. Programlarımızda birşeyin doğru ya da yanlış olduğunu int veri türündeki bir değişken kullanarak gösterebiliriz. Atama ifadesiyle bu değişkene 0 değeri verirsek yanlış, sıfır olmayan bir değer verirsek doğru olarak kabul ederiz. Örneğin, flag int veri türünde bir değişken olsun ve bu değişkenle x değikeninin 10'dan büyük olup olmama durumunu belirtmek isteyelim. Bu durumu aşağıdaki atama ifadesiyle belirtebiliriz. flag = (x>1);Bu atama ifadesi eğer x 'in değeri 10'dan büyükse flag 'a 1 (doğru), değilse flag'a 0 (yanlış) değerini koyacaktır. cift = (n % 2 == 0);ifadesi ise eğer n bir cift sayıysa cift 'e 1 değerini verecektir.
Özetleyecek olursak C'de koşul
şunlardan biridir:
Kısa devre değerlendirme (Short-circuit Evaluation)
İf ifadesine geçmeden önce C'nin
koşulların sonucunu hesaplama şeklini anlatmak gerekir. C mantıksal
deyimlerin sadece bir bölümünün değerini hesaplar. Bütün deyim ancak
gerektiği durumlarda hesaplanır. Örneğin
a
|| b
deyimi
a
doğruysa do
ğru olacaktır. Bu
yüzden C bu tip bir ifadeyi çalıştırırken eğer ilk değer sıfır değilse
ikinci değeri hiç hesaplamaz. Benzer şekilde
a && b
deyimi
a
yanlış ise yanlış olacaktır. Bu tip koşullarda da C ilk değer
sıfırsa ikinci değere hiç bakmadan sonucu sıfır olarak bulur. Bu
değerlendirme metoduna kısa devre değerlendirme diyoruz.
3.2. IF ifadesiProgramlarımızda bir komutlar kümesinden koşullara bağlı olarak yalnızca birini çalıştırmak isteyebiliriz. Diğer bir deyişle bazı durumlarda, komutlardan yalnızca birini çalıştırır diğerlerini çalıştırmayabiliriz. C programlama dilinde koşula bağlı çalıştırma işlemini genellikle if ifadesini kullanarak yaparız. C'de if ifadesinin iki değişik yapısı vardır. Bu yapıyla bir komutlar dizisini koşula bağlı olarak ya çalıştırırız yada çalıştırmayız.Bir seçenekli if ifadesinin yapısı şöyledir:
doğru-ifade;
doğru-ifade ; else yanlış-ifade ; NOT: Daha önce algoritmalarımızda kullandığımız eğer-değilse türü karar verme işlemlerini C'de if ifadeleriyle yapabiliriz.
3.3. Öbek İfade (Compound Statement)'{' ve '}' sembolleri arasında kalan komutlar kümesi öbek ifade olarak adlandırılır. Öbek ifade de C programlama dilindeki ifadelerden biridir. Diğer ifadelerin kullanıldığı her yerde bir öbek ifade de kullanılabilir. Diğer ifadelerden sonra her zaman ' ; ' işareti koyarız, ama öbek ifadesini kapatan '}' den sonra ' ; ' işareti koymamıza gerek yoktur. Daha önce öbek ifadesiyle karşılaşmıştık. Örneğin bir işlevin gövdesi bir öbek ifadedir. If ifadesi içinde öbek ifadesini doğru -ifade veya yanlış -ifade yerine kullanabiliriz. If ifadesinin koşulu doğru olduğunda (ya da else kısmında) eğer birden fazla işlem yapmamız gerekiyorsa, bu işlemleri yapan bütün C ifadelerini bir öbek ifadesi biraraya toplarız.
3.4. İç-İçe IF İfadeleri (Nested IF Statements)İkiden fazla koşulu içeren karar verme yapılarında da if-ifadelerini kullanabiliriz. Eğer bir if - ifadesinin doğru-ifadesi ve/veya yanlış-ifadesi de başka bir if -ifadesi ise, böyle if -ifadelerini iç-içe if -ifadeleri olarak adlandırırız.Örneğin,
ifadesi bir iç-içe if -ifadesidir. Dışarıdaki if -ifadesinin (kırmızı renkle gösterilen) yanlış-ifadesi (else kısmı) başka bir if -ifadesidir (yeşille gösterilen). İlk önce x 'in 10'dan küçük olup olmadığı sınanacaktır. Eğer küçükse, x 'in tek rakamdan oluştuğunu yazacak olan printf işlevi çalışacaktır. Değilse, dışardaki (kırmızı) if -ifadesinin else -bölümündeki if ifadesi çalışacaktır. Bu durumda (yani x 10'dan küçük değilken), x 'in 100'den küçük olup olmadığı kontrol edilecektir. Eğer küçükse, ikinci if ifadesinin (yeşil olan) doğru bölümünü oluşturan ve x 'in iki rakamdan oluştuğunu yazan printf işlevi çalışacaktır. Aksi halde (yani x 100'den küçük değilse) ikinci if -ifadesinin else -bölümünü oluşturan ve x 'in ikiden fazla rakamdan oluştuğunu yazacak olan printf işlevi çalışacaktır.
Aşağıdaki örnekte bir
iç-içe
if
ifadesi görülmektedir. Bu yapı her
if
-ifadesinin (sonuncu
if
-ifadesi hariç)
else
-bölümünde
yine bir
if
-ifadesi yazarak ortaya çıkmıştır. Birbiriyle eşleşen
if
ve
else
'ler
aynı renkte gösterilmiştir.
Bu
if
ifadesi, eğer
grade
90'dan büyük
ya da eşitse A yazar. Değilse,
grade'
in 80'den büyük ya da
eşit olup olmadığını kontol eder ve eğer öyleyse B yazar. Değilse ve
grade'
in değeri
70'ten büyük ya da eşit ise C yazar. Aksi halde,
grade'
in değerini tekrar 60 ile
karşılaştırır ve bu karşılaştırmanın sonucuna göre D ya da F
yazar.
YANLIŞif (y>5) printf("x ve y 5 den buyuk"); else printf("x 5 den kucuk ya da esit");
if (y>5) printf("x ve y 5 den buyuk"); } else printf("x 5 den kucuk ya da esit"); 3.5. IF-ifadeleri ile Bir C ProgramıMinValue.cpp
Bu program üç tamsayıyı ayrı ayrı
okur ve okuduğu bu sayıları
num1
,
num2
ve
num3
değişkenleri içinde
saklar. Sayılar okunduktan sonra bu üç
sayının en küçüğü, iki
if
-ifadesi kullanılarak
bulunur. İlk
if
-ifadesi iki seçenekli bir
if
ifadesidir ve ilk iki
sayının en küçüğünü
minValue
değişkenin içinde saklar. İkinci
if
-ifadesi bir seçenekli
if
ifadesidir ve
eğer
num3
değişkeninin içindeki değer,
minValue
değişkeninin içindeki
değerden küçükse,
num3'
teki değer
minValue
'ya aktarılır. Böylece
minValue
girilen üç sayının en
küçüğünü tutacaktır. Daha sonra bu en küçük değer ekrana
yazdırılır. 3.6. switch ifadesiÇok sayıdaki seçenekler arasından bir seçim yapmak isteniyorsa, diğer bir karar verme yapısı olan switch -ifadesi de kullanılabilir. Seçenekler arasındaki seçim tek bir değişkenin ya da basit bir deyimin değerine dayalı olarak yapılıyorsa switch -ifadesi çok yararlı olabilir. Seçimin dayalı olduğu bu deyimin veri türü ya int ya da char olmalıdır. double veri türü olamaz. switch ifadesinin genel yapısı şöyledir:
değer-kümesi-1 ifade(ler) break ; değer-kümesi-2 ifade(ler) break ; ... ... değer-kümesi-n ifade(ler) break ; default : ifade(ler) } case sabit :şeklindeki etiketlerden oluşur. break ve default: kısımları switch ifadesinde bulunmak zorunda değildir (optional). Bir switch -ifadesinde ilk önce kontrol-deyiminin değeri hesaplanır. Bu değer her değer-kümesindeki etiketlerin sabitleri ile tek tek karşılaştırılır. İçindeki sabit, kontrol deyiminin değerine eşit olan ilk değer-kümesi bulunana kadar bu karşılaştırmaya devam edilir. Eşitlik bulununca o case etiketini takip eden ifade(ler) ilk break ifadesine gelininceye kadar çalıştırılırlar. Bulunan ilk break ifadesinden sonra switch ifadesinin geri kalan kısmı çalıştırılmadan atlanır. Hiç break ifadesi yoksa çalıştırma işlemi switch -ifadesinin sonuna erişene kadar devam eder. Eğer değer kümelerindeki bütün etiket sabitleri kontrol deyiminin değerinden farklıysa, default kısmı seçilir ve bu kısımdaki ifadeler çalıştırılır. default kısmı yoksa bütün switch ifadesinin gövdesi hiç çalıştırılmadan atlanır. Örnek:
Eğer x 'in değeri 1 ise, ilk case etiketindeki ifade ler çalıştırılır. İlk printf işlevi çağırılır ve sonra break ifadesi çalıştırıldığında switch -ifadesinin çalışması bitmiş demektir. Böylece switch -ifadesinden sonraki ifadeye geçilir. Ekranda şunları görürüz:
x in degeri 3 ya da 4
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c++
Tesekkürler