C porgramlama

Page 1

1 EV 1: BİR C PROGRAMI C programının temel yapı taşları fonksiyonlardır(functions). C fonksiyonları ise C cümlelerinden oluşur. Bir fonksiyon içindeki eylemler, C komutları(deyimleri) içeren C cümleleri tarafından belirlenir. /deneme. c/ #include<stdio.h> main() { printf(“C ile programlama öğreniyorum”); return 0; } C cümleleri noktalı virgülle bitirilir. #include<stdio.h> noktalı virgülle bitmez çünkü bu bir C cümlesi değil, programı derleyecek olan yazılıma yönelik derleyici ön komutudur.  Tanıtıcı: Bilgisayar nesnelerine verilen isimdir. C’de tanıtıcılarda Türkçe karakter kullanılmaz. Tanıtıcılar ayrıca rakamla ve alt tire (_) haricindeki simgelerle başlamaz. Yani İngiliz alfabesindeki 26 harf ve _ simgesiyle başlıyorlar. Son olarak da rakamlar tanıtıcılarda ilk karakter hariç olmak üzere kullanılabilir. EV 2: C DİLİNDE TANITICILAR 2. ev 1. oda: Temel Veri Tipleri, Değişkenler ve Tanıtıcılar  C’nin temel veri tipleri;  char: Alfa sayısal simge(karakter)lerdir. Uzunluğu 8 bittir ve -128 ile 127 arasındaki değerleri içerir.  int: Tamsayıları temsil eder. Uzunluğu 16 bittir ve -32768 ile 32767 arasındaki değerleri içerir.  float: Tek hassas kesirli sayı(gerçel). Uzunluğu 32 bittir.  double: Çift hassas kesirli sayı. Uzunluğu 64 bittir.  C dilinde atama(assignment) operatörü (=) simgesidir. Değişken = Atanacak ifade; printf(“sonuc % d”, m); “sonuc%d” olarak yazılan karakter katarı, denetim katarı(control string) olarak adlandırılır. Denetim katarında 2 türlü bilgi bulunur. Birincisi özel anlamları olan %d, %f, %c gibi % simgesiyle başlayan özel biçimlendirme belirteçleridir(format specifier). İkincisi ise bir özel anlam ifade etmeyen direkt çıktıya aktarılan katardır. 2. ev 2. oda: Temel Tiplerin Tanım Açısından Nitelenmesi Temel veri tiplerinden(int, float, double, char) daha özellikli yararlanmak için “tanım niteleme sıfatları” kullanılır. C’de signed, unsigned, long, short olmak üzere 4 niteleyici vardır.

Klavyu.org Sayfa 1


2 2. ev 3. oda: Temel Tiplerin Erişim Açısından Nitelenmesi Erişim niteleme sıfatları const ve volatile sözcükleridir. Bu sıfatlar, diğer sıfatlardan ve tip isimlerinden önce gelmelidir.  const(Constant): Adı da üstünde olan niteleme sıfatımız kendinden sonra gelen değişkenlerin değerinin değiştirilmemesine imkân verir. Const sıfatını içeren cümlede değişkene ilk değer vermek mümkün iken bu değerin program içinde değiştirilme izni yoktur. Program içinde kullanımı aşağıdaki gibidir. #const unsigned int a = 3;  volatile: Kelime anlamı uçucu olan sıfatımız, derleyiciye bir değişkenin değerinin programda ancak açıkça bildirilmeyen yollarla(örneğin donanım yoluyla) değişebileceğini belirtir. 2. ev 4. oda: Temel Tiplerin Depolama Açısından Nitelenmesi C’de 4 tip depolama sıfatı vardır. Bunlar extern, static, register, auto. Bu sıfatlar derleyiciye ilgili değişkeni nasıl depolayacağını belirtir. Kullanımları Depolama_sıfatı tip değişken; şeklindedir.  Extern sıfatı: Sağ olsun C dili kaynak kodu çok büyük olan programların parçalar halinde yazılmasına izin verir. Bu parçaların uygun biçimde düzenlenmesi halinde ayrı ayrı derlenmeleri de mümkündür. Fakat bir bütün program parçalara ayrıldığında parçalar(daha sonra bağlanmak üzere) kendi başlarında derlenmek istendiğinde global değişkenlerin nerede ve nasıl tanımlandığının belirtilmesi gerekir. Bu amaçla extern sıfatı kullanılır. Dışsallığı ifade eden extern sıfatı ile tanımlanan bir değişkenin gerçekte ayrıca derlenecek bir başka program parçası içinde tanımlanmış olduğunu belirtilir.  Static sıfatı: Bir fonksiyon içinde kalıcı değişkenler (fonksiyon çağrıları arasında değerlerini yitirmeyenler değişkenler) oluşturmak için kullanılır. Static değişkenler, yerel ve global olarak iki farklı yerde konuşlanabilirler. Static sıfatı bir yerel değişkene uygulanırsa derleyici, global değişken için yaptığı gibi yerel değişken için de kalıcı yer ayrımı yapar. Yerel static değişken ile global değişken arasındaki en önemli fark, yerel değişkenin sadece tanımlandığı blok içinde tanınmasıdır.  Register sıfatı: Bu sıfat, yalnız yerel değişkenlere ve bir fonksiyondaki formel parametrelere uygulanır. Sağladığı hız nedeniyle özellikle döngü denetim değişkenlerinin register sıfatına sahip olmaları istenebilir. Bir diğer cixx özellikse register sıfatına sahip değişkenlerin adreslerinin ulaşılmaz olmasıdır. Çünkü bu değişkenlerin(register sıfatına sahip değişkenler) bellekte depolanan sıradan değişkenler gibi bellek adresleri yoktur. Bu nedenle adres operatörü olan simgesi kullanılarak register değişkenlerin adresleri bulunamaz. EV 3: GİRİŞ/ÇIKIŞ VE ARİTMETİK İŞLEMLER 3. ev 1. oda: Klavyeden Bilgi Girişi C dilinde klavyeden bilgi girmek için pek çok komut(fonksiyon) bulunuyormuş. Bunlar arasında standart kitaplık fonksiyonlarından olan (scanf)’i tanıyacağız. Kullanımı en kolay olanlardan birisidir bu scanf. Genel kullanım kalıbı ise şöyle; scanf(biçimlendirme_belirteci_katarı, &değişken);

Klavyu.org Sayfa 2


3

/*deneme.c*/ #include<stdio.h> main() { int sanal; scanf(“%d”, &sanal); system(“PAUSE”); return 0; } (!)Bu örnekte kullandığımız & simgesi, derleyiciye değişkenimizin adresini belirtiyor. 3. ev 2. oda: Aritmetik İşlemler  İşaret değiştirme operatörü (-) .  Çarpma operatörü (*)  Bölme operatörü (/)  Modülo (modulus) (%)  Toplama operatörü (+)  Çıkarma operatörü (-) Bu operatörler, temel veri tiplerinden(char, int, float, double…) herhangi biriyle kullanılabilir. Yalnız modülo operatörü, tam sayı tiplerle kullanılır. /*deneme.c*/ #include<stdio.h> main() { int sanalkalem, izdusen; sanalkalem = -1 + 2 * 3; izdusen = (5 - 2) / 1 * 2; printf(“sonuc1 = %d”, sanalkalem); printf(“sonuc2 = %d”, izdusen); system(“PAUSE”); return 0; } 3. ev 3. oda: Fonksiyonlar Bildiğiniz üzere her C programı cümle veya cümlelerden oluşur. Binevi C’nin yapı taşları, fonksiyonlar denebilir. Sizinde bildiğiniz gibi global fonksiyonlar ve ana yordam(Yardım için bakınız 1. ders) içine yazılan fonksiyonlar var. Bir fonksiyon, genelde kendine bazı bilgiler geçirilerek çağrılır. Geçirilen bilgilere “fonksiyonun parametreleri” denir. İki sayının çarpımını bulan şu örnek iyi bir tercümandır duygularımıza(Dikkatle incele). Klavyu.org Sayfa 3


4 /*deneme.c*/ #include<stdio.h> float carpim(float f1, float f2) { float f; f = f1 * f2; return f; } main() { printf(“parametreye gecirerek carpma islemi = %f”, (0.5, 3.0)); system(“PAUSE”); return 0; } Bu örnekte ismi carpim olan global fonksiyon(namı diğer body function) tanımladık. Bu carpim global fonksiyonunun parametreleri; f1 ve f2’dir. Daha sonra ana yordam denilen main() altında iki süslü arasına C cümlelerimizi yazdık. carpim fonksiyonunun f1 parametresine 0.5 ve f2 parametresine 3.0 değerlerini geçirerek işlemi yaptırdık. Peki, bir fonksiyonun kaç tane parametresi olur diye sorarsanız duyduğuma, okuduğuma göre en fazla 31 tane parametreye kullanılabiliyormuş. EV 4: DENETİM DEYİMLERİ VE DÖNGÜLER 4. ev 1. oda: Denetim Deyimleri_if_ if deyimi, C’de koşul ve seçim-karar cümlelerinde yaygın olarak kullanılan bir anahtar sözcüktür. İşleyişi, bir mantıksal önermenin(logical expression) doğru(true) veya yanlış(false) olduğuna bağlıdır. C dilinde bir değer sayısal olarak sıfıra eşitse, mantıksal olarak yanlış; sıfırdan farklı ise doğru(true) olarak algılanır. if deyiminin genel kalıbı: if(ifade) C_cumlesi; /*deneme.c*/ main() { int sanalkalem; sanalkalem = 0; if(sanalkalem) printf(“yazma beni yarim yarim\n”); return 0; } Yukarıdaki örnekte değişken(sanalkalem) sıfır olduğu için ekranda bir şey yazmaz. Sıfır C’de mantıksal yanlıştır. if deyiminin ifade kısmında şu ilişkisel operatörler de kullanılabilir.  Küçüktür ( < )  Büyüktür ( > )  Küçük veya eşittir ( <= )  Büyük veya eşittir ( >= )  Eşittir ( == )  Eşit değildir ( != ) Klavyu.org Sayfa 4


5 /*deneme.c*/ #include<stdio.h> main() { int izdusen = 2; int sanalkalem = 3; if(izdusen <= sanalkalem) printf(“izdusen sanalkalemden kucuk ya da esitse ekrandayim”); return 0; } if cümlesine else deyimini ekleyebiliriz. Bu sefer mantıksal önermenin yanlış olduğu durumda else kısmında belirtilen cümle(ler) işlenir. Genel kullanım: if(ifade) C_cümlesi1; else C_cümlesi2; Eğer ifade kısmı doğruysa C_cümlesi1 işlenir else kısmı işlenmez. İfade kısmı yanlışsa C_cümlesi2 işlenir. Böylece iki yollu bir karar sistematiği oluşturulur. C’de iki veya daha fazla cümle, bir blok oluşturacak şekilde bir araya gelebilir. İki süslü{…} arasındaki cümleler topluluklarına blok denir. Genel kullanım: if(ifade) { cümle1; cümle2; .... cümlen; } else { cümle111; cümle112; ... Cümlebilmemkac; } Eğer ifade doğruysa if deyiminin hedefi olan bloktaki cümleler işlenir. Aksi halde else’in hedefi olan bloktaki cümleler çalışır. Eğer bir if cümlesi; başka bir if veya else cümlesinin hedefi olarak kullanılmışsa, buna iç içe if cümleleri(nested if) denir. Standartlara göre 15 tane if cümlesinin iç içe girmesine izin veriliyormuş. 4. ev 2. oda: Seçim Operatörü C’de bazen if-else deyiminin yerini alabilen, üçlü operatör(ternary operator) veya seçim operatörü olarak bilinen ve ? : simgeleri ile gösterilen bir operatör vardır. Arkadaş, bu seçim operatörünün işleyişi şöyledir; ifade1? ifade2; ifade3 Önce ifade1’e bakılır. Mantıksal olarak doğruysa işlemin sonucu ifade2 olur; eğer ifade1 mantıksal olarak yanlışsa bu sefer işlemin sonucu ifade3 olur. (Hatırlatma: C’de herhangi bir ifadenin değeri sıfıra eşitse, mantıksal yanlış(false); sıfırdan farklı ise mantıksal doğru(true) olarak kabul edilir.)

Klavyu.org Sayfa 5


6 /*deneme.c*/ #include<stdio.h> main() { int a, b; a = 15; b = a > 10? 7: 14; return 0; } Üçlü operatör satırında (a > 10) önermesi doğru olduğundan b değişkenine 7 değeri atanır; bu önerme yanlış olsaydı b’ye 14 değeri atanacaktı. 4. ev 3. oda: Döngüler _for_ Bir cümle veya cümleler topluluğunun tekrarlı olarak yapılması döngü deyimleri ile olanaklı kılınır. C’de üç tane döngü deyimi vardır. Bunlardan yaygın olarak kullanılanı ve esnek olanı for döngüsüdür. En sade ifadeyle for döngüsü, bir cümlenin veya bir bloğun belirli sayıda tekrar edilmesi için kullanılır. Genel kalıbı şöyledir; for(başlangıç; koşullu_sınama; artırım)C_cümlesi; “başlangıç” kısmında döngünün denetimini yapan değişkene ilk değeri verilir. Bu değişken, döngü denetim değişkeni(loop control variable) olarak adlandırılır. for döngüsünün “başlangıç” kısmı, döngü başlarken yalnız bir kez işletilir. Döngünün “koşullu_sınama” kısmı, denetim değişkeninin her değeri için bir kez yapılır ve elde edilen sonuca göre(eğer sınamanın sonucu doğru çıkarsa) C_cümlesi işlenir veya(eğer sınamanın sonucu yanlış çıkarsa) döngüden çıkılır. Döngüden çıkılınca, programın işleyişi sonraki cümle ile devam eder. Döngünün “artırım” kısmı, C_cümlesinin veya döngü bloğunun her gerçekleştirilişinden sonra işlenir ve döngü denetim değişkeninin ne olacağı hesaplanır. /*deneme1.c*/ #include<stdio.h> main() { int i, j; j = 0; for(i = 1; i < 21; i = i + 1) j = i + j; printf(“Toplam = %d”, j); return 0; } /*deneme2.c*/ #include<stdio.h> main() { int a, b, c; for(a = 1, b = 5; a < 4; ++a, b--){ printf(“Ali gel\n”); c = a + b; printf(“%d\n”, c);

Klavyu.org Sayfa 6


7 } printf(“Ali gelme”); return 0; } /*deneme3.c*/ #include<stdio.h> main() { int lil, lal, la; for(lil = 34, lal = 5; ; ++lil, lal--) printf(“Döngüden çıkamıyorum.”); printf(“kakuri kukiri”); return 0; } EV 5: OPERATÖRLER 5. ev 1. oda: Artım ve Azaltım Operatörleri C dili az bulunan(diğer dillerden) iki operatöre sahiptir. Bunlar ++ ile gösterilen artırım (increment) operatörü ve -- ile gösterilen azaltım( decrement) operatörüdür. Bu operatörler;  x++; ile x = x + 1;  ++x; ile x = x + 1;  x-- ; ile x = x-1;  --x; ile x = x-1; Aynı anlamları ifade ederler. a = 5; b = ++a; bu cümlenin sonunda a = 6, b = 6 olur. a = 5; b = a++; bu cümlenin sonunda a = 6, b = 5 olur. 5. ev 2. oda: Bileşik Atama Operatörleri  a += 2 ile a = a + 2 aynı,  a - = 2 ile a = a - 2 aynı,  a * = 2 ile a = a * 2 aynı,  a /= 2 ile a = a / 2 aynı,  a %= 2 ile a = a % 2 aynı,  a &= 2 ile a = a & 2 aynı,  a |= 2 ile a = a | 2 aynı,  a ^= 2 ile a = a ^ 2 aynı,  a <<= 2 ile a = a << 2 aynı,  a >>= 2 ile a = a >> 2 aynı, 5. ev 3. oda: İlişki Operatörleri ve Mantıksal Operatörler if deyiminde, ilişki operatörlerinden(relational operators) azıcık bahsetmiştik. Bu konuda değineceğimiz mantıksal operatörler(logical operator), mantıksal değerlerin üretilmesinde kullanılırlar. Klavyu.org Sayfa 7


8 C’ de mantıksal operatörler, temel mantıksal işlemler olan ve(and), veya(or), değil(not) işlemlerini yerine getirirler. VE operatörü && ile, VEYA operatörü || ile, DEĞİL operatörü ! ile gösterilirler. Şimdi bu mantıksal operatörlerin doğruluklarına bakalım;  && İki tane a ve b gibi operatta olabilecek durumlar ya 0 0, ya 0 1, ya 1 0, ya 1 1 dir.  a = 0, b = 0 ise a && b = 0  a = 1, b = 0 ise a && b = 0  a = 0, b = 1 ise a && b = 0  a = 1, b = 1 ise a && b = 1  || İki tane a ve b gibi operatta olabilecek durumlar ya 0 0, ya 0 1, ya 1 0, ya 1 1 dir.  a = 0, b = 0 ise a || b = 0  a = 1, b = 0 ise a || b = 1  a = 0, b = 1 ise a || b = 1  a = 1, b = 1 ise a || b = 1  !a İki tane operatta olabilecek durumlar ya 0 0, ya 0 1, ya 1 0, ya 1 1 dir.  a = 0, b = 0 ise !a = 1  a = 1, b = 0 ise !a = 1  a = 0, b = 1 ise !a = 0  a = 1, b = 1 ise !a = 0 /*deneme.c*/ include<stdio.h> main() { int a, b, c, kucuk, buyuk; printf("Bir tamsayi giriniz: "); scanf("%d", &a); printf("\nikinci tamsayiyi giriniz: "); scanf("%d", &b); printf("\nucuncu tamsayiyi giriniz:"); scanf("%d", &c); printf("\n"); if(a > b) printf("Birinci sayi ikinciden buyuk\n"); if(a > c) printf("Birinci sayi ucuncuden buyuk\n"); if((a == b) && (a == c)) printf("uc sayi birbirine esit\n"); if((a != b) && (a != c) && (b != c)) printf("uc sayi birbirinden farklidir\n");

Klavyu.org Sayfa 8


9 if((a) || (b) || (c)) printf("en az bir sayi sifirdan farklidir\n"); system("PAUSE"); return 0; } 5. ev 4. oda: Bit İşlemleri C, değerler üzerinde, bit temelinde işlemler yapabilmek için bazı operatörler sunar. Bunlar; &(bitwise and), |(bitwise or), ^(bitwise XOR) ve ~((1’ s complement) operatörleridir. Örnekler:  A = 10101010, B = 11011011 A & B = 10001010  A = 10101010, B = 11011011 A | B = 11111011  A = 10101010, B = 11011011 A ^ B = 01110001  A = 10101010, B = 11011011 A ~ B = 01010101 EV 6: DÖNGÜLERİN İKİNCİ POSTASI 6. ev 1. oda: while Döngüsü C dilindeki bir diğer döngü, while. Bir mantıksal ifadenin doğru(true) olduğu durumlarda tekrar edilen döngünün genel kalıbı şöyle; while(ifade) C_cümlesi; Bu kalıpta C_cümlesi yerine bir C bloğu da yazılabilir. Parantez içine yazılan ifade doğru olduğu sürece döngü tekrar edilir; ifadenin yanlış olması durumunda döngüden çıkılır. İfadenin doğruluk değeri döngünün baş tarafında sınandığından, eğer döngü yanlış bir değerle başlarsa döngü komutları hiç işlenmeden sonraki cümleye geçilir. /*deneme.c*/ #include <stdio.h> #include <stdlib.h> int main() { int i, j; i = 1; j = 0; while (i < 51){ j = j + i; i = i + 1; } printf("Toplam = %d", j); system("PAUSE"); return 0; } Bu örneğin işleyişi şöyledir. i ve j gibi iki tane integer değişkene 1 ve 0 değerleri atandı. Sonra while döngüsünün ifade kısmında i < 51 olduğu sürece şartı var. Sonra döngümüz iki blok parantez arasını etkileyecek. Blok parantezdekilerin içindekilerden de anlaşılacağı üzere i, sürekli 1 artarak yeni turuna başlıyor. Klavyu.org Sayfa 9


10 En son turu anlatıyorum: i = 50 oldu ifade kısmı doğru, iki blok parantez arasındakileri yap. Yaptı ve tam yeni döngüye başlanacakken i = 51 oldu ve ifade kısmı sağlanmadı ve döngüye girilmeden devam edildi. Yani son durumda i’nin değeri, 51 oldu. Burası önemli iyi algılayın. Aşağıdaki örneği de siz inceleyin. /*deneme.c*/ #include <stdio.h> int main(void) { int i; i = 0; while(i < 100){ printf("%d\n ", i) i++; } printf("\n"); return 0; } 6. ev 2. oda: do-while Döngüsü Evet. Yeni bir döngü daha. for ve while döngüleri göz açıp kapayıncaya kadar geçti. Bunun da genel kalıbı şöyle; do{ C_cümleleri }while(ifade); do-while döngüsünde ifadenin doğruluk değeri bloğun sonunda sınandığından döngü en az 1 kere yapılır. (Hatırlayalım: for ve while döngülerinde başlangıç kısımları yapılmadan geçilebilirdi.) do-while döngüsü koşul ifadenin yanlış oluşuna dek işler. Yanlış olunca döngüden çıkıp devam eder. /*deneme.c*/ #include <stdio.h> #include <stdlib.h> int main() { int i; i = 0; do{ printf("%d ", i); i++; }while(i < 80); printf("\n"); system("PAUSE"); return 0; }

Klavyu.org Sayfa 10


11 Bu örnek 0’dan başlayıp 79’a kadar yazar ekrana. İşin algoritmik olayı şöyle; i diye bir integer değişkene sıfır değeri atandı. Sonra bakın o sıfırı önce ekrana yazdı. Sonra sınama kısmına baktı. Bu olay, sınama kısmı doğru da yanlışta olsa devam eder. Zaten diğer gördüğümüz döngülerden en önemli farkı bu. Sonra döngü olağan şekilde devam eder ve döngü çıkışında printf ile i’yi yazdırırsak 80 olur. Bu da önemli herhalde. 6. ev 3. oda: Döngü İçi Deyimleri(break-continue) Bazen bazı durumlarda döngünün olağan(Yani sınama kısmı sağlanmayana dek) şekilde bitiş koşullarının oluşmasından önce çıkılabilir. C’de ne olursa olsun <<döngünün olağan dışı sona erdirilmesi>> için break deyimi kullanılır. Döngünün break ile kırılmasından sonra işleyiş, döngü cümlesinin(veya bloğunun) ardından gelen C cümlesi ile devam eder. Herhangi bir döngünün <<sıradaki işleyişini atlayarak>> bir sonraki işleyiş ile devam etmesini sağlamak için continue deyimi kullanılır. /*deneme.c*/ #include <stdio.h> #include <stdlib.h> int main() { int a, b; for(a = 1; a < 21; a++) { if(a == 5) continue; b = 2 * a; printf("%d\n", b); } system("PAUSE"); return 0; } Bu örnekte 1’den 20’ye kadar olan döngü işleyişinde, 5 değeri için işlem atlanacaktır. (!)Bilirkişi diyor ki(Ben değil): İyi yazılmış C programları için continue ve(switch hariç) break deyimlerinin kullanımı önerilmez; çünkü bu deyimler, programlama yapısallığını(structured programming) ve okunabilirliğini(readability) olumsuzu yönde etkiler. Yeni konuya geçmeden bu zamana kadar gördüklerimizi kapsayan örnekler çözelim.  1. örnek: Kullanıcıdan 10 tane sayı girmesini isteyen ve girilen bu sayılardan en büyüğünü ekrana yazan bir C programı yazalım. Soruya başlamadan bir önemi noktayı hatırlatmak isterim. C programları yazarken kodlarımızın yanına hatırlatıcı yazılar yazarsak kodların okunurluğu artacaktır. Şu ana kadar yazdıklarımız zaten temel olduğu için herhangi bir yorum yazma ihtiyacı hissetmedik. Şimdi örneğimize geçebiliriz. /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() { int sayici, sayi, enbuyuk; /*3 tane değisken atanır*/

Klavyu.org Sayfa 11


12 sayici = 1, enbuyuk = 0; /*ilk değerler verilir*/ /*işlem kısmı*/ while(sayici <= 10) { printf("%d. Sayiyi girin:", sayici); scanf("%d", &sayi); if(sayi > enbuyuk) /*eğer sayi, enbuyuk'ten buyukse enbuyuge sayiyi ata*/ enbuyuk = sayi; sayici += 1; } printf("Girmis oldugunuz en buyuk sayi: %d", enbuyuk); getch(); /*son*/ } Programımızda temel olarak while ve if gibi önemli C faktörlerini kulandık. Yeşil renkli yazılar yazdıklarımızın, ikinci bir kişi tarafından kolay algılanmasını sağlayacaktır. Bu açıklayıcı yazıların /*…*/ arasına yazıldığı için derleyici tarafından algılanmazlar.  2. örnek: Bu örneğimiz de fonksiyon çağırma ile alakalı olsun. Kullanıcıdan üç tane sayı girilmesini isteyen ve bu sayılardan en büyüğünü ekrana yazdıran bir C programı yazalım. /*deneme.c*/ #include<stdio.h> #include<conio.h> int maksimum(int, int, int); /*fonksiyon prototipi*/ int main() { int a, b, c; printf("3 tamsayi girin:"); scanf("%d%d%d", &a, &b, &c); printf("Maksimum: %d\n", maksimum(a, b, c)); getch(); } /*maksimum fonksiyonun tanımı*/ int maksimum(int x, int y, int z) { int maks = x; if(y > maks) maks = y; if(z > maks) maks = z; Klavyu.org Sayfa 12


13 return maks; } Bu örnekte dikkat ettiyseniz global fonksiyonu farklı bir yere yazdık. Buradan global fonksiyonu, main fonksiyonu dışında istediğimiz bir yere yazabiliriz sonucu çıkıyor.  3. örnek: Bu örnek de yine kullanıcıdan 1 ile 30 arasında tamsayı alan ve bu tamsayı kadar ekrana yıldız simgesi koyan bir program yazmaya çalışalım. /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() { int A, B, C; /*değişken tanımlama*/ for(A = 0; A <= 4; A++){ printf("Sayi girin(1-30 arasinda): "); scanf("%d", &B); for(C = 1; C <= B; C++){ printf("*"); } printf("\n"); } getch(); } Bu örnekte de iç içe döngü yapısını kullandık. EV 7: DİZİLER 7. ev 1. oda: Dizilere(arrays) Giriş Diziler, birbirleriyle ilişkili ve aynı tipte yapılar içeren veri yapılarıdır. Diziler ve yapılar statik yapılardır ve programın çalışması süresince hep aynı boyutta kalırlar. (Ara sıra da otomatik depolama sınıfında olabilirler ve böylece tanımladıkları blokların içine giriş/çıkış esnasında, oluşturulup yok edilebilirler.) Hani program esnasında ‘a’ ilk önce bir değer(mesela 2 ), sonra programın akışına göre de başka bir değer atayıp(mesela 7 ) bir önceki değer(2) kayboluyordu ya artık diziler sayesinde bu sorunun üstesinden geliyoruz. Kısacası bir değişkene(mesela a) istediğimiz kadar değer atayabiliyoruz. Bir dizi, aynı isme ve de aynı tipe sahip olması sebebiyle birbirleriyle ilişkili olan hafıza konumlarının bir grubudur. Bir dizinin içindeki bir elemanı ya da konumu belirtmek için o dizini adını ve elemanın dizi içindeki pozisyonunu belirtmeliyiz. /*deneme.c*/ #include<stdio.h> #include<stlib.h> int main() { int j; int d[10] = {1, 34, 7, 67, 88, 123434};

Klavyu.org Sayfa 13


14 for(j = 0; j < 10; j += 1){ printf("d[%d] = %d\n", j, d[j]); } system("PAUSE"); return 0; } Bu örnekte d[10] dizisi görüldüğü gibi 10 elemanlı bir dizi olacak ve de ilk 6 elemanının değerleri tanımlanmış. ‘Dizinin 7. Elemanı’ ile ‘7. Dizi elemanı ’ arasındaki fark önemlidir. Dizi belirteçleri sıfırdan başladığı için ‘Dizinin 7. Elemanı’ 6 belirtecine sahiptir. ‘7. Dizi elemanı ’ ise 7 belirtecine sahiptir ve aslında dizinin 8.elemanıdır. /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() { int sanal[10],j; for(j = 0; j <= 9; j++) sanal[j] = 0; printf("%s%13s\n", "Eleman", "Deger"); for(j = 0; j <= 9; j++) printf("%7d%13d\n", j, sanal[j]); getch(); } Bu örnekte bir dizinin elemanlarına sıfır değerlerini atadık. Diziler konusuna ileriki bölümlerde daha ayrıntılı olarak değineceğiz. EV 8: C’DE YAPISAL PROGRAM GELİŞTİMEK 8.ev 1.oda: Bir Yerlerden Girmek Lazım! Bir sorunu çözmeden önce, onu anlamak, analiz etmek ve de en doğrusunu bulup planlamak önemlidir. Ben bundan önceki derslerde, direkt sorunları anlamadan bilmeden, planlamadan hazırladım. Çünkü hayatta bazen ilk olan şeyler hata yaparak öğreniliyor(Bu benim düşüncem katılmayabilirsiniz.). Dönemin ilk başlarında bir C projesi açmasını bile bilmeyenler(Ben) için sanki biçilmiş bir kaftan oluyor bu hatalar. Aslında işin aslı -kitaplarda yazılan çizilen-; bu sorun çözme, algılama planlama tekniklerinin daha programlamaya başlamadan verilmesidir. Biz de bu 15 tatili fırsat bilerek bir şeyler anlama adına artılanalım. 8. ev 2. oda: Birazcık Saçmalamadan Sonra ‘ALGORİTMALAR’ Algoritma, ‘Ya bir yol bul, ya bir yol aç, ya da yoldan çekil!’ mantığına dayanan, sorunların çözülmesinde gidilecek yolu bulmaya yarayan felsefi bir şey olsa gerek. Bu algoritma ile çözülmeyen düğüm, sorun yok. Bir problemi veya sorun çıkaran bir şeyi çözerken;  Uygulanacak işlemler ve bu işlemlerin hangi sırada uygulanacağı(olay örgüsü) algoritmadır diyebiliriz. Klavyu.org Sayfa 14


15 Örneğin; Benim yataktan kalkıp okula gidene kadar yapacaklarımın algoritmasını bulalım. Yataktan kalk Pijamalarını çıkar Duş al(Bu her zaman olmayabilir) Giyin Kahvaltı yap(Nadir olur. Bu dönem toplamda 8 kahvaltı yaptım.) Okula doğru yola koyul Bu algoritma, benim okula düzgün bir şekilde gitmemi sağlar. Şimdi de aynı işlemlerin farklı sırada olduğu bir algoritmayı inceleyelim. Yataktan kalk Pijamalarını çıkar Giyin Duş al(Bu her zaman olmayabilir) Kahvaltı yap(Nadir olur. Bu dönem toplamda 8 kahvaltı yaptım.) Okula doğru yola koyul Eğer bu algoritma uygulanırsa okula ıslak bir şekilde gitmiş olurum. Bu örneklere, programlamada program kontrolü denir. Ben de C’nin program kontrol tekniklerinden söylenmeye başlayacağım. 8. ev 3. oda: Sahte Kodlar(Pseudocode) Sahte kodlar, bir programcının algoritma yazmada kullandığı suni ve mantıksal bir dildir. Sahte kodlar, konuşma dilimize oldukça yakındır. Bu kodları, bilgisayarda çalıştırma şansımız yok. Sadece bir C programını yazma sürecinde kullandığımız bir teknik. Sahte kodlar, C kodlarını yazmadan önce onları daha da somutlaştırmamıza yarıyor. Kısaca sahte kodlar, bir program geliştirme aracıdır. Sahte kodlarda sadece işlem ifadeleri yer alır. İşlem ifadeleri, C’ye çevrildiğinde kolayca çalıştırılabilirler. 8. ev 4. oda: Kontrol Yapıları Genelde yazdığımız ifadeler, programa yazıldıkları sıraya göre teker teker çalıştırılırlar. Buna sıralı çalışma denir. Ama bazı C komutları sırayı değiştirmemize yardım eder. Böylece sıradaki ifade yerine istediğimiz ifadeyi çalıştırabiliriz. Buna da kontrolün transferi denir. Sahte kodlar gibi akış grafikleri de, algoritmalar yazmakta kullanılırlar. Ancak sahte kodlar, programcılar tarafından daha yaygın kullanılır. Akış grafiğinde, elmas, dikdörtgen, çember gibi özel şekiller bulunur. 8. ev 5. oda: if Seçim Yapısı Seçme yapısı, bir işin değişik yönlerinden seçim yapma için kullanılır. Mesela bir sınavın geçme notunun 50 olduğunu varsayalım. Eğer(if) öğrencinin notu 50 ya da üstüyse ‘Geçtiniz’ yazdır. Biçimindeki sahte kod öğrencinin notunun 50 ya da üzeri olma durumunun doğruluğunu araştırır. Eğer koşul doğruysa “Geçtiniz” yazdırılır ve diğer sahte koda geçilir. Sahte kodu C koduna kolaylıkla çevirebiliriz. /*deneme.c*/ if(not >= 50) printf(“Geçtiniz”); Klavyu.org Sayfa 15


16 8. ev 6. oda: if / else Seçim Yapısı if yapısı, koşul doğru olduğu sürece belirtilen işi yapıyordu. Yanlış olursa atlıyordu. if / else ise, koşul doğruysa şunları yap; yanlışsa bunları yap diyor. Şu aşağıdaki sahte kodu inceleyelim. Eğer(if) öğrencinin notu 50 ya da üstüyse ‘Geçtiniz’ yazdır. Aksi halde(else) ‘Kaldınız’ yazdır. Yine bu sahte kodu, kolaylıkla C koduna çevirebiliriz. /*deneme.c*/ if(not >= 50) printf(“Geçtiniz”); else printf(“Kaldınız”); 8. ev 7. oda: while Döngüsü Diyelim ki üniversiteyi yeni kazanmış birisi var ve üniversiteye kayıt için gerekli evrakların listesini çıkartmış. Ve yapılacaklar listesinde birden fazla yapması gereken var öyleyse bunun sahte kodu; Yapılacaklar listemde birden fazla yapılacak bulunduğu sürece(while) Bunu yap ve listemden çıkar. Yapılacaklar sırasındaki döngüyü tanımlamaktadır. Burada koşul(yapılacaklar listemde yapılacak olduğu sürece) döngü devam eder. 8. ev 8. oda: Algoritmaları Uygulamak: Durum1 (Sayıcı Kontrollü Döngü) Şimdi algoritmaların nasıl geliştirildiğini görebilmek için klasik sınıf ortalaması bulma problemini çözeceğiz. Diyelim ki; bir sınıftaki 10 kişi sınava girmiş. Notlar(0’dan 100’e kadar tamsayılar) size verilmiş ve bu sınavın sınıf ortalamasını bulmanız istenmiştir. Öncelikle bu problemi, adım adım düşünüp algoritmasını çıkarıp C kodlamasını yapmalıyız. Sahte kodu aşağıdaki gibi olabilir. sayıcı ve toplam değişkenlerine ilk değerler vermek toplamı 0'a, sayıcıyı 1'e ata sayıcı 10'a eşit yada küçükken(while) Diğer notu gir Girilen notu toplama ekle Sayıcıya 1 ekle sınıf ortalamasını 10'a bölerek bul sınıf ortalamasını yazdır 8.ev 9.oda: Adımsal İyileştirmeyle Algoritmaları Uygulamak: Durum 2(Nöbetçi Kontrollü Döngüler) İlk yapmış olduğumuz sınıf ortalaması örneğinde, öğrenci sayısını(10) biliyorduk. Bu sefer öğrenci sayısını bilmeyelim. Programımız kaç tane öğrenci olursa olsun yapmak zorundadır. Pekâlâ, program kaç öğrenci olduğuna nasıl karar verecektir? Programın sonlandığını nasıl bilecektir? Klavyu.org Sayfa 16


17 Burada önemli olan şu ki; veri girişinin(not girişi), sonlandığını belirten özel bir şey(buna nöbetçi değer, sinyal değer, işaretçi değer denir.) kullanmaktır. Bu programı kullanan kişi, veri girmeyi bıraktığı zaman bunu bilgisayara bu nöbetçi değerle bildirir. Nöbetçi kontrollü döngüler, genelde belirsiz döngülerdir. Çünkü sağları solları belli değildir. Döngü çalışmaya başlamadan kaç kere döneceği belli değildir. Nöbetçi değer, her değer olamaz. Diyelim ki kullanıcı, not(0 ile 100 arasındaki tamsayılar olsun) giriyorsa nöbetçi değer 0 ile 100 arasındaki bir tamsayı olmamalıdır. -2, -630, -11, -352 gibi sayılar olsun. Bu tamamen çakışmayı engellemek için yapılmalıdır.  Bizden üzerine kod yazılması istenen şu olsun: Öğrenci sayısı kaç olursa olsun, sınav notları girildiğinde bu notların sınıf ortalamasını veren C programını yazınız. Öncelikle oturup düşünüp bu kodların sahtesini yazmak lazım. Aşağıdaki gibi bir sahte kod yazılabilir. toplam ve sayıcı değişkenini sıfır olarak belirle İlk notu gir Kullanıcı nöbetçi değeri girmediği sürece bu notu o andaki değere ekle sayıcıyı bir arttır sıradaki notu al(bu değer nöbetçi değer olabilir) Eğer(if) sayıcı sıfıra eşit değilse Ortalamayı, notların toplamını sayıcıya bölerek hesapla Ortalamayı yazdır Aksi takdirde(else) 'Not girilmemiştir' yazdır Daha sonra bu sahte kodu derleyiciye uyarlayalım. /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() { float ortalama; /*yeni veri tipi*/ int sayici, not, toplam; toplam = 0, sayici = 0; /*işlem kısmı*/ printf("Notu giriniz(Cikis icin -1) :"); scanf("%d", &not); while(not!=-1) { toplam = toplam + not; sayici = sayici + 1; printf("Notu giriniz(Cikis icin -1) :"); scanf("%d", &not); } /*sonlandırma*/ if(sayici != 0){ ortalama = (float) toplam / sayici;

Klavyu.org Sayfa 17


18 printf("Sinif ortalamasi %.2f", ortalama); } else printf("Hic not girilmemiştir..\n"); getch(); } Eğer bu örnekleri sindirdiysek başka bir örneği de bu mantıkla siz bulabilirsiniz. Soru şöyle: “Benzin fiyatları, son artışla 65 Papua Yeni Gine Doları’ndan 85 Papua Yeni Gine Doları’na çıkmıştı. Artık benzini kaç galon aldığıma dikkat etmeliyim. Ne aldığımı bilerek alıp ona göre harcamalıyım.“ Diyen bir vatandaş bize gelip ”Bana bu benzin harcamalarımı hesaplayıp kontrol etmemde yardımcı olun.“ dedi. Biz de bunun C kodunu yazacağız. Taslak şu şekilde olabilir. Biz bu adamın kaç galon benzin aldığını ve bu benzinle ne kadar yol aldığını biliyoruz. Sadece biz 1 galonla ne kadar kilometre yol alır onu hesaplayacağız. Bir de bu adamın belli bir süre sonra yani ne kadar galon aldığını bilmediğimiz süre sonra birde bunun ortalamasını hesaplayacağız. Artık sahte kod yazmada belli bir yol kat ettiğimizi düşünerek bu sorunun direk C kodlarını yazalım. /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() { float galon, kilometre, ortalama; /*değişkenleri tanımlama*/ int sayici = 0, toplam = 0; /*ilk değerler atanır*/ /*işlem kısmı*/ printf("Kac galon benzin harcadiniz(cikis icin -1):"); scanf("%f", &galon); if(galon == -1) { printf("\n"); printf("Uzgunuz. Herhangi bir veri girmediginiz icin islem yapamiyoruz."); } while(galon != -1){ printf("Kac kilometre yol aldiniz:"); scanf("%f", &kilometre); ortalama = kilometre / galon; printf("Kilometre / galon:%f\n", ortalama); toplam = toplam + ortalama; sayici = sayici + 1; printf("\n"); printf("Kac galon benzin harcadiniz(cikis icin -1):"); scanf("%f", &galon); } if(sayici != 0) /*sonlandırma*/ printf("Toplam ortalama:%f", (float)toplam / sayici); Klavyu.org Sayfa 18


19

getch(); } 8. ev 10. oda: Yukarıdan Aşağıya Adımsal İyileştirmeyle Algoritmalar Yazmak: Durum 3(Yuvalı Kontrol Yapıları) Şimdi bu bölümde yine diğer bölümdeki gibi algoritmamızı yine sahte kod ve yukarıdan aşağıya adımsal iyileştirme ile oluşturup C kodunu yazacağız. Şimdi şu aşağıdaki problemin hikâyesini inceleyelim. Bir kurum öğrencilerini bir sınava hazırlamaktadır. Bu kurumda sınava hazırlanan bir kısım öğrenci geçen sene bu sınava girmiştir. Bu kurumun yöneticileri, öğrencilerinin sınavda ne kadar başarılı olduklarını bilmek istemektedirler. Bunun için sizden sonuçları anlatan bir C programı yazmanızı istemişlerdir ve yöneticiler size geçen sene bu sınava giren 10 kişinin yer aldığı bir liste vermişlerdir. Bu listede ayrıca öğrenci sınavı geçmişse isminin yanında 1, geçememişse 2 yazmaktadır. Programınızın sınav sonuçlarını şöyle analiz etmesi istenmektedir. Siz; 1. Her öğrencinin sınav sonucunu kullanıcıdan isteyeceksiniz ve her yeni sonuç için “Sonucu girin:” mesajı yazdıracaksınız. 2. Her tipte(int, float gibi) sınav sonucunu bulduracaksınız. 3. Kaç öğrencinin sınavı geçtiğini ya da kaldığını özetleyen bir gösterge hazırlayacaksınız. 4. Eğer 8’den fazla öğrenci geçtiyse “yüksek başarı ” yazan bir program hazırlayacaksınız. Yazacağınız programın sahte kodu aşağıdaki gibi olmalıdır. Gecenler değişkenini sıfıra ata Kalanlar değişkenini sıfıra ata ogrenci değişkenini bire ata öğrenci sayısı 10'a 2sit ya da kucukse sınav sonucunu al Eğer öğrenci geçmişse Gecenlere bir ekle Aksi takdirde Kalanlara bir ekle Öğrenci sayısına bir ekle Gecenlerin sayısını yazdır Kalanların sayısını yazdır Eğer 8'den fazla öğrenci geçmişse "Yüksek başarı" yazdır /*deneme.c*/ #include<stdio.h> #include<conio.h> int main() {

Klavyu.org Sayfa 19


20

/*bildirimde değişkenlere ilk değer vermek*/ int gecenler = 0, kalanlar = 0, ogrenci = 1, sonuc;/*sayıcı kontrollü döngü ile sonucların işlenmesi*/ while(ogrenci <= 10){ printf("Sonucu girin(1 = gecti, 2 = kaldi):"); scanf("%d", &sonuc); if(sonuc == 1)/*if/else while içinde yuvalanmış*/ gecenler = gecenler + 1; else kalanlar = kalanlar + 1; ogrenci += 1; } printf("Gecenler %d\n", gecenler); printf("Kalanlar %d\n", kalanlar); if(gecenler > 8) printf("Yuksek basari"); getch(); }

Klavyu.org Sayfa 20


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.