Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
C ve C++ Programlama Dersleri
#1

Sanırım, C ve C++ adını bilgisayarla az çok haşır neşir olan herkes en az bir kez duymuştur. Sizde bu isimleri duyanlardansanız ve nedir, ne değildir, nasıl kullanılır gibi birçok soruya yanıt arıyorsanız, doğru yerdesiniz. Çünkü bu yazıyla başlayarak C ve C++ ile programlamaya gireceğiz. Önce C ile yolumuza koyulup, belli bir olgunluğa ulaştıktan sonra C++ ile devam edeceğiz.

Okuyucularımızın genelini düşünerek, konuyu en temelden almayı daha doğru buldum. Yani hedefimiz, programlamayı hiç bilmeyen bir insanın burada okuduklarıyla belli bir yerlere ulaşması. İleri derece de olanlarsa sıkılmamak için biraz beklemeli. Lafı fazla uzatmadan başlayalım.

Bilgisayar ve Programlama nedir?

Bilgisayar çok basit düşündüğümüzde üç ana görevi yerine getiren bir makinedir. Girilen bilgiyi alır (INPUT), işler (PROCESSING) ve bu işlenmiş veriden bir sonuç (OUTPUT) çıkarır. Bilgisayar, sadece donanım olarak çalışmaz. Çünkü yazılım olmadan, donanım ne yapacağını bilemez. Bilgisayar donanımına ne yapacağını söyleyecek bir komutlar dizisi gerekir. Yapacağı görevleri, ona anlatan komutlara program diyebiliriz. Yani donanıma “sen şunu yap, sonra bulduğun sonucu şöyle şuraya ekle” gibisinden işler yaptırmak programın veya bir başka deyişle yazılımın işidir. Bir programcı olarak bundan fazlasını bilmek elbette ki avantajdır. Ama bilgisayarın bütün özelliklerini bilmeniz gerekmez. Yani yazacağınız bir program için o bilgisayarın özelliklerini bilmeseniz de olur.

Bilgisayarın anladığı tek dil, Makine Dilidir. Bu 16’lık (Hexadecimal) sistemden oluşan bir programlama tipidir. Makine dilini anlamak çok zordur ve bu dili kullanmak için o bilgisayarın donanım özelliklerini mutlaka bilmeniz gerekir. C de ekrana yazı yazmanızı sağlayan “printf();” gibi çok basit bir fonksiyon, makine dilinde 1A BB 0D BC D5 FF C2 F7... gibi çok daha karmaşık ve hiçbir anlam ifade etmeyen bir hâle dönüşür. Makine dili programlama dilleri arasında en alt seviyedir.

Makine dilinden sonra Assembler Dili gelir. Makine dilini kullanmanın zorluğu ve karmaşası üzerine geliştirilen Assembler, daha basit bir yapıdadır. Ama yine de C ile mukayese ederseniz çok daha zordur ve kullandığınız bilgisayarın donanımına dair hâlen bilgiye gereksinim duyarsınız. Assembler aşağıdaki gibi karmaşık bir yapıdadır.

Kod:
SEGMENT COM WORD PUBLIC ‘CODE’
ASSUME CS : COMDS : COM
ORG 100H
ENTRY: MOV DVX,OFFSET MSG
MOV AH,g
.
.
.
Şuan bunu anlamaya çalışıp, hiç zamanınızı harcamayın. Çünkü öğreneceğimiz dil C, işlerimizi ve dolayısıyla hayatımızı çok daha kolaylaştırmaktadır. C, orta seviye bir programlama dilidir. Bunun anlamı, hem yazması kolay, hemde üst seviye dillere göre daha çok erişim hakkınızın olduğudur. Üst seviye programlama dilleri ise BASIC, PASCAL, gibi dillerdir. Üst seviye dillerde, yazması göreceli olarak daha kolay olsa da C ile yapabileceklerimiz daha çoktur.

Program yazmak için ne gerekir?

Program yazabilmek için hiçbir şeye ihtiyacınız yoktur. Program yazmak için Windows’un not defterini veya Linux'da Gedit, Kwrite gibi bir program bile kullanabilirsiniz. Önemli olan yazılan programın derlenmesidir. Derlemeye “compile” ve derleme işini yapan derleyiciyeyse “compiler” denir. C için internet üzerinden birçok Compiler bulabilirsiniz. Ben, program uygulamalarını GCC üzerinden yapacağım. Aynı şekilde bu derleyiciyi kurmanızı tavsiye ederim. GCC gelmiş geçmiş en iyi derleyicilerden biri olduğu gibi, özgür bir yazılımdır! Richard Stallman tarafından açık kaynak koduyla sunulmuştur ve arzu ettiğiniz takdirde, sonuna kadar değişiklik yapma imkanınız vardır.

Şayet Windows işletim sisteminiz varsa GCC'yi kurmanız biraz sıkıntılı olabilir. Basit bir Google araştırmasıyla, Bloodshed Dev-C++ adında bir program buldum. GCC üzerine kurulmuş bir yapısı varmış. GCC ile uğraşmak istemeyen Windows kullanıcıları, bu programı deneyebilir.

Algoritma Geliştirmek

C dilini ve komutlarını öğrenmek, programlamaya başlamak için şarttır ama algoritma oluşturamadığımız sürece bir program oluşturmazsınız. Algoritma, mantıktır. Yani neyi, nasıl yapacağınızı belirtir. Algoritma türetmek için geliştirilmiş bir metot yok. Her program için o metodu sizin bulmanız gerekiyor. Ama hiç merak etmeyin, yazdığınız program sayısı arttıkça, algoritma kurmanız daha kolaylaşır.

Algoritma, programlamanın bel kemiğidir. C dilinde kullanılan komutlar, BASIC veya FORTRAN gibi başka dillerde işe yaramaz. Fakat programlama mantığını bir kere oturttursanız, C komutlarının yerine pekâlâ başka dillere ait komutları da öğrenebilir ve büyük bir zorluk çekmeden diğer dillerde de program yazabilirsiniz.

Basit bir örnek üzerinden düşünelim. Bir markete gittiniz, kasada ki görevliye aldığınız ürünü gösterdiniz, parayı uzattınız, paranın üstünü aldınız. Günlük hayatta gayet normal olan bu durumu biraz değiştirelim. Karşınızda insan değil, elektronik bir kasiyer olsun. Ona göre bir algoritma geliştirirsek,

1-) Ürüne bak;
2-) Ürün Fiyatını bul;
3-) Parayı al;
4-) Alınan paradan ürün fiyatını çıkar;
5-) Kalan parayı ver.

İnsan zekasının otomatik hâle getirdiği eylemleri, ne yazık ki bilgisayar bilmez ve ona biz öğretmek zorundayız. Öğretirken de hata yapma hakkımız yoktur, çünkü yanlış öğreti yanlış programlamayla sonuçlanır.

C Programlama Dili

Temel Giriş/Çıkış İşlemleri (BASIC I/O):

C ile ilgili olarak bu ve önümüzdeki yazılarda birçok komut/fonksiyon göreceğiz. Ama hep kullanacağımız ve ilk öğrenmemiz gerekenler temel giriş çıkış fonksiyonlarıdır. C de klavyeden bir değer alabilmek için scanf(); fonksiyonunu kullanırız. Ekrana herhangi bir şey yazdırmak içinse printf(); fonksiyonu kullanılır.

Bir örnekle görelim;
Kod:
#include<stdio.h>
int main( void )
{
printf("Hello World");
}
Eğer bunu derleyicinizde yazıp derlerseniz ve sonrasında çalıştırırsanız ekrana Hello World yazılacaktır. #include<stdio.h>, standart giriş çıkış başlık dosyasını, programa dahil et gibi bir anlam taşır. C'de (ve hemen hemen bütün diğer programlama dillerinde) bir kütüphaneyi dahil etmek son derece rutin bir iştir. Aksi halde giriş-çıkış fonksiyonlarını dahi her seferinde bizim baştan tanımlamamız gerekirdi.

main( ), bir programdaki ana fonksyiondur. Ondan sonra gelen ayraç standarttır. Bir bloğu temsil eder. İki ayraç işareti arasındaki alan main fonksiyonuna ait bir bloğu oluşturur. printf ise yazdığımız metini, ekrana bastırmaya yarayan, standart bir fonksiyonudur. Çift tırnak işaretleri içersine yazdığınız herşey printf sayesinde ekrana basılır.

Dikkat ettiyseniz, her satır sonuna noktalı virgül koyduk. Aslında her satır değil, her komutan sonra noktalı virgül koyduğumuzu söylemek daha doğru olacak. Çünkü noktalı virgül C dilinde komut ayracı anlamına gelir.

Şimdi yukarıda yazdığımız basit programı, biraz daha geliştirelim:

Kod:
#include<stdio.h>
int main( void )
{
printf("Hello World\n");
printf("Merhaba Dünya");
return 0;
}
Birkaç yeni satır görüyorsunuz. Sırayla ne olduklarını açıklayalım. Az evvel yazdığımız "Hello World" yazısının sonuna "\n" ekledik. "\n" bir alt satıra geç anlamına geliyor. Eğer "\n" yazmazsak, ekranda "Hello WorldMerhaba Dünya" şeklinde bir yazı çıkar. "\n" kullanırsak, "Hello World" yazıldıktan sonra, bir alt satıra geçilir ve ikinci satırda "Merhaba Dünya" yazdırılır. En altta "return 0;" adında yeni bir komut fark etmişsinizdir. Bunu eklemezseniz, program yine çalışır; ancak uyarı verir. Çünkü main fonksiyonu, geriye bir tam sayının dönmesini beklemektedir. Yazmış olduğumuz return ifadesiyle bu uyarılardan kurtulabilirsiniz. Detayına girmek için henüz erken, return konusuna ileride değineceğiz.

Yukarıda ki programın aynısını şöyle de yazabilirdik:

Kod:
#include<stdio.h>
int main( void )
{
printf("Hello World");
printf("\nMerhaba Dünya");
return 0;
}
Bir önce ve şimdi yazdığımız programların ekran çıktısı aynıdır. Bu örnekle anlatmak istediğim, printf( ) fonksiyonunda '\n' konulan yerden sonrasının bir alt satıra düşeceğidir.

#include<stdio.h>
int main( void )
{
printf("Hello World\nMerhaba Dünya");
return 0;
}[/code]
Gördüğünüz gibi tek bir printf( ); kullanarak aynı işlemi yaptırdık.

Varsayalım, ekrana çok uzun bir cümle yazmamız gerekti. Örneğin;

Kod:
#include<stdio.h>
int main( void )
{
printf("Benim adım Doğan Akça ve Yazılım Mühendisiyim.\n");
return 0;
}
Bu yazdığımız program hata vermemesine karşın, çalışma verimini azaltır. Çünkü yazacaklarınız editör penceresine sığmazsa, yazılanı okumak daha zahmetli olur. Önemsiz bir detay gibi gelebilir, ama kod yazma verimini ciddi oranda düşüreceğinden emin olabilirsiniz.

Bu programı aşağıdaki gibi yazmamız daha uygundur:

Kod:
#include<stdio.h>
int main( void )
{
printf("Benim adım "
"Doğan Akça"
"ve Yazılım Mühendisiyim.\n");
return 0;
}
Tek bir printf( ); fonksiyonu kullanılmıştır. Ancak alt alta yazarak, metini tek seferde görülebilir hâle getirdik. Programı derleyip çalıştırırsanız, alt alta üç satır yazılmaz. Cümle bütün olarak gösterilir ve bir önceki örnekle tamamen aynıdır. (Satırların alt alta görünmesini isteseydik; daha önce bahsettiğimiz gibi '\n' koymamız gerekirdi.)

Ekrana, Ali: "Naber, nasılsın?" dedi. şeklinde bir yazı yazdırmamız gerekiyor diyelim. Bu konuda ufak bir problem yaşayacağız. Çünkü printf( ); fonksiyonu gördüğü ilk iki çift tırnak üzerinden işlem yapar. Böyle bir şeyi ekrana yazdırmak için aşağıdaki gibi bir program yazmamız gerekir:

Kod:
#include<stdio.h>
int main( void )
{
printf("Ali: \"Naber, nasılsın?\" dedi.\n");
return 0;
}
printf( ); fonksiyonunu kullanmayı sanırım iyice anladınız. printf( yazıp, sonra çift tırnak açıyor, yazmak istediklerimizi yazıyor, çift tırnağı sonra da parantezi kapatıyor, sonuna noktalı virgül ekliyoruz. Alt satıra geçmek içinse, yazdıklarımızın sonuna '\n' ekliyoruz. Çift tırnaklı bir şey kullanmak içinse \“ ... \” kullanıyoruz. Hepsi bu!

scanf(); fonksiyonuna gelince, bu başında bahsettiğimiz gibi bizim giriş (Input) fonksiyonumuzdur. Ancak yazımı burada noktalıyorum. Çünkü değişkenler işin içine girmekte ve onları anlatmam uzun sürecek.

Bloodshed Dev-C++

Okuyucularımızın bir kısmı, Bloodshed Dev-C++'in kullanımıyla ilgili çeşitli sorunlar yaşamış. Programı nasıl kullanabileceğinize dair ufak bir açıklamayla yazımıza başlamak yerinde olacaktır. ( Bu bölüm C derleyicisi olmayanlara yardımcı olmak için yazılmıştır. Eğer hâli hazırda bir derleyiciniz varsa ve sorunsuz kullanıyorsanız, "Değişken nedir? Tanımı nasıl yapılır?" bölümünden devam edebilirsiniz. )

Dev-C++ kullanımı oldukça basit bir program. Bloodshed Dev-C++ web sitesinin Download kısmından Dev-C++'i indirebilirsiniz. Dilerseniz bu bağlantıya tıklayarak yüklemeniz de mümkün. ( Zaman içinde bağlantı adresi çalışmayabilir. ) Programı başarıyla indirip kurarsanız, geriye yapacak fazla bir şey kalmıyor.

Program menülerinden, File -> New-> Source File yaparak yeni bir kaynak dosyası açın. ( Ctrl + N ile de aynı işlemi yapabilirsiniz. ) Aşağıdaki kodu deneme amacıyla, açtığınız dosyaya yazın:

Kod:
#include<stdio.h>
int main( void )
{
// Hello World yazar.
printf( "Hello World" );
// Sizden herhangi bir giriş bekler.
// Böylece program çalışıp, kapanmaz.
getchar( );
return 0;
}
File -> Save As sekmesiyle, yazdığınız dosyayı kaydedin. ( Ctrl + S ile de kaydedebilirsiniz. ) Dosyanın adını verdikten sonra sonuna .c yazın. Örneğin deneme.c gibi...

Execute -> Compile sekmesine tıklayın. ( Kısayol olarak Ctrl + F9'u kullanabilirsiniz. ) Artık programınız derlendi ve çalışmaya hazır. Execute -> Run ile programınızı çalıştırın. ( Ctrl + F10'u da deneyebilirsiniz. ) Ekrana "Hello World" yazacaktır.

Eğer yazdığınız kodu tek seferde derleyip, çalıştırmak isterseniz, Execute -> Compile & Run yolunu izleyin. ( Bu işlemin kısayol tuşu, F9'dur. )

Yazdığınız kodu nereye kaydederseniz, orada sonu .exe ile biten çalıştırılabilir program dosyası oluşacaktır. Örneğin C:\Belgelerim klasörüne deneme.c şeklinde bir dosya kaydedip, F9'a bastığınızda, deneme.c'nin bulunduğu klasörde deneme.exe diye bir dosya oluşur. Oluşan bu dosyayı istediğiniz yere taşıyabilir, dilediğiniz gibi çalıştırabilirsiniz.

Değişken nedir? Tanımı nasıl yapılır?

Değişkenler, girdiğimiz değerleri alan veya programın çalışmasıyla bazı değerlerin atandığı, veri tutucularıdır. Değişken tanımlamaysa, gelecek veya girilecek verilerin ne olduğuna bağlı olarak, değişken tipinin belirlenmesidir. Yani a isimli bir değişkeniniz varsa ve buna tamsayı bir değer atamak istiyorsanız, a değişkenini tamsayı olarak tanıtmanız gerekir. Keza, a'ya girilecek değer eğer bir karakter veya virgüllü sayı olsaydı, değişken tipinizin ona göre olması gerekirdi. Sanırım bir örnekle açıklamak daha iyi olacaktır.

Kod:
#include<stdio.h>
int main( void )
{
int a;
a = 25;
printf("a sayısı %d",a);
return 0;
}
Şimdi yukarıdaki programı anlamaya çalışalım. En baş satıra, int a -int, İngilizce de integer'ın kısaltmasıdır- dedik. Bunun anlamı, tamsayı tipinde, a isimli bir değişkenim var demektir. a=25 ise, a değişkenine 25 değerini ata anlamına geliyor. Yani, a artık 25 sayısını içinde taşımaktadır. Onu bir yerlerde kullandığınız zaman program, a'nın değeri olan 25'i işleme alacaktır. printf(); fonksiyonunun içersine yazdığımız %d ise, ekranda tamsayı bir değişken değeri gözükecek anlamındadır. Çift tırnaktan sonra koyacağımız a değeri ise, görüntülenecek değişkenin a olduğunu belirtir. Yalnız dikkat etmeniz gereken, çift tırnaktan sonra, virgül koyup sonra değişkenin adını yazdığımızdır. Daha gelişmiş bir örnek yaparsak;

Kod:
#include<stdio.h>
int main( void )
{
int a;
int b;
int toplam;
a = 25;
b = 18;
toplam = a + b;
printf("a sayısı %d ve b sayısı %d, Toplamı %d.\n", a, b, toplam);
return 0;
}
Bu programın ekran çıktısı şöyle olur; a sayısı 25 ve b sayısı 18, Toplamı 43. Yazdığımız bu programda, a, sonra b, üçüncü olarakta toplam ismiyle 3 adet tamsayı değişken tanıttık. Daha sonra a'ya 25, b'ye 18 değerlerini atadık. Sonraki satırdaysa, a ile b'nin değerlerini toplayarak, toplam ismindeki değişkenimizin içersine atadık. Ekrana yazdırma kısmı ise şöyle oldu: üç tane %d koyduk ve çift tırnağı kapattıktan sonra, ekranda gözükme sırasına göre, değişkenlerimizin adını yazdık. printf(); fonksiyonu içersinde kullanılan %d'nin anlamı, bir tamsayı değişkenin ekranda görüntüleneceğidir. Değişkenlerin yazılma sırasındaki olaya gelince, hangisini önce görmek istiyorsak onu başa koyar sonra virgül koyup, diğer değişkenleri yazarız. Yani önce a değerinin gözükmesini istediğimiz için a, sonra b değerinin gözükmesi için b, ve en sonda toplam değerinin gözükmesi için toplam yazdık.

Bu arada belirtmekte fayda var, elimizdeki 3 tamsayı değişkeni, her seferinde int yazıp, belirtmek zorunda değiliz. int a,b,toplam; yazarsakta aynı işlemi tek satırda yapabiliriz.

Şimdi, elimizdeki programı bir adım öteye taşıyalım:

Kod:
#include<stdio.h>
int main( void )
{
int saat;
float ucret, toplam_ucret;
char bas_harf;
printf("Çalışanın baş harfini giriniz> ");
scanf("%c",&bas_harf);
printf("Çalışma saatini giriniz> ");
scanf("%d",&saat);
printf("Saat ücretini giriniz> ");
scanf("%f",&ucret);
toplam_ucret = saat * ucret;
printf("%c başharfli çalışanın, alacağı ücret: %f\n",bas_harf,toplam_ucret);
return 0;
}
Bu yazdığımız program basit bir çarpım işlemini yerine getirerek sonucu ekrana yazdırıyor. Yazılanların hepsini bir anda anlamaya çalışmayın, çünkü adım adım hepsinin üzerinde duracağız. Programı incelemeye başlarsak; değişken tanımını programımızın başında yapıyoruz. Gördüğünüz gibi bu sefer farklı tiplerde değişkenler kullandık. Biri int, diğer ikisi float ve sonuncusunu da char. int'ın tamsayı anlamına geldiğini az evvel gördük. float ise 2.54667 gibi virgüllü sayılar için kullanılır. char tipindeki değişkenler, a,H,q,... şeklinde tek bir karakter saklarlar. Konu biraz karmaşık gözükse de, değişken tanımında bütün yapmanız gereken, değişkeninizin taşıyacağı veriye göre programın başında onun tipini belirtmektir. Bunun için de tıpkı yukarıdaki programda olduğu gibi, önce tipi belirtir, sonra da adını yazarsınız.

Programımıza dönersek, çalışma saati bir tamsayı olacağından, onu saat isminde bir int olarak tanıttık. Ücret virgüllü bir sayı olabilirdi. O nedenle onu float (yani virgüllü sayı) olarak bildirdik. Adını da saatucret koyduk. Farkettiğiniz gibi, toplamucret isimli değişkenimiz de bir float. Çünkü bir tamsayı (int) ile virgüllü sayının (float) çarpımı virgüllü bir sayı olmaktadır. Tabii 3.5x2=7 gibi tam sayı olduğu durumlarda olabilir. Ancak hatadan sakınmak için toplamucret isimli değişkenimizi bir float olarak belirtmek daha doğrudur.

Üsteki programımızda olmasına karşın, şuana kadar scanf(); fonksiyonunun kullanımına değinmedik. scanf(); geçen haftaki yazımızdan da öğrendiğimiz gibi bir giriş fonksiyonudur. Peki nasıl kullanılır, tam olarak ne işe yarar? scanf(); kabaca klavyeden girdiğiniz sayıyı veya karakteri almaya yarar. Kullanımı ise şöyledir: önce scanf yazar, sonra parantez ve ardından çift tırnak açar, daha sonra alınacak değişkene göre, %d, %f veya %c yazılır. %d int, %f float, %c char tipindeki değişkenler için kullanılır. Bundan sonra çift tırnağı kapatıp, virgül koyarsınız. Hemen ardından & işareti ve atanacak değişken adını yazarsınız. Son olarak, parantezi kapatıp noktalı virgül koyarsınız. Hepsi budur.

Yukarıdaki programda da scanf(); fonksiyonu gördüğünüz gibi bu şekilde kullanılmıştır. Sanırım gereğinden çok laf oldu ve konu basit olduğu halde zor gibi gözüktü. Yukardaki sıkıntıdan kurtulmak için çok basit bir program yazalım. Bu programın amacı, klavyeden girilen bir sayıyı, ekrana aynen bastırmak olsun.

Kod:
#include<stdio.h>
int main( void )
{
int sayi;
printf("Değer giriniz> ");
scanf("%d",&sayi);
printf("Girilen değer: %d\n",sayi);
return 0;
}
Gördüğünüz gibi hiçbir zor tarafı yok. Klavyeden girilecek bir tamsayınız varsa, yapmanız gereken önce değişkenin tipini ve adını belirtmek, sonra scanf( ); fonksiyonunu kullanmak. Bu fonksiyonu kullanmaya gelince, scanf(" yazdıktan sonra değişken tipine göre %d, %c, veya %f, yazıp, ardından & işaretini kullanarak atanacak değişkenin adını belirtmekten ibaret. Fark etmişsinizdir, printf(); ve scanf(); fonksiyonlarının her ikisinde de %d koyduk. Çünkü scanf( ); ve printf( ); fonksiyonların değişken tipi simgeleri aynıdır. Aşağıdaki tablodan hangi değişken tipinin nasıl deklare edileceğini, kaç byte yer kapladığını, maksimum/minimum alabileceği değerleri ve giriş/çıkış fonksiyonlarıyla nasıl kullanılabileceğini bulabilirsiniz. Tanımlamalar ve fonksiyon uygulamaları, degisken isimli bir değişken için yapılmıştır.

TİP DEKLARASYON printf( ); scanf( ); Minimum Maksimum Byte
Karakter char degisken; printf("%c",degisken); scanf("%c",&degisken); -128 127 1
Kısa Tam Sayı short degisken; printf("%d",degisken); scanf("%d",&degisken); -32768 32767 2
Tamsayı int degisken; printf("%d",degisken); scanf("%d",&degisken); -32768 32767 2
Uzun Tamsayı long int degisken; printf("%ld",degisken); scanf("%ld",&degisken); -2147483648 2147483647 4
İşaretsiz Tamsayı unsigned int degisken; printf("%u",degisken); scanf("%u",&degisken); 0 65535 2
İşaretsiz Uzun Tamsayı long unsigned degisken; printf("%lu",degisken); scanf("%lu",&degisken); 0 4294967295 4
Virgüllü Sayı float degisken; printf("%f",degisken); scanf("%f",&degisken); 1,17549e-38 3,40282e+38 4
Uzun Virgüllü Sayı double degisken; printf("%lf",degisken); scanf("%lf",&degisken); 2,22504e-308 1,79769e+308 8

Verilen bu değerler; işletim sisteminden, işletim sistemine, farklılık gösterebilir. En doğru değerleri almak için sizeof( ), fonksiyonunu kullanmak gerekir. Aşağıda yazmış olduğum bir program bulacaksınız. Kendi bilgisayarınızda derleyip, çalıştırırsanız, size değişkenlerin boyutunu ve alabileceği maksimum-minimum değerleri verecektir:

Kod:
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main( void )
{    
printf( "\nTIP\t\t BOYUT\t\t MIN\t \tMAX\n" );
printf("==============================================================\n");
printf( "char\t\t: %d byte(s)\t%d\t\t%d\n", sizeof(char),CHAR_MIN,CHAR_MAX );
printf( "short\t\t: %d byte(s)\t%d\t\t%d\n", sizeof(short), SHRT_MIN, SHRT_MAX );
printf( "int\t\t: %d byte(s)\t%d\t%d\n", sizeof(int), INT_MIN, INT_MAX );
printf( "unsigned int\t: %d byte(s)\t\t\t%u\n",sizeof(unsigned),UINT_MAX );
printf( "long\t\t: %d byte(s)\t%ld\t%ld\n", sizeof(long), LONG_MIN, LONG_MAX );
printf( "float\t\t: %d byte(s)\t%e\t%e\n", sizeof(float), FLT_MIN, FLT_MAX );
printf( "double\t\t: %d byte(s)\t%e\t%e\n\n", sizeof(double), DBL_MIN, DBL_MAX );

return 0;
}
Programı inceleyip, detaylara girmeyin. Sadece çalıştırıp, sonuçları görmeniz yeterli. Örneğin, Ubuntu yüklü x86 tabanlı bir bilgisayarda, karşınıza şöyle bir ekran gelecektir:

TIP BOYUT MIN MAX
==============================================================
Kod:
char : 1 byte(s) -128 127
short : 2 byte(s) -32768 32767
int : 4 byte(s) -2147483648 2147483647
unsigned int : 4 byte(s) 4294967295
long : 4 byte(s) -2147483648 2147483647
float : 4 byte(s) 1.175494e-38 3.402823e+38
double : 8 byte(s) 2.225074e-308 1.797693e+308
Sanırım hiç istemediğim bir şey yaparak, kafanızı karıştırdım. Dilerseniz, burada keselim ve bunlar ileriye dönük olarak bir kenarda dursunlar. Yine de daha fazla bilgi isterseniz, Teach Yourself C in 21 Days yazısına göz atabilirsiniz. Ama dediğim gibi bunların sonraya bırakılması, uygun olacaktır.

Şu ana kadar öğrendiklerimizle girilen herhangi iki sayısının ortalamasını hesaplayan bir program yazalım. Başlamadan önce, değişkenlerimizin kaç tane ve nasıl olacağını düşünelim. Şurası kesin ki, alacağımız iki sayı için 2 farklı değişkenimiz olmalı. Bir de ortalamayı hesapladığımızda bulduğumuz değeri ona atayabileceğimiz bir başka değişkene ihtiyacımız var. Peki değişkenlerimizin tipleri ne olacak? Başında belirttiğimiz gibi yazmamız gereken program herhangi iki sayı için kullanılabilmeli. Sadece tamsayı demiyoruz, yani virgüllü bir sayı da girilebilir. O halde, girilecek iki sayının değişken tipi float olmalı. Bunu double da yapabilirsiniz, fakat büyüklüğü açısından gereksiz olacaktır. Ortalamaların atanacağı üçüncü değişkene gelince, o da bir float olmalı. İki virgüllü sayının ortalamasının tamsayı çıkması düşünülemez. Oluşturduğumuz bu önbilgilerle programımızı artık yazabiliriz.

Kod:
#include<stdio.h>
int main( void )
{
float sayi1,sayi2,ortalama;
printf("İki sayı giriniz> ");
scanf("%f%f",&sayi1,&sayi2);
ortalama = ( sayi1 + sayi2 ) / 2;
printf("Ortalama sonucu: %f'dir",ortalama);
return 0;
}
Yukarıda yazılı programda, bilmediğimiz hiçbir şey yok. Gayet basit şekilde izah edersek, 2 sayı alınıp, bunlar toplanıyor ve ikiye bölünüyor. Bulunan değerde ortalama isminde bir başka değişkene atanıyor. Burada yabancı olduğumuz, sadece scanf(); kullanımındaki değişiklik. scanf(); fonksiyonuna bakın. Dikkat edeceğiniz gibi, değişkenlerden ikisine de tek satırda değer atadık. Ayrı ayrı yazmamız da mümkündü, ancak kullanım açısından böyle yazmak açık şekilde daha pratiktir. Bu konuda bir başka örnek verelim. Diyelim ki, biri int, diğeri float, sonuncusuysa char tipinde 3 değişkeni birden tek scanf(); ile almak istiyorum. Değişkenlerin isimleri, d1,d2 ve d3 olsun. Nasıl yaparız?

Kod:
scanf("%d%f%c",&d1,&d2,&d3);
Peki aldığımız bu değişkenleri ekrana tek printf(); ile nasıl yazdırabiliriz?

Kod:
printf("%d %f %c",d1,d2,d3);
Görüldüğü gibi bu işin öyle aman aman bir tarafı yok. Fonksiyonların kullanımları zaten birbirine benziyor. Tek yapmanız gereken biraz pratik ve el alışkanlığı.

Aritmetik Operatör ve İfadeleri

Üste yazdığımız programların hemen hemen hepsinde aritmetik bir işlem kullandık. Ama aritmetik işlemleri tam olarak anlatmadık. Kısaca;

Kod:
( + ) : Artı

( - ) : Eksi

( / ) : Bölme

( * ) : Çarpma

( % ) : Modül
Burada bilinmeyen olsa olsa modül işlemidir. Modül kalanları bulmaya yarar. Yani diyelim ki 15'in 6'ya olan bölümünden kalanını bulmak istiyorsunuz. O halde 15%6 = 3 demektir. Veya, 7'nin 3'e bölümünden kalanı bulacaksanız, o zamanda 7%3 = 1 elde edilir. Bu C'de sıkça kullanacağımız bir aritmetik operatör olacak.

İşlem sırasına gelince, o da şöyle olur. En önce yapılan işlem parantez ( ) içidir. Sonra * / % gelir. Çarpma, bölme ve modül için, soldan sağa hangisi daha önce geliyorsa o yapılır. En son yapılanlarsa artı ve eksidir. Keza, bu ikisi arasında, önce olan solda bulunandır.

Bölme işlemine dair, bir iki ufak olay daha var. 4/5 normalde 0.8 etmektedir. Ancak C için 4/5 sıfır eder. Çünkü program, iki tamsayının bölünmesiyle, sonucu tamsayı elde etmeyi bekler. İleride tipleri birbiri arasında değiştirmeye değineceğiz. Ama şimdilik bu konuda bir-iki örnek yapalım:

Kod:
*    8/4+2 => 2 + 2 => 4
*    8-4*2+-12 => 8 - 8 + -12 => -12
*    15*4/2%4*7 => 60/2%4*7 => 30%4*7 => 2*7 => 14
*    31+7/2-83%5*2-2 => 31+ 3 - 3 * 2 - 2 => 31 + 3 - 6 - 2 => 26
*    (31-7) * 2 + 83 / (5%2) => 24 * 2 + 83 / 1 => 48 + 83 => 131

Bu aritmetik ifadeleri henüz bir C programı için denemedik. Ancak burada keselim. Bunu yapmayı diğer yazımıza saklayalım. Eğer uğraşmak isterseniz klavyeden alınacak 3 sayının ortalamasını bulan bir program yazabilirsiniz. Yada girilecek 2 tamsayı arasında bütün aritmetik işlemleri -ikisin çarpımını, toplamını, birbirine bölümünü ve farkını- bulan ve sonuçları ekrana yazdıran bir program da yazmanız mümkün.

Kodlarınıza açıklama (comment) koymak

Yazılım mühendislerinin en büyük sıkıntısı kod yazmak değildir. Yazılmış bir kodu okuyup anlamak -hele ki büyük bir projeden söz ediyorsak- asıl başınıza bela olacak konudur. Bundan korunmak için kodlarımıza açıklama/yorum koyarız.

C programlama dilinde iki şekilde açıklama koymak mümkündür. Bunlardan bir tanesi, satır bazında yapılır. Diğeriyse, belirli bir bloğu yorumlamaya yarar. Compiler her iki şekilde de, açıklama olarak belirlemiş yerleri işlemeyecektir. Aşağıdaki örnekte satır ve blok olarak, nasıl kodlarınıza açıklama getirebileceğinizi görebilirsiniz:

/*Çok satırlı bir açıklama.
Yıldızlar arasında kalan bütün
alan, yorum olarak değerlendirilir
ve derleyici (compiler) tarafından
işlenmez.
Kod:
*/
#include<stdio.h>
int main( void )
{
//Tek satırlık bir açıklama.
printf("Hello World\n");
}
Cast Operator

Cast operator'un Türkçe karşılığı olacak bir kelime aklıma gelmedi. Ancak cast operatoru şu şekilde açıklayabiliriz. Bir değişken tipini örneğin (Tam sayı-int), bir başka tipe (virgüllü sayı-float) gibi dönüştürmek isterseniz, o zaman cast operator kullanırız.

Aşağıdaki kodu yazıp derleyin.

Kod:
#include<stdio.h>
int main( void )
{
int bolunen = 12, bolen = 8;
float bolum;
bolum = bolunen / bolen;
printf("Sonuc: %f\n",bolum);
return 0;
}
Program çıktısı; "Sonuc: 1.000000" olacaktır:

Normalde 1.5 çıkmasını beklediğiniz sonucun, 0.000000 çıkmasının nedeni casting kullanmamamızdır. Bir tam sayıyı, bir başka tam sayıya bölerseniz, sonuç bir başka tam sayı çıkar. Ve C programlama dili, bir virgüllü sayıyı tam sayıya atamaya kalktığınızda, herhangi bir yuvarlama işlemi yapmadan, virgülden sonrası atar.

Cast Operator şu şekilde kullanılmalıdır: degisken_1 = ( tip ) degisken_2;

Elimizdeki bu bilgiye göre programımızı tekrar yazalım.

Kod:
#include<stdio.h>
int main( void )
{
int bolunen = 12, bolen = 8;
float bolum;
bolum = (float)bolunen / bolen;
printf("Sonuc: %f\n",bolum);
return 0;
}
Sonuç bu sefer, beklediğimiz gibi 1.5 çıkacaktır.

Aşağıdaki örneği inceleyelim:

Kod:
#include<stdio.h>
int main( void )
{
printf("Sonuc: %f\n", 2 / 4);
return 0;
}
Öğrendiğimiz üzere, bunun da sonucu 0.5 yerine, 0 olarak gözükecektir. Sonucu doğru yazdırmak için (float)2/4 şeklinde yazmanız yeterlidir. Ancak dahi basit bir yöntem olarak 2/4.0 veya 2.0/4 yazarsanız yine aynı sonucu elde edersiniz.Çünkü bu durumda sayılardan bir tanesi float olmaktadır.

Kullanılan değişken tiplerinden hangisi büyükse, sonuç o değişkenin tipinde döner. Yüksek değişken bellekte daha fazla yer kaplamaktadır. Bunun doğal bir sonucu olarakta, domine eden o'dur. Değişkenlerin büyüklüğünü daha önceki dersimizde vermiştik. Ancak hatırlamak açısından, aşağıya bakabilirsiniz.

(DÜŞÜK) char <-> int <-> long <-> float <-> double (YÜKSEK)
Çıkan sonucu, daha düşük bir değişken tipine atamaya kalkarsanız, o zaman veri kaybı yaşanır. Ve örneğin float 1.5 olan sonucu int değişkene 1.0 olarak kaydedilir.

Öğrendiklerinizin pekişmesi için bir program yazalım. Bu programda, klavyeden girilen, bir virgüllü sayının, yuvarlanıp, tam sayı olması gösterilsin:

Kod:
#include<stdio.h>
int main( void )
{
float girilen_sayi;
printf("Lütfen bir sayı giriniz> ");
scanf("%f",&girilen_sayi);
printf("Sayının yuvarlanmış hali: %d\n", (int)(girilen_sayi+0.5));
return 0;
}
Koşullu (Conditional) İfadeler

if

Bilgisayarda yapılan bütün mantıksal işlemler kaba bir temele dayanır. Şartlar sağlandığı halde yapılacak işlem belirlenir. Ve şartlar sağlandığında, bu işlemler yapılır. Şartların kontrol edilmesini, C (ve daha birçok) programlama dilinde if operatörünü kullanarak yaparız.

if operatörünün genel kullanım yapısı şu şekildedir:

Kod:
if( koşul ) {
komut(lar)
}
diğer if'in altında birden çok komut varsa, ayraç işareti (veya küme parantezi) koymamız gerekir. Şayet if'ten sonra, tek komut bulunuyorsa, ayraç koyup-koymamak size kalmıştır. Zorunluluğu yoktur.

Örnek bir program yazalım. Bu programda kullanıcının klavyeden, bir tam sayı girsin. Ve bizde girilen sayı, 100'den büyükse, ekrana yazdıralım:

Kod:
#include<stdio.h>
int main( void )
{
int girilen_sayi;
printf("Lütfen bir tam sayı giriniz> ");
scanf("%d",&girilen_sayi);
if( girilen_sayi > 100 )
printf("Girilen sayı 100'den büyüktür\n");
return 0;
}
if-else

Bazı durumlarda, bir koşulun doğruluğuna göre sonuç yazdırmak yetmez. Aksi durumda da ne yapacağımızı belirtmek isteriz. Bunun için if-else yapısını kullanırız.

if-else yapısı şu şekildedir:

Kod:
if( koşul ) {
komut(lar)
}
else {
komut(lar)
}
Önceki yazdığımız programı düşünelim; 100'den büyük olduğunda, ekrana çıktı alıyorduk. Bu programa bir özellik daha ekleyelim ve 100'den küçükse, bunu da söyleyen bir yapıyı oluşturalım:

Kod:
#include<stdio.h>
int main( void )
{
int girilen_sayi;
printf("Lütfen bir tam sayı giriniz> ");
scanf("%d",&girilen_sayi);
if( girilen_sayi > 100 )
printf("Girilen sayı 100'den büyüktür\n");
else
printf("Girilen sayı 100'den küçüktür\n");
return 0;
}
Örnekte gördüğünüz gibi, bir koşulun doğruluğunu program kontrol ediyor ve buna doğru olursa, bazı işlemler yapıyor. Şayet verilen koşul yanlışsa, o zaman daha başka bir işlem yapıyor. Ancak ikisini de yapması gibi bir durum söz konusu değil.Aşağıdaki akış diyagramlarında (flowchart) her iki durumu da görebilirsiniz.




İlişkisel (Relational) Operatörler

Koşullu operatörlerde, koşulun doğruluğunu kontrol ederken kullandığımız ilişkisel operatörler, aşağıda verilmiştir:

Kod:
<    Küçüktür
>    Büyüktür
==    Eşittir
<=    Küçük eşittir
>=    Büyük eşittir
!=    Eşit değildir

Birleşik (Compound) Operatörler

Bazı durumlarda, kontrol edeceğimiz koşul, tek bir parametreye bağlı değildir. Örneğin, bir kişinin yaşının 65'den küçük olup olmadığına bakabiliriz. Ama 65'den küçük ve 18 yaşından büyük olup olmadığına karar vermek istersek, o zaman Birleşik/Birleştirici Operatörler'i kullanmamız uygun olacaktır.

Compound operator'ler aşağıdaki gibidir:

&& and ve
|| or veya
! not tersi

Bu operatörlerin mantıksal (logical) doğruluk tablosu da şu şekildedir:

Kod:
p    q    p&&q    p||q    !p
0    0    0    0    1
0    1    0    1    1
1    0    0    1    0
1    1    1    1    0


Klavyeden alınacak bir değerin, 18 ile 65 arasında olup olmadığını kontrol eden bir program yazınız:

/*
Girilen yaşın, 18 ile 65 arasında
olup olmadığını belirler.
Kod:
*/
#include<stdio.h>
int main( void )
{
int girilen_yas;
printf("Lütfen yaşınızı giriniz> ");
scanf("%d",&girilen_yas);
if( girilen_yas >= 18 && girilen_yas <= 65 )
printf("Girilen yaş, 18 ile 65 arasındadır.\n");
//Girilen yaş 18 ile 65 arasında değilse, aşağıdaki else
//bloğu çalışır.
else {
//Girilen yaş 18'den küçükse
if( girilen_yas < 18 )
printf("Girilen yaş, 18'den küçüktür.\n");
//Girilen yaş 65'ten büyükse
else
printf("Girilen yaş, 65'ten büyüktür.\n");
}
}




Kendisine verilen iki tam sayıyı, bölecek ve sonucu virgüllü sayı olarak gösterecek bir bölme işlemini programı hazırlayınız. (Şayet bölen 0 olarak verilirse, bölme işlemi yapılmamalıdır.)

/*
Kendisine verilen iki tam sayıyla
bölme işlemi yapan program.
Kod:
*/
#include<stdio.h>
int main( void )
{
int bolunen, bolen;
float sonuc;
printf("Bölünecek sayıyı giriniz> ");
scanf("%d",&bolunen);
printf("Bölen sayıyı giriniz> ");
scanf("%d",&bolen);
//Bolen, 0 ise, bir sayı sıfıra bölünemeyeceğinden,
//program sorun çıkartacaktır. Bu yüzden,
//bolenin 0 olmaması kontrol ediliyor.
if( bolen != 0 ) {
sonuc = (float)bolunen / bolen;
//.2f, virgülden sonra 2 basamak gösterilmesi
//içindir.
printf("Sonuc: %.2f\n",sonuc);
}
else
printf("Hata: Sayı 0'a bölünemez!\n");

}
---------------------Ekleme------------------------
İçiçe geçmiş (Nested) İfadeler

Daha önceki yazımızda, koşullu ifadeleri görmüştük. Hatırlatmak için üzerinden geçersek, if ile bir ifadeyi kontrol ediyor ve doğruysa, buna göre işlemler yapıyorduk. Bir de if - else yapısı vardı. if - else yapısında da, koşulu gene kontrol ediyor, doğruysa if bloğunun altında kalanları yapıyorduk; yanlışsa, else bloğunda olan kodlar işleme alınıyordu. Son derece basit bir mantık üzerine kurulmuş bu yapıyla, yapılamayacak kontrol yoktur. Ancak öyle durumlar vardır ki, if - else yapısı yeterli verimliliği sunamaz.

Diyelim ki, birden fazla kontrol yapmanız gereken bir durum oluştu. Hatta örnek vererek konuyu daha da somutlaştıralım. İstenilen bir programda, klavyeden size yaş bilgisi veriliyor. Siz de bu bilgiye göre, şayet yaş 18'den küçükse çocuk; 18-30 yaş arasında genç; 30-50 yaş arasında ortayaş diye bir mesaj bastırıyorsunuz. Basit bir program.

Şimdi bunu sadece if yapısıyla kuruyor olsaydık, her seferinde yaşın uygun aralıklara düşüp düşmediğini kontrol eder ve ona göre sonucu ekrana bastırırdık. Ama bu son derece verimsiz bir yöntem olurdu. Çünkü zaten yaş bilgisinin genç olduğuna dair bir karar vermişsek, sonrasında tutup bunun yaşlı olup olmadığını kontrol etmenin bir esprisi olmayacaktır. Verilebilecek en kötü cevabı aşağıda bulabilirsiniz:

/*
Sorulan soruya verilebilecek en
kötü cevap.
Kod:
*/
#include<stdio.h>
int main( void )
{
int girilen_yas;
printf("Lütfen yaşınızı giriniz> ");
scanf("%d",&girilen_yas);
if( girilen_yas < 18 )
printf("Daha çocuk yaştasınız, hayatın başındasınız.\n");
if( girilen_yas >= 18 && girilen_yas <= 30 )
printf("Gençliğin, güzelliği bambaşka!\n");
if( girilen_yas > 30 && girilen_yas <= 50 )
printf("Hepsini boşverin, olgunluk ortayaşta başlar!\n");
return 0;
}
Yukarda ki kodu if - else kullanarak daha efektif hale getirebiliriz:

/*
if - else yapısıyla daha
efektif bir yapı
Kod:
*/
#include<stdio.h>
int main( void )
{
int girilen_yas;
printf("Lütfen yaşınızı giriniz> ");
scanf("%d",&girilen_yas);
if( girilen_yas < 18 )
printf("Daha çocuk yaştasınız, hayatın başındasınız.\n");
else {
if( girilen_yas >= 18 && girilen_yas <= 30 )
printf("Gençliğin, güzelliği bambaşka!\n");
else {
if( girilen_yas > 30 && girilen_yas <= 50 )
printf("Hepsini boşverin, olgunluk ortayaşta başlar!\n");
}
}
return 0;
}
Yukardaki program daha efektif bir yapı sunmuş olmasına rağmen, eğer kontrol ettiğimiz aralıkların sayısı çok fazla olsaydı, tam bir başbelası olacaktı! Çünkü if - else içinde, bir başka if - else bloğu ve onun içinde bir başkası... bu böyle sürüp gidecekti. Kısacası performans olarak çok bir şey değişmese de, kodu yazan ve/veya okuyacak olan için tam bir eziyete dönüşecekti. İşte bu nedenlerle daha efektif yapılara ihtiyaç duyuyoruz.

if - else if Merdiveni

if - else if merdiveni yukarda verdiğimiz örnekler için biçilmiş kaftandır. if - else if merdiveni, doğru bir şey bulduğu zaman kontrolu orada keser ve diğer koşulları kontrol etmeden blok sonlandırılır.

Aşağıda if - else if yapısını ve akış diyagramını bulabilirsiniz:
Kod:
if( koşul 1 ) {
komut(lar) 1
}
else if( koşul 2 ) {
komut(lar) 2
}
.
.
.
else if( koşul n ) {
komut(lar) n
}
else {
komut(lar) n
}

if - else if ile söylenebilecek son bir şey sonunda ki else'tir. else koymak zorunlu değildir. Ancak hiçbir koşula uymayan bir durumla karşılaştığınızda, else devreye girer. Örneğin yukarda anlatıp, kodunu vermiş olduğumuz programda, belirtilen yaş aralıklarında değer girilmezse, hiçbir şey ekrana bastırılmayacaktır. Çünkü programa tanınmayan yaş aralığında ne yapılacağı öğretilmemiştir. Şimdi bu durumu da içerecek şekilde, programamımızı if - else if yapısıyla tekrar yazalım:

Kod:
#include<stdio.h>
int main( void )
{
int girilen_yas;
printf("Lütfen yaşınızı giriniz> ");
scanf("%d",&girilen_yas);

if( girilen_yas < 18 )
printf("Daha çocuk yaştasınız, hayatın başındasınız.\n");
else if( girilen_yas >= 18 && girilen_yas <= 30 )
printf("Gençliğin, güzelliği bambaşka!\n");
else if( girilen_yas > 30 && girilen_yas <= 50 )
printf("Hepsini boşverin, olgunluk ortayaşta başlar!\n");
else
printf("HATA: Girilen yaş tanımlı değildir!\n");

return 0;
}
swicth - case ifadesi

switch - case, if - else if yapısına oldukça benzer bir ifadedir. Ancak aralarında iki fark vardır. Birincisi, switch - case yapısında, aralık değeri girmezsiniz. Direkt olarak ifadelerin bir şeylere eşit olup olmadığına bakarsınız. İkinci farksa, switch - case yapılarında, illa ki uygun koşulun sağlanmasıyla yapının kesilmek zorunda olmayışıdır. 'break' komutu kullanmadığınız takdirde, diğer şartların içindeki işlemleri de yapma imkanınız olabilir. switch case en tepeden başlayarak şartları tek tek kontrol eder. Uygun şart yakalanırsa, bundan sonra ki ifadeleri kontrol etmeden doğru kabul eder. Ve şayet siz break koymamışsanız, eşitlik uygun olsun olmasın, alt tarafta kalan case'lere ait komutlarda çalıştırılacaktır. if - else if ise daha önce söylemiş olduğumuz gibi böyle değildir. Uygun koşul sağlandığında, yapı dışarsına çıkılır.

switch case yapısında ki durumu, aşağıdaki tabloda görebilirsiniz:

Kod:
switch( degisken ) {
case sabit1:
komut(lar)
[break]
case sabit2:
komut(lar)
[break]
.
.
.
case sabitN:
komut(lar)
[break]
default:
komut(lar);
}



Sanırım gözünüze biraz farklı gözüktü. Yapı olarak şimdiye kadar görmüş olduğunuz if else gibi gözükmese de, bir örnekten sonra arasında pek bir fark olmadığını göreceksiniz. Her komut sonunda koyduğum break komutu, zorunlu değildir ve o nedenle köşeli parantezle belirtilmiştir. break koyduğuz takdirde, uygun koşul sağlandıktan sonra, daha fazla kontrol yapılmayacak ve aynen if - else if yapısında olduğu gibi program orada kesilecektir. Ama break koymazsanız, altında kalan bütün işlemler -bir daha ki break'e kadar- yapılacaktır.

Kodun sonunda gördüğünüz default komutu, if - else if yapısında ki sonuncu else gibidir. Uygun hiçbir şart bulunamazsa, default komutu çalışır.

Öğrendiğimiz bilginin pekişmesi için biraz pratik yapalım. Bir not değerlendirme sistemi olsun. 100 - 90 arası A, 89 - 80 arası B, 79 - 70 arası C, 69 - 60 arası D, 59 ve altıysa F olsun. Eğer 100'den büyük veya negatif bir sayı girilirse, o zaman program hatalı bir giriş yapıldığını konusunda bizleri uyarsın. Bunu şimdiye kadar öğrendiğiniz bilgilerle, if - else if yapısını kullanarak rahatlıkla yanıtlayabilirsiniz. Ama şu an konumuz switch case olduğundan, cevabını öyle verelim:

Kod:
#include<stdio.h>
int main( void )
{
int not;
printf("Lütfen notu giriniz> ");
scanf("%d",&not);
switch( not / 10 ) {
case 10:
case 9: printf("NOT: A\n"); break;
case 8: printf("NOT: B\n"); break;
case 7: printf("NOT: C\n"); break;
case 6: printf("NOT: D\n"); break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: printf("NOT: F\n"); break;
default:
printf("HATA: Bilinmeyen bir değer girdiniz!\n");
}

return 0;
}
Algoritmaya bakalım: Önce sayıyı alıyor ve 10'a bölüyoruz. Yani girilen not, 57 ise 5.7 sonucunu elde ediyoruz. Ancak iki tam sayının sonucu bir virgüllü sayı veremez, tıpkı işleme giren değişkenler gibi tam sayı olarak döner. Dolayısıyla bilgisayarın elde edeceği sonuç, 5.7 değil, sadece 5'tir. switch case yapısında koşullar yukardan başlayarak kontrol ediliyor. case 5'e gelindiğinde eşitlik sağlanıyor. Ama break konmadığı için, switch case'ten çıkılmıyor. Ve altında kalan işlemlerde yapılıyor. Altında herhangi bir işlem veya break olmadığından case 0'a kadar bu böyle sürüyor. Ve case 0'da ekrana bir çıktı alıp switch case yapısı break ile sonlandırılmaktadır.

switch case, if - else if yapısının sunduğu esnekliğe sahip değildir. Daha çok menü olarak sunulacak işlerde kullanılır. Örneğin Unix'in ünlü listeleme komutu ls içersinde, verilen parametrelerin kontrolü switch case kullanılarak sağlanmıştır. Open Solaris, FreeBSD veya Linux kodlarını incelerseniz bunun gibi yüzlerce örnek bulabilirsiniz.

Arttırma (Increment) ve azaltma (decrement) işlemleri

Daha önceki derslerimizde, aritmetik işlemlerden bahsetmiştik. Bunların dışında yapabileceğimiz başka şeylerde bulunmaktadır. Bunlardan biri de, arttırma ve azaltma işlemleridir.

Eğer i adında bir değişkenin değerini 1 arttırmak isterseniz, i = i + 1 olarak yazarsınız. Veya 1 azaltmak isterseniz, benzer şekilde i = i - 1 de yazabilirsiniz. Arttırma ve azaltma işlemleri bu olayı daha basit bir forma sokmaktadır. i = i + 1 yazmak yerine i++ veya i = i - 1 yazmak yerine i-- yazabilirsiniz.

Arttırma ve azaltma işlemleri temelde iki çeşittir. Birinci yöntemde yukarda yazdığımız gibi, arttırma/azaltma sonradan yapılır. İkinci yöntemdeyse arttırma/azaltma ilk başta yapılır. Aşağıdaki örneklere bakalım.

/*
Bu programda, arttırma ve azaltma
işlemleri önce yapılacaktır.
Kod:
*/
#include<stdio.h>
int main( void )
{
int i = 10, j = 60;
printf("i = %d ve j = %d\n", ++i, --j);
return 0;
}
Yukardaki programı yazar ve çalıştırısanız elde edeceğiniz çıktı şu şekilde görünecektir:

i = 11 ve j = 59

Çünkü arttırma ve azaltma işlemleri ekrana bastırmadan önce yapılmış ve i ile j'nin değerleri değiştirilmiştir. Şimdi programı değiştirip şöyle yazalım:

/*
Bu programda, arttırma ve azaltma
işlemleri sonra yapılacaktır.
Kod:
*/
#include<stdio.h>
int main( void )
{
int i = 10, j = 60;
printf("i = %d ve j = %d\n", i++, j--);
return 0;
}
Bu sefer program çıktısı şöyle olacaktır:

i = 10 ve j = 60

Farkettiğiniz üzere hiçbir değişiklik yapılmamış gibi duruyor. Aslında değişiklik yapıldı ve program sonlanmadan önce i 10 olurken, j'de 59 oldu. Ama arttırma ve azaltma işlemleri printf komutu çalıştırıldıktan sonra yapıldığı için, biz bir değişiklik göremedik.

Kısacası önce arttırma (pre-increment) veya önce azaltma (pre-decrement) kullandığınızda, ilgili komut satırında çalışacak ilk şey bu komutlar olur. Ancak sonra arttırma (post increment) veya sonra azaltma kullanırsanız, o zaman bu işlemlerin etkileri ilgili komut satırından sonra geçerli olacaktır. Aşağıdaki özel tabloya bakabilirsiniz:


Form Tip İsim Açıklama
i++ postfix post-increment İşlem sonrası arttırma
++i prefix pre-increment İşlem öncesi arttırma
i-- postfix post-decrement İşlem sonrası azaltma
--i prefix pre-decrement İşlem öncesi azaltma
Gelişmiş atama (Advanced Assignment) yöntemleri

C'de yazım kolaylığı amacıyla sunulmuş bir başka konu da, gelişmiş aşama yöntemleridir. Biraz daha uzun yazacağınız kodu, kısaltmanıza yaramaktadır.

degisken_1 = degisken_1 (operator) degisken_2 şeklinde yazacağınız ifadeleri, daha kısa yazabilmeniz için, degisken_1 (operator) = degisken_2 şeklinde ifade edebilirsiniz. Gelişmiş atamalarda sunulan genel formlar şu şekildedir:

+= , -= , *= , /= , %=
Sanırım aşağıdaki örneklere bakarsanız, konuyu çok daha net anlayacaksınız:

1-) j = j * ( 3 + x ) ==> j *= ( 3 + x )
2-) a = a / ( 5 - z ) ==> a /= ( 5 - z )
3-) x = x - 5 ==> x -= 5
Conditional Operator ( ? )

Türkçe karşılık bulamadığım bir başka C kavramı da, Conditional Operator. Aslında mot a mot çeviri yaparsam, koşullu operatör anlamına geliyor. Ama şu ana kadar gördüğümüz birçok yapıyı da bu şekilde tanımlamak mümkünken, koşullu operatör ifadesini kullanmayı pek tercih etmiyorum. Neyse lafı uzatmayalım...

Conditional Operator, if-else ile tamamen aynı yapıdadır. Hiçbir farkı yoktur. Tek farkı koda bakıldığında anlaşılmasının biraz daha zor oluşudur. Bir de if - else gibi yazıyla ifade edilmez. Onun yerine soru işareti (?) ve iki nokta üst üste ( : ) kullanarak yazarız. Aşağıdaki tabloda if else yapısıyla karşılaştırılmalı olarak, Conditional Operator verilmiştir:

Kod:
if-else Yapısı    Conditional Operator ( ? ) Yapısı
if( koşul ) {
if_komut(lar)
}
else {
else_komut(lar)
}
koşul?if_komut(lar):else_komutlar

Şimdi de aynı programı, hem if-else, hem de conditional operator kullanarak yazalım:

/*
Girilen tam sayının
10'dan büyük olup
olmadığını gösteren
program
Kod:
*/
#include<stdio.h>
int main( void )
{
int sayi;
printf("Lütfen bir sayı giriniz> ");
scanf("%d",&sayi);
if( sayi > 10 )
printf("Sayı 10'dan büyüktür\n");
else
printf("Sayı 10'dan küçüktür veya 10'a eşittir\n");
return 0;
}
Şimdi de aynı programı conditional operator kullanarak yazalım:

/*
Girilen tam sayının
10'dan büyük olup
olmadığını söyleyen
program
Kod:
*/
#include<stdio.h>
int main( void )
{
int sayi;
printf("Lütfen bir sayı giriniz> ");
scanf("%d",&sayi);
( sayi > 10 ) ? printf("Sayı 10'dan büyüktür\n"):
printf("Sayı 10'dan küçüktür veya 10'a eşittir\n");
return 0;
}
Program gördüğünüz gibi biraz daha kısaldı.

Conditional Operator'ler pek kullanmayı sevmediğim bir yapıdır. Çünkü kodun kısa olmasından çok, anlaşılabilir olması önemli. Ve conditional operator kullanmak ne yazık ki, kodu daha karmaşık hale getiriyor. UNIX filozofisinde bir şeyi akıllıca yapacağınıza, temiz/açık yapın diye bir yaklaşım mevcut. Belki bu yüzden veya belki de tembellik, conditional operator'lere alışamadım gitti...

Şimdi örnek sorularımıza gelelim...
Soru 1: Aşağıdaki kodu yorumlayınız:

Kod:
s = ( x < 0 ) ? -1 : x * x






cvp :
Eğer x, 0'dan küçük bir değerse, s değişkenine, -1 değeri atanır. Eğer x, 0'dan büyükse,
x'in karesi, s değişkenine atanır. (Gördüğünüz gibi ilk bakışta kodu yorumlamak biraz
sıkıcı olabiliyor. Sanırım yukarda ne demek istediğimi anlamışsınızdır.)

İki tam sayı alacak ve verilecek operatöre göre (+, -, *, /, %) işlem yapacak bir program yazınız.





Kod:
#include<stdio.h>
int main( void )
{
int sayi_1, sayi_2;
char operator_simgesi;
printf("Lütfen işlem simgesi giriniz> ");
scanf("%c",&operator_simgesi);
printf("Lütfen birinci sayıyı giriniz> ");
scanf("%d",&sayi_1);
printf("Lütfen ikinci sayıyı giriniz> ");
scanf("%d",&sayi_2);
switch( operator_simgesi ) {
case '+':
printf("%d %c %d = %d\n",sayi_1,operator_simgesi, sayi_2, sayi_1 + sayi_2); break;
case '-':
printf("%d %c %d = %d\n",sayi_1,operator_simgesi, sayi_2, sayi_1 - sayi_2); break;
case '%':
printf("%d %c %d = %d\n",sayi_1,operator_simgesi, sayi_2, sayi_1 % sayi_2); break;
case '*':
printf("%d %c %d = %d\n",sayi_1,operator_simgesi, sayi_2, sayi_1 * sayi_2); break;
case '/':
printf("%d %c %d = %.2f\n",sayi_1,operator_simgesi, sayi_2, (float)sayi_1 / sayi_2);break;
default:
printf("HATA: Tanımsız bir operatör girdiniz!\n");
}
return 0;
}
---------------------Ekleme------------------------
C Programlama Dersi - V


Döngü Kavramı

Programlama konusunda -hangi dil olursa olsun- en kritik yapılardan biri döngülerdir. Döngüler, bir işi, belirlediğiniz sayıda yapan kod blokları olarak düşünülebilir. Ekrana 10 kere "Merhaba Dünya" yazan bir programda, "Merhaba Dünya" yazdıran kodu aslında tek bir defa yazarsınız, döngü burada devreye girip, sizin için bu kodu istediğiniz sayıda tekrarlar.

Döngüleri bu kadar kritik yapan unsur; iyi yazılıp, optimize edilmediği takdirde, bilgisayarınızın işlem gücünü gereksiz yere tüketmesi ve harcanan zamanı arttırmasıdır. Benzer şekilde, iyi yazılmış bir döngü, programınızı hızlı çalıştıracaktır.

Bütün döngüler temelde iki aşamayla özetlenebilir. Aşamalardan biri, döngünün devam edip etmeyeceğine karar verilen mantıksal sorgu kısmıdır. Örneğin, ekrana 10 kere "Merhaba Dünya" yazdıracaksanız, kaçıncı seferde olduğunu, koşul kısmında kontrol edersiniz. Diğer aşama, döngünün ne yapacağını yazdığınız kısımdır. Yani ekrana "Merhaba Dünya" yazılması döngünün yapacağı iştir.

Döngünün devam edip etmeyeceğine karar verilen aşamada, hatalı bir mantık sınaması koyarsanız, ya programınız hiç çalışmaz ya da sonsuza kadar çalışabilir.

C programlama diline ait bazı döngüler; while, do while, for yapılarıdır. Bunlar dışında, goto döngü elemanı olmasına rağmen, kullanılması pek tavsiye edilmemektedir.

while Döngüsü

while döngüsü, en temel döngü tipimizdir. Bir kontrol ifadesiyle döngünün devam edilip edilmeyeceği kontrol edilirken, scope içinde ( yani ayraç işaretleri arasında ) kalan bütün alan işleme sokulur. İşleme sokulan kod kısmı döngü yapılacak adet kadar tekrar eder.

while döngüsünün genel yapısını ve akış şemasını aşağıda görebilirsiniz:
while Yapısı while
while( koşul ) {
komut(lar)
}

while Akış Diyagramı


Yukarda 10 kere ekrana "Merhaba Dünya" yazan programdan bahsettik. Gelin bir anlaşma yapalım ve döngülerle alakalı bütün ilk örneklerimiz bu programın nasıl yazılacağını göstersin.

while döngüsü kullanarak, ekrana 10 kere "Merhaba Dünya" yazan program aşağıdaki gibidir:

/*
Ekrana 10 kere "Merhaba Dünya"
yazan program
Kod:
*/
#include<stdio.h>
int main( void )
{
//i değişkenine bir başlangıç değeri atıyoruz.
//i'ye ilk deger atanmazsa, döngümüz yanlış çalışır.
int i = 0;
//i'nin degeri kontrol işleminden
//sonra 1 artar.
while( i++ < 10 ) {
//2d bir tam sayının yazdırılacağı
//ancak bu sayı tek rakamdan oluşsa da
//2 rakamlık yer ayırılmasını belirtir.
printf("%2d: Merhaba Dünya\n",i);
}
return 0;
}
Yukardaki program aslında son derece basit. i değişkenine ilk değer olarak 0 atıyoruz. Daha sonra, while döngüsüne başlıyoruz. İfadenin doğruluğu ( yani i'nin 10'dan küçük olup olmadığı) kontrol ediliyor. Eğer doğruysa, döngü içindeki kodların çalışması başlatılıyor. Elbette kodların başlamasından bir önceki adımda, i değişkeni arttırılıyor. ( Önceki derste anlatmış olduğumuz post-increment işlemini hatırlayın. ) Bu yapı toplamda 10 kere tekrar ediyor ve en sonunda i'nin degeri 10'a eşit olunca, döngü sonlandırılıyor.
http://www.cagataycebi.com/programmi...on_example.png
Yandaki işlem basit bir toplama ifadesidir. Yanda gördüğümüz ifade de, n değerini kullanıcıdan alacağımızı düşünerek bir program yazalım. Bu program, alacağı n değerine göre, kendisine kadar olan sayıların karelerinin toplamını gösterecektir. Bu programı yazarsak:

Kod:
#include<stdio.h>
int main( void )
{
int i = 0, toplam_deger = 0;
int n;
printf("Lütfen n değerini giriniz> ");
scanf("%d",&n);
while( i <= n ) {
toplam_deger += i*i;
i++;
}
printf("Sonuç: %d\n",toplam_deger);
return 0;
}
do while Döngüsü

Göreceğimiz ikinci döngü çeşidi, do while döngüsüdür. Yaptığı iş, while ile hemen hemen aynıdır; verilen işi, döngü koşulu bozulana kadar sürdürür. Ancak while'a göre önemli bir farkı vardır.

while döngülerinde, döngü içersindeki işlem yapılmadan önce, sunulan koşul kontrol edilir. Şayet koşul sağlanmıyorsa, o while döngüsünün hiç çalışmama ihtimali de bulunmaktadır. do while döngülerindeyse, durum böyle değildir. İlk çalışmada koşul kontrolü yapılmaz. Dolayısıyla, her ne şartta olursa olsun, döngünüz -en azından bir kere- çalışacaktır.

Bazı durumlarda, döngü bloğu içersindeki kodların en azından bir kere çalışması gerektiğinden, do while yapısı kullanılır. do while ile ilgili genel yapıyı ve akış şemasını aşağıda bulabilirsiniz:
do while Yapısı
do {
komut(lar)
} while( koşul );

do while Akış Diyagramı


Önce Merhaba Dünya örneğimizi yapalım:

Kod:
#include<stdio.h>
int main( void )
{
int i = 0;
do {
//Önce i'nin değeri arttırılıyor
//sonra ekrana Merhaba Dünya yazdırılıyor.
printf("%2d: Merhaba Dünya\n",++i);
} while( i < 10 );
return 0;
}
Gördüğünüz gibi, bir önceki örneğimize oldukça benzer bir yapıda, yazıldı. Tek fark i'nin değeri 0'da olsa, 1000'de olsa, en azından bir kez Merhaba Dünya'nın yazılacak olmasıdır. Ancak while'de kontrol önce yapıldığı için, hiçbir şey ekrana yazılmaz.

Şimdi do while'in kullanılmasının daha mantıklı olacağı bir program yapalım. Kullanıcıdan iki sayı alınsın. Bu iki sayı toplandıktan sonra, sonucu ekrana yazdırılsın. Yazdırma sonunda "Devam etmek istiyor musunuz?" sorusu sorulsun ve klavyeden 'E' veya 'e' karakterlerinden birisi girilirse, program devam etsin. Yok farklı birşey girilirse, program sonlandırılsın. Örnek programımızı aşağıda bulabilirsiniz:

Kod:
#include<stdio.h>
int main( void )
{
int sayi_1, sayi_2;
char devam_mi;
do {
printf("Birinci sayıyı giriniz> ");
scanf("%d",&sayi_1);
printf("İkinci sayıyı giriniz> ");
scanf("%d",&sayi_2);
printf("%d + %d = %d\n", sayi_1, sayi_2, sayi_1 + sayi_2);
printf("Devam etmek ister misiniz? ");
//C'de tek karakter okuma işlemi biraz sıkıntılı
//olduğundan, burada da bir do while kullandık.
do {
scanf("%c",&devam_mi);
}while( devam_mi == '\n' );
printf("\n");
} while( devam_mi == 'E' || devam_mi == 'e' );

Kod:
return 0;
}
Program, kullanıcıdan iki sayı alıp, toplamını ekrana bastıktan sonra, yeniden işlem yapıp yapmak istemediğimizi sormaktadır. Bu programı while ile de yazabilirdik. Ancak while ile yazabilmek için, devam_mi değişkenine önceden 'E' değerini atamamız gerekmekteydi. do while döngüsündeyse, bu zorunluluğa gerek kalmamıştır.

Not: Yukardaki programda, farketmiş olduğunuz gibi karakter okumayı biraz farklı yaptık. Normalde, scanf( ) fonksiyonunu kullanmak yeterliyken, burada, işin içine bir de, do while girdi. Açıklayacak olursak, C'de karakter okumaları, biraz sıkıntılıdır. Eğer giriş tampon belleğinde (Buffer) veri bulunuyorsa, bu direkt karaktere atanır. Bundan kurtulmak için birçok yöntem olduğu gibi, uygulanabilecek bir yöntem de, yukarda yazılmış olan döngü şeklinde değer almaktır. Çünkü siz daha bir şey girmeden, ilk değer '\n' geleceğinden, döngünün ikinci çalışmasında, doğru değer atanacaktır. İlerki konularda, daha detaylı ele alacağımız bir problem olarak şimdilik önemsemeyelim. Sadece karakter okuyacağınız zaman problem çıkarsa, yukardaki gibi bir yöntem uygulanabileceğini bilmeniz -şimdilik- yeterli.

for Döngüsü

while ve do while dışında, üçüncü bir döngü tipi olarak, for yapısı bulunmaktadır. Diğer iki döngüden farklı olarak, for yapısı, yenilemeli-tekrarlamalı (İngilizce iterative) yapılarda kullanıma daha uygundur. Bunu performans anlamında söylemiyorum. Demek istediğim yazım tekniği olarak, for döngüsünün daha kullanışlı olmasıdır. Örneğin birbirini, sürekli tekrar eden işlemlerin yapıldığı Nümerik Analiz gibi alanlar, for döngüsü için iyi bir örnek olabilir. Ancak bu dediklerim sizi yanıltmasın; for döngüsü sadece soyut alanlarda çalışsın diye yaratılmış bir şey değildir.

Programlarda, diğer iki döngüden çok daha fazla for kullanırsınız. Çünkü for sadece matematiksel hesaplama işlemlerinde değil, diziler ( array ) gibi konularda sürekli kullanılan bir yapıdır. Yazımı diğerlerine nazaran daha sade olduğundan, iteratif işlemlerde kullanılması elbette ki tesadüf olarak düşünülemez.

Aşağıda for döngüsünün genel yazımını ve akış diyagramını göreceksiniz:
for Yapısı
for( ilk_deger_atama; koşul; arttırma/azaltma ){
komut(lar)
}

for Akış Diyagramı

İlk atacağımız adım; elbette ki ekrana 10 kere "Merhaba Dünya" yazdırmak olacak. ( Umarım bu Merhaba Dünya'larla sizi fazla sıkıp, programlama işinden vazgeçirmemişimdir. Programlama mantığını kaptıktan sonra, dünyayı daha farklı görmeye başlayacak ve Merhaba Dünyalar'ın sebebini daha iyi anlayacaksınız. Ve inanın bütün bu eziyete değer... ) Buyrun programımız:

Kod:
#include<stdio.h>
int main( void )
{
int i;
for( i = 0 ; i < 10; i++ ) {
printf("%2d: Merhaba Dünya\n",(i+1));
}
return 0;
}
Gördüğünüz gibi çok daha sade ve açık gözükür bir kod oldu. for altında tek satır komut olduğundan, küme parantezleri koymamız opsiyoneldi ama ne yaptığınızı karıştırmamak için, her zaman koymanızı öneririm.

for döngüleriyle ilgili bazı özel durumlarda vardır. for döngüsü içersine yazdığınız ilk değer atama, kontrol ve arttırma işlemlerini tanımlama esnasında yapmanız gerekmez. Aşağıda verilen kod, yukardakiyle tamamen aynı işi yapar. Farkı, i'nin daha önce tanımlanmış olması ve arttırma/azaltma işinin döngü içinde yapılmasıdır.

Kod:
#include<stdio.h>
int main( void )
{
int i;
i = 0;
for( ; i < 10; ) {
printf("%2d: Merhaba Dünya\n",(i+1));
i = i + 1;
}
return 0;
}
break Komutu

Bazı durumlarda, döngüyü aniden sonlandırmak isteriz. Bunun için 'break' komutunu kullanırız. Döngüyü aniden sonlandırmak veya döngüyü kırmak işlemini, zaten daha önce switch case'lerde kullanmıştık. Bahsetmediğimiz şey, bunun her döngü içersinde kullanılabileceğiydi.

Aşağıdaki programı inceleyelim:

Kod:
/*
0 ile 99 arasında tesadüfi sayılar üreten
bir programın, kaçıncı seferde 61 sayısını
bulacağını yazan program aşağıdadır.
Kod:
*/
#include<stdio.h>
int main( void )
{
int i,tesadufi_sayi;
int deneme_sayisi = 0;
//while içinde 1 olduğundan sonsuza kadar döngü çalışır.
while( 1 ){
//tesadufi_sayi değişkenine, 0 ile 99 arasında
//her seferinde farklı bir sayı atanır.
//rand( ) fonksiyonu tesadüfi sayı atamaya yarar.
//mod 100 işlemiyse, atanacak sayının 0 ile 99
//arasında olmasını garantiler.
tesadufi_sayi = rand() % 100;
//Döngünün kaç defa çalıştığını deneme_sayisi
//değişkeniyle buluruz.
deneme_sayisi++;
//Eğer tesadufi sayı 61'e eşit olursa,
//döngü kırılıp, sonlandırılır.
if( tesadufi_sayi == 61 ) break;
}
printf("Toplam deneme sayısı: %d\n",deneme_sayisi);
return 0;
}

Program için koyulmuş açıklamalar ( comment ) zaten neyin n'olduğunu açıklıyor. Kısaca bir şeyler eklemek gerekirse, bitişinin nerede olacağını bilmediğimiz bir döngüyü ancak, break komutuyla sonlandırabiliriz. Şartlar sağlandığında, break komutu devreye girer ve döngü sonlandırılır. Bunun gibi bir çok örnek yaratmak mümkündür.

continue Komutu

break komutunun, döngüyü kırmak için olduğundan bahsetmiştik. Bunun dışında işlem yapmadan döngüyü devam ettirmek gibi durumlara da ihtiyacımız vardır. Bunun içinde continue ( Türkçe: devam ) komutunu kullanırız.

Kod:
/*
Sadece tek sayıları yazdıran bir
program
Kod:
*/
#include<stdio.h>
int main( void )
{
int i;
for( i = 0; i < 10; i++ ) {
//i değişkeninin 2'ye göre modu
//0 sonucunu veriyorsa, bu onun
//bir çift sayı olduğunu gösterir.
//Bu durumda ekrana yazdırılmaması
//için döngü bir sonraki adıma geçer.
if( i%2 == 0 ) continue;
printf("%2d\n",i);
}
return 0;
}

0 ile 10 arasındaki tek sayıları gösteren program örneğini yukarda görebilirsiniz. Elbette ki bu işi daha farklı ve daha iyi yapan bir program yazabilirdik. Ama şimdilik continue komutunun nasıl kullanıldığını inceleyelim.

Program bir for döngüsü çalıştırmaktadır. Her defasında i değişkenin 2'ye göre modu alınır. Eğer sonuç 0'sa, bu sayının çift olduğunu gösterir. Dolayısıyla, bunun ekrana yazdırılmaması gerekir. Bu yüzden, döngü içersindeki işlemleri sürdürmek yerine, altta kalan kodları atlarız. Burada continue komutu kullanılır ve kullanıldığı noktadan itibaren olan işlemler yapılmaz. Döngü başa döner, aynı işlemleri yapar. Bu sefer i tek sayı olacağından continue komutu çalışmaz ve sayıyı ekrana bastırırız.

goto Yapısı

C programlama dilinde bulunan bir başka yapı, goto deyimidir. Koyacağınız etiketler sayesinde, programın bir noktasından bir başka noktasına atlamanızı sağlar. goto, bir döngü değildir ancak döngü olarak kullanılabilir.

goto, çalışabilmek için etiketlere ihtiyaç duyar. Etiketler, vereceğiniz herhangi bir isme sahip olabilir. Etiket oluşturmak için bütün yapmanız gereken; etiket adını belirleyip, sonuna iki nokta üst üste eklemek (exciting ve programın herhangi
Beğenenler: YellowBlack , BYHAKLİRT
#2
reiz şimdi olmusmu
Beğenenler:
#3
(01-11-2013, Saat: 19:04)LuckMania Adlı Kullanıcıdan Alıntı: reiz şimdi olmusmu

eline sağlık ;)
İnsɑnlɑr değişmez değişen tek şey şɑrtlɑr ve çıkɑrlɑr...
Beğenenler:
#4
Eyw exciting Gozune Gırıyorum Demı exciting
Beğenenler:
#5
kardesim yazı renginde açık bi ton kullansan okuyucu için cok iyi olur
Beğenenler:
#6
çok iyi
Beğenenler:
#7
ÇOK İYİ EMEGİNE SAGLIK ..!! kiss
Beğenenler:

Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  C# Setup Programlama Umutesmer 4 294 28-02-2016, Saat: 00:08
Son Yorum: Umutesmer
  Programlama Derslerine Giriş (C#, Arduino...) Pentathlon 3 285 24-02-2016, Saat: 22:32
Son Yorum: Umutesmer
Anahtar Kelimeler

C ve C++ Programlama Dersleri indir, C ve C++ Programlama Dersleri Videosu, C ve C++ Programlama Dersleri Online izle, C ve C++ Programlama Dersleri Bedava indir, C ve C++ Programlama Dersleri Yükle, C ve C++ Programlama Dersleri Hakkında, C ve C++ Programlama Dersleri Nedir, C ve C++ Programlama Dersleri Free indir, C ve C++ Programlama Dersleri Oyunu, C ve C++ Programlama Dersleri Download


1 Ziyaretçi