-Sayi giriniz: 582374
-bes yuz seksen iki bin uc yuz yetmis dort
Öncelikle programın nasıl çalışacağını tasarlayalım.
Kullanıcıdan sayıyı aldığımız zaman sol baştan beri bu sayıyı okumaya başlamalıyız. Bunu sağlayabiliriz fakat bu birazdan vereceğim yönteme kıyasla biraz daha uğraştırıcı olur.
Bunun yerine sayıyı terse çevirelim ve direkt sağdan beri okumaya başlayalım.
Max okuyacağımız sayı 999999999 olsun ve programın gerekli yerlere 'milyon' ve 'bin' koymasını sağlayalım. Yani geri kalan 3 basamaklı sayıları bizim önceden girdiğimiz gibi okusun. Fonksiyonu yazarsak:
void oku(int a,int b) {
if(b==0) b=3;
if (a==1 && b==1) printf("bir ");
else if(a==2 && b==1) printf("iki ");
else if(a==3 && b==1) printf("uc ");
else if(a==4 && b==1) printf("dort ");
else if(a==5 && b==1) printf("bes ");
else if(a==6 && b==1) printf("alti ");
else if(a==7 && b==1) printf("yedi ");
else if(a==8 && b==1) printf("sekiz ");
else if(a==9 && b==1) printf("dokuz ");
else if(a==1 && b==2) printf("on ");
else if(a==2 && b==2) printf("yirmi ");
else if(a==3 && b==2) printf("otuz ");
else if(a==4 && b==2) printf("kirk ");
else if(a==5 && b==2) printf("elli ");
else if(a==6 && b==2) printf("altmıs ");
else if(a==7 && b==2) printf("yetmis ");
else if(a==8 && b==2) printf("seksen ");
else if(a==9 && b==2) printf("doksan ");
else if(a==1 && b==3) printf("yüz ");
else if(a==2 && b==3) printf("iki yüz ");
else if(a==3 && b==3) printf("uc yüz ");
else if(a==4 && b==3) printf("dort yüz ");
else if(a==5 && b==3) printf("bes yüz ");
else if(a==6 && b==3) printf("alti yüz ");
else if(a==7 && b==3) printf("yedi yüz ");
else if(a==8 && b==3) printf("sekiz yüz ");
else if(a==9 && b==3) printf("dokuz yüz ");
}
Fonksiyona iki değer gönderiyoruz: birincisi (a) okunacak rakam, ikincisi (b) hangi basamakta olduğu. Sayıyı üçerli bölerek okuyacağımız için toplam üç basamak varmış gibi düşündük. Mesela '3' rakamını birler basamağında "üç", onlar basamağında "otuz", yüzler basamağında "üç yüz" diye okuruz.
24142345 sayısını ele alalım. Program öncelikle sayıyı tersine çevirecek. Tersine çevirmek için bir fonksiyon yazalım.
int tersten(int a) {
int b,ters=0;
ters=a%10;
a/=10;
while (a>0) {
ters*=10;
b=a%10;
ters+=b;
a/=10;
}
return ters;
}
Fonksiyona sayıyı göndereceğiz ve bize sayının tersini döndürecek. 24142345 sayısını fonksiyona gönderirsek bize 54324142 sayısını döndürecek.Sonra program sayının kaç basamaklı olduğunu bulsun. Bunun için de fonksiyon yazalım.
int basamak(int a) {
int bs=0;
while (a>0) {
a/=10;
bs++;
}
return bs;
}
Bu fonksiyonlardan dönen değerleri değişkenlere atayalım.
tsayi=tersten(sayi);
bs=basamak(sayi);
Şimdi programın asıl yapacağı işe gelelim. Basamak sayısı 6'dan büyük ise 6. basamaktan sonraki üç veya daha az basamaklı sayıyı okuyacak ve sonuna 'milyon' ekleyecek. Programın bu kısmını koda dökersek:
if (bs>6) {
for(i=bs;i>6;i--) {
oku(tsayi%10,i%3);
tsayi/=10;
}
printf("milyon ");
bs=6;
}
Program çalışırken buraya geldiğinde "yirmi dort milyon" yazacak. (Farkettiyseniz okuduğu her rakamdan sonra o rakamı siliyor.)Buraya kadar her şey net sanırım. Asıl problem çıkartan kısım binlik kısım. Burada hiç sayı olmayabilir, bunun için burda sayı yoksa "bin" yazdırmak yanlış olur. Aynı zamanda sadece 1 varsa bile "bir bin" yazar ki buda yanlış olur. Bunun için programın bu kısmıyla biraz daha fazla uğraşacağız.
if (bs>3) {
for(i=bs;i>3;i--) {
if (sayi/1000 % 10 ==1 && sayi /10000 ==0) {
tsayi/=10;
break;
}
else {
oku(tsayi%10,i%3);
if (tsayi%10==0) a++;
}
tsayi/=10;
}
if(a!=3)
printf("bin ");
bs=3;
}
for döngüsüne bu hataları engellemek için bir koşul ve bir değişken (a) ekledik.
Koşul derki "Eğer sayının 4. basamağı '1' ise ve sonrasında bir rakam yoksa döngüyü sonlandır.(Bu programın "bir bin" yazmasını engeller.) Değilse rakamı oku, rakam '0' ise a değişkenini bir arttır ve sayıyı 10'a böl.".
Gelelim a değişkeninin ne işe yaradığına. Bunu da mesela 1000008 sayısının "bir milyon bin sekiz" şeklinde okunmasını engellemek için kullandık. Eğer ortadaki rakamların üçü de 0 değilse bin yazdırır.
Bu kısımda az önceki yazılan kısma ilaveten "yuz kirk iki bin" yazdırdık.
En son kısmı da yazarsak:
if (bs>0) {
for(i=bs;i>0;i--) {
oku(tsayi%10,i);
tsayi/=10;
}
}
Böylece program son kısmı da ekledi: "uc yuz kirk bes".
Ve okuma işlemi tamamlanmış oldu: "yirmi dort milyon yuz kirk iki bin uc yuz kirk bes"
Ben daha sonra bütün bu işlemleri sayiyi_oku(int a) fonksiyonu oluşturup içine koydum böylelikle çok daha sade bir main fonksiyonum oldu. Bir kaç ufak eklerle birlikte program bu hale geldi:
#include
void oku(int a,int b);
int tersten(int a);
int basamak(int a);
void sayiyi_oku(int sayi);
int main() {
int sayi;
printf("Sayiyi giriniz: "); scanf("%d", &sayi);
sayiyi_oku(sayi);
return 0;
}
int tersten(int a) {
int b,ters=0;
ters=a%10;
a/=10;
while (a>0) {
ters*=10;
b=a%10;
ters+=b;
a/=10;
}
return ters;
}
int basamak(int a) {
int bs=0;
while (a>0) {
a/=10;
bs++;
}
return bs;
}
void oku(int a,int b) {
if(b==0) b=3;
if (a==1 && b==1) printf("bir ");
else if(a==2 && b==1) printf("iki ");
else if(a==3 && b==1) printf("uc ");
else if(a==4 && b==1) printf("dort ");
else if(a==5 && b==1) printf("bes ");
else if(a==6 && b==1) printf("alti ");
else if(a==7 && b==1) printf("yedi ");
else if(a==8 && b==1) printf("sekiz ");
else if(a==9 && b==1) printf("dokuz ");
else if(a==1 && b==2) printf("on ");
else if(a==2 && b==2) printf("yirmi ");
else if(a==3 && b==2) printf("otuz ");
else if(a==4 && b==2) printf("kirk ");
else if(a==5 && b==2) printf("elli ");
else if(a==6 && b==2) printf("altmıs ");
else if(a==7 && b==2) printf("yetmis ");
else if(a==8 && b==2) printf("seksen ");
else if(a==9 && b==2) printf("doksan ");
else if(a==1 && b==3) printf("yüz ");
else if(a==2 && b==3) printf("iki yüz ");
else if(a==3 && b==3) printf("uc yüz ");
else if(a==4 && b==3) printf("dort yüz ");
else if(a==5 && b==3) printf("bes yüz ");
else if(a==6 && b==3) printf("alti yüz ");
else if(a==7 && b==3) printf("yedi yüz ");
else if(a==8 && b==3) printf("sekiz yüz ");
else if(a==9 && b==3) printf("dokuz yüz ");
}
void sayiyi_oku(int sayi){
int tsayi,bs,i,a=0;
if(sayi>999999999) {
printf("Cok buyuk sayi girdiniz!");
return;
}
tsayi=tersten(sayi);
bs=basamak(sayi);
if (bs>6) {
for(i=bs;i>6;i--) {
oku(tsayi%10,i%3);
tsayi/=10;
}
printf("milyon ");
bs=6;
}
if (bs>3) {
for(i=bs;i>3;i--) {
if (sayi/1000 % 10 ==1 && sayi /10000 ==0) {
tsayi/=10;
break;
}
else {
oku(tsayi%10,i%3);
if (tsayi%10==0) a++;
}
tsayi/=10;
}
if(a!=3)
printf("bin ");
bs=3;
}
if (bs>0) {
for(i=bs;i>0;i--) {
oku(tsayi%10,i);
tsayi/=10;
}
}
}
Hiç yorum yok:
Yorum Gönder