CCS-C Dersleri Genel C Anlatımı Ders-3
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 = %d\r\n",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> // 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.




















“CCS-C Dersleri Genel C Anlatımı Ders-3” yazısı için 11 Yorum yapıldı
Önceki dersleri de inceledim.Gerçekten güzel anlatmışsınız.
Tebrik eder ve yazılarınızın devamını dilerim.
Pointerları sabırsızlıkla bekliyorum…
Ayrıca bugün kendi çapımda pic16f877 ile sırası ile led yakıp söndürme işlemi yaptım. Gerçekten c’nin gücünü ve bu gücün çokta yalın olduğunu tekrar anladım…
Devamını bekliyoruz…
ellerine sağlık hocam
hocam, fonskiyonlarda global değişkenleri kullanmak ne kadar sağlıklı? bunu şunun için soruyorum.
Malum, C de bir fonksiyondan çağrıldığı yere yanlızca bir değer döndürülür o da return ile.
birden fazla değer dondürmek istediğimizde ise POINTER kullanılır, böyle öğretildik.
ama bakıyorum da ben istediğim kadar global değişken tanımlayarak bir fonksiyonda hepsini döndürebilirim. aslında direk bir döndürme işlemi yok. ama içeriğini değiştirebilirim yani. dolaylı döndürme.
mesela örnek:
#include
int16 fatih,hasan,ahmet; //global değişkenler
void ornek_fonk (void); // fonksiyonun ön tanımlanması
void main() // ana fonksiyon
{
ornek_fonk(); //fonskiyonu çağırdık.
ekranda_goster=fatih; //ekrana yazdır.
delay_ms(5000);
ekranda_goster=ahmet;
delay_ms(5000);
ekranda_goster=hasan;
}
void ornek_fonk()
{
hasan++;
fatih++;
ahmet++;
}
gördüğünüz gibi ana fonksiyona üç değer döndürmüş oldum? sağlıklı mı? sağlıklıysa pointerle döndürme işlemine ne gerek var?
soru uzun oldu ama kusura bakmayın.
@fatih
Birden fazla değer döndüren fonksiyonların pointer ile değer döndürmesi olayı doğrudur. Fonksiyonun birden fazla sonuç ürettiği durumlarda geçerlidir. Global değişkenlerin fonksiyon içerisinde değerlerinin değiştirilmesi fonksiyonun ürettiği bir değerin geri döndürülmesine eş değer değildir. Global değişkenlerin amacı tanımlanan değişkenein her noktadan ulaşılabilmesidir. Sonuç olarak bu değişkenin değerini istediğiniz noktadan değiştirebilirsiniz. Kesme kullandığınız programlarda biraz dikkatli olmak gerekiyor
Fatih,
Global değişkenlerden sonsuz tane yaratamayacağın kesin.
Global değişkenlerin sınırı, kullandığın mikro-denetleyiciye göre ve bazen de derleyicine göre değişir. Dolayısıyla tüm değişkenlerini gobalde tutmak her zaman mümkün olmayabilir.
Bununla birlikte her değişkeni tüm fonksiyonların kullanımına açmak da çok doğru bir yaklaşım değildir.
Son olarak, bazı fonksiyonları projeye yönelik değil, genel olarak yazmak daha akıllıca bir tutum olabilir diye düşünüyorum. Dolayısıyla, sadece ilk kullanılan projedeki global değişkenleri başka bir projede kullanmanız gibi bir zorunluluk ya da durum olmayabileceği için, pointer kullanımı çok daha etkin bir kullanımdır.
c de paskal da veya bska programlarda oldugu gibi goto komutu yokmu . Aynı anlama gelicek bi komut bulamadım. Yardımcı olailirmisiniz.
Gerek KAlmadı BuLDum teşk.
@ferit
çok gerekmedikçe kullanmamamı tavsiye ederim ama.
goto komutu elbette mevcut zaten bulmuşsun
Kolay gelsin