Veri Türleri, Atama İfadesi, Basit Girdi Çıktı Java programlama dilindeki veri türleri tanıtılacak ve bu veri türleri kullanılarak tanımlanan değişkenlerin bellekte nasıl gösterildiği tartışılacaktır. Daha sonra deyimin ne olduğu, içindeki işlemlerin hangi sırada yapıldığı atama ifadesi ile birlikte anlatılacaktır. Bu haftaki dersimiz Java konsol uygulama programları ve appletlerden nasıl basit girdi/çıktı yapılacağının öğretilmesi ile devam edecektir.
Veri Türleri Tanımlayacağımız her değişken bellekte bir bölgeye denk gelecektir. Bir değişkenin türü o değişkene denk düşen bellek bölgesinin büyüklüğünü ve o bölgenin içindeki bilginin nasıl yorumlanacağını gösterir. Bir değişkene yeni bir değer verdiğimizde, verdiğimiz bu değer o değişkene denk düşen bellek bölgesine eski değeri yok ederek saklanır. Örneğin, int x; tanımlaması, x değişkeni için 32 bitlik bir bellek bölgesinin kullanacağını ve bu bölgenin içindeki bitlerin bir tamsayı (integer) olarak yorumlanacağını gösterir. Aşağıdaki atama ifadesi ile x değişkenine 10 değerini verebiliriz: x = 10; Bu atama ifadesinden sonra, x değişkenine denk gelen bellek bölgesi 10 sayısını 32 bit’lik bölgeyi kullanarak bir tamsayı olarak tutacaktır. Bu bellek bölgesi sonradan yeni bir atama ifadesi ile değiştirilebilir. Örneğin, x = 20; atama ifadesi x değişkenin içine 20 sayısını koyacaktır ve eski değer olan 10 buradan silinecektir.
İkilik Düzendeki Sayılar Bilgisayardaki her değer, ikilik düzendeki sayılar ile gösterilir. İkilik düzendeki tek bir rakam (0 ya da 1) bir bit olarak adlandırılır. Her bir bit iki değişik durumu gösterir. Bit dizgileri daha büyük sayıları göstermekte kullanılır. Her bit dizgisinin kaç değişik değeri gösterebileceği o dizgideki bit sayısına bağlıdır. Eğer bir bit dizgisinde N bit varsa, o dizgi 2N değişik değeri gösterebilir. Örneğin bit sayısına göre kaç değişik değer gösterilebileceği aşağıdaki tabloda verilmiştir: 1 bit 21=2 değişik değer : 0 1 2 bit 22=4 değişik değer : 00 01 10 11 3 bit 23=8 değişik değer : 000 001 010 011 100 101 110 111 : 32 bit 232=4,294,967,296 değişik değer 64 bit 264=18,446,744,073,709,551,616 değişik değer
İkilik Düzendeki Sayılar (Devamı) Gördüğünüz gibi dizgiye her bit eklediğimizde, o dizginin gösterebileceği değişik değerin sayısı iki katına çıkar. Tanımlayacağımız her değişken bellekte bir bit dizgisi olarak tutulacaktır ve bu bit dizgisinin nasıl yorumlanacağı ise o değişkenin türüne bağlı olacaktır. Örneğin veri türü int olan bir değişken 32 bitlik bir bit dizgisi olarak tutulacaktır ve bu bit dizgisi artı ya da eksi bir tamsayı olarak yorumlanacaktır. Java’daki her veri türü bir değerler kümesinden ve onların üzerinde yapılabilecek işlemlerden oluşur. Her veri türünün int, float, char gibi bir adı olacaktır. Bellekte tutulan her değer belirli bir veri türü kullanılarak yorumlanacaktır. Java’daki her değişkenin bir türü olacaktır ve bir değişkenin türünün ne olacağını tanımlama (declaration) ifadesi ile belirtiriz. Örneğin, int x, y; int z; double d; tanımlama ifadeleri x, y, z değişkenlerinin türlerinin tamsayıların gösteriminde kullanılan bir veri türü olan int olacağını ve d değişkeninin türünün ise reel sayıların gösteriminde kullanılan bir veri türü olan double olacağını belirtir. Java'da kullanılan her literalin (sabit sayı) de bir veri türü vardır. Örneğin, 5 bir tamsayıyı (yani int) ve 5.0 bir reel sayıyı (yani double) gösteren birer literaldir. Bellekte 5 ve 5.0 gösteren bit dizgileri tamamen farklı iki dizgi olacaklardır.
İkilik Düzendeki Sayılar (Devamı) Java’daki veri türlerini aşağıdaki iki gruba ayırırız: · ilkel veri türleri (primitive data types) · nesnesel veri türleri (object data types) İlkel veri türleri ile tanımlanan değişkenler için gerekli bellek, tanımlama (declaration) sırasında otomatik olarak ayrılır. Nesnesel veri türü ile tanımlanan bir değişken için otomatik olarak bir bellek ayrılmaz; bu tür bir değişken için daha sonra new işlemcisini kullanarak gerekli olan belleği ayırırız. Bu hafta, nesnesel veri türlerinden yalnızca String’i kısaca tanıtacağız. Daha sonra, nesnesel veri türlerini daha ayrıntılı olarak tartışacağız.
İlkel Veri Türleri (Primitive Data Types) Java programlama dilinde aşağıdaki anahtar sözcüklerle ifade edilen 8 ilkel veri türü vardır: byte short int long float double boolean char Tamsayılar için ilkel veri türleri: Tamsayıların gösteriminde dört değişik veri türü kullanabiliriz. Bu veri türleri şunlardır: · byte · short · int · long Bu dört veri türü de artı ve eksi tamsayıların gösteriminde kullanılır; tek farklı olan nokta değişik miktarlarda bellek kullanmalarıdır. Bu durumda gösterebilecekleri tamsayıların miktarları da farklı olacaktır. Bu veri türlerinden biri ile tanımlanan değişkene denk düşen bellekteki bit dizgisi bir tamsayı (artı ya da eksi) olarak yorumlanacaktır. Her bir veri türü, yalnızca biri eksi (en küçük değer) diğeri artı (en büyük değer) olan belirli iki tam sayı arasındaki değerleri gösterebilir. Aşağıdaki tablo her veri türünün kaç bitlik bir bellek bölgesi kullandığını ve bu veri türü ile gösterilebilen en küçük ve en büyük tamsayıları gösterir.
İlkel Veri Türleri(Devamı) Java programlama dilinde tamsayıları aşağıdakiler gibi yazabiliriz: 5 3344 89
Reel Sayılar İçin İlkel Veri Türleri Reel sayılar için kullanılan iki ilkel veri türü vardır: · float · double Bu iki veri türü de reel sayıların gösteriminde kullanılır. Bir reel sayı, bilimsel notasyonda mantissa * 2power formülüyle gösterilebilir; böylece bir reel sayıyı bilgisayarda göstermek için kullanılan bit dizgisinin bir bölümü sayının rakamlarını gösteren mantissa için ayrılmış ve diğer bir bölümü de üs (power) göstermek için ayrılmıştır. float ve double veri türlerinin kullandıkları bellek büyüklüğü ve mantissa ve power için ayırdıkları bit miktarı farklıdır. Aşağıdaki tablo bu veri türlerinin kaç bitlik bir alan kullandıklarını ve yaklaşık olarak gösterebilecekleri en küçük ve en büyük sayıları gösterir.
Reel Sayılar İçin İlkel Veri Türleri(Devamı) float veri türü sayının 7 rakamını, double veri türü ise 15 rakamını saklayabilir. Reel sayıları yazmak için noktalı notasyonu ya da bilimsel notasyon olarak bilinen e-notasyonunu kullanabiliriz. Bazı reel sayıları aşağıdaki gibi yazabiliriz: 5.0 7.34 0.5e+12 -15.35e-15 e-notasyonunda yazılan 0.5e+12 sayısı 0.5x1012 sayısına, -15.35e-15 sayısı -15.35x10-15 sayısına eşittir.
char İlkel Veri Türü Java programlama dilinde her bir char değeri Unicode karakter kümesinden bir karakteri saklar. Bu Unicode karakter kümesi karakterlerin sıralanmış bir listesidir. Unicode karakter kümesi her bir karakter için 16 bitlik bir bellek bölgesi kullanılır, böylece 65536 değişik karakter gösterilebilir. Unicode karakter kümesi uluslararası bir karakter kümesidir ve birçok dildeki karakterler bu kümededir. Java’dan önce yaygın olarak kullanılan (hala diğer programlama dilleri tarafından kullanılan) bir karakter kümesi de ASCII karakter kümesidir. ASCII karakter kümesi her bir karakter için yalnızca 8 bit kullanır ve İngilizce dışında diğer dillerdeki çoğu karakteri kapsamaz. ASCII karakter kümesi Unicode karakter kümesinin bir alt kümesidir. Karakter literalleri ‘‘ sembolleri arasına yazılır. Örneğin, bazı karakter literalleri aşağıdaki gibi yazılabilir: ‘A’ ‘B’ ‘a’ ‘b’ ‘0’ ‘1’
boolean İlkel Veri Türü Bir boolean değer yalnızca doğru ya da yanlış olan bir durumu gösterebilir. Örneğin, boolean değerler bir lambanın açık ya da kapalı olması gibi iki değişik değeri olan durumları göstermekte kullanılabilir. Boolean bir değişken için yalnızca true ve false anahtar sözcükleri ile ifade edilen iki değerden biri geçerlidir.
Nesnesel Veri Türleri (Object Data Types) Bu gruptaki veri türlerinden yalnızca string’i bu hafta göreceğiz. Daha sonraki haftalar nesnesel veri türlerini daha ayrıntılı inceleyeceğiz. String nesnesel veri türü: Java programlama dilinde nesnesel veri türü olan string yaygın olarak kullanılır. string veri türüne ait değerler diğer nesnesel veri türleri gibi new işlemcisi kullanılarak yaratıldığı gibi, string literalleri kullanılarak da yaratılabilir. Bir string literali " " arasına yazılmış karakterlerden oluşur. Örneğin, string s1, s2; s1 = "abc"; s2 = "de"; ifadeleriyle iki string değişkeni tanımlanır; iki string nesnesi string literalleri kullanılarak yaratılır ve bu nesneler tanımlanan bu iki değişkenin içine saklanır. İki string nesnesi birleştirme işlemcisi (+) ile birleştirilebilir. Örneğin, System.out.println(s1+s2); ifadesi s1 ve s2'deki stringleri birleştirerek "abcde" dizgisini elde eder ve bu sonucu bastırır. Birleştirme işlemcisinin parametrelerinden biri string, ama diğeri int ise, int değeri ilk önce string’e çevrilir, sonra birleştirme işlemi yapılır. Örneğin, System.out.println(s1+35); ifadesinde 35 sayısı ilk önce "35" dizgisine çevrilir; daha sonra s1’deki dizgi ile birleştirilir ve en son olarak “abc35“ dizgisi basılır. Daha sonraki haftalarda string sınıfını ve içindeki işlevleri ayrıntıları ile işleyeceğiz.
Değişkenlerin Tanımlanması Bir değişken belirli bir veri türünü tutan bir bellek bölgesini gösteren bir tanımlayıcıdır. Bütün değişkenler kullanılmadan önce tanımlanmalıdır. Bir tanımlama ifadesi aynı veri türüne sahip olacak bir ya da daha fazla değişkenin tanımlanmasında kullanılır. Bir tanımlama ifadesinin yapısı aşağıdakiler gibi olmalıdır: veri-türü değişken-adı; veri-türü değişken-adı1,değişken-adı2, ... ,değişken-adın; Örneğin, int sum; int x,y; double z; Birinci tanımlama ifadesi sum değişkeninin türünün int olacağını, ikinci tanımlama ifadesi x ve y değişkenlerinin türünün int olacağını ve üçüncü ifade de z değişkeninin türünün double olacağını gösterir. Bir tanımlama ifadesinde birden fazla değişken tanımlanacaksa, bu değişkenler virgüllerle ayrılır.
Değişkenlerin Tanımlanması(Devamı) Değişkenlere ilk değerleri istenirse tanımlanma anında verilebilir. Örneğin, int sum = 0; int x=0, y=10; tanımlama ifadeleri aynı zamanda sum, x ve y değişkenlerine ilk değerlerini verirler. Bir sabit (constant), bir değişkene benzer ama o var olduğu sürece yalnızca bir değer tutar. Hangi tanımlayıcıların sabit olarak kullanılacağı tanımlama ifadesinde final anahtar sözcüğü kullanılarak belirtilir. Örneğin, final double PI = 3.14159; final int numofstudents = 50; PI ve numofstudents sabitlerine değerlerini verirler ve bu değerler bir daha program içinde değiştirilemezler. Eğer bir değişkene bir kez değer verip bir daha değiştirmeyeceksek, o değişken yerine bir sabit kullanmamız daha iyidir. Böylece kaza ile değer değişmeleri gibi hatalarla uğraşmak zorunda kalmayız. Program içinde, bir literal yerine bir sabit kullanmamız, kodumuzu daha okunabilir kılacaktır. Üstelik o sabitin değerini tek bir noktada (yani tanımlama sırasında) verdiğimizden, gerektiğinde yalnızca o tek noktada değişiklik yaparak kodumuzu değiştirmemiz daha kolay olur.
Atama İfadesi Atama ifadesi, bir değişkene yeni bir değer vermek için kullanılır. Bir atama ifadesinin yapısı genelde aşağıdaki gibidir: değişken = deyim; Sağdaki deyimin (expression) değeri bulunur ve bulunan değer soldaki değişkenin içine konur. Bir deyim yalnızca bir değişken, sabit ya da literal olabilir. Örneğin, int x, y; x = 5; y = x; x = 6; komutları ilk önce x değişkenin içine 5 değerini koyar; daha sonra x değişkenin içindeki değeri y değişkenin içine kopyalar ve en son olarak da x değişkenin içine 6 değerini, içindeki eski değeri silerek koyar.
Atama İfadesi(Devamı) Bir deyim, işlemciler (operators) ve işlenenlerden (operands) oluşan bir dizgidir. Bazı aritmetik işlemciler şunlardır: · + toplama · - çıkartma · * çarpma · / bölme · % kalan (mode operator) Bir işlenen (operand) ise bir literal, bir değişken, bir sabit ya da diğer tek bir değeri gösteren yapılar olabilir. Örneğin, x = y + 1; y = x * z; atama ifadelerinde, önce y+1 deyimini hesaplamak için y’nin içindeki değer 1 ile toplanır ve sonuç x değişkeni içinde saklanır; sonra x*z deyimini hesaplamak için de x’in içindeki değer z’nin içindeki değer ile çarpılır ve sonuç y değişkeninin içinde saklanır.
İşlemci Önceliği (Data Precedence) Eğer bir deyimde birden fazla işlemci varsa bu işlemleri hangi sırada yapacağımız işlemcilerin önceliğine göre belirlenir. Örneğin, x = y + z * 5; komutunda ilk önce çarpma işlemini mi yapacağız, yoksa toplama işlemini mi yapacağız? Bu iki değişik sıra deyim sonucunun tümüyle iki farklı değer olması demektir. Java programlama dilinde çarpma işlemcisinin önceliği toplama işlemcisininkinden daha yüksek olduğundan ilk önce çarpma işlemi yapılacaktır. Yani ilk önce z ve 5 çarpılacak ve elde edilen sonuç ile y toplanacaktır. Bazen bir deyimde ardarda gelen iki işlemcinin önceliği aynı olabilir. Bu durumda, işlemcilerin hangi sırada yapılacağını gösteren birleşme (associativity) kuralına bakılarak işlem sırası belirlenir. Örneğin Java programlama dilinde toplama ve çıkartma aynı önceliğe sahiptir. Aşağıdaki komutta toplama işlemleri soldan sağa doğru yapılacaktır: x = y + z + 5; Yani ilk önce x ve y toplanacak ve o toplamın sonucu 5 ile toplanacaktır. Bu örnekte toplamaların hangi sırada yapılacağı sonucu etkilemeyebilir; ama aşağıdaki örnekte etkileyecektir: x = y - z + 5; Yukarıdaki örnekte - ve + işlemcileri aynı önceliğe sahip olduklarından, bu işlemleri soldan sağa doğru yaparız (ilk önce – işlemi, sonra + işlemi).
İşlemci Önceliği(Devamı) İşlemci öncelikleri parantezler kullanılarak değiştirilebilir. Örneğin, x = (y+z) * 5; komutunda parantezleri kullanarak + işlemcisi, * işlemcisinden daha önce yapılmaya zorlanmıştır.
Atama İfadesinde Türlerin Uyuşmazlığı Normal olarak bir atama ifadesinin solundaki değişkenin türü ile sağındaki deyimin türü aynı olmak zorundadır. Eğer sol taraftaki değişken türü int ise, sağ taraftaki deyimin türü de int olmak zorundadır. Örneğin, int x; double y; x = y; atama ifadesiyle bir double değeri, bir int değişkeni içine saklanmak istendiğinden, Java derleyicisi bu atama ifadesine hata mesajı verecektir. Bunun nedeni herhangi bir double değeri, bir bilgi kaybı olmadan bir int değeri olarak saklanamaz. Ancak bazı durumlarda Java derleyicisi, değişkenin türü ile deyim türünün aynı olmasında ısrar etmez. Örneğin, int x; double y; y = x; komutuna Java derleyicisi hata vermez. x değişkenin içindeki int değeri otomatik olarak bir double değere çevrilir ve bu double değer, y değişkenin içinde saklanır. Bu, otomatik tür değiştirme (automatic type casting) olarak bilinir. Örneğin, bütün tamsayı veri türlerindeki değerler otomatik olarak double değerine dönüştürülebilir. Bir tamsayı veri türündeki değer, o veri türünden daha fazla bellek kullanan tamsayı veri türüne otomatik olarak dönüştürülebilir. Örneğin, bir short değeri otomatik olarak int ya da long değerine dönüştürülebilir.
Konsol Uygulama Programlarında Basit Girdi/Çıktı Konsol uygulama programlarında yapacağımız girdi/çıktı işlemleri, girdi akışı (input stream) ve çıktı akışı (output stream) olarak bilinen mekanizmalar kullanılarak yapılır. En basit çıktı üretmenin yolu standart çıktı akışı olan System.out akışını kullanmaktır. Bu standart çıktı akışı ekran ile özdeşleşmiştir ve onu kullanarak ekrana istediklerimizi yazdırabiliriz. Benzer şekilde standart girdi akışı System.in akışı da klavye ile özdeşleşmiştir ve klavyeden yazılacak girdileri okumakta kullanılır.
Basit Girdi/Çıktı (Devamı) System.out akışına print ve println işlevlerini kullaranak çıktı gönderebiliriz. Örneğin, System.out.println("bir dizgi"); işlev çağırma komutu, bilgisayarın ekranına çift tırnak " sembolleri arasında kalan dizgiyi ekrana yazar ve imleç bir sonraki satıra geçer. Yani, ekranda, bir dizgi yazısını göreceğiz. Eğer çıktımızı ekrana yazdırdıktan sonra bir sonraki çıktı için bir alt satıra gitmek istemezsek, print işlevini kullanmalıyız. Örneğin, System.out.print("bir dizgi"); işlev çağırma komutu, ekrana bir dizgi yazdıktan sonra, imleç bir alt satıra gitmeyecek o yazıdan hemen sonraki noktada bulunacaktır. Örneğin, System.out.print("bir dizgi"); System.out.print("diger dizgi"); işlev çağırma komutları ekrana bir dizgidiger dizgi yazısını yazacaktır.
Basit Girdi/Çıktı (Devamı) System.out.println("bir dizgi"); System.out.println("diger dizgi"); komutları ekrana bir dizgi diger dizgi yazılarını yazacaktır. Çıktı işlevlerinin parametreleri yalnızca tek bir dizgi olduğu gibi, bir deyim de olabilir. Eğer deyimin sonucunun türü string değilse, çıktı işlevi çağırılmadan sonuç string’e çevrilir. Örneğin, System.out.println(5); komutu bir tamsayı olan 5 sayısını ilk önce bir dizgiye çevirir ve ekrana bu dizgiyi yazar. Böylece ekranda 5 sayısını görürüz. Bazen bir çıktı komutunun parametresi aşağıdaki gibi olabilir: System.out.println("bir sayi: " + 5); Bu komut, 5 tamsayısını bir dizgiye çevirdikten sonra, + birleştirme işlemcisi (concatenation operator) kullanarak, bu dizgiyi komuttaki dizgi ile birleştirir ve sonucu ekrana yazar. Ekranda, bir sayi: 5 yazısını görürüz.
Basit Girdi Programımızda ilk iş olarak klavye ile özdeşleşen System.in girdi akışını kullanarak girdi işlemlerimizi yapmakta kullanacağımız BufferedReader nesnesi yaratmamız gerekir. Aşağıdaki tanımlama ifadesini programımızın main işlevinin tanımlama ifadeleri arasına koymalıyız: BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in)); Bu komut ilk önce System.in girdi akışından bir InputStreamReader nesnesi yaratır ve bu nesneyi de kullanarak BufferedReader nesnesi yaratarak stdin değişkeninin içine koyar. Bu değişkeni kullanarak BufferedReader sınıfındaki işlevlere erişebiliriz. BufferedReader sınıfından yalnızca readLine işlevini kullanacağız. Bu işlev, klavyeden yazacağımız bir satırı tamamen okur ve bu satırdaki bütün karakterleri bir dizgi olarak geri döndürür. Örneğin, s = stdin.readLine(); komutu çalıştığında, bilgisayar bizim klavyeden bir şeyler yazmamızı bekleyecektir. Eğer klavyeden, bu bir satırdır yazar ve Enter tuşuna basarsak, "bu bir satırdır" dizgisi okunacak ve bir String değişkeni olarak tanımlandığını kabul ettiğimiz s değişkeninin içinde saklanacaktır.
Bir Tamsayı Okumak için Daha önceden de belirtiğimiz gibi bir tamsayıyı klavyeden okuyacak basit bir işlev yoktur. Bu yüzden bir satıra yazdığımız bir tamsayıyı bir dizgi olarak okuyup, daha sonra onu bir tamsayı türüne çevirmeliyiz. Aşağıdaki iki komut bir satırda yazılan tek bir tamsayı okur: s = stdin.readLine(); i= new Integer(s.trim()).intValue(); İlk komut bir satırı bir dizgi olarak tamamen okur ve bu dizgiyi s değişkenin içinde saklar. İkinci komutta yapılan işleri aşağıdaki gibi sıralayabiliriz: · s.trim() işlevi, s dizgisinin başındaki ve sonundaki boşlukları atar ve dizginin geri kalan kısmını geri döndürür. Geri dönen dizginin ilk ve son karakteri boşluk değildir ve bu dizgi yalnızca klavyeden yazmış olacağımız tamsayıyı tutacaktır. Burada s.trim() kullanmadaki amaç, klavyeden yazacağımız tamsayıdan önce ve sonra Enter tuşuna basmadan istediğimiz kadar boşluk bırakabilme hakkına sahip olma isteğimizdir. · new Integer(s.trim()) başından ve sonundan bütün gereksiz boşluklar atılmış olup yalnızca tamsayı tutan dizgiden bir integer nesnesi yaratır. Bu yaratılan integer nesnesi, bizim girdiğimiz tamsayıyı tutar. integer sınıfı, ilkel veri türü olan int’e benzer ama o bir nesnesel veri türüdür. · Bu yaratılan integer nesnesi, intValue() işlevi ile int veri türündeki bir değere dönüştürülür. · Bu int değeri bir int değişkeni olan i değişkeni içinde saklanır.
Bir Tamsayı Okumak İçin (Devamı) Yukarıdaki iki komut çalıştığında ve klavyeden 123<enter tuşu> satırı girildiğinde "123" dizgisi okunur. Bu dizginin başında ve sonunda boşluk olmadığından s.trim() işlevi aynı dizgiyi geri döndürür. Bu dizgiden bir integer nesnesi yaratılır ve bu nesne intValue() işlevi ile 123 int değerine çevrilir. Bu 123 tamsayısı, i değişkenin içinde saklanır. Eğer klavyeden, 212 <enter tuşu> girilirse, s.trim() 212 sonra girilen boşlukları atar ve yalnızca “212” dizgisini döndürür ve bu dizgi 212 tamsayısına dönüştürülerek, i değişkenin içinde saklanır. Eğer klavyeden bir tamsayı olamayacak bir dizgi girecek olursak (örneğin 'abc'), programımız bir çalışma (run-time) hata mesajı verir ve çalışmasını durdurur. Benzer şekilde bir reel sayı aşağıdaki komutlar ile okunabilir: s = stdin.readLine(); d = new Double(s.trim()).doubleValue(); Bu komutlarla, yine, ilk önce klavyeden yazılan bir reel sayı, bir dizgi olarak okunur ve bu dizgi, bir reel sayıya çevrilir.
Örnek Program Bu örnek programda (SumDiffApplication.java), klavyeden iki tamsayı okutacağız ve bu sayıların toplamlarını ve birinci ve ikinci sayı arasındaki farkı bularak ekrana yazdıracağız.
import java.io.*; public class SumDiffApplication { public static void main(String args[]) throws IOException { String s; // okunan dizgi int i1,i2; // okunan tamsayılar int sum,diff; // toplam ve fark // Klavye ile özdeşleşen System.in akışını kullanarak // BufferedReader nesnesini yarat BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in)); // İlk tamsayıyı oku System.out.print("Birinci tamsayi "); System.out.flush(); s = stdin.readLine(); i1 = new Integer(s.trim()).intValue(); // İkinci tamsayıyı oku System.out.print("Ikinci tamsayi "); System.out.flush(); s = stdin.readLine(); i2 = new Integer(s.trim()).intValue(); // Toplamı bul sum = i1 + i2; // Farkı bul diff = i1 - i2; // Toplamı ve farkı ekrana yazdır System.out.println("Toplam: " + sum); System.out.println("Fark : " + diff); } } SumDiffApplication.java
Örnek Program (Devamı) Bu program, her sayıyı okumadan önce, ekrana, print işlevi ile kullanıcıya ne yapacağını söyleyen uyarıyı bastırır ve kullanıcının yazdığı sayı okunarak değişkenin içinde saklanır. print işlevinden sonra kullanılan flush işlevi, yazdığımız mesajın ekrana gitmesini garantiler. Bunun nedeni, print işlevi ile ekrana gönderdiğimiz çıktıların buffer (tampon) olarak bilinen bir bölgede depolanması ve belirli zamanlarda ekrana gönderilmesidir. flush işlevi, bu buffer bölgesindeki çıktının ekrana hemen gönderilmesini sağlar. Sayılar okunup değişkenler içinde saklandıktan sonra, toplamları ve farkları atama ifadeleri ile bulunur. Bulunan sonuçlar, println işleviyle ekrana gönderilir. println işlevi gönderdiği çıktıların hemen ekrana gitmesini kendi zorladığından, ek olarak flush işlevini kullanmamıza gerek yoktur.
Appletlerde Basit Girdi/Çıktı Uygulama programlarının aksine, applet programlarında girdi ve çıktı işlemleri applet üzerindeki bölgelerden yapılır. Bu bölgeler nesneler olarak tanımlanır ve o applet üzerine konur. Bir bölgeden çıktı yapmak istediğimizde, bu işi, o bölgede saklanan nesnenin değerini değiştirerek yaparız. Bir girdi bölgesi olarak tanımlanan bir bölgeden de, kullanıcı o bölgeye bir şeyler yazıp Enter tuşuna bastığında yazacağımız applet programındaki belirli bir işlev yazılan girdiyi bir nesne olarak alır ve bu nesneyi istediği veri türüne çevirebilir. SumApplet.java
Appletlerde Basit Girdi/Çıktı (Devamı) Bu sınıfta dört değişken tanımladık: bir Label nesnesi olan prompt, bir TextField nesnesi olan input, ve iki tamsayı tutacak olan number ve sum. Label olarak bir nesne ile yalnızca çıktı işlemi yapacağımızı ve TextField olarak tanımlanan bir nesneyle de girdi işlemi yapacağımızı belirtmiş oluruz. Appletimiz ilk başladığında init işlevi çalışacaktır. Bu işlevde yapılan işleri şöyle sıralayabiliriz: · Bir Label nesnesi ilk değeri ile yaratılır ve yaratılan nesne prompt değişkeni içinde saklanır. Bu nesne, appletimize add işlevi ile eklenir ve bu nesnenin değeri applet üzerinde bir bölgede gözükecektir. · Daha sonra bir TextField nesnesi yaratılır ve yaratılan nesne input değişkeni içinde saklanır. Bu nesne appletimize add işlevi ile eklenir ve bu nesnenin applet üzerinde bulunduğu bölgeden girdi işlemi yapılır. · Gireceğimiz sayıların toplamını tutacak olan sum değişkenine ilk değeri bir atama ifadesiyle verilir. · En son olarak da, AddActionListener işlevi ile bu appletin (this değişkeni bu appleti gösterir) input bölgesinde olacak olayları yakalayarak karşılık vermek istediğimizi belirtiriz. input bölgesinde bir sayı yazıp Enter tuşuna bastığımız anda actionPerformed işlevi çağırılacaktır.
Appletlerde Basit Girdi/Çıktı (Devamı) input bölgesinde bir sayı yazıp Enter tuşuna bastığımız anda çağırılan actionPerformed işlevinin yaptığı işleri şöyle sıralayabiliriz: · actionPerformed, girdi bölgesine yazacağımız sayıyı bir ActionEvent türü şeklinde parametre olarak alır. Bu ActionEvent türü değer, e değişkeninin içinde bulunacaktır. · Bu e değişkeninin içindeki değer, ilk önce getActionCommand işlevi ile bir dizgiye, daha sonra Integer sınıfında bulunan parseInt işlevi ile bir int değerine çevrilir. Sonuç number değişkeni içinde saklanır. Yazağımız sayıdan önce ve sonra hiç boşluk bırakmamalıyız, aksi halde parseInt işlevi bunu kabul etmeyeceğinden hata mesajı verecektir. · Yeni okunan bu tamsayılar, toplamları tutan sum değişkeni içindeki değere eklenecek, sonuç yine sum değişkeni içinde saklanacaktır. · setText işlevi ile input bölgesi temizlenir. · Daha sonra, bu yeni değerleri appletimiz üzerinde görebilmek için repaint işlevi çağrılır ve bu işlev bizim yazdığımız paint işlevinin çağırılmasına neden olacaktır.
paint işlevi normalde appletimiz üzerinden ayrılıp üstüne tekrar geldiğimizde otomatik olarak çağrılan bir işlevdir. Bizim programımızda paint işlevi, repaint işlevini kullanarak çağrılmasını sağlarız. paint işlevi içinde yapılan işlemler şunlardır: · paint işlevi, bulunduğumuz appletin yapısını gösteren bir Graphics nesnesini parametre olarak alır. Bu Graphics nesnesi g değişkenin içinde olacaktır. · Appletin yapısı iki boyutlu bir tablo gibidir. Bu tablonun değişik bölgelerine x-y koordinat sistemi kullanılarak erişilebilir. Bu tablonun sol üst köşesinin koordinatı (0,0)’dır. drawString işlevi ilk parametresinde verilen dizgiyi (50,50) koordinatından başlamak üzere appletin içine yazar. Böylece o bölgede "Toplam:" dizgisi ile birlikte yeni toplam değerini görürüz.
SON