Giriş Düzeni
Not: Phobos'un bir hatası yüzünden, bu derslerdeki örneklerdeki düzen
dizgilerinin hepsinin sonuna bir .dup eklemek zorunda kaldım. Ne yazık ki
o hata, .dup'suz derlenen programların çökmesine neden oluyor.
Hata giderildiğinde, hem bu notu hem de normalde gerekmeyen aşağıdaki
.dup'ları kaldıracağım.
Çıktı düzeni dersinde anlatılanlara benzer şekilde, girişten gelen verilerin düzeni de belirtilebilir. Bu düzen; hem okunması istenen bilgiyi, hem de gözardı edilmesi istenen bilgiyi belirtebilir.
Düzen dizgisi kullanılmadığında değerler çıkışa sanki %s belirteci kullanılmış gibi yazdırılıyorlardı. Girişten okurken de normalde düzen belirteci kullanılmadığında, her değişken kendi türünün normal düzeni olarak okunur. Örneğin şu readf çağrılarının ikisi de aynı şekilde çalışır; ikisi de girişten bir kesirli sayı okur:
double sayı; din.readf(&sayı); din.readf("%f".dup, &sayı);
Giriş için kullanılan düzen dizgisi, C'deki scanf işlevinin düzen dizgisine çok benzer.
Düzen dizgisi içinde üç tür bilgi bulunabilir:
- boşluk karakteri: girişteki sıfır veya daha fazla boşluk karakteri anlamına gelir ve onların okunup gözardı edilmelerini sağlar
- herhangi bir karakter: girişte aynen bulunması beklenen bir karakteri ifade eder ve onun okunup gözardı edilmesini sağlar
- düzen belirteci: önceki derstekilere benzer şekilde
%karakteriyle başlar ve girişten gelen karakterlerin hangi türde okunacaklarını belirler
O bilgiler sayesinde, girişten gelen veri içerisinden bizim için önemli olanlarını seçip çıkartmak ve geri kalanını gözardı etmek son derece kolaydır.
Ayrıntıya girmeden önce, bu üç tür bilgiyi kullanan bir örneğe bakalım. Girişte tek satır halinde şöyle bir bilgi bulunsun:
öğrenci_numarası:123 öğrenci_ismi:Ayşe
O satır içerisinden bizim için önemli olan iki bilgi, öğrencinin numarası ve ismi olsun; yani girişteki öğrenci_numarası: ve öğrenci_ismi: gibi karakterlerin bizim için bir önemi bulunmasın. İşte o satır içinden öğrencinin numarasını ve ismini seçen ve geri kalanını gözardı eden bir düzen dizgisi şöyle yazılabilir:
int numara; char[] isim; din.readf("öğrenci_numarası:%d öğrenci_ismi:%s".dup, &numara, &isim);
%d ve %s, belirtildikleri noktalarda girişte sırasıyla bir tamsayı ve bir dizgi olduğunu ifade ederler.
"öğrenci_numarası:%d öğrenci_ismi:%s" düzen dizgisi içinde maviyle gösterdiğim bütün karakterler girişte aynen bulunmalıdırlar; onlar readf tarafından girişten okunup gözardı edilirler.
O düzen dizgisinde kullanılan tek boşluk karakteri, girişte o noktada bulunan bütün boşluk karakterlerinin gözardı edilmelerine neden olur.
Girişte kullanılan düzen belirteçleri, çıkışta kullanılanlardan çok daha basittir:
% genişlik düzen_karakteri
Baştaki % karakterinin ve sondaki düzen karakterinin yazılması şarttır, genişlik ise isteğe bağlıdır.
% karakterinin böyle özel bir anlamı olduğu için, girişte % karakterinin kendisinin gözardı edilmesi istendiğinde %% şeklinde çift olarak yazılır.
düzen_karakteri
d: onlu sistemde tamsayı
o: sekizli sistemde tamsayı
x: onaltılı sistemde tamsayı
i: tabanı bilinmeyen tamsayı; 0x ile başlarsa onaltılı, 0 ile başlarsa sekizli, değilse onlu olarak okunur
f: kesirli sayı
s: sözcük
c: tek bir karakter; bu belirteç, boşlukları da okur (gözardı edilmelerini önler)
n: şimdiye kadar okunan karakter sayısı
Örneğin girişte 3 tane "23" bulunduğunu varsayarsak; değer, düzen belirtecine göre farklı olarak okunur:
int sayı_d; int sayı_o; int sayı_x; din.readf("%d %o %x".dup, &sayı_d, &sayı_o, &sayı_x); dout.writefln("onlu olarak okununca : ", sayı_d); dout.writefln("sekizli olarak okununca : ", sayı_o); dout.writefln("onaltılı olarak okununca: ", sayı_x);
Girişine 3 defa "23" girdiğimiz halde, değerler farklı okunur:
onlu olarak okununca : 23 sekizli olarak okununca : 19 onaltılı olarak okununca: 35
Not: Çok kısaca; "23", sekizli düzende 2x8+3=19 değerinde, ve onaltılı düzende 2x16+3=35 değerindedir.
genişlik
Normalde değer, düzen belirtecine uyan bütün karakterleri içerir. Örneğin girişte "1234" şeklinde bulunan karakterler %d ile 1234 değerinde okunurlar. Düzen belirtecinin genişlik bölümü, bize o dört karakteri örneğin iki farklı tamsayı olarak okuma olanağı sağlar:
din.readf("%2d%2d".dup, &birinci, &ikinci); dout.writefln("birinci: %d, ikinci: %d", birinci, ikinci);
Girişten "1234" geldiğinde:
birinci: 12, ikinci: 34
Problem
- Girişten yıl.ay.gün düzeninde bir tarih bilgisi gelsin. Ekrana kaçıncı ay olduğunu yazdırın. Örneğin 2009.09.30 geldiğinde 9 yazılsın.
D.ershane
Forum
Wiki
Projeler
Tanıtım
İletişim
Hakları