Giriş Düzeni
Çıktı Düzeni bölümünde 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.
Giriş için kullanılan düzen dizgisi C'deki scanf
işlevinin düzen dizgisine benzer.
Düzen dizgisi olarak şimdiye kadar yaptığımız gibi " %s"
kullanıldığında, okunmakta olan değişkenin türüne en uygun olan düzende okunur. Örneğin aşağıdaki readf
çağrısında değişkenin türü double
olduğu için girişteki karakterler kesirli sayı olarak okunurlar:
double sayı; readf(" %s", &sayı);
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.
- Düzen belirteci: Önceki bölümdekilere benzer şekilde
%
karakteriyle başlar ve girişten gelen karakterlerin hangi türde okunacaklarını belirler. - Başka herhangi karakter: Girişte aynen bulunması beklenen bir karakteri ifade eder ve onun okunup gözardı edilmesini sağlar.
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:
numara:123 not:90
O satır içerisinden bizim için önemli olan iki bilgi, öğrencinin numarası ve notu olsun; yani girişteki numara:
ve not:
gibi karakterlerin bizim için bir önemi bulunmasın. İşte o satır içinden öğrencinin numarasını ve notunu seçen ve geri kalanını gözardı eden bir düzen dizgisi şöyle yazılabilir:
int numara; int not; readf("numara:%s not:%s", &numara, ¬);
"numara:%s not:%s"
düzen dizgisinde işaretli olarak gösterilen 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.
%
karakterinin özel anlamı nedeniyle, girişte %
karakterinin kendisinin gözardı edilmesi istendiğinde %%
şeklinde çift olarak yazılır.
Tek satırlık bilgi okumak için Dizgiler bölümünde strip(readln())
yöntemi önerilmişti. Düzen dizgisinin sonuna yazılan \n
karakteri sayesinde readf
de bu amaçla kullanılabilir:
import std.stdio; void main() { write("Adınız : "); string ad; readf(" %s\n", &ad); // ← sonda \n write("Soyadınız: "); string soyad; readf(" %s\n", &soyad); // ← sonda \n write("Yaşınız : "); int yaş; readf(" %s", &yaş); writefln("%s %s (%s)", ad, soyad, yaş); }
Yukarıda ad
ve soyad
okunurken kullanılan düzen dizgileri satır sonunda basılan Enter tuşunun oluşturduğu \n
karakterinin de okunmasını ve gözardı edilmesini sağlarlar. Buna rağmen, satır sonlarındaki olası boşluk karakterlerinden kurtulmak için yine de strip()
'i çağırmak gerekebilir.
Düzen karakterleri
Verinin nasıl okunacağı aşağıdaki düzen karakterleriyle belirtilir:
o
: Sekizli sistemde tamsayı oku
x
: On altılı sistemde tamsayı oku
s
: Değişkenin türüne uygun olan düzende oku; en yaygın kullanılan belirteç budur
c
: Tek karakter oku; bu belirteç boşlukları da okur (gözardı edilmelerini önler)
Örneğin, girişte 3 tane "23" bulunduğunu varsayarsak, her birisi aşağıdaki farklı düzen karakterlerine göre farklı olarak okunur:
int sayı_d; int sayı_o; int sayı_x; readf(" %d %o %x", &sayı_d, &sayı_o, &sayı_x); writeln("onlu olarak okununca : ", sayı_d); writeln("sekizli olarak okununca : ", sayı_o); writeln("on altılı olarak okununca: ", sayı_x);
3 defa "23" girildiği halde her birisi farklı okunur:
onlu olarak okununca : 23 sekizli olarak okununca : 19 on altılı olarak okununca: 35
Not: "23", sekizli düzende 2x8+3=19 değerinde, ve on altılı düzende 2x16+3=35 değerindedir.
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.