Categories: C

C Programlama Dersi – 2

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.

  1. Ekrana yazı yazdıralım (halk arasında çıktı işlemleri),
  2. Kullanıcı ve program arasında etkileşim yapalım (girdi işlemleri),
  3. 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:

  1. hem puts() hem de printf() sonuna “;” koyduk. Bu C için verdiğimiz komutun sonuna geldiğini bildiriyor.
  2. 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, at beyine!

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 ama double‘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ş:

  1. Önce değişkenin tutacağı veri tipini belirle. Tam sayı mı, ondalıklı sayı mı, metin mi yoksa tek bir karakter mi?
  2. 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.
  3. 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:

  1. En basit kural, Türkçe karakter ve özel karakter kullanma.
  2. Harf ya da “_” (alt çizgi) ile başlayabilirsin.
  3. C bazı kelimeleri (keywords) kendisi için rezerve etmiştir. Onları da kullanma. Keywordsler için buraya.
  4. 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);
}
Share
Published by
yusufkaracin

Recent Posts

Celery Checklist [Python]

Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…

5 yıl ago

JavaScript Dizileri için 13 İpucu

Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…

5 yıl ago

List & Tuple Mini Test (Python)

listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…

5 yıl ago

Bilmeniz Gereken 11 Python Mülakat Sorusu

Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…

5 yıl ago

Angular Componentlere Konsol Üzerinden Hızlı Erişim

Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…

5 yıl ago

Birkaç Güzel JavaScript Sorusu İster Miydiniz?

Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…

5 yıl ago