Genel C anlatımı hakkındaki 3. yazımızla karşınızdayız, Hızımızı artırıyoruz :) Bu yazımızda kontrol yapıları ve fonksiyon kullanımı hakkında bilgiler aktaracağız.

KONTROL YAPILARI

IF,ELSE,ELSE IF

if kontrol yapısı istenilen durumun oluşup oluşmadığının kontrolü için kullanılır. if, else ile beraber kullanılabileceği gibi yalnız başına da kullanılabilir.

if(koşul)
{
yapılacaklar
....
....
}

örnek

int a,b,c;   // a,b,c değişkenleri 1 Byte integer
a = 5;
b = 8;
c = 15;

if(b > a)  // b değeri a dan büyük mü?
{
printf("b sayısı a sayısından büyük");   // evet b a'dan büyük 8 > 5
}

if((a == 5) && (b == 8)) // a değeri 5' eşit ve b değeride 8'e eşit mi?
{
printf(" a degeri 5'e ve b degeri 8'eşit");
}

if((b > a) || (c > a))  // b a'dan büyük veya c a'dan büyük mü?
{
printf(" b veya a'dan en az biri c'den büyük");
}

if‘in else ile beraber kullanımı

int a,b,c;   // a,b,c değişkenleri 1 Byte integer
a = 1;
b = 2;
c = 3;

if(a > b)   // a değeri b değerinden büyük mü?
{
printf(" a değeri b değerinden büyük);
}
else   // a değeri b'den büyük değilse
{
printf(" a değeri b değerinden büyük değil);
}

if((a== 1) && (b > 1)) // a =1 ve b > 1 mi?
{
printf(" a değeri = 1 ve b değeri 1'den büyük);
}
else   // a = 1 ve b > 1 şartı sağlanmıyor
{
printf(" a değeri 1'e eşit değil veya b değeri 1'den büyük değil");
}

if, else if, else birlikte kullanımı

int a,b,c;
a = 1;
b = 5;
c = 15;

if(a==1){  // a = 1 ise
printf("a değeri 1'e eşit");
}
else if(a == 5)  //a=1 değil , a = 5 ise
{
printf("a değeri 5'e eşit");
}
else // a değeri 1 veya 5 değerlerinden farklıysa
{
printf("a değeri 1 ve 5 den farklı");
}

kullanabileceğiniz else if adedinde sınırlama yoktur

if(koşul-1){
}
else if(koşul-2) {
}
else if(koşul-3) {
}
....
else if(koşul-n){
}
else {
}

if kullanılırken koşul belirtilmeyebilir. Bu durumda parantez içerisine yazılan değer Sıfır’dan farklı ise koşul doğru olur.

int a=15;
int b=0;

if(a) // koşul doğru olur çünkü a sıfırdan farklı.
{
...
}

if(b) // koşul yanlış olur çünkü b 0 dan farklı değil
{
..
}

Yukarıdaki örnekte bir değerin sıfırdan büyük olup olmadığını kontrol etmiştik, aynı şekilde Sıfır olup olmadığınıda başına ! işareti koyarak test edebiliriz.

int a=15;
int b=0;

if(!a) // koşul doğru olur çünkü a sıfırdan farklı.
{
...
}

if(!b) // koşul doğru olur çünkü b değeri 1 den farklı
{
..
}

Çok sık kullanılmasa da C dilinde değişkenlere koşula bağlı atama yapabileceğiniz hoş bir yapı vardır. aşağıdaki örnek üzerinden bu yapıyı anlatalım

degisken = (koşul) ? koşul dogruysa alacağı değer : koşul yanlışsa alacağı değer

int a=10;
int b;
b = (a > 5) ? 6 : 16;   // a > 5 ise b=6, değilse b = 16 yap

Yukarıdaki örnek şu manaya gelir, eğer a değeri 5 ten büyük ise b değerine 6 değerini ata, a 5 ten büyük değilse b değerine 16 ata.

int a = 3;
int b;
b = (a > 5) ? a*2:a+2

a 5 ten küçük ise b değerine a’nın iki katını ata, değilse a’nın iki fazlasını ata. Örneğimizde a değeri 5′ten küçük olduğu için b = a*2 = 6 olur.

SWITCH-CASE YAPISI

switch(deger)
{
case a: işlemler
.....
break;
case b: işlemler
.....
break;
case c: işlemler
.....
break;
.
.
.
default: işlemler
...
break;
}

Örnek

int a,b,c;
int yas = 20;

switch(yas)    // yaş değişkeninin değerine bak
{
//yaş değeri 1 ise
case 1:  printf("daha bebek yaştasın");    // bu yazıyı yaz
break; // yapının sonuna git
case 20: printf("Askerlik çağına gelmişsin");  // yaş değeri 20
break; // yapının sonuna git
case 35: printf("Bu yaşa yolun yarısı deniliyor");
break; // yapının sonuna git
default:  printf("Yaşın 1,20,30 dan farklı");
break; // yapının sonuna git
}

Yapı içerisinde istediğiniz kadar case kullanbilirsinizr, default: belirtilen durumların oluşmaması halinde işletilecek kodu belirtmek için kullanılır, kullanılması zorunlu değildir.

Başka bir örnek

int menu = 0;
while(TRUE)
{
siwtch(menu)
{
case 0: baslangic();
++menu;
break;
case 1: ayarlar();
++menu;
break;
case 2: bilgi();
menu = 0;
break;
}
}
}

DÖNGÜLER

FOR DÖNGÜSÜ

for döngüsü şu şekilde oluşturulur.

for(başlangıç değeri ;koşul; yapılacaklar)
{
işlemler.
...
...
}

örnek

int i;
for(i=0;i<;10;++i) {// i 0'dan başlayacak ve 10 değerinden
// küçük olduğu müddetçe döngü devam edecek
// her adımda i değeri 1 artırılacak
printf("i değeri = %drn",i);
}

Yukarıdaki örnekte aşağıdaki gibi bir çıktı verir
i degeri = 0
i degeri = 1
i degeri = 2
...
...
...
i degeri = 9
i degeri = 10

Değişik kullanım örnekleri

for( i = 0; i<100;i+=2)  // i değeri her adımda 2 artıyor. 50 adımlık döngü
for( i = 10; i>;0; --i) // i 10'dan başlayacak ve her adımda 1 azaltılacak

WHILE DÖNGÜSÜ

While döngüsü belirli bir şart doğru olduğu sürece istenilen işlemleri yapmak için kullanılır

while(koşul)
{
işlemler
...
...
}
int a = 0;
while(a != 50)  // a değeri 50 den farklıysa
{
++a;   // a'yı 1 artır
}

Yukarıdaki örnekte, a değeri ilk olarak sıfırdır ve 50 den farklı olduğu için ++a; komutu işler ve a değeri 1 olur. bu değer de 50 den farklı olduğu için yine ++a komutu işletilir. Bu durum a değeri 50 oluncaya kadar sürer. a = 50 olduğunda (a != 50) koşulu sağlanmayacağından program while bloğunun altından işletilmeye devam edilir.

while şu şekilde de kullanılabilir

while(BUTON); // süslü parantezler yok sonunda ";" var
LED = 1;

BUTON Sıfır'dan farklı olduğu sürece bekle. Buton Sıfır olduğunda LED = 1; satırına geçilir

DO-WHILE DÖNGÜSÜ

do {
işlemler
..
..
} while(koşul);

Örnek

char c;
do {
while(kb_hit()); // rs232'den karakter gelmesini bekle
c = getc();   // karakteri oku
}while(c != 'a');   // okuna  karakter 'a' değilse parantez içindeki kodlar yine işletilecek
printf(" 'a' karakteri okundu"); // 'a' karakeri okunduğunda do-while bloğu sonlanır.

FONKSİYONLAR

C içerisinde kütüphane dosyalarında tanımlanmış kullanıma hazır fonksiyonlar vardır. Bu fonksiyonları kodunuzda kullanabilmek için fonksiyonun tanımlandığı header dosyasını #include direktifi ile kodunuza dahil etmeniz gerekir.

#include
 // math.h koda dahil ediliyor
// sin(),cos(), sqrt(),log()   gibi fonksiyonlar artık kullanılabilir
int a = 9;
int b;
b = sqrt(a);  // b değeri a'nın karekökü olur yani b = 3 olur

CCS-C derleyicisi özel bir C derleyicisi olduğu için kendine özel dahili fonksiyonları vardır. Bu fonksiyonları kullanmak istediğinizde #include ile dosya belirtmeniz gerekmez.

int a;
if(bit_test(a,5))  // a değerinin 5. biti 1 mi?
{
a = 0;
}

bit_test() fonksiyonu CCS-C derleyicisinin dahili fonksiyonlarından biridir.

Hazır fonksiyonların nasıl kullanıldığını gördük ama kafanızda yeni soru işaretleri belirdiğinden eminim :) Bu soru işaretlerini gidermek için fonksiyonların anlatımına geçelim.
C' de kendiniz fonksiyon oluşturabilir ve kullanabilirsiniz. Düşününki kod içerisinde bir çok yerde aynı hesaplamayı yaptırıyorsunuz. Bu kadar fazla kod yazmaktansa aynı kodu bir fonksiyon haline getirip ilgili yerlerde bu fonksiyonu çağırabilirsiniz.

Fonksiyonlar Nasıl Tanımlanır?

Dönüş tipi  fonksiyonadı(parametreler)
{
yapılacak işlemler
...
...
}

Dönüş tipi, fonksiyonumuzun çağrıldığı yere hangi tipte veri döndüreceğini belirtmek için kullanılır. Bir örnek ile anlatalım

int bizim_fonksiyon()
{
int a;
a = 5;
return a;
}

bizim_fonksiyon adında, geriye integer değer döndüren bir fonksiyon yazmış olduk. fonksiyon çalıştığında a değişkeni oluşturulur ve değeri 5 yapılarak çağıran yere a değeri geri yollanır.

int b;
b = bizim_fonksiyon();  // b degeri = 5 olur

CCS-C Derleyicisinde fonksiyonların geri döndürebileceği değerler

int,int8,byte // 8 bit
char  // 8 bit
int16, long  //16 bit
int32  // 32 bit
float  // 32 bit reel
int1, boolean //1 bit

olabilir

Eğer fonksiyon geriye değer döndürmeyecek ise dönüş tipi olarak void yazılır

void gecikme_fonksiyonu()
{
long x;
for(x =0; x < 10000; ++x);
}

yukarıda tanımlanan fonksiyon şu şekilde kullanılabilir

LED = 1;
gecikme_fonksiyonu();
LED = 0;
gecikme_fonksiyonu();

Dışarıdan parametre alan fonksiyonlar tanımlama

Verilen bir sayının 10 ila 20 değerleri arasında olup olmadığını kontrol eden ve bu aralıkta ise 1 değerini değil ise 0 değerini geri döndüren fonksiyon tanımlayalım.

int1 karsilastir(int sayi)
{
if((sayi > 10) && (sayi < 20))
return 1;
else
return 0;
}

Yukarıdaki fonksiyon tanımlamasında, karsilastir adında geriye 1 bitlik değer döndüren ve parametre olarak integer bir sayı alan fonksiyon tanımladık. Artık kod içerisinde bu fonksiyonu kullanabiliriz

int c=15;
if(karsilastir(c))  // karsilastir fonksiyonundan dönen değer 1 ise
{
printf("c değeri istenilen aralıkta");
}

Fonksiyonlar birden fazla parametre alabilirler

int hesapla(int deger1, long deger2, boolean anahtar) // gibi

Örnek olarak, verilen iki sayıyı çarpıp sonucu çağırana geri döndüren fonksiyon tanımlayalım.

long sayilari_carp(int a, int b)
{
return (a*b);
}

long x,y,z;
int a=5;b=10;
x = sayilari_carp(10,15); // x = 150 olur
y = sayilari_carp(a,b);  // y = 50 olur

Ansi C'de fonksiyonların recursion (Kendi Kendini Çağırma) özelliği olmasına rağmen CCS-C derleyicisinde böyle bir özellik yoktur. Zaten PIC programlarken pek ihtiyaç duymayacaksınız. Bu yüzden recursif fonksiyonları pas geçiyoruz :)

DEĞiŞKENLERİN LOKAL VEYA GLOBAL TANIMLANMASI

Fonksiyon içerisinde tanımlanan değişkenler lokal değişkenler olarak adlandırılırlar ve o fonksiyon haricinde kod içerisinde başka bir noktadan erişilemezler.

void fnc(void)
{
int x;
}
void main()
{
int y,z;
z = x; // derleyici hata verir çünki x değişkeni sadece fnc() içerisinde erişilebilir
}

Fonksiyon dışarısında tanımlanan değişkenler ise GLOBAL değişkenler olarak adlandırılırlar ve kod içerisinde her noktodan bu değişkenlere ulaşılabilir.

int a,b,c,d;

void fnc1()
{
int x,y,z
a = x;  // doğru
a = k;  // yanlış
}

main()
{
int k,l,m;
k = a;  // dogru
k = x;  // yanlış
}

a,b,c,d GLOBAL değişkenler
x,y,z fnc1 fonksiyonunda geçerli LOCAL değişkenler
k,l,m main fonksiyonunda geçerli LOCAL değişkenlerdir

#define İLE MAKRO TANIMLAMA

#define direktifini kullanarak makrolar oluşturabilirsiniz. Aşağıdaki örneğe bir gözatalım

#define iki_kati(x) (x<<1)
int a=5;
a = iki_kati(a);  // a = a<<1   olur, yani bir bit sole kaydırılır (iki ile çarpılmış olur)

Bu yazıyla birlikte Temel C bilgileri konusunu noktalıyoruz. İnternette temel C anlatımı ile ilgili destek alabileceğiniz birçok site bulunduğunu tekrar hatırlatmak istiyorum. Anlayamadığınız konuları başka kaynaklardan öğrenebilirsiniz.

Gelecek yazımızda PIC 16F877 Denetleyicisini kullanan, geliştirme kartı tarzında bir proteus projesi hazırlayıp, bu proje üzerinden CCS-C derslerimizi anlatacağız.