İlk bölüm sizin de fark edeceğiniz gibi çok sıkıcıydı. Hatamı telafi etmeye çalışcam. Ama unutmayın ki 10 yıldır profesyonel kurslarda C/C++ öğreten biri deilim. Bu ders eğer yapabilirsem veri türleri ile ilgili bir ik anahtar sözcüğü anlatacam ve fonksiyon tanımlamaya geçecem.
Bu yazıda “değişken”lerden söz ediliyo ama değişkenler anlatılmıyo. Bi ara geçecem onlara(eğer yeterli reklam geliri elde edersek =) )
NOT: Bu yazıyı okuyanların 1. bölümü okumuş, anlamış, sindirmiş ve özümsemiş olduğunu kabul ediyorum. Kısacası, bi önceki bölümü okuyup anlamamışsanız, ve hala bunu okuycaksanız GÜNAH BENDEN GİTTİ.
Türlerin Özelliklerini Hafiften Değiştiren Anahtar Kelimeler
1.) short
C dilinin kuralı: Eğer direkt short olarak tanımlarsanız “short int” olarak görür. İnsan bi şeyi istediği şekilde görürmüş. C derleyicileri de öyle.
short, kullanıldığı veri tipini küçültür. Fark edeceksiniz ki 16-bit, 2 byte, integer(int) tanımlamaktan başka bi işe yaramıyo. Olsun, biz onu böyle seviyoruz.
Kullanımı
short int a |
gibi olması gerekiyo ama genellikle
short a |
olarak kullanılıyo. Örneğin aşağıdaki durum aptalca
short char b |
Hiç bi işe yaramıyo. Çünkü char türünün ne olursa olsun 8-bit 1 byte olması garantili.
Toparlarsak, kullanıldığı türün uzunluğunu kısaltıyo(bazen).
2.) long
Adı üzerinde uzun. Kullanıldığı türün bitlerini arttırıyo. Eskiden(Turbo C zamanlarında) int’ler 16 bitti. O zamanlar int’i 32 bite çıkartmak için kullanılıyordu. Şu an int’ler zaten 32 bit. Ama yine uzatmada kullanılıyo. Örneğin
long double a |
Biliyosunuz ki double 64 bit(bilmiyosanız bi önceki derse dönün. HEMEN!). yukarıdaki taımlama ise (genellikle, yani derleyiciye bağlı) 80-bit bi ondalık sayı yaratır(MSVC ve CB de 80-bit). Bi örnek daha:
long long int b |
“Bunu yazacağıma camdan atlarım, hem zaten cam açık, tek yapmam gereken yürümek” diyosunuz dimi =) . Sakın atlamayın(zemin katta deilseniz =) ) Bu da normalde 32-bit olan int’i 64-bit yapar. Siz de 64-bit matematiksel işlemlerin zevkini çıkarırsınız( NOT: normalde kullandığınız işlemci kaç bit olursa olsun, istdiğiniz bit ölçeğinde işlem yapabilirsiniz. Yalnız biraz makine dili bimeniz lazım.) .
NOT: Benim sistemde “long long int” 64-bit çıktı. Bu da normal olanı zaten. Ama “long double” 96-bit, “long long double” ise 64 bit çıktı. Bu işte bi bit yeniği var. Bi de strict(katı) ISO C++ modunda “long long” tanımlama yapamıyorum :S. Bu problemler sizin de başınıza gelmiş olabilir ve nasıl çözüleceği konusunda bi bilgim yok. ( 96-bit “long double”, derleyicinin bazi işlemleri hızlandırma isteğinden kaynaklanıyo olabilir. keşke derleyicilerin, “ne dediysem onu yap” diye bi modu olsaydı
)
3.) auto
Bunu ilk başa koydum çünkü bü işe yaramıyo. “Derleyici, bunun özelliklerini seçmeyi sana bırakıyorum. Ama verdiğim türü kullancaksın diyo”. Zaten derleyici normalde de bunu yapıyo. Hiç kullanmadım, umarım kullanmam. Belki ihtiyacınız olur die(her organımla gülmekteyim bu cümleye) (php fonksiyonu olan die deil ( serbest çağrışım ) ) verdim. Umarım kullanmak zorunda kalmazsınız =)
4.) register
Bana bakmayın, bunlara böyle isimler veren ben değilim!
register keyword’ü(anahtar sözcüğü) bir değişkenin(programda belirli bir veriyi tutar, siz isteyince değişir), işlemcinin yazmaçlarında tutulmasını emreder. Şimdi, çoğunuz harddiskten okumanın RAM’den okumaktan çok çok çok daha yavaş olduğunu biliyodur( o yüzden oyunlar çok RAM ister, gerekli bütün bilgileri hazır tutmak için). Ama RAM’den daha hızlı bi şey var. O da yazmaçlar(register). Bunun nedeni, işlemcinin RAM’e erişirken bir dizi pis(çok pis) işler yapması, ve register’ların işlemcinin “içinde” olmasıdır(daha anlatırım ama uykunuz gelir, sonra reklam gelirlerimiz düşer =) )
Bi bilgisayar manyağı şakası(neresi şaka diyceksiniz)
-Niçin makine dilinde program yazılır ki?
-Hız, hız ve daha çok hız için…
Yüzünüzde bu :S ya da bu
ifade var biliyorum. Ama konuya tam parmağı bastı bu sözler. Bi değişkeni register’a alırsınız. Daha hızlı erişim için. Çoğu zaman, kilit bir değişkeni registerde tutarak programı hızlandırabilirsiniz. Bazen ışık hızı yeterli olmayabiliyo. O zaman böyle kirli numaralar denemek gerekiyo. Ama unutmayın ki işlemcinizin sınırlı sayıda registeri var. Yani register tanımladığınız şey register’a atanmamış olabilir. Yani, bilgisayara güvenmeyin. Asla, bilgisayara güvenmeyin. Bi gün ayaklanıp dünyayı ele geçircekler.
5.) volatile
E, hayatta herşeyin bi zıttı var. Çoğu şeyin ya da. Bu da register’in zıttı. Ama “değişkeni registerda tutma” manasında deil. O imkansız bi bakıma. (x86 işlemciler direkt hafıza ile çalışmakta iyi değiller) . Bu sözcük, “bu değişkeni her kullandığında RAM’deki kopyasını kullan. registerlarda varsa bile RAM’den yeniden al, onu kullan” demek. Garip gözüküyo. Bi de hızı azaltıyo. Ama çok güzel bi kullanım alanı var: Çift işlemcili sistemler. Eğer iki işlemci aynı RAM’i paylaşıyosa bu şekilde bunları eşgüdümlü çalıştırmak basitleşiyo. Ayrıca başka bir programla paylaştığınız RAM bölgeleri için de ideal =) (ben neler saçmalıyorum)
6.) const
Programlamanın vazgeçilmezlerindendir: Sabitler. Nam-ı diğer değişmezler. Eğer değişmiyolarsa niye değişken tanımlarken kullanılıyolar ki. Uzun iş =).
Şimdilik şunu bilin. const tanımlanmış bi değişkene sadece tanımlama sırasında değer verebilirsiniz. Sonrasında değerini direkt değiştirmek isterseniz derleyici bunları görmezden gelir, ya da ayarlarınıza göre hata/uyarı verir. BASIC gibi dillerde işe yarıyo ama C/C++ yeterli seviyede bi önişlemciye sahip. Çok kullanmadım bu anahtarı açıkçası.
7.) static
Bu da ayrı bir güzellik. Ama işe yarıyo. İlk başta global(küresel) ve local(yerel) değişkenleri anlatalım.
Basit bi şey. Global değişkenlere programın her yerinden ulaşabilirsiniz. Ama yerel değişkenlere sadece hangi blokta tanımlanmışlarsa o blok içinde ulaşabilirsiniz. main içinde tanımladıysanız, sadece main içinde =) Basit bi kural yani.
Diyelim ki, program çalışırken bi fonksiyon kaç kez çalıştırıldı merak ediyosunuz. Ama bütün programın görebileceği bi değişken yaratmaktan da kaçınıyosunuz. İşte kurtarıcınız: static. Normal yerel değişkenler, fonksiyon her başladığında ilk değerlerine dönerken, staticler nasıl bıraktıysanız öyle kalır. Derleyici hilesi. Aslında onu da global tanımlıyo. Ama çaktırmadan =) Öyle yapıyo ki sadece tanımlandığı fonksiyon görüyo onu.
8.) extern
Bu, genellikle, değişkenleri ya da fonksiyonları başka bi osyayla paylaştığımızda kullandığımız bi anahtar. “Abi, bak, ben bunu gösteriyom burda, ama bu aslı deil. Bunun aslı başka yerde, sen onu kullancan” demek derleyici dilinde. Bağlayıcı(linker) hatalarını gidermek için kullanabilirsiniz bazen. Ama çok işinize yaramıycak başlangıç seviyesinde.
9.) signed
Bu melet ise, değişkenin bilgisinin işaretli yorumlanacağını gösteriyor. Sadece char ve int ile kullanabilirsiniz.
10.) unsigned
Yukarıdakinin, işaretsiz yorumlatan versiyonu. Yine sadece char ve int’te işe yarıyo.
void
TADA: türsüz tür. Atmıyorum, walla öyle. Bu C dilinin bi güzelliği.
void değişken tanımlayamazsınız. Bunu bilin. Ama, void fonksiyon tanımlarsınız. Ve geriye sonuç döndürmez. Nasıl, güzel mi?
Bi de bunun gösterici olarak kulanımı var ki yeme de yanında yat derim. Ama o konuya göstericiler konusunda dalacaz. Ama önce bi fonksiyonlara dalmam lazım.
Fonksiyon tanımlama
Dün Hilmi bana PM atıp, “r-G0ne abi, fonksiyonsuz yazılmıyo kod yaa. Göster artık şunu!” dedi. “Memleketin gidişatı buna bağlı, Ergenekon bilgisayarsız çözülmüyo” dedi. =) E, ben de anlatiyim diyorum artık. Çünkü, türler konusunda hamdınız, piştiniz, ve yandınız (ama hala öğrenecek şeyleriniz var).
Arkadaşlar, C dilinde her kod bi fonksiyon içinde olmalıdır. Yoksa dil bunu kabul etmez. Kurallara aykırı: LL(2) parser fonksiyonların block’lar içinde tanımlanmış olmasını gerektiriyo. “<type> <identifier>(<arg_list>){<code>}|;” misali. Yani en basit program için bile en az bir fonksiyon tanımlanmalıdır. Nitekim, içinde boş bir C dosyasını derlemeye kalkınca linker(bağlayıcı) hatası alırsınız. İnanmıyosanız deneyin.
Her programın, en az bir fonksyonu olacak dedik( Dennis Amca dedi). İşte bu fonksiyon “main”. Kural olarak, bir C programı “main” fonksiyonundan başlar (aslında işler biraz daha karışık). Yani, yazacağınız esas kod “main” içinde olacak.
main(){ // kod yazdım buraya kimsenin umrunda deil ... return 0; } |
Yukarıda fark edeceğiniz gibi “//” ile başlayan satır gri. Niye diye soracaksanız, (ki sormanız lazım) o bir yorum satırı. C dilinde “//” ile başlayan satırlar, hiç kafaya takılmaz. Derleyici atlar bunları. Bu satırları daha çok yazdığımız koda not düşmek, ya da “bunu ben yazdım izinsiz kullanan en adi…” şeklinde telif hakkı mesajları eklemek için kullanırız. Ekranda güzel durur.
Araya sıkıştırdığımız yorum satırı olayını atlarsak, fonksiyon yazmayı öğrencez. Basit bi şey.
0.) FONKSİYONU KAFANIZDA TASARLAYIN. ( Sakın bu adımı atlamayın, sonra pişman olursunuz )
1.) Fonksiyonun ne türde sonuç üreteceğini seçin. ( sonuç üretmeyecekse void )
2.) Fonksiyonun adını seçin. ( Türkçe karakterler veya araya boşluk sıkıştırmak yok )
3.) Fonksiyonun, çalışmak için hangi türde bilgiler alacağını seçin (parantez içinde)
4.) Bunları sırayla yazın, ve blok açıp kodu yazın.
Gayet basit di mi. Örneklerle:
Örnek 1
0.) FONKSİYONU KAFANIZDA TASARLAYIN. ( Sakın bu adımı atlamayın, sonra pişman olursunuz )
Ben, ekrana “Merhaba Baba.\n******** ÖSYM” yazan bi fonksiyon istiyorum. Fonksiyonu çağırınca, “puts” ile direkt bunu basıp geri döncek.
1.) Fonksiyonun ne türde sonuç üreteceğini seçin. ( sonuç üretmeyecekse void )
Fonksiyonumun bi değer üretmesine gerek yok. o yüzden “void” seçicem.
2.) Fonksiyonun adını seçin. ( Türkçe karakterler veya araya boşluk sıkıştırmak yok )
Burda biraz daha anlatım yapcam. İlk olarak, yazdığımız her isim, CAPS LOCK tuşuna duyarlı. Yani, “r-g0ne” ile “r-G0ne” farklı isimler. İkinci olarak, “r-G0ne” geçerli bir isim değil. Çünkü sadece İngiliz abecesindeki büyük ve küçük harfler, sayılar ve altçizgi(_) isimlendirmede kulanılabiliyo ( bi de sayılar ismin ilk harfi olamıyo, o daha gıcık ). Yani “r-G0ne”, “-” işaretinden kaybediyo. (isimlendirmede, 26*2 harf, 10 rakam ve _ karakteri kullanılabilir. yani 63 karakter ).
Aslında isim seçerken, akıllıca bişeyler seçmek lazım. Benim durumumda “MesajYaz” gayet uygun bir isim. İsim kısa ve açıklayıcı olursa rahat edersiniz. Ama biz yeni başlıyoruz. O seviyeye gelmenize 2-3 ders var daha.
Benim durumuma en uygun isim bence “kadikoy_vapuru_ne_zaman_kalkıyo_abi”. İsmini de seçtim.
3.) Fonksiyonun, çalışmak için hangi türde bilgiler alacağını seçin (parantez içinde)
Benim fonksiyonun çalışması için bişeye ihtiyacı yok. Boş bırakıcam( “()” ), ya da “(void)” diycem. Boş bırakıyorum “()”.
4.) Bunları sırayla yazın, ve blok açıp kodu yazın.
void kadikoy_vapuru_ne_zaman_kalkıyo_abi(){ puts("Merhaba Baba.\n******** ÖSYM"); return; }
Basit di mi. Unutmadan, farkettiyseniz “return” komutuna bi değer vermedim. direkt “return;” dedim. Çünkü dönecek bi değer yok =) Böylece, “fonksiyonu çağıran adama dön” dedim.
Örnek 2
0.) FONKSİYONU KAFANIZDA TASARLAYIN. ( Sakın bu adımı atlamayın, sonra pişman olursunuz )
İki sayının toplamını veren bir fonksiyon yazalım. Toplam, direkt “+” ile yapılıyo.
1.) Fonksiyonun ne türde sonuç üreteceğini seçin. ( sonuç üretmeyecekse void )
int, sayıların toplamı için gayet iyi bence.
2.) Fonksiyonun adını seçin. ( Türkçe karakterler veya araya boşluk sıkıştırmak yok )
“topla” diycem buna.
3.) Fonksiyonun, çalışmak için hangi türde bilgiler alacağını seçin (parantez içinde)
Toplayacak 2 sayımız var. İkisi de int olsun diyorum. ama isimlendirmek lazım. “(int a, int b)” ile, hem tür belirtiyorum, hem de argümanlara isim veriyorum. Kıymetimi bilin =).
4.) Bunları sırayla yazın, ve blok açıp kodu yazın.
int topla(int a, int b){ return a+b; }
Bu kadar. return ile bi değer döndürdük. Aşağıdaki kod ile kontrol edebilirsiniz.
#include <stdio.h> int topla(int a, int b){ return a+b; } int main() { printf("Sonuc: %d\n",topla(45,25)); return 0; } |
45 ve 25 değerlerini değiştirip sonucu kontrol edebilirsiniz.
Hazır kullanmışken, size “printf” fonksiyonunu anlatiyim =)
printf(char *arg,…);
Başlık güzel oldu bea. Şimdi, C dilinin olmadığını, her kodu makine dilinde yazdığımızı( ya da yazamayıp saçımızı yolduğumuzu ) düşünelim. bir int’i nasıl yazdırırdınız. Onu geçtim, double’ı nasıl yazdırırdınız. Daha makine dili bilmeden… İşte bu sorundan bıkan programcılar, “Şu standart kütüphaneye bi de böyle istediğimiz her şeyi, istedğimiz şekilde yazacak bi fonksiyon koyalım” demişler. İyi etmişler.
printf’te, kaç argümanla çağıracağınız konusunda bi sınırlama yok. Gönlünüz nasıl isterse. Ama “bakalım 14520 argümanı basabilecek mi” diye denemeyin bence.
Bizi asıl ilgilendiren, ilk argüman. İlk argümanda, kalan argümanları nasıl basacağımızı anlatıyoruz. printf çok… çok dalgalı bi fonksiyon. Tamamını burda işleyemiycez. O yüzden kısa bilgiler:
1.) Birinci argüman bi string(”lelelelele” gibi). Yani printf(”lelelelele”); gibi kullanıyoruz.
2.) Bu argümanda, fonksiyon “%” ile karşılaşırsa, anında bi sonraki karaktere bakıyo. “%x” varsa, “x” e bakıyo.
3.) Bu gördüğü karakter, sıradaki argümanı ne olarak basacağını gösteriyor. Misal
%% -> ekrana “%” basmak için.
%c -> char (karakter olarak basar “a”, “b” gibi )
%d -> int ( 10‘luk tabanda işaretli tamsayı. -127 gibi )
%i -> int ( 10‘luk tabanda işaretli tamsayı. -133 gibi )
%u -> unsigned int ( 10‘luk tabanda işaretsiz tamsayı 4200000000 gibi)
%o -> unsigned int ( 8‘lik tabanda işaretsiz tamsayı. 65′i(kendileri A olur) “101″ şeklinde yazar )
%x -> int( 16‘lık tabanda tamsayı. 102′yi “66″ olarak basar. işe yarıyo bazen)
%X -> int ( 16‘lık tabanda tamsayı. yukarıdakinden tek farkı, “a” yerine “A” yazması. 16′lık tabanda rakamlar 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f dir sırayla)
%e -> float ( bilimsel yazılış “1000.0″ yerine “1.0e+3″ yazar. “1.0 * (e üzeri +3)” anlamında )
%E -> float ( yukardakinden tek farkı “e” yerine “E” kullanması )
%f -> float ( %e’nin daha insansı formu. “1000.0″ yazıyo direkt )
%g -> float (yukardakinin tıpkısının aynısı )
%G -> float (yukarıdakinin tek yumurta ikizi )
%lf -> double (insansı formda basıyo, “1000.0″ gibi)
%s -> char[] (ne siz sorun, ne ben söyliyim “diziler”e kadar. “dasdklj” gibi şeyleri basıyo )
Yukarıdakilerden daha fazlası var. Ama bunlar bile fazla. Siz sadece %d, %c ve %f’ye alışın yeter =) .
Örnek verirsek
printf("%s %d ... neyse soylemiyim.","bilal",1); |
gibi bi fonksiyon ekrana “bilal 1 … neyse soylemiyim.” basmalı.
Şimdilik bu kadar. 3. bölümde görüşürüz =)


6 yorum var.
zafer
Hocam şimdi ben program hemen kapanmasın sonuç ekranda kalsın(doğrumu yapmışım yanlışmı öğrenmek için :angel: ) diye
“system (”pause”);” adlı komutu kullanıyorum.Ama integer karakterlerde saçma sapan sayılar geliyor.Sadece Char, yada float olarak kullanıbiliyosun.”getchar” komutu da scanf kullanılınca yalan oluyor.Ne yapmalıyım ?
Ağu 9th, 2008
r-G0ne
system(”pause”); kullanımını hiç tavsiye etmem. linux’ta çalışmaz. ayrıca elle ters kulağı tutmak gibi birşey oluyor.
getchar senin de söylediğin gibi, hatalı çalışabiliyor. “bir program tek satır bile olsa elbet bir gün bakıma ihtiyaç duyar.” bunu söyleyen ben değilim. hatalar kaçınılmazdır. sanırım girdi arabelleğini kullanma yöntemlerinden dolayı oluyor bu sorun.
sorunun muhtemel çözümü getchar(); dan önce fflush(stdin); kullanmak. bu şekilde girdi arabelleği temizlenir, ve biz de taze bir tuş bekleriz.
ayrıca, bir diğer yöntem olarak(önermiyorum bunu, kirli bir hile) getchar(); yerine scanf(”%*s”); kullanabilirsin. bu, “%s” gibi okuma yapar, ama değeri saklamaz.(* işaretinin özelliği)
Ağu 9th, 2008
zafer
——
#include
main()
8 haneli bir sayı çıktı.Programdaki problem nedir ?
{
int a;
printf (”sayi gir”);
scanf (”%d”,a);
printf (”%d”,a);
fflush (stdin);
getchar ();
return 0;
}
—-
Aynı problem devam ediyor
Ağu 9th, 2008
r-G0ne
programın hata vermedi mi :S çünkü muhtemelen sana ait olmayan bir belleğe erişmeye çalıştın. windows’un alarmları öttürmesi gerekirdi
sorun scanf’i çalıştırma yönteminde( bi de sorununu yazma yönteminde, lütfen soru sorarken açıklayıcı ol. hatta direkt kodu gönder ilk mesajda ) scanf’in adres ile çalıştırılması zorunludur. yani, scanf(”%d”,a); değil scanf(”%d”,&a); yapman lazımdı. bu da sorunu çözmezse, diğer mesajını bekleriz =)
Ağu 9th, 2008
zafer
Oldu teşekkürler… :mahcupsimili:
Ağu 9th, 2008
r-G0ne
arkadaşlar, bu yazının 3. kısmıyla uğraşıyorum şu an. bitince göndereceğim.(e bi de göndermeseydim =) ). 3. yazı daha çok örnek ağırlıklı olacak. yani, kuramsal bilgileri pekiştireceğiz. ama yazı biraz geç gelebilir.( kişisel nedenler(öss), siz kafanıza takmayın =) )
kalın sağlıcakla
Ağu 28th, 2008
“C Dili: Ders 2 - Veri Türleri ve Fonksiyonlar (II)” yazısına yorum yapın.