2 Mayıs 2015 Cumartesi

C Programlama Ders 4 - Temel Giriş/Çıkış Fonksiyonları (printf, scanf, puts, gets, getchar)

Bütün programlama dillerinde temel giriş/çıkış fonksiyonları bulunur. Bu fonksiyonlar en genel tabiriyle kullanıcının programdan veri okumasını veya programa veri girişi yapmasını sağlar.

C Standart Kütüphanesinde temel giriş/çıkış fonksiyonları "stdio.h" başlık dosyası içinde tanımlıdır. En çok kullanılan temel giriş/çıkış fonksiyonları şunlardır:

  • printf()
  • scanf()
  • puts()
  • gets()
  • getchar()
Faydalı Bilgi 4.1 - Fonksiyonları Programa Dahil Eden Bağlayıcı (Linker)

Temel giriş/çıkış fonksiyonları da tıpkı diğer standart fonksiyonlar gibi kütüphanede bulunurlar. Kütüphane fonksiyonları C programlama dilinin bir parçası değildir. Derleyici kaynak kodu makine diline çevirirken bir standart fonksiyon gördüğünde oraya işaret koyarak boş bırakır. Çünkü kütüphanenin yerini derleyici değil, bağlayıcı(linker) bilir. Derlemeden sonraki aşamada bağlayıcı bu boşlukları doldurur ve kaynak kod makine diline çevrilmiş olur. Bu son aşamadır artık çalıştırılabilir (executable) program hazırdır.

Fonksiyonların yanlış yazılması durumunda ise derleyici hatayı anlayamaz. Bunu bağlayıcı boşlukları doldururken fark eder ve bağlamayı sonlandırarak "undefined reference" (tanımsız referans) şeklinde hata mesajı gönderir.

printf() Fonksiyonu


İlk dersimizde printf fonksiyonuna kısaca değinmiştik ve bu derse kadar yaptığımız uygulamalarda da printf fonksiyonunu çeşitli şekillerde kullandık. Bu ders printf() fonksiyonunu baştan alıp daha teknik bilgilerle ileriye götürerek bütün kullanım şekillerini ve inceliklerini göreceğiz.

Fonksiyon Prototipi

int printf(const char *format, ...);

Bu prototip programcıya şunu söyler: "Bana göndereceğin ilk parametre char tipinde olsun, diğerlerinin sayısını ve tipini sen belirle."

Ek Bilgi

printf() fonksiyonunun başka bir özelliği de yazdırdığı metnin kaç karakter olduğunu geriye döndürmesidir. Bu nedenle prototipin başındaki geri dönüş tipi int olarak belirtilmiştir. Aşağıda bu özelliği kullanarak bir uygulama yapacağız. (Fonksiyonun geri döndürmesi derken ne kastettiğimi anlamayanlar o uygulamayla anlayacaktır.)

const ifadesi ise; fonksiyona gönderilen değerin, fonksiyon içersinde değiştirilemez, sadece okunabilir olduğunu belirtir.


Basit bir printf() uygulaması:
#include <stdio.h>
main()
{
 
 printf("Alt Developer\n");
 printf("Ders 4\nTemel Giris/Cikis Fonksiyonlari");

}

Çoğu zaman ekrana bir değişkenin değerini yazdırmamız gerekir. Bunun için tip belirteçlerini kullanırız. Yazdığımız metinde değişken değerinin gözükmesini istediğimiz yere tıpkı new-line (\n) karakterini eklediğimiz gibi bir belirteç ekler virgülden sonra ise değişkenin adını gireriz.

Bu noktada bilmemiz gereken, her veri tipi için farklı belirteç kullanıldığıdır. Belirteçler ve kullanıldıkları veri tipleri aşağıdaki tabloda verilmiştir:

Belirteç Veri Tipi Anlamı
 %c  char  tek bir karakter
 %s  char  karakter dizisi (string)
 %d  int  tamsayı
 %ld  long  uzun tamsayı
 %u  unsigned int  işaretsiz tamsayı
 %lu  unsigned long  işaretsiz uzun tamsayı
 %f  float  Gerçel sayı
 %lf  double  Çift duyarlı gerçel sayı

Bu bilgiler ışığında artık herhangi bir değişkenin değerini ekrana yazdırabiliriz.

Değişken değerini yazdırma:
#include <stdio.h>
main()
{
 
 int gun=29,yil=1453;
 char ay[5]="Mayis";
 
 printf("Istanbul %d yilinda %s ayinin %d'unda fethedilmistir.\n",yil,ay,gun);

}

Değişkenlerle matematiksel işlemler yapıp sonucu parametre olarak atayabiliriz:
#include <stdio.h>
main()
{
 
 int kurulusTarihi=1923;
 printf("%d tarihinde kurulan Cumhuriyetimiz %d yasinda.\n",kurulusTarihi, 2015-kurulusTarihi);
 
 int kapasite=2000, katilim=1979;
 printf("%d kisilik salonda sadece %d tane bos koltuk var.\n\n",kapasite,kapasite-katilim);

}

 "printf() fonksiyonu aynı zamanda geriye karakter sayısını döndürür." demiştik. Yukarıda yaptığımız örneklerde bu fonksiyonu sadece çalıştırdık. Onu herhangi bir değişkene atamadığımız için geriye döndürdüğü değeri göremedik. Şimdi aşağıdaki örneği inceleyelim ve fonksiyonun geriye döndürdüğü değer derken neyi kastettiğimizi anlayalım.

printf() fonksiyonuyla karakter sayısını bulma:
#include <stdio.h>
main()
{
 
 int karakterSayisi, sayi=321;
 
 karakterSayisi=printf("Deneme %d\n",sayi);
 printf("Yukaridaki metin %d karakter uzunlugundadir.\n\n",karakterSayisi); 
        // boşluk ve \n birer karakterdir.

}


scanf() Fonksiyonu


Şimdiye kadar yaptığımız programlarda değişkenlerin değerlerini kendimiz belirledik. Kullanıcının değer girmesine izin vermedik. Ancak hemen hemen her programda kullanıcının programa veri girişi yapması gereken durumlar vardır. Bu durumlar için scanf() fonksiyonu kullanılır.

Fonksiyon Prototipi

int scanf(const char *format, ...);

Ek Bilgi

scanf() fonksiyonuyla veri girişi yapıldıktan sonra fonksiyon geriye 1 veya 0 sayısını döndürür. Eğer girilen değer belirtilen veri tipine uygunsa veri girişi başarılı olur ve geriye 1 döndürür. Eğer girilen değer veri tipine uygun değilse giriş başarısız olur ve geriye 0 döndürür.

Yani veri tipine uygun olmayan giriş hata üretmez. Dolayısıyla bunun sınamasını programcı yapmalıdır. Aksi taktirde program yanlış sonuçlar üretebilir. Bunu ileride if-else yapısını anlatırken göstereceğiz.


Basit bir scanf() uygulaması:
#include <stdio.h>
main()
{
 
char ad[10];
 int numara;
 printf("Adinizi girin: ");
 scanf("%s",&ad);
 printf("Numaranizi girin: ");
 scanf("%d",&numara);
 
 printf("%s bey numaranizi %d olarak girdiniz.\n\n",ad,numara);

}

Değişken isminin başına eklediğimiz & işaretine adres operatörü denir. Bir değişkenin başına geldiğinde artık değişkenin değeri değil, bellekteki adresi temsil edilir. Daha detaylı bilgiyi pointer konusuna geldiğimizde vereceğiz. Şimdilik şunu bilmeniz yeterli; scanf() fonksiyonuna değişkenin değeri değil bellekteki adresi gönderilir.

scanf() fonksiyonunun ilk parametresine belirteçler dışında bir karakter girmeniz doğru değildir. Derleme esnasında hata üretmez ancak programın yanlış ve saçma sonuçlar üretmesine neden olur.

scanf() fonksiyonuyla klavyeden birden fazla sayı okunabilir. Bunun için yapmanız gereken belirteçler arasına birer boşluk bırakmak. Klavyeden giriş yaparken ise diğer sayıya geçmek için boşluk, tab veya enter tuşları kullanılabilir. Bu tuşların her biri sonlandırıcı karakter olarak adlandırılır.

Tek scanf() ile birden fazla sayı girilmesi:
#include <stdio.h>
main()
{
 
int not1,not2,not3;
 float ortalama;
 
 printf("Notlarinizi Giriniz: ");
 scanf("%d %d %d",&not1, &not2, &not3);

 ortalama= (float)(not1+not2+not3)/3;
 
 printf("Ortalamaniz: %f\n\n",ortalama);

}


puts() Fonksiyonu


Bu fonksiyon printf() gibi ekrana çıktı vermek için kullanılır ancak aralarında farklar vardır.

printf() Fonksiyonundan Farkı:

  1. Sadece metin yazdırılabilir. int, float, double gibi veri tipleri yazdırılamaz. (Metnin içinde rakam olabilir.)
  2. Tek parametre kabul eder. 
  3. Metni yazdırdıktan sonra alt satıra iner. (new-line karakteri (\n) kullanmaya gerek kalmaz.) 


Fonksiyon Prototipi

int puts(const char *s);

Prototipten anlayacağımız üzere fonksiyon, char tipinde tek bir parametre alıyor. Yani virgül koyup ikinci veya üçüncü parametrelere izin vermez. Bu yüzden printf() fonksiyonundaki gibi belirteç kullanımını tanımaz ve belirteci olduğu gibi yazdırır.

Not: Geriye değer olarak; eğer başarıyla gerçekleştiyse pozitif bir sayı, başarıyla gerçekleşmediyse EOF karakterini döndürür. EOF karakteri işletim sistemlerine göre değişmekle birlikte genelde -1'dir

puts() Kullanımı:
#include <stdio.h>
main()
{
 
 puts("Alt Developer C Programlama Dersleri");
 
 char metin[20]="Puts Kullanimi";
 puts(metin);

}


gets() Fonksiyonu


Bu fonksiyon da scanf() fonksiyonu gibi programa veri girmek için kullanılır ve aralarındaki fark puts-printf arasındaki ilişki gibidir.

scanf() Fonksiyonundan Farkı:

  1. Girilen değeri sadece char tipine atar. 
  2. Tek parametre kabul eder. 
  3. Önemli: scanf()'te boşluk, tap ve enter tuşları metine dahil edilmez ve girişi sonlandırır. gets()'te sadece enter girişi sonlandırır boşluk ve tab tuşlarına izin verir. 

Fonksiyon Prototipi

Fonksiyon Prototipi

char *gets(char *s);

Şimdiye kadar gördüğümüz fonksiyonlardan farklı olarak prototipin başında char var. Fakat geri dönüş tipi char değildir. gets'in başındaki * geri dönüş tipini pointer yapar. Yani geriye bellekten bir adres döndürür. Pointer kavramını ilerideki derslerde anlatacağız. Burada şunu bilmeniz yeterli; gets() fonksiyonunun geriye döndürdüğü değer, ona atadığımız verinin bellekteki adresidir.

gets() Kullanımı:
#include <stdio.h>
main()
{
 
        char cumle[50];
 
 printf("\nMetin girin: ");
 gets(cumle);
 
 printf("\nGirilen metin: %s\n\n",cumle);

}


getchar() Fonksiyonu 


Bu fonksiyon ile sadece karakter okunur. Bu karakteri hiçbir değişkene atamaz veya yazdırmaz. Programı istenen yerde durdurmak için kullanılır. Enter'a bastıktan sonra program bir alt satırdan devam eder.

Fonksiyon Prototipi

int getchar(void);

Prototipteki void ifadesi boş veri tipidir. Fonksiyona parametre girilmesine gerek yoktur.

getchar Kullanımı:
#include <stdio.h>
main()
{
 
        printf("1. Bunu yazdirdi ve durdu.");
 getchar();
 printf("2. Enter'a basinca bunu yazdirdi.");

}

Temel giriş/çıkış fonksiyonları bu kadarla sınırlı değildir. Çeşitli eylemleri gerçekleştirmek için bir çok giriş/çıkış fonksiyonu vardır. En çok kullanılanlar burada verdiklerimizdir.

Bu dersimizi burada bitiriyoruz. Bir sonraki dersimizde karşılaştırma veya sınama yapmamızı sağlayan if-else yapısı ve switch-case yapısını anlatacağız.

0 yorum:

Yorum Gönder