18 : Sayi Pozitif mi? Fonksiyonda enum döndürme

Fonksiyonların bir sayı döndürdüğünü görmüştük. Ya da bir fonksiyon bir değer döndürmeyip void şeklinde de tanımlanabilir. Dönüş değeri bunların yanında yapısal tipte de olabilir. Sayısal tiplerin haricinde şuana kadarki örneklerde sadece enumeration kullandığım için yine bu şekilde örnekleyeceğim. Daha sonra struct gibi tiplerin örneklerini verdiğimizde fonksiyonlarda da nasıl kullanıldığından bahsedebiliriz.

Bu örnekte bir enumeration oluşturacağız. Bu enumeration sayının pozitif, negatif ya da sıfır olduğunu gösterecek. Yine kullanıcıdan bir sayı girmesini isteyeceğiz. Bu sayıyı doğrudan fonksiyona göndereceğiz. Bu sayıyı fonksiyonda kontrol edip hangi durumda olduğunu enumeration ile döndürüp bir switch case yapısı ile yazdıracağız.

kontrol.c
#include <stdio.h>

enum sayi_durumu {
sifir = 0,
negatif,
pozitif 
};

enum sayi_durumu kontrol (int val);

int main()
{

 int val1 = 0;
 int val2 = 0;
 printf("Ilk degeri giriniz: ");
 scanf("%d", &val1); 
        enum sayi_durumu durum;
 durum = kontrol(val1);

    switch(durum)
    {
      case sifir: printf("Sifir girildi\n"); break;
      case pozitif: printf("Pozitif sayi girildi\n"); break;
      case negatif: printf("Negatif sayi girildi\n"); break;
      default: 
         break;
    }

 return 0;
}

enum sayi_durumu kontrol (int val)
{

 if (val == 0)
 {
    return sifir;
 }
 else if (val > 0)
 {
   return pozitif;
 }
 else
 {
   return negatif;
 }
}

Burada bir kaç konudan bahsedelim. Değişkenler tanımlandığı yerde kullanılabilir. Bir değişken tanımlandığı yerden ayrıldığında tanımsız olur. Biz yukarıdaki örnekte sayi_durumu değişkenini iki ayrı yerde kullandık. Bu sebeple herhangi bir fonksiyon içinde değil en üstte tanımladık. Bu tip tanımlı değişkenler global değişkenler olarak adlandırılıyor ve bütün fonksiyonlarda kullanılabiliyor.

Bir diğer konu da enumerationları kullanırken her ne kadar her bir eleman bir sayıya denk geliyor olsa da sayı olarak değil elemanın ismi ile kullanıyoruz. Bu bize hem okunurluk sağlıyor hem de daha sonra enumeration içinde araya bir eleman koymanız gerekirse hata yapmamanızı sağlıyor. Örneğin üstteki örnekte enumerationı negatif, sifir, pozitif olarak değiştirseydim ve case yapısını 0 1 ve 2 olarak belirtmiş olsaydım case yapısını tekrar düzenlemem gerekirdi. Ancak üstteki örnekte elemanların kendi ismini kullandığım için enumerationı değiştirsem de hata oluşmaz ve switch case yapısı bu değişiklikten etkilenmez.

Bir başka bahsetmek istediğim konu da bir enumeraion tanımladığımda bu yapıyı kullandığım her yerde enum olarak belirtmem gerekti. Fonksiyon dönüşünde değişken tanımında vs enum sayi_durumu olarak yazdım. Bu gereksiz bir iş kalabalığı oluşturuyor. Bunu daha temiz bir koda çevirmek için şu şekilde düzenleyebiliriz.


kontrol.c
#include <stdio.h>

typedef enum sayi_durumu {
sifir = 0,
negatif,
pozitif 
}sayi_durumu;

sayi_durumu kontrol (int val);

int main()
{

 int val1 = 0;
 int val2 = 0;
 printf("Ilk degeri giriniz: ");
 scanf("%d", &val1); 
    sayi_durumu durum;
 durum = kontrol(val1);

    switch(durum)
    {
      case sifir: printf("Sifir girildi\n"); break;
      case pozitif: printf("Pozitif sayi girildi\n"); break;
      case negatif: printf("Negatif sayi girildi\n"); break;
      default: 
         break;
    }

 return 0;
}

sayi_durumu kontrol (int val)
{

 if (val == 0)
 {
    return sifir;
 }
 else if (val > 0)
 {
   return pozitif;
 }
 else
 {
   return negatif;
 }
}

typedef belirteci ile enumeration olduğunu bildirdik ve artık bu enumerationı kendi adıyla kullanabiliyoruz. typedef bir enum oluşturup bir değişken yaratıyor ve o değişkeni kullanıyoruz. Üstteki örnekte typedef' ten hemen sonra ve tanımlamadan sonra tekrar sayi_durumu kullandık. Burada ilk sayi_durumu enum ikinci sayi_durumu ise değişken oluyor. Bunu şu şekilde de yapabilirdik:


 
typedef enum sayi_pozitiflik_durumu {
sifir = 0,
negatif,
pozitif 
}sayi_durumu;


Tersini yapmam mümkün değil. Eğer ikinci sayi_durumunu değiştirmek isterseniz koddaki diğer sayi_durumu ifadelerini de aynı şekilde değiştirmek gerekir. Bir değişken ismini kullanıdığınızda o değişkeni kullandığınız her yerde güncellemeniz gerektiği gibi.

Yorumlar

Bu blogdaki popüler yayınlar

31 : Fonksiyonda Struct Kullanımı

Structure - 29 : Yapılar ile Öğrenci Bilgileri Tutma

23 : İki Karakter Dizisini Birleştirme