Temel C Programlama -25- Değer Alan Fonksiyonlar, Sabitler, Önek ve Sonekler

Önceki yazımızda fonksiyonlara giriş yaptık ve basit fonksiyonların nasıl kullanıldığını size anlattık. Şimdi ise fonksiyonları daha işlevsel hale getirmek adına fonksiyonlara değer aktaracağız ve değer alan fonksiyonların işleyişini anlatacağız. Önceki yıldız yazdırma örneğinde fonksiyon tek bir sayıda ve tek bir karakteri yazdırıyordu. Bu fonksiyonun ayarlanabilir olmadığı anlamına gelmektedir. Yani küçük bir değişiklik yapmak istiyorsak örneğin yıldız yerine “-” yazdırmak istiyorsak başka bir fonksiyon yazmamız gerekecektir. Bunu önlemek ve tek bir fonksiyonda başka başka işler yaptırmak için yani fonksiyonun esnekliğini artırmak için fonksiyonlara argüman değer aktarırız ve bu değerlere göre işlem yaparız.

İlk vereceğimiz örnekte argüman almayan bir fonksiyonun parametreleri ile nasıl oynayabileceğimizi anlatacağız. Bu pratik bir yöntem olmasa da alternatif bir çözüm olarak kullanılabilir. Biz de öğrenmeniz ve argümanların önemini kavramanız adına öncelikle bu örneği veriyoruz. Örneğimiz yıldız yardırma fonksiyonu ile aynı görevi yapıyor fakat biz programlarken istediğimiz karakteri istediğimiz sayıda yazdırmayı global değişkenlerin değerleri ile oynayarak yapmaktayız.

#include <stdio.h>
#include <stdlib.h>
////// FONKSİYON PROTOTİPLERİ //////////
void karakter_yaz(void);
//// GLOBAL DEĞİŞKENLER /////
int karakter_sayisi = 30;
char karakter = '-';
int main() {

	karakter_yaz();
	puts("Hos Geldiniz");
	karakter_yaz();

system("PAUSE");
}

void karakter_yaz (void)
{
	for (int i=0; i < karakter_sayisi; i++ )
	printf("%c",karakter);
	printf("\n");
}

Programı çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır.

Burada karakterlerin kaç defa yazdırılacağı ve hangi karakter yazdırılacağı global değişkenlere atadığımız değerler yardımıyla belirlenmiştir. Global değişkenler C programında bir dosya içerisinde bütün fonksiyonlar tarafından erişilebilen ve bütün fonksiyonların değerini okuyup değiştirdiği değişkenlerdir. Normalde bir fonksiyon içerisinde tanımlanan değişken “kapsam” içerisinde kalmaktadır ve diğer fonksiyonlar tarafından erişilememektedir. Bu değişken tipine yerel değişken adı verilir. Bir fonksiyon içerisinde tanımlanan yerel değişken o fonksiyon kapsamından çıkıldığı zaman silinmektedir ve kısa bir süreliğine hafızada tutulmaktadır. Global değişken ise program başında tanımlanmakta ve program boyunca varlığını sürdürmektedir. O yüzden global değişkenleri çok fazla tanımlamak hafızada gereksiz yere yer kaplanmasına sebep olacak ve program güvenliğine olumsuz etki edecektir. Çünkü her fonksiyon tarafından erişilebilen bir değişkenin değerini kaza ile değiştirmemiz olasıdır. Kapsamlar değişkenlerin değerini güvenceye almaktadır. Aşağıdaki kod blokunda global değişkenlerin nasıl tanımlandığını görebilirsiniz.

int karakter_sayisi = 30;
char karakter = '-';
int main() {

Görüldüğü gibi main fonksiyonundan önce ve main fonksiyonunun dışında tanımlanır. main ana program fonksiyonu olsa da main programı içinde tanımlanan bir değişkene başka bir fonksiyonun erişme imkanı yoktur. Biz fonksiyonlara değer aktarmak istediğimizde bu yüzden argüman olarak değer aktarırız ve bu kapsam sınırlamasında kontrollü bir şekilde veri aktarma imkanı buluruz. Şimdi aynı fonksiyona değer aktarmayı sabitler ile yapalım.

#include <stdio.h>
#include <stdlib.h>
////// FONKSİYON PROTOTİPLERİ //////////
void karakter_yaz(char karakter, int sayi);
//// GLOBAL DEĞİŞKENLER /////

int main() {

	karakter_yaz('*', 50);
	puts("Hos Geldiniz");
	karakter_yaz('*', 50);

system("PAUSE");
}

void karakter_yaz (char karakter, int sayi)
{
	for (int i=0; i < sayi; i++ )
	printf("%c",karakter);
	printf("\n");
}

Burada fonksiyon prototipinden itibaren bir takım değişiklikleri yaptık. Önce fonksiyon prototipine bakalım ve ne değişiklik yaptığımızı görelim.

void karakter_yaz(char karakter, int sayi);

Burada fonksiyon parantezleri arasında iki değişken tipi tanımladık ve virgülle birbirinden ayırdık. Burada demek istediğimiz fonksiyonun ilk argümanı char tipinde, ikinci argümanı ise int tipinde değer olacağıdır. Buradaki değişken isimleri main fonksiyonunda da yer alabilir fakat kapsam dışında olduğu için yinelemesi sıkıntı olmayacaktır. karakter veya sayı diyebileceğimiz gibi istediğimiz ismi ekleyebiliriz ve virgül ekleyerek daha fazla argüman ekleyebiliriz.

karakter_yaz(‘*’, 50);

Ana programda fonksiyonu çağırırken bu şekilde çağırdık. Fonksiyon argüman alıyorsa aldığı argüman kadar parantez içerlerine argümana uygun değer yazılması gereklidir. İlk argüman char karakter olduğu için karakter sabiti olan ‘*’ değerini yazdık. Sonrasında int sayi dediği için 50 değerini yazdık. Artık bizim yazdığımız ‘*’ değeri char karakter değişkenine, 50 değeri ise int sayi değişkenine aktarılacaktır.

Sabitler

Şimdiye kadar sabit değerleri kullansak da bunları özel olarak ele almadık. Sabit değer konusu çok kısa olduğu için konunun arasında size anlatmak istiyoruz. Biz bir değer belirtmek için değişken kullanmadığımız zaman sabit değerleri kullanırız. Bu sabit değerler 50, 400 gibi onluk tabanda sayı değerleri olduğu gibi ‘a’ şeklinde karakter değeri de olabilir. Fark ederseniz bazı sabitleri ifade etmek için farklı kurallar vardır. Bu kuralları bilmeden bir değeri ifade ettiğimizde bazen derleyici hatası çoğu zaman da programlama hatası ile karşı karşıya kalırız. Örneğin tek bir karakteri ifade ettiğimiz tek tırnak ifadesiyle ‘Merhaba Dunya’ yazarsak derleyici buna hata vermese de değişkene tek bir karakter değerini aktaracaktır. O yüzden bu sabit değerleri kullanmayı iyi bilmemiz gereklidir.

Sabit değerleri ifade ederken önek ve sonek adı verilen bileşenler kullanılmaktadır. Öncelikle size önekleri anlatalım.

Önekler

Bizim dilimiz sondan eklemeli bir dil olduğu için önekleri dilimizde yabancı ifadelerde kullanmaktayız. C programlama dilinde ise ön ekler normal dilde kelimelerin başına gelip anlamlarını değiştirmesi gibi değerlerin önüne gelerek bu değer tiplerini değiştirmektedir.

Onluk Taban : Desimal ifadelerde herhangi bir ön veya son eke gerek yoktur doğrudan sayıyı yazmakla ifade ederiz. Örneğin; 500, 1250, 20, -600.

Sekizlik Taban: Sekizlik tabandaki sayıları başına sıfır getirmekle ifade ederiz. Örneğin; 012, 05, 024.

Onaltılık Taban : Onaltılık tabandaki sayıları başına 0x ya da 0X getirmekle ifade ederiz. Hatta pek çok dijital elektronik ve mühendislik kitabında C diliyle alakası olmasa da onaltılık sayıların başına 0x getirilmekle ifade edildiğini görebilirsiniz. Biz de C ile alakasız yazılarımızda onaltılık sayıları böyle ifade ediyorduk. Örnekler; 0xFF, 0x12, 0xff55, 0XFF.

İkilik Taban : İkilik tabandaki sayıları ifade ederken başına 0b ya da 0B getiririz. Örnekler; 0b110010, 0B1111100.

Son Ekler

Önekler yukarıda görüldüğü gibi temel veri tiplerini tanımlamak için kullanılıyordu. Assembly dilinde de mevcut olan bu temel veri tipleri hemen hemen aynı önekler vasıtasıyla ifade edilmektedir. Sonekler ise C diline mahsus değişkenleri ifade etmek için kullanılmaktadır.

int : Integer tipindeki bir değeri ifade etmek için herhangi bir ek kullanılmaz. Doğrudan sayı yazılır. Örnekler; 500, 200.

unsigned int : İşaretsiz integer tipindeki değeri ifade etmek için u ya da U eki kullanılır. Örnekler; 500u, 6000U.

long int : long int yani uzun tamsayı tipindeki değeri ifade etmek için l ya da L eki kullanılır. Örnekler; 500l, 800L.

unsigned long int : İşaretsiz uzun tamsayı tipindeki değeri ifade etmek için ul ya da UL eki kullanılır. Örnekler; 5222UL, 200000ul.

long long int : çok uzun tam sayı olan long long int tipinde değeri ifade etmek için ll ya da LL eki kullanılır. Örnekler; 500000000ll, 20000000LL.

unsigned long long int : İşaretsiz çok uzun tam sayı değeri olan unsigned long long int tipinde değeri ifade etmek için ull ya da ULL eki kullanıır. Örnekler; 50000ULL, 6545622456ull.

float : float tipinde ondalıklı ifadeleri kullanırken nokta ile sayıyı yazdıktan sonra f ekini kullanmamız gereklidir. Aksi halde derleyici bunu double olarak anlayacaktır. Örnekler; 3.522f, 25.22F.

double : double tipinde ondalıklı ifadeleri tam sayı değerinde olsa bile nokta ile yazmamız gereklidir. Örnekler; 2.0, 25.0005, -0.55E-7.

Sonek kullanımında en çok sorunu float tipinde sabitleri yazarken yaşarsınız. O yüzden nokta koyduğunuza her zaman emin olmanız gereklidir. Tip dönüşümlerini ileride anlattığımızda daha ayrıntılı olarak açıklayacağız.

Karakter sabiti : Karakter değerini ifade etmek istediğimizde değeri tek tırnak arasına yazarız. Örnekler; ‘a’, ‘B’.

Karakter dizisi : Karakter dizisi çift tırnak arasına yazılır. Örnekler; “Merhaba Dunya!”, “Lutfen Deger Giriniz.”.

Yazımız yeterince uzadı bir sonraki başlıkta değer alan fonksiyonları anlatmaya devam edeceğiz.

Last updated