Kodun çalışma mantığı şöyledir.
oku
fonksiyonuna gönderilen string başına "0" eklemek suretiyle önce 15
haneye tamamlanır, sonra yeni string 3 erli kümeler halinde 5 eşit
parçaya bölünür ve her bir üçlü küme tek tek dizisine yüklenir. Böylece 5
elemanlı rakam dizisinin her bir elemanında 3 karakterli bir string
yüklü olur.
1.Aşama
sayımız 32313234 olsun. ilk olarak sayımızın hane sayısını
başına 0 eklemek sureti ile 15 e çıkarırız.
Böylece yeni stringimiz
000000032313234 şeklini alır.
2.Aşama
Stringimiz 3 erli kümeler halinde 5 eşit parçaya bölünür.
1. küme : 000
2. küme : 000
3. küme : 032
4. küme
: 313
5. küme : 234
3.aşama
her bir küme 5 elemanlı rakam isimli araya yüklenir ve
sonuçta
rakam[0] = "000"
rakam[5] = "234"
olur
rakam[5][0]="2"
5. kümenin yüzler basamağı;
rakam[5][1]= "3" 5. kümenin onlar
basamağı;
rakam[5][2]= "4" 5. kümenin birler basamağı;
olur.
4.aşama
10 elemanlı yüzler,onlar ,birler string dizileri
tanımlanır ve içleri doludur
örn:
yuzler.SetValue("ikiyuz",2);
onlar.SetValue("otuz",3);
birler.SetValue("dört",4);
yani yuzler[2]+onlar[3]+birler[4] = ikiyüzotuzdört olur.
int x
=Convert.ToInt16(rakam[5][0].ToString()); yüzler
int y
=Convert.ToInt16(rakam[5][1].ToString()); onlar
int z
=Convert.ToInt16(rakam[5][2].ToString()); birler
yuzler[x]+onlar[y]+birler[z] = ikiyüzotuzdört
bir döngü ile her bir kümeye bu işlemi uygularsanız, 1 ve
ikinci kümlerin bütün elemanları sıfır olduğu için sonuçta
otuzdört
üçyüzonuç
ikiyüzotuzdört
ü elde edersiniz
5.Aşama
hane isimli 5 li array tanımlanır ve elemanları trilyon,
milyar, milyon, bin ve sonuncusu da boş olacak şekilde ayarlanır. aynı
döngü içerisinde her bir kümenin sonuna eklenir
string sonuc = "";
for(int
i = 0 ; i < 5;i++)
{
sonuc =
sonuc +
yuzler[Convert.ToInt16(rakam[0].ToString())]+
onlar[Convert.ToInt16(rakam[1].ToString())]+
birler[Convert.ToInt16(rakam[i][2].ToString())]+
hane[i];
}
Burada ayarlanması
gereken durum eğer bir kümenin bütün elemanları sıfırsa (yukarıdaki
gibi) hanenin gözükmemesi gerekir. Yani
000 = yuzler[0]+onlar[0]+birler[0]+hane[0] dersek sonuç
trilyon olur bu durumda
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!= "000")
hane.SetValue("milyar ",1);
if(rakam[2].ToString()!= "000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!= "000")
hane.SetValue("bin ",3);
yani rakam[0] (trilyon kümesi) "000" değilse hane[0] =
"trilyon" olsun demeliyiz.
Yanlız
bir sorun daha var. eğer sayı 1000 ise fonksiyon bize haklı olarak
"birbin" i döndürür. Bir milyar var, Bir Milyon var ama bir bin ve bir
yüz yok. Ben bu sorunu BirSorunu isimli fonksiyonla hallettim.
Aşağıdaki kodu inceleyebilirsiniz.
using System;
namespace
numbereader
{
public
class
SayiOkuma
{
privatestring[ ] yuzler =newstring[10];
private string[ ] onlar =new string[10];
private string[ ] birler =new string[10];
private string[ ] hane = new string[5];
private string[ ] rakam =newstring[5];
// arrayları tanımlıyoruz
public
SayiOkuma()
{
// içlerini dolduruyoruz
yuzler.SetValue("dokuzyüz",9);
yuzler.SetValue("sekizyüz",;
yuzler.SetValue("yediyüz",7);
yuzler.SetValue("altıyüz",6);
yuzler.SetValue("beşyüz",5);
yuzler.SetValue("dörtyüz",4);
yuzler.SetValue("üçyüz",3);
yuzler.SetValue("ikiyüz",2);
yuzler.SetValue("yüz",1);
yuzler.SetValue("",0);
onlar.SetValue("doksan",9);
onlar.SetValue("seksen",;
onlar.SetValue("yetmiş",7);
onlar.SetValue("altmış",6);
onlar.SetValue("elli",5);
onlar.SetValue("kırk",4);
onlar.SetValue("otuz",3);
onlar.SetValue("yirmi",2);
onlar.SetValue("on",1);
onlar.SetValue("",0);
birler.SetValue("dokuz",9);
birler.SetValue("sekiz",;
birler.SetValue("yedi",7);
birler.SetValue("altı",6);
birler.SetValue("beş",5);
birler.SetValue("dört",4);
birler.SetValue("üç",3);
birler.SetValue("iki",2);
birler.SetValue("bir",1);
birler.SetValue("",0);
hane.SetValue("",0);
hane.SetValue("",1);
hane.SetValue("",2);
hane.SetValue("",3);
hane.SetValue("",4);
/* ilk olarak bu arrayın elemanlarını
boş olarak ayarlıyoruz eğer küme elemanları
000 değilse
trilyon,milyar,milyon bin değerleri ile dolduruyoruz
*/
}
public string oku(string sayi)
{
int uzunluk = sayi.Length;
if(uzunluk
> 15)
return "Hata girilen değerin uzunluğu en fazla 15 olmalı";
// uzunluk 15 karakterden fazla olmamalı. si
try
{
long k =
Convert.ToInt64(sayi);
}
catch(Exception
ex)
{
return
ex.Message.ToString();
}
sayi = "000000000000000"+sayi;
sayi =
sayi.Substring(uzunluk,15);
rakam.SetValue(sayi.Substring(0,3),0);
rakam.SetValue(sayi.Substring(3,3),1);
rakam.SetValue(sayi.Substring(6,3),2);
rakam.SetValue(sayi.Substring(9,3),3);
rakam.SetValue(sayi.Substring(12,3),4);
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!= "000")
hane.SetValue("milyar
",1);
if(rakam[2].ToString()!=
"000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!= "000")
hane.SetValue("bin ",3);
string
sonuc = "";
for(int
i = 0 ; i < 5;i++)
{
sonuc = sonuc + yuzler[Convert.ToInt16(rakam[i][0].ToString())]+
birsorunu(onlar[Convert.ToInt16(rakam[i][1].ToString())]+birler[Convert.ToInt16(rakam[i][2].ToString())]+hane[i]);[/i][/i][i][/i][i][i]
}
return sonuc;
}
privatestring
birsorunu (string sorun)
{
string cozum = "";
if (sorun == "birbin ")
cozum = "bin ";
else
cozum = sorun;
return
cozum;
}
}
}[/i][/i][/i][/i][/i][/i]
oku
fonksiyonuna gönderilen string başına "0" eklemek suretiyle önce 15
haneye tamamlanır, sonra yeni string 3 erli kümeler halinde 5 eşit
parçaya bölünür ve her bir üçlü küme tek tek dizisine yüklenir. Böylece 5
elemanlı rakam dizisinin her bir elemanında 3 karakterli bir string
yüklü olur.
1.Aşama
sayımız 32313234 olsun. ilk olarak sayımızın hane sayısını
başına 0 eklemek sureti ile 15 e çıkarırız.
Böylece yeni stringimiz
000000032313234 şeklini alır.
2.Aşama
Stringimiz 3 erli kümeler halinde 5 eşit parçaya bölünür.
1. küme : 000
2. küme : 000
3. küme : 032
4. küme
: 313
5. küme : 234
3.aşama
her bir küme 5 elemanlı rakam isimli araya yüklenir ve
sonuçta
rakam[0] = "000"
rakam[5] = "234"
olur
rakam[5][0]="2"
5. kümenin yüzler basamağı;
rakam[5][1]= "3" 5. kümenin onlar
basamağı;
rakam[5][2]= "4" 5. kümenin birler basamağı;
olur.
4.aşama
10 elemanlı yüzler,onlar ,birler string dizileri
tanımlanır ve içleri doludur
örn:
yuzler.SetValue("ikiyuz",2);
onlar.SetValue("otuz",3);
birler.SetValue("dört",4);
yani yuzler[2]+onlar[3]+birler[4] = ikiyüzotuzdört olur.
int x
=Convert.ToInt16(rakam[5][0].ToString()); yüzler
int y
=Convert.ToInt16(rakam[5][1].ToString()); onlar
int z
=Convert.ToInt16(rakam[5][2].ToString()); birler
yuzler[x]+onlar[y]+birler[z] = ikiyüzotuzdört
bir döngü ile her bir kümeye bu işlemi uygularsanız, 1 ve
ikinci kümlerin bütün elemanları sıfır olduğu için sonuçta
otuzdört
üçyüzonuç
ikiyüzotuzdört
ü elde edersiniz
5.Aşama
hane isimli 5 li array tanımlanır ve elemanları trilyon,
milyar, milyon, bin ve sonuncusu da boş olacak şekilde ayarlanır. aynı
döngü içerisinde her bir kümenin sonuna eklenir
string sonuc = "";
for(int
i = 0 ; i < 5;i++)
{
sonuc =
sonuc +
yuzler[Convert.ToInt16(rakam[0].ToString())]+
onlar[Convert.ToInt16(rakam[1].ToString())]+
birler[Convert.ToInt16(rakam[i][2].ToString())]+
hane[i];
}
Burada ayarlanması
gereken durum eğer bir kümenin bütün elemanları sıfırsa (yukarıdaki
gibi) hanenin gözükmemesi gerekir. Yani
000 = yuzler[0]+onlar[0]+birler[0]+hane[0] dersek sonuç
trilyon olur bu durumda
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!= "000")
hane.SetValue("milyar ",1);
if(rakam[2].ToString()!= "000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!= "000")
hane.SetValue("bin ",3);
yani rakam[0] (trilyon kümesi) "000" değilse hane[0] =
"trilyon" olsun demeliyiz.
Yanlız
bir sorun daha var. eğer sayı 1000 ise fonksiyon bize haklı olarak
"birbin" i döndürür. Bir milyar var, Bir Milyon var ama bir bin ve bir
yüz yok. Ben bu sorunu BirSorunu isimli fonksiyonla hallettim.
Aşağıdaki kodu inceleyebilirsiniz.
using System;
namespace
numbereader
{
public
class
SayiOkuma
{
privatestring[ ] yuzler =newstring[10];
private string[ ] onlar =new string[10];
private string[ ] birler =new string[10];
private string[ ] hane = new string[5];
private string[ ] rakam =newstring[5];
// arrayları tanımlıyoruz
public
SayiOkuma()
{
// içlerini dolduruyoruz
yuzler.SetValue("dokuzyüz",9);
yuzler.SetValue("sekizyüz",;
yuzler.SetValue("yediyüz",7);
yuzler.SetValue("altıyüz",6);
yuzler.SetValue("beşyüz",5);
yuzler.SetValue("dörtyüz",4);
yuzler.SetValue("üçyüz",3);
yuzler.SetValue("ikiyüz",2);
yuzler.SetValue("yüz",1);
yuzler.SetValue("",0);
onlar.SetValue("doksan",9);
onlar.SetValue("seksen",;
onlar.SetValue("yetmiş",7);
onlar.SetValue("altmış",6);
onlar.SetValue("elli",5);
onlar.SetValue("kırk",4);
onlar.SetValue("otuz",3);
onlar.SetValue("yirmi",2);
onlar.SetValue("on",1);
onlar.SetValue("",0);
birler.SetValue("dokuz",9);
birler.SetValue("sekiz",;
birler.SetValue("yedi",7);
birler.SetValue("altı",6);
birler.SetValue("beş",5);
birler.SetValue("dört",4);
birler.SetValue("üç",3);
birler.SetValue("iki",2);
birler.SetValue("bir",1);
birler.SetValue("",0);
hane.SetValue("",0);
hane.SetValue("",1);
hane.SetValue("",2);
hane.SetValue("",3);
hane.SetValue("",4);
/* ilk olarak bu arrayın elemanlarını
boş olarak ayarlıyoruz eğer küme elemanları
000 değilse
trilyon,milyar,milyon bin değerleri ile dolduruyoruz
*/
}
public string oku(string sayi)
{
int uzunluk = sayi.Length;
if(uzunluk
> 15)
return "Hata girilen değerin uzunluğu en fazla 15 olmalı";
// uzunluk 15 karakterden fazla olmamalı. si
try
{
long k =
Convert.ToInt64(sayi);
}
catch(Exception
ex)
{
return
ex.Message.ToString();
}
sayi = "000000000000000"+sayi;
sayi =
sayi.Substring(uzunluk,15);
rakam.SetValue(sayi.Substring(0,3),0);
rakam.SetValue(sayi.Substring(3,3),1);
rakam.SetValue(sayi.Substring(6,3),2);
rakam.SetValue(sayi.Substring(9,3),3);
rakam.SetValue(sayi.Substring(12,3),4);
if(rakam[0].ToString()!=
"000")
hane.SetValue("trilyon ",0);
if(rakam[1].ToString()!= "000")
hane.SetValue("milyar
",1);
if(rakam[2].ToString()!=
"000")
hane.SetValue("milyon ",2);
if(rakam[3].ToString()!= "000")
hane.SetValue("bin ",3);
string
sonuc = "";
for(int
i = 0 ; i < 5;i++)
{
sonuc = sonuc + yuzler[Convert.ToInt16(rakam[i][0].ToString())]+
birsorunu(onlar[Convert.ToInt16(rakam[i][1].ToString())]+birler[Convert.ToInt16(rakam[i][2].ToString())]+hane[i]);[/i][/i][i][/i][i][i]
}
return sonuc;
}
privatestring
birsorunu (string sorun)
{
string cozum = "";
if (sorun == "birbin ")
cozum = "bin ";
else
cozum = sorun;
return
cozum;
}
}
}[/i][/i][/i][/i][/i][/i]