CCS-C ile PIC Programlama, Temel C Bilgisi – 3

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.

1
2
3
4
5
6
if(koşul)
{
yapılacaklar
....
....
}

örnek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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ı

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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ı

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
8
9
10
11
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.

1
2
3
4
5
6
7
8
9
10
11
12
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.

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
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.

1
2
3
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(deger)
{
case a: işlemler
.....
break;
case b: işlemler
.....
break;
case c: işlemler
.....
break;
.
.
.
default: işlemler
...
break;
}

Örnek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
defaultprintf("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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(başlangıç değeri ;koşul; yapılacaklar)
{
işlemler.
...<div class="ad">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-5963711057135309";
/* 336x280, oluşturulma 19.06.2008 */
google_ad_slot = "7915129787";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><ins style="margin: 0px; padding: 0px; border: currentColor; width: 336px; height: 280px; display: inline-table; visibility: visible; position: relative;"><ins style="margin: 0px; padding: 0px; border: currentColor; width: 336px; height: 280px; display: block; visibility: visible; position: relative;" id="aswift_1_anchor"></ins></ins> 
</div>
...
}

örnek

1
2
3
4
5
6
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

1
2
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

1
2
3
4
5
6
while(koşul)
{
işlemler
...
...
}
1
2
3
4
5
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

1
2
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Ü

1
2
3
4
5
do {
işlemler
..
..
} while(koşul);

Örnek

1
2
3
4
5
6
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.

1
2
3
4
5
6
#include <math.h> // 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
</math.h>

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.

1
2
3
4
5
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?

1
2
3
4
5
6
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

1
2
3
4
5
6
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.

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

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

1
2
3
4
5
6
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

1
2
3
4
5
void gecikme_fonksiyonu()
{
long x;
for(x =0; x < 10000; ++x);
}

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

1
2
3
4
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.

1
2
3
4
5
6
7
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

1
2
3
4
5
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

1
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.

1
2
3
4
5
6
7
8
9
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.

1
2
3
4
5
6
7
8
9
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
#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.

CCS-C ile PIC Programlama, Temel C Bilgisi – 3” için 7 yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir