Selam efenim,
Hatırladığım kadarıyla en son C diline ufak bir başlangıç yapmıştık. Bugün kendim için şöyle bir menü hazırladım.
- Ekrana yazı yazdıralım (halk arasında çıktı işlemleri),
- Kullanıcı ve program arasında etkileşim yapalım (girdi işlemleri),
- Son olarak “değişkenler”e bakalım.
Eclipse aç, yeni C projesi oluştur ben geliyorum.
Çıktı İşlemleri
#include <stdio.h> #include <stdlib.h> int main(void) { puts("Hello World!"); /* prints Hello World! */ return EXIT_SUCCESS; }
Geçen dersteki kodları hatırlamışındır. puts();
ile ekrana bir şeyler yazdırabiliyorduk. Ayrıca ekrana başka bir fonksiyon ile de yazdırabileceğimizi söylemiştim. Doğru cevap: “printf();
” tebrikler…
Hem puts()
hem de printf()
ekrana yazı yazdırıyor. Aralarında hiç fark yok mu bunların hacı?
Güzel soru. İstersen bunu bir örnekle açıklayayım. Aslında 2 örnekle. Buyrunuz efenim:
#include <stdio.h> #include <stdlib.h> int main(void) { puts("Ben puts içinde ilk paragrafım."); puts("Ben puts içinde ikinci paragrafım."); return EXIT_SUCCESS; }
Yukarıdaki kodu çalıştırdığımızda şöyle bir çıktı almış olmalısın:
Ben puts içinde ilk paragrafım. Ben puts içinde ikinci paragrafım.
Şimdi aynı metinleri printf()
ile yazdıralım:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Ben printf içinde ilk paragrafım."); printf("Ben printf içinde ikinci paragrafım."); return EXIT_SUCCESS; }
Şimdi aldığımız çıktı ise:
Ben printf içinde ilk paragrafım.Ben printf içinde ikinci paragrafım.
Evet sayın, Severus Snape. Sizin de fark ettiğiniz gibi 2 farklı printf()
ile yazdığım metinler yan yana yazılırken, puts()
paragraf olarak ekrana yazdırmış. “Ne yani, şimdi ayrı paragraflar yazdırmak istersem puts()
mu kullanayım? printf()
ne işe yarıyor o zaman?” diye aklınıza gelmiştir (gelmedi). Efenim aslında aynı olayı printf()
ile de yapabiliriz. Şöyle göstereyim:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Ben printf içinde ilk paragrafım.n"); printf("Ben printf içinde ikinci paragrafım."); return EXIT_SUCCESS; }
İşte çıktımız:
Ben printf içinde ilk paragrafım. Ben printf içinde ikinci paragrafım.
Gördüğünüz üzere sanki puts()
ile yazmışım gibi paragrafa ayırabilirdim. “n” (new line) yeni satıra geçmemi sağlıyor. Hatta size şöyle ufak bir kaç kod daha göstermeme izin verin lüfen:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Ben printf içinde ilk paragrafım.nBen printf içinde ikinci paragrafım."); return EXIT_SUCCESS; }
Çıktı:
Ben printf içinde ilk paragrafım. Ben printf içinde ikinci paragrafım.
Birde şuna bakın efenim. n kullanarak istediğim yerde yeni bir satır oluşturabiliyorum:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Ben printf içinde ilk paragrafım.nBen printf içinde ikinci paragrafım."); printf("nBen printf içinde üçüncünparagrafım.nBennprintf içinde ikinci paragrafım."); return EXIT_SUCCESS; }
Çıktı:
Ben printf içinde ilk paragrafım. Ben printf içinde ikinci paragrafım. Ben printf içinde üçüncü paragrafım. Ben printf içinde ikinci paragrafım.
Yeni satıra geçmek için “n” yazacağıma neden printf() içinde yeni satıra geçmiyoruz ki? Şöyle:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Ben printf içinde ilk paragrafım." "Ben printf içinde ikinci paragrafım." "Ben de üçüncü paragraf!"); return EXIT_SUCCESS; }
Güzel çakallık ama istersen çıktıya bir bakalım:
Ben printf içinde ilk paragrafım.Ben printf içinde ikinci paragrafım.Ben de üçüncü paragraf!
Görüldüğü üzere printf()
içine yazılan tüm metin tek satırmış gibi algılandı. Çare “n”
Alkışlarla Severus Snape’i yerine alırken, printf()
ile devam edelim. Ama printf()
hakkında yeni bilgiye geçmeden önce C dilinin kurallarına değinelim:
- hem puts() hem de printf() sonuna “;” koyduk. Bu C için verdiğimiz komutun sonuna geldiğini bildiriyor.
- metinleri ” ” içinde yazdık.
Tekrar printf()
fonksiyonuna geri dönelim. printf()
ile sadece metin değil değişkenleri de yazdırabiliriz. Tabii öncesinde değişken nedir bir bakalım.
Değişkenler
Beyin bedava olduğu için bilgileri beyine atıyoruz. Peki ya yazacağımız programda bilgileri nereye atacağız? Evet, yine beyine atacağız. Yalnız bilgisayarda beyin yerine ramleri kullanmamız gerek. İşte değişkenler yardımıyla bilgileri alıp saklayabilir, değiştirebilir istersek silebiliriz. Değişkenler içide sakladığımız veriler, program akarken değişikliğe uğrayıp değerleri değişebilir. Bu yüzden değişken demişler zaten.
Değişkenler içinde veriler sakladığımızı söylediydim. Yazılımda her verinin bir tipi vardır evlat. Senin için 10, 3/2, 10.234.546 sayılarının hepsi sayı olabilir ama C de hepsinin bir veri tipi var. Şimdik veri tiplerine bakalım sonra değişken tanımlamaya bakarız.
Veri Tipleri
En temel veri tipleriyle başlayalım.Burada kısa bir özet geçiyorum ama çok daha detaylı anlatım için buraya link bırakıyorum.
int
: tam sayı değerleri tanımlamak için kullanılır.char
: tek karakter tanımlamak için kullanılır.double
: reel sayı tanımlamak için kullanılır.float
: bu da reel sayı tanımlamak için amadouble
‘dan daha küçük aralıktaki sayılar için. Küçük dediysem, 1.175494e-038 ile 3.402823e+038 aralığındaki sayıları kastediyorum. e+038, 10 üssü 38 demek bu arada 🙂
Yalnız işletim sistemine göre bu veri tiplerinde ufak farklılıklar olabiliyor. Konu başındaki linkte gayet iyi açıklanmış zaten. Biz devam edelim.
Şimdi biraz pratik yapalım ve değişken tanımlamaya bakalım.
Değişken Tanımlama
veri tipi değişken adı ;
Yukarıda yazar şunu demek istemiş:
- Önce değişkenin tutacağı veri tipini belirle. Tam sayı mı, ondalıklı sayı mı, metin mi yoksa tek bir karakter mi?
- Daha sonra değişkenine bir isim ver. Akılda kalıcı olması ve kullanım amacını açıklayıcı olmasına özen göstermekte fayda var.
- Komutumuz bittiğine göre “;” koyuyoruz.
Aynen şu şekil:
#include <stdio.h> int main(void) { int yas; float sicaklik; double alan; char karakter; return 0; }
Yalnız değişkenlere isim verirken bazı kurallara uymamız gerekecek. Öyle kafana göre isim veremiyorsun canım:
- En basit kural, Türkçe karakter ve özel karakter kullanma.
- Harf ya da “_” (alt çizgi) ile başlayabilirsin.
- C bazı kelimeleri (keywords) kendisi için rezerve etmiştir. Onları da kullanma. Keywordsler için buraya.
- Son kural ama önemli bir kural. C için büyük harf ve küçük harf farklı anlamlar ifade eder. Yani “armut” ve “Armut” farklı değişkenlerdir.
Bugünkü dersimin son kısmında değişkenlere veri atama ve kullanıcıdan girdi almayı öğrenerek bitiriyorum. Önce değişkenlere değer atamakla başlayalım.
Değişkenlere Değer Ataması
Değişkenlerin aldıkları bilgileri “bedava değil mi? attım beyine!” diyerek sakladığını söylemiştim. Ama yukarıda değişken tanımlarken hiçbir değer atamadık. Değişkenlerde ne zaman veri saklayacağımız, verileri değiştirip, işlemler yapacağımız bize kalmış.
İlk olarak değişkeni tanımlarken değer girebiliriz.
#include <stdio.h> int main(void) { int sayi1 = 10; return 0; }
sayi1 isimli bir değişken oluşturduk ve değerini 10 olarak belirledik. printf()
ile değişkenlere ekrana yazdırabileceğimi söylemiştim yukarda, hatırladın mı? Hazır yeri gelmişken ona da bir bakalım.
#include <stdio.h> int main(void) { int sayi1 = 10; printf("Sayı değeri: %d", sayi1); return 0; }
Biraz daha yakından bakalım:
printf("Sayı değeri: %d", sayi1); "
%d” bizim yer tutucumuz (place holder) ve “sayi1” değişkenimiz. Place holder’ı koyduğumuz yerde belirlediğimiz değişken yazılıyor.
Yani “place holder”a şunu diyorum. “Evlat, sen şimdi beni burada bekle. Sana bir değişken gönderteceğim. Sana bir şey söyleyecek. Sende onu ekrana yazacaksın. İşte ben de böyle bir manyağım.” Place holder’da “tamam abi” diyor ve şu çıktıyı alıyoruz:
Sayı değeri: 10
Daha açıklayıcı olması için biraz daha örnek serpiştiriyorum:
#include <stdio.h> int main(void) { int sayi1 = 10; int sayi2 = 5; printf("İlk sayi: %d, İkinci sayi: %d", sayi1,sayi2); return 0; }
Çıktıyı bildiğini biliyorum:
İlk sayi: 10, İkinci sayi: 5
Yalnız tüm place holder’lar %d ile gösterilmiyor. Veri tipine göre değişir, dikkat edelim lütfen.
char
için%c
,int
için%d
,float
için%f
,double
için%lf
,- metinler (string) için
%s
.
Place holder’lara sadece değişken göndermek zorunda değiliz. Placeholder’ın veri tipine uygun değer gönderebiliriz.
Bak şimdi ne yapıyorum:
#include <stdio.h> int main(void) { int sayi = 3; //sayi değişkenine ilk değer olarak 3 verdim. printf("%dn",sayi); //ekrana 3 yazar sayi = 5; //sayi değişkeni içindeki veriyi güncelleyerek 5 yaptım. printf("%dn",sayi); //ekrana 5 yazar sayi = sayi * 2; // sayi değişkenini 2 ile çarpıp tekrar kendisine atadım printf("%dn",sayi); //ekrana 10 yazar printf("%dn", sayi/2); //sayi değişkeni yazdırırken 2ye bölünmüş sonucunu yazdırdım. yani ekrana 5 yazacak. Ama sayi değişkeninin değerini değiştirmedim. printf("%d",sayi); //ekrana 10 yazar printf("%d",12); // ekrana 12 yazar return 0; }
Değişkenlerin tuttuğu değerin program çalışırken değişebileceğini söylemiştim. Aynen yukarıda olduğu gibi. Ayrıca place holder üzerinde de matematiksel işlemler yapabiliyoruz. Değişkenler üzerinde de matematiksel işlemler yapabiliriz.
#include <stdio.h> int main(void) { int sayi1 = 3; int sayi2 = 4; int toplama = sayi1 + sayi2; int cikarma = sayi1 - sayi2; printf("Toplam: %d, Fark: %d", toplama, cikarma); return 0; }
Çıktı:
Toplam: 7, Fark: -1
Hiç karakter ya da metin yazdırmadık. Bir de onlara bakalım. Önce karakter yani char
için bakalım.
char
diğer veri tiplerinden biraz daha farklı. ASCII tablosundaki değerleri kullanabiliyoruz. Tablo burada.
char
veri tipinde birkaç değişken yazdıralım.
#include <stdio.h> int main(void) { char karakter = 'A'; /*char veri tipine değişken atarken ' ' arasına yazmamız gerekir ve sadece tek karakter olmalı. */ char karakter2 = 89; /* ASCII tablosundaki 89. değeri atadım. */ char karakter3 = 33; /* ASCII tablosundaki 33. değeri atadım. */ char metin[] = "Selam, nasıl gidiyor?"; /* Metinleri " " içinde yazmamız gerekir.Değişkenin sonuna [ ] koyarak metin olduğunu söyledim. */ printf("ilk karakter: %c", karakter); printf("nikinci karakter: %c", karakter2); printf("nüçüncü karakter: %c", karakter3); printf("n%s",metin); return 0; }
Çıktı:
ilk karakter: A ikinci karakter: Y üçüncü karakter: ! Selam, nasıl gidiyor?
Metin tanımlama gördüğün gibi char
gibi değil. Birazcık farklı ama bir hikmeti var elbete. Yalnız şimdi sırası değil.
Buraya kadar hep verileri ben atadım. Peki ya programa kullanıcı veri girmek isterse ne yapmamız gerekecek?
Aferin, bu soruyu bekliyordum en başından beri. Böylelikle bugünkü son başlığımıza geliyoruz: Kullanıcıdan veri alma ya da girdi işlemleri.
Girdi İşlemleri
Veri girişi için kullandığımız fonksiyon scanf()
Hemen basit bir program hazırlayalım. Programımız kullanıcıdan 2 sayı alacak ve bunların toplamını bulacak.
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int sayi1, sayi2; //kullanıcıdan gelecek sayıları tutacağım değişkenler int toplam; //sayıların toplamını atayacağım değişken printf("Lütfen ilk sayıyı girin: "); //1.sayıyı girmesi için kullanıcıya mesaj scanf("%d", &sayi1); //kullanıcının girdiği sayıyı, sayi1 değişkenine attım printf("nLütfen ikinci sayıyı girin: "); //2.sayıyı girmesi için kullanıcıya mesaj scanf("%d", &sayi2); //kullanıcının girdiği sayıyı, sayi2 değişkenine attım toplam = sayi1 + sayi2; //girilen sayıların toplamını toplam değişkinine attım printf("nToplam: %d", toplam); return (EXIT_SUCCESS); }
Zaten kodların yanında açıklamalar mevcut ama scanf()
fonkiyonuna yakından bakalım. printf()
ile oldukça benzer. Yalnız değişkenin önünde “&” işareti var. İşte bütün olay bu kadar.
Yalnız burada şöyle bir soruna parmak basmak istiyorum. Ben kullanıcıdan tam sayı girmesini bekliyorum. Ya kullanıcı ondalıklı sayı ya da metin girerse ne olacak?
Bu da güzel bi soru evlat ama biraz ara verelim. Yeterince uzun bir konu oldu. Kısaca bir özet geçip bugünlük veda edelim…
Özet
printf()
ile çıkış,scanf()
ile giriş işlemleri yapılır.- değişkenleri yazdırırken placeholder kullanılır.
printf("hava %d derece", havaSicakligi);
- veri girişi yapılırken de placeholder kullanılır. Ama değişken önüne & işareti koymayı unutma.
scanf("%d", &yas);
- veri tipi degiskenAdi; formülüne göre değişken tanımlanabilir.
float hesapTutari;
printf()
içinde yeni satıra geçmek için n kullanılmalı.
Çalışma Sorusu
Senaryo: Kullanıcı kilometre cinsinden bir değer girecek ve bunun kaç mil yaptığı çıktı olarak alacak.
Eğitimim için kullandığım örnekleri bu adresteki github reposunda saklıyorum. Ders başlığıyla eşit olan klasörde kaynak kodları bulabilirsiniz.
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { double km; //kilometre değerini saklayacağım değişken double mil = 0.6213; //1 mil = 0.6213 km puts("Lütfen kilometre olarak bir değer giriniz:"); //input message scanf("%lf", &km); mil = km * mil; printf("%lf km = %lf mil", km, mil); return (EXIT_SUCCESS); }
Yorumlar