Gerçek problemlerin boyutları genelde birinci bölümde gördüğümüz problemlere göre çok daha büyüktür. Bu yüzden genelde programlar küçük parçalara bölünerek daha kolaylıkla anlaşılır şekle getirilmeye çalışılır. Buna böl parçala ve yönet tekniği de diyebiliriz.Bu küçük parçalara javada metot adi verilir. Java programları yeni metotları içeren java sınıflarıyla(class) java sınıf kütüphanelerinde yer alan metotların birleşmesinden oluşur. Java kütüphanesinde matematik işlemlerinden grafik, ses, giriş çıkış işlemleri, yanlış kontrolu gibi birçok konularda yazılmış metotlar mevcuttur. Java metotlar kolleksiyonu Java API Adını alir. Java sınıf kütüphanesi adi da verilir. Şüphesiz bunun dışında java metodlar kolleksiyonlarının olduğu çeşitli diğer kütüphaneler de mevcuttur.
Java API kütüphanelerinin bazıları şunlardır :
java.applet : (java applet paketi) Java applet paketi applet grafik ortamını sağlar (grafik programlarının internet browser programları aracılığıyla görüntülenebilmesinin temellerini oluşturur.). Bu sınıfa paralel olarak Java 1.2 de grafik applet arayüz birimi javax.swing.JApplet geliştirilmiştir.
java.awt : ( java window araçları paketi) Bu sınıf grafik arayüzleri tanımlamaya yara. Java 1.2 de paralel sınıf javax.swing geliştirilmiştir.
java.awt.color: renk tanımlar
java.awt.datatransfer: bilgisayarın geçic hafızasıyla java programı arasında bilgi akışını sağlar.
java.awt.dnd : ekle ve çalıştır türü programlar arasında geçiş yapabilen paketlerden oluşur.
java.awt.event : grafik programlamaortamıyla kullanıcı arasındakiilişkiyi sağlar. Örneğin grafik penceresinde return tuşuna basıldığında veya farenin düğmesine basıldığında ne yapılması gerektiğini belirler. Java.awt ve javax.swing sınıflarının ikisiyle de kullanılır.
java.awt.font : yazı fontları ve bu fontların değiştirilmesiyle ilgili programalrı içerir.
java.awt.geom : iki boyutlu geometrik şekilleri tanımlar.
java.awt.im : java programlarına çince, japonca ve kore dilinde girdi girebilmek için tanımlanmış bir arabirimdir.
java.awt.image : java görüntü işleme paketi
java.awt.image.renderable : bir program içindeki resimleri depolama ve değiştirme için gerekli olan programları içerir.
java.awt.print : java programlarından yazıcılara yazım için bilgi aktaran paketleri içerir.
java.beans : java fasulyeleri paketi, bu paketin detayları için ilgili bölümü inceleyiniz.
java.beans.beancontext : tekrar kullanılabilen ve otomatik olarak birleştirilebilen program parçacıkları tanımlar.
java.io : dosya ve ekrandan girdi ve çıktı yapmak için gerekli program paketleri tanımlanır.
java.lang : bu paket birçok temel program içerir Bunlardan biri olan Math paketi aşağıda açıklanacaktır. Lang paketi java programlarınca otomatik olarak kullanılır. İmport deyimiyle iave edilmesi gerekmez.
java.lang.ref : bu paket java programıyla garbage collector (çöp toplayıcısı) denilen otomatik kullanılmayan hafıza temizleme programıyla ilişkiyi sağlar.
java.lang.reflect : bu paketteki programlar java programının çağrıldığında içinde bulunan değişken ve metotları dinamik olarak tespit etmesinive kullanma izni almasını sağlar.
java.math : bu sınıf değişebilir hassasiyette arimetik işlemler yapmak için gereken tanımları ve sınıfları içerir.
java.net : ağ işlemlerinde kullanılan çeşitli paketleri tanımlar
java.rmi , java.rmi.activation, java.rmi.dgc, java.rmi.registry, java.rmi.server: programların ve metodların uzaktan çalışabilmeleri için gerekli tanımlamaları içerir.
java.security, java.security.acl, java.security.cert, java.security.interfaces, java.security.spec : güvenlikle ilgili programlar demetini içerir.
java.sql : databaseprogramıyla java programlarını bağlantısını sağlar.
java.text : sayı karekter ve string tarih gibi işlemlerle ilgili programlar demeti içerir. Örneğin çok dilli programlar yazmayı sağlayan internalisation paketi bu paket içinde yer alır.
java.util : bu sınıf tarih ve zamanla ilgili fonksiyonlar, tesadüfi sayı üreticileri, StringTokenizer gibi programları barındırır.
java.util.jar bu paket java programlarını paketlemeye yarıyan jar yapılarını tanımlamada gerekli olan programları tanımlar.
java.util.zip : bu paket programları sıkıştırmaya yarayan programları tanımlar.
Java.accessibility : bu paket özürlülerin kullanabileceği ara üniteler tanımlar. Ekran okuyucular ve ekran büyüteçleri gibi.
javax.swing : grafik kullanıcı arabirimi tanımlar. Bu sınıftakitanımlar aracılığıyla ekrandan grafik ortamında veri transferi kolaylıkla yapılabilir.
javax.swing.borders : grafik arabirimi sınır yaratımında çeşitli sınır şekilleri yaratmakta kullanılır.
Javax.swing.colorchooser : renk seçimi için tanımlanmış grafik kullanıcı arabirimini tanımlar.
Java API dosyalarındaki metotlarin sadece isimlerinin listesi yaklaşık 200 sayfa boyutunda bir liste tuttuğundan burada sadece yeri geldiğine programları kullanırken örneklerde gerekli API isimlerini göreceğiz. Şu ana kadar kullandığımız java programlarında java.applet, java.awt, java.io javax.swing, javax.swing.JApplet ve javax.awt.event API paketlerini kullandık. Java.applet paketi appletleri oluşturma, appletlere giriş çıkısları ve dosyaları applet içerisinde çalıştırmayı sağlar. java.awt pencere(window) ortamındaki tüm programlama sınıflarını ve metotlarını içerir. Java swing (javax.swing) paketi yine aynı tür pencere(window) ortamında programlama için gerekli girdi çıktı grafik ortamlarını içerir. awt grafik ortamına göre daha zengin ve gelişmiş bir kolleksiyondur. Bu metotları ilerideki bölümlerde daha detaylı inceleyeceğiz. java.io paketi javaya dışarıdan(dosya,ekran v.b) bilgi giriş çıkışını ayarlar.
Java metodlarının tamamının listesini (İngilizce olarak) Java doküman kütüphanesindeki api alt gurubunda bulabilirsiniz. Java döküman kütühanesi http://java.sun.com/ adresinden çekilebilir.
Java dilinde en çok kullanılan API sınıflarından birisi Math sınıfıdır. Bu sınıf(class) java.lang paketinde yer alır. Java.lang paketi java programı açılırken otomatik olarak çağırılır. Bütün diğer paketler import deyimi kullanılarak programa ilave edilirler. Math sınıfında tanımlanan metotların bazıları Şekil 2.1 de listelenmiştir. Tablodaki x veya y değişkenleri double değişken türündendir. Math sınıfında(class) iki tane de sabit tanımlanmıştır. Bu sabitlerden birisi Math.PI 3.14159265358979323846 (pi) sayısına eşittir. Diğeri Math.E 2.7182818284590452354 (e) sayısına eşittir.
Tablo 2.1 Math sınıfı nda(class) çalışan metotlardan bazıları
Metot
Tanım
Örnek
abs(x)
x değişekeninin mutlak değeri
türkçesi : Mutlak
Math.abs(9.2) = 9.2
Math.abs(-9.2) = 9.2
ceil(x)
x degişkenini bir üst tamsayıya dönüştürür (türkçesi : tavan)
Math.ceil(9.2) = 10
Math.ceil(-9.8) = -9
floor(x)
x değişkenini bir alt tamsayıya dönüştürür. (türkçesi : taban)
Math.floor(9.2) = 9
Math.floor(-9.8) = -10
cos(x)
x in trigonometrik cosünisü
(x radyan cinsinden tanımlanmıştır.)
Math.cos(1.0)=0.54030230568
sin(x)
x in trigonometrik sinüsü
(x radyan cinsinden tanımlanmıştır.)
Math.sin(1.0)=0.8414709840709
tan(x)
x in trigonometrik tanjantı
(x radyan cinsinden tanımlanmıştır.)
Math.tan(1.0)=1.557040724655
acos(x)
x in trigonometrik cosünisünün tersi
(sonuç radyan cinsindendir)
Math.acos(0.54030230568)=1.0
asin(x)
x in trigonometrik sinüsü
(x radyan cinsinden tanımlanmıştır.)
Math.asin(0.8414709840709)=1.0
atan(x)
atan2(x,y)
x in trigonometrik tanjantı
(x radyan cinsinden tanımlanmıştır.)
x,y noktanın x,ykoordinatlarıdır
4.0*Math.atan(1.0)=3.14159265359
4.0*Math.atan2(1.0,1.0)=3.14159265359
exp(x)
e(2.7182818284590452354) nin x inci kuvveti
Math.exp(1.0) =2.718281828459
Math.exp(2.0) =7.389056098931
log(x)
e tabanına göre logaritma
Math.log(2.718281828459)=1.0
pow(x,y)
x in y inci kuvveti
Math.pow(3,2)=9.0
max(x,y)
x ve y nin büyük olanı
Math.max(2.3,12.7)=12.7
min(x,y)
x ve y nin küçük olanı
Math.min(2.3,12.7)=2.3
random()
Raslantısal sayı (0 ile 1 arasinda)
Math.random() = 0 ila bir arasında her sayı çıkabilir
Program 2.1 de Math sınıfındaki metotları kullanan Matematik1 sınıfını görüyoruz.
Program 2.1 Math sınıfında(class) çalışan metotlardan bazılarını gösteren Matematik1.java programı
import javax.swing.JOptionPane; // giriş çıkı
class matematik1SW
{
public static void main (String args[])
{
double x,y;
String s="";
x=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
y=Double.parseDouble(JOptionPane.showInputDialog
("İkinci bir gerçek sayı giriniz : "));
s +="Statik Matematik kütüphanesi Math de \n";
s+="en cok kullanilan metodlar :\n" ;
// Math.abs(3.2)=3.2 Math.abs(-3.2)=3.2
s+="Math.abs("+x+") = "+Math.abs(x)+"\n";
// Math.ceil(9.2)=10 Math.ceil(-9.8)=-9
// Math.ceil(x) x den buyuk en kucuk tam say�ya yuvarlar
s+="Math.ceil("+x+") = "+Math.ceil(x)+"\n";
// Math.floor(9.2)=9 Math.floor(-9.8)=-10
// Math.floor(x) x den kucuk en buyuk tam say�ya yuvarlar
s+="Math.floor("+x+") = "+Math.floor(x)+"\n";
// Trigonometrik fonksiyonlar sin(x) cos(x) tan(x) x:radyan
// Math.PI pi sayisi
s += "Math.PI = "+Math.PI+"\n";
s += "Math.sin("+x+") = "+Math.cos(x)+"\n";
s += "Math.cos("+x+") = "+Math.sin(x)+"\n";
s += "Math.tan("+x+") = "+Math.tan(x)+"\n";
//Trigonometrik fonksiyonlar asin
acos
atan
// asin,acos,atan : radyan
s += "Math.asin("+y+") = "+Math.acos
+"\n";
s += "Math.acos("+y+") = "+Math.asin
+"\n";
s += "Math.atan("+y+") = "+Math.atan
+"\n";
// Math.log(x) dogal logaritma (e) taban�na gore
// Math.E e sayisi = 2.718281828...
s += "Math.E = "+Math.E+"\n";
s += "Math.log("+x+") = "+Math.log(x)+"\n";
// Math.pow(x,y) x in y inci kuvveti
s += "Math.pow("+x+","+y+" ) = "+Math.pow(x,y)+"\n";
// Math.exp(x) Math.E=e=2.718281828.. in x inci kuvveti
s += "Math.exp("+x+" ) = "+Math.exp(x)+"\n";
// Math.sqrt(x) x in kare koku
s += "Math.sqrt("+x+" ) = "+Math.sqrt(x)+"\n";
// Maximum - minimum functions
// Math.max(x,y) Math.min(x,y)
s += "Math.max("+x+","+y+" ) = "+Math.max(x,y)+"\n";
s += "Math.min("+x+","+y+" ) = "+Math.min(x,y)+"\n";
JOptionPane.showMessageDialog(null,s,
"Math kütüphanesi işlemleri",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02001.JPG
Şekil 2.1 matematik1SW.java programının çıktısı
2.2 METOTLAR
Metotlar java programlarının ana parçalarıdır. Metotlar sınıfların(class) içinde yer alan küçük program parçacıklarıdır. Metotların çoğunda değişken parametreler metotlar ve sınıflar arasında iletişimi sağlarlar. Ayrıca her metotun kendine özgü değişkenleri de vardır. Metot yapısının ana sebebi programları modüler hale getirmektir. Aynı zamanda aynı program parçacığının tekrarlanmasını önlemeyi de sağlar. Her metot çağrıldığı proğram parçacığına belli bir değişkeni aktarabilir. Metotların tanımlarında aktardıkları değişken türü tanımlanır. Eğer metot hiçbir değişken aktarmıyorsa void sözcüğü yle tanımlanır. Metotların genel tanımı aşağıdaki gibidir. Parantez içindeki terimler kullanılmıyabilir.
Genel Metot tanımı
(public) (static) sınıf değişken türü sınıf ismi( sınıf değişken girdi listesi)
{
sınıf içinde geçerli degişken tanımları
Metotun ana gövdesi
return metot çıktı değişkeni
}
Örnek olarak aşağıdaki metotu verebiliriz :
Public static double metotornegi(int x,double y)
{
double z = 3.5;
double f ;
f = z*x*x+y;
return f;
}
Bu metotdaki x ve y gerçek (double) değişkenleri metotun girdi değişkenleridir. z ve f değişkenleri metotun yerel değişkenleridir ve bu metot dışında tanımları yoktur. Metot f değişkeninin değerini çıktı olarak metotun dışina aktarmaktadır. Eğer yukarıdaki metot aynı sınıfın içindeki başka bir metotda veya main metotunda aşağıdaki gibi bir örnekte kullanılırsa,
double z = 2.5;
double r ;
int i = 3;
r = metotornegi(i,z);
System.out.println(“r = “+r);
r = 34 sonucuna ulaşılır. Şimdi aynı metotun statik metot olarak bir appletin içinde kullanılmasını görelim.
Program 2.2 : metotornegi1.java programında kare statik metotunun kullanılması
import java.io.*;
public class metotornegi1
{
// sayinin karesi static metotu
public static double kare(double x)
{
return x*x;
}
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
System.out.println("Bir tam sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin karesi : "+kare(sayi));
}
}
Program 2.3 : metotornegi2.java programında kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
public class metotornegi2 extends Applet
{
double sayi=5; // Gercek degisken sayi
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+kare(sayi),25,50);
}
}
02002.JPG
Şekil 2.2 metotornegi2.java programında kare metotunun kullanılması
Şekil 2.2.3 de tanımlanan public double kare(double x) metotu, public void paint(Graphics g) metotundaki
g.drawString(sayi+"nin karesi = "+kare(sayi),25,50);
işleminde çağırılmıştır. Bilgisayar kare(sayi) ifadesini gördüğünde metotun içine gider, orada tanımlanan tüm işlemleri yaptıktan sonra return kelimesinin karşısındaki işlemleri çağırıldığı yere geri iletir. Metotorneği1 java programında çağırılan kare(sayi) metotunda sadece sayının kendisiyle çarpımı return kelimesinin karşısına yazıldığından, kare(sayı ) ifadesi sayı*sayı ifadesiyle eşdeğerdir. Burada kare metotundandaki değişken adının sayı değil x olarak verildiğini de burada not edelim. Sayı değişkeni metotun girişinde x degişkenine yüklenir. Gerekli işlemler metotda yapıldıktan sonra sadece metotun sonuçları return deyimiyle metodun değişken türü olarak (bu metod için double ) geri döner.
2.3 NESNE (OBJECT) TANIMI VE METOTLARDA KULLANIMI
Birinci bölümde temel değişken türlerini (double,int,boolean v.b.) nasıl tanımladığımızı görmüştük. Nesne tipi programlamanın en önemli özelliği kendi değişken türlerimizi yaratabilmemizdir. İlerideki bölümlerde kendi değişken türlerimizi sınıf (class) yapısını kullanarak nasıl yaratacağımızı daha detaylı olarak inceleyeceğiz. Bu bölümde nesnelerin program içindeki tanımlanmasına göz atalım. Daha önce tanımladığımız bazı applet programlarında nesne tanımları zaten geçmişti. Örneğin daha önceki programlarımızda bilgi okutmak için kullandığımız
Text cin=new Text();
Terimi Text sınıfından(class) cin nesnesini tanımlar. Nesne(object) tanımı yaparken aynı metotlarda olduğu gibi değişken veya nesneleri girdi olarak tanımlamamız mümkündür.
Diğer bir örnek olarak yine daha önceki örnek problemlerde kullandığımız Label sınıfından(class) kutubasligi nesnesinin tanımını ve TextField sınıfından(class) kutugirdisi nesnesini gösterebiliriz.
Label kutubasligi; //Label sinifi degiskeni (nesnesi) kutubasligi
kutubasligi=new Label("Ogrencinin notunu giriniz (A B C.. : ");
TextField kutugirdisi;//Textfield sinifi degiskeni (nesnesi) kutugirdisi
kutugirdisi=new TextField(5);
Bu örneklerde de görüldüğü gibi Nesne tanımı şu şekilde yapılmaktadır:
Sınıf (class) isminesne(object) ismi ;
nesne(object) ismi = new Sınıf (class) ismi(değişken veya nesne girdi listesi)
Nesne tanımını daha iyi anlamak için metotornegi2 sınıfını yazdığımız programı biraz değiştirerek metotornegi3 ve metotornegi3a sınıflarını olusturalım ve kare metotumuzu metotornegi3a sınıfına yerlestirelim.
Program 2.4 : metotornegi.java programında kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
class metotornegi3a
{
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
}
public class metotornegi3 extends Applet
{
double sayi=5; // Gercek degisken sayi
metotornegi3a nesne1=new metotornegi3a();
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+nesne1.kare(sayi),25,50);
}
}
Metotornegi3.java programında iki tane sınıf(class) yaratılmıştır. İlk sınıf metotornegi3a da kare metotu tanımlanmıştır. İkinci sınıf(class) metotornegi3 de ise metotornegi3a sınıfı nesne1 nesnesi tanımlanmış, ve kare metotu nesne1 nesnesi üzerinden nesne1.kare(sayi) olarak çağırılmıştır. Bu metot nesne1 nesnesi için bilgisayar belleğinde bir yer ayırır. Kare metotunu çağırırken bu yerin adresini kullanır. Metotornegi2.java programında kare(sayı) dogrudan kullanılmıştı. Çunku kare metotu aynı sınıfın(class) içinde tanımlanmıştı. Metotornegi3.java programında ise kare metotu ayrı bir sınıf(class) ta tanımlandığından yerinin tanımlanması gerekir. Bu bizim kendi odamızın yatak odasını tanımlarken sadece yatak odası dememizle baska bir evin yatak odasını tanımlarken Ahmet beyin evinin yatak odası dememiz gibidir. Metotlar statik olarak da tanımlanabilirler. Statik olarak tanımlanan metotlar nesne kullanılmadan direk olarak sınıf(class) adları kullanılarak çağırılabilirler.
Program 2.5 : metotornegi4.java programında static kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
class metotornegi4a
{
// sayinin karesi dinamik metotu
public static double kare(double x)
{
return x*x;
}
}
public class metotornegi4 extends Applet
{
double sayi=5; // Gercek degisken sayi
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+ metotornegi4a.kare(sayi),25,50);
}
}
Görüldüğü gibi metotornegi4 sınıfında(class) kare metotu metotornegi4a.kare(sayi) olarak tanımlanmış ve ek bir nesne adresi kullanılmamıştır. Static olarak tanımlanan metotların kendikendine yeterli metotlar olaması gerekir. Yani içinde bulunduğu sınıfla veya baska sınıflarla direk olarak veri alışverişi olamaz. Girdileri sadece girdi parantezleri () arasinda verilen değişkenlerdir.dinamik metotlar ise kendi sınıfları ve diğer sınıflarla değişik yollardan bilgi ve değişken aktarımı yapabilirler
Metotornegi3.java ve Metotornegi4.java programlarında iki sınıf(class) aynı dosyada yer almiştı. Her sinifi ayri bir dosyada da tanımlamak mumkündür. Bu yapıldığında diğer dosya import(ithal) terimiyle diğer programa aktarılır. Şekil 2.6 ve 2.7 de Şekil 2.5 de verilen programın iki ayrı dosyada yazılımını görüyoruz.
Program 2.6 : metotornegi6.java programında kare metotunun tanımlanması
class metotornegi6
{
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
}
Program 2.7 : metotornegi7.java programında kare metotunun metotornegi6 sınıfı x nesnesi üzerinden kullanılışı.
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import metotornegi6; // metotornegi6 sınıfını çağır
public class metotornegi7 extends Applet
{
double sayi=5; // Gercek degisken sayi
metotornegi6 x=new metotornegi6();
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+ x.kare(sayi),25,50);
}
}
2.4 METOTLARIN KENDİ KENDİNİ ÇAĞIRMASI (RECURSION)
Bazı problemlerin çözümünde bir metotun kendi kendini çağırması yararlı olabilir. Java bir metotun kendi kendini çağırmasına izin verir. Burada dikkatli olunması gereken nokta bu kendi kendine çağırılma döngüsünün sonsuza kadar sürmesinin bir kontrol yapısı kullanılarak engellenmesidir. Kendi kendini çağıran programlarda mutlaka bir döngü çıkış şartı tanımlanmalıdır.
Daha önceki alıştırmalarımızda faktoriyel sınıfı tanımlanmıştı. Önce bu programdaki faktoriyel hesabını ayrı metot haline dönüştürelim. Program 2.8 de daha önce de gördüğümüz faktoriyeli ana metotumuz olan main içinde hesaplayan faktoriyel programını görmekteyiz. Program 2.9 da faktoriyel hesabı for döngüsü kullanılarak faktoriyel metotonda gerçekleştirilmektedir.
Program 2.8 : Metot kullanılmadan (main metotunun içinde) faktoriyel hesaplayan faktoriyel.java programı
import java.io.*;
import Text;
class faktoriyel
{
public static void main(String args[]) throws IOException
{
int faktoriyel=1;
Text cin=new Text();
int faktoriyelsayi;
System.out.print("Bir tamsayi giriniz : ");
faktoriyelsayi=cin.readInt();
for(int sayi=1;sayi<=faktoriyelsayi;sayi++)
{ faktoriyel*=sayi;}
System.out.println(faktoriyelsayi + " faktoriyel: " + faktoriyel);
}
}
değişik giriş çıkış opsiyonlarını biraz daha anlamak için aynı programın JOPtionPane kullanılarak yazılmış eşdeğerini de verelim :
Program 2.9 : Metot kullanılmadan (main metotunun içinde) faktoriyel hesaplayan faktoriyeSW.java programı
import javax.swing.JOptionPane;
class faktoriyelSW
{
public static void main(String args[])
{
int faktoriyel=1;
int faktoriyelsayi;
faktoriyelsayi=Integer.parseInt(JOptionPane.showIn putDialog("Bir tam sayı giriniz : "));
for(int sayi=1;sayi<=faktoriyelsayi;sayi++)
{ faktoriyel*=sayi;}
String s=faktoriyelsayi+" faktoriyel: "+faktoriyel;
JOptionPane.showMessageDialog(null,s, "Metod örneği faktoriyelSW.java ",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
Şimdi aynı programın faktoriyel metodu ayrı yazılmış fakat yine for döngüsü kullanan şekillerine göz atalım. Program 2.10 ve 2.11 de birbirinin aynı olu, program 2.10 da çıktı System.out.println deyimiyle alınırken 2.11 de çıktı JOptionPane.showMessageDialog metodu kullanılarak aktarılmıştır.
Program 2.10 : for döngülü faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel1.java programı
import java.io.*;
import Text;
class faktoriyel1
{
public static long faktoriyel(int x)
{
long faktoriyel=1;
for(int sayi=1;sayi<=x;sayi++)
{ faktoriyel*=sayi;}
return faktoriyel;
}
public static void main(String args[]) throws IOException
{
Text cin=new Text();
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=cin.readInt();
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
Program 2.11 : for döngülü faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel1SW.java programı
(JoptionPane girdi çıktı sistemi kullanarak hesaplıyor)
import javax.swing.JOptionPane;
class faktoriyel1SW
{
public static long faktoriyel(int x)
{ long faktoriyel=1;
for(int sayi=1;sayi<=x;sayi++)
{ faktoriyel*=sayi;}
return faktoriyel;
}
public static void main(String args[])
{ int faktoriyelsayi;
faktoriyelsayi=Integer.parseInt(
JOptionPane.showInputDialog("Bir tam sayı giriniz : "));
String s=faktoriyelsayi+" faktoriyel: "+faktoriyel(faktoriyelsayi);
JOptionPane.showMessageDialog(null,s,"Metod örneği faktoriyel1SW.java ",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
Program 2.12 ve 2.13 de faktoriyeli kendi kendini çağıran(recursive) faktoriyel metotunu kullanarak hesaplayalım.
Program 2.12 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel2.java programı
import java.io.*;
import Text;
class faktoriyel2
{
public static long faktoriyel(int x)
{
if( x <= 1 )
return 1;
else
return x * faktoriyel( x – 1);
}
public static void main(String args[]) throws IOException
{
DataInputStream cin=new DataInputStream(System.in);
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=Text.readInt(cin);
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
}
Bir tamsayi giriniz: 4
4 faktoriyel:24
Program 2.13 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan
Faktoriyel2SW.java programı (JOPtionPage girdi/çıktı)
import java.io.*;
import Text;
class faktoriyel2
{
public static long faktoriyel(int x)
{
if( x <= 1 )
return 1;
else
return x * faktoriyel( x – 1);
}
public static void main(String args[]) throws IOException
{
DataInputStream cin=new DataInputStream(System.in);
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=Text.readInt(cin);
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
}
02003.JPG
Şekil 2.3 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan
Faktoriyel2SW.java programının sonuçlarının JOPtionPage çıktısı olarak görülmesi
Program 2.132veya 2.13’ü çalıştırdığımızda faktoriyel hesabı şu şekilde yapılacaktır :
5! = 5 * 4! = 4 * 3! = 3 * 2! = 2 * 1! = 1
faktoriyel metotu 1 e ulastığında tekrar kendisini çağırmıyacağından geriye dogru yaptığı hesapları göndermeye başlıyacaktır.
1 = (2*1!(=1)) = 2 = (3 * 2!(=2)) = 6= (4*3!(=6))=24= (5*4!(24))=120= 5!(=120)
sonuç 120 olarak ana programa gönderilecektir. Kendi kendini çağıran metodlar mutlak bir gereksinim olmadıkça tercih edilmez. Bu tür programlamada hem sonsuz döngülerin görülmesi daha güç olabilir, hemde for, while gibi döngüler kullanılarak programlamaya göre programlar daha yavaş çalışır. Gerçek uygulamalarda kendi kendini çağıran programlar genellikle bir döngü yapısı kurmadan çok tek kerelik çağırmaları gerçekleştirmek için kullanılırlar.
2.5 AYNI ADLI METOTLARIN BİR ARADA KULLANILMASI (OVERLOADİNG)
Java aynı adlı metotların aynı sınıf içerisinda kullanılmasına izin verir. Aynı sınıfta(class) kullanılan metotların girdi değişkenlerinin değişken türlerinin veya değişken sayılarının farklı olması gerekir. Java aynı isimli ve ayni degişken türlü iki metotu birbirinden ayıramaz. Örneğin
Public double Bmetodu(double Adeğişkeni)
Ve
Public double Bmetodu(double Bdeğişkeni)
Veya
Public int Bmetodu(double Cdeğişkeni)
Java tarafindan ayırt edilemez , Fakat
Public double Cmetodu(double Adeğişkeni)
Ve
Public double Cmetotu(int Bdeğişkeni)
veya
Public double Cmetotu(double Adeğişkeni, double Bdeğişkeni)
Java tarafından ayırt edilir ve birlikte aynı sınıfın (class) içinde yer alabilir. Eğer birbirinin tam olarak eşiti metotlar değişik sınıflarda yer alıyorsa bunun herhangi bir sakıncası yoktur. Program 2.11'de ayniisimliikimetot.java programı görülmektedir. Bu programda daha önceki programlarda da kullandığımız kare metotunu int ve double girdi değişkenleriyle iki kere aynı sınıfın içerisinde tanımlayacağız.
Program 2.14 : ayniisimliikimetot.java programı
import java.awt.Graphics;
import java.applet.Applet;
public class ayniisimliikimetot extends Applet
{
// void tipi paint metotu
public void paint( Graphics g)
{
g.drawString(“ 7 nin karesi = “+kare(7),25,25);
g.drawString( 7.5 un karesi = “+kare(7.5),25,40);
}
// int tipi kare metotu
int kare(int x)
{
return x*x;
}
// double tipi kare metotu
double kare(double x)
{
return x*x;
}
}
02004.JPG
Şekil 2.4 ayniisimliikimetot.html programıyla ayniisimliikimetot.class ın gösterilmesi
Bu programda parantez içerisinde 7 (tamsayı) verildiğinde java tamsayi metotu kare(int x), 7.5(gerçek sayı) verildiğinde gerçeksayi metotu kare(double x) i çağırır.
Benzer bir örneği swing applet olarak verelim :
Program 2.15 : H3AL9_2000 programı
import java.awt.Container;
import javax.swing.*;
public class H3AL9_2000 extends JApplet
{
JTextArea ciktiAlani;
public void init()
{
ciktiAlani=new JTextArea();
Container c=getContentPane();
c.add(ciktiAlani);
int x1=7;
double x2=7.0;
ciktiAlani.setText(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
x1=5;
x2=5.0;
ciktiAlani.append(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
}
// double girisli exp metodu
public double exp(double x)
{
double faktoriyel=1;
double us=1;
double exponent=1;
for(double i=1;i<=300;i++)
{
faktoriyel*=i;
us*=x;
exponent+=us/faktoriyel;
}
return exponent;
}
// int girişli exp metodu
public double exp(int x)
{
double exponent=1.0;
for(int i=1;i<=x;i++)
{
exponent*=Math.E;
}
return exponent;
}
}
02005.JPG
Şekil 2.5 Gerçek ve tamsayı değişkenleri çağıran aynı adlı metodların çağırılması örneği
2.6 METOT (METHOD) VE SINIF(CLASS) DEĞİŞKENLERİ
Metotların içinde kullanılan değişkenler sadece metotlara aittir. O metotun dışında tanımları yoktur. Eğer değişkenler metotların dışında sınıf(class) değişkenleri olarak tanımlanırsa metota da aynen aktarılırlar. Sınıf değişkeniyle aynı isimde bir değişken mettotta da tanımlanmışsa bu değişken metotun içinde kullanılan metotun değişkenidir
Program 2.16 : metotvesinifdeg.java programında metot değişkenlerinin sınıfa aktarılması
import java.awt.Container;
import javax.swing.*;
public class H3AL9_2000 extends JApplet
{
JTextArea ciktiAlani;
public void init()
{
ciktiAlani=new JTextArea();
Container c=getContentPane();
c.add(ciktiAlani);
int x1=7;
double x2=7.0;
ciktiAlani.setText(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
x1=5;
x2=5.0;
ciktiAlani.append(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
}
// double girisli exp metodu
public double exp(double x)
{
double faktoriyel=1;
double us=1;
double exponent=1;
for(double i=1;i<=300;i++)
{
faktoriyel*=i;
us*=x;
exponent+=us/faktoriyel;
}
return exponent;
}
// int girişli exp metodu
public double exp(int x)
{
double exponent=1.0;
for(int i=1;i<=x;i++)
{
exponent*=Math.E;
}
return exponent;
}
}
metotvesinifdeg.java programının sonuçları
Metot1 in disi : x=2.5 y=3
Metot1 in ici : x=5.5 y=6
Metot1 in disi : x=5.5 y=6
Program 2.17 : metotvesinifdeg1.java programında metot değişkenlerinin sınıfa aktarılması
import java.awt.Graphics;
import java.applet.Applet;
public class metotvesinifdeg1 extends Applet
{
//buradaki değişkenler tüm sınıfa aittir
double x ;
int y ;
void metot1( Graphics g) //metota hi‡ bir de§iŸken girmiyor
{
double x;
int y;
x=5.5;
y=6;
g.drawString("metot1 in ici : x = "+ x+" y = "+ y,25,40);
}
public void paint(Graphics g)
{
x = 2.5;
y = 3;
g.drawString("metot1 in disi : x = "+ x+" y = "+ y,25,25);
metot1(g);
g.drawString("metot1 in disi : x = "+ x+" y = "+ y,25,55);
}
}
metotvesinifdeg1.java programının sonuçları
Metot1 in disi : x=2.5 y=3
Metot1 in ici : x=5.5 y=6
Metot1 in disi : x=2.5 y=3
Program 2.16'daki metotvesinifdeg sinıfındaki metot1 metotunun içinde değiştirilen x ve y değişkenleri tüm tüm sınıfa(class) aittir. Bu yüzden paint metotundaki drawString metotu tekrar çağırıldığında x ve y nin değerlerinin değiştiğini görürüz.
Program 2.17 deki metotvesinifdeg1 sınıfındaki metot1 metotunun içinde ise yerel değişkenler x ve y tanımlanmıştır. Bu yüzden metot1 in içindeki x ve y değişkenlerinin değişmesi paint metotundaki drawString metotu tekrar çağırıldığında x ve y nin değerlerinin değişmediği görülür.
Nesne tanımı yapıldığında Bilgisayar bu nesne için bir adres yaratır. Yeni adres yarat komutu new komutudur.
Pogram 2.18 : Point1.java programda nokta1 ve nokta2 nesnelerinin yaratılması ve adres paylaşımı.
// java kutuphanelerinde tanimli bir sinifin cagirilip
// nesne olarak tanimlanmasi ve adres paylasimi
import java.io.*; //java girdi cikti sinifini cagir
import java.awt.Point; //Point sinifini cagir
class Point1
{
public static void main(String args[])
{
//Point sinifi x,y koordinatli bir nokta tanimlar
Point nokta1,nokta2;
nokta1=new Point(100,100);
nokta2=nokta1;
// nokta1 ve nokta2 bilgisayarda ayni
// adres kutusunu paylasiyor
System.out.println("nokta1 ve nokta2 ayni degerleri tasiyor");
System.out.println("ve aynı bilgisayar adresini paylasiyor");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
nokta1.x=200;
nokta1.y=200;
System.out.println("nokta1 in degeri degistirildi");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
// nokta1 ve nokta2 nin degerleri ayni fakat bilgisayarda
// degisik adreslerde tanimlanmis
nokta1=new Point(100,100);
nokta2=new Point(100,100);
System.out.println("nokta1 ve nokta2 ayni degerleri tasiyor");
System.out.println("fakat ayni bilgisayar adresini paylasmiyor");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
nokta1.x=200;
nokta1.y=200;
System.out.println("nokta1 in degeri degistirildi");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
}
}
Point1.java da verilen
Point nokta1,nokta2;
nokta1=new Point(100,100);
nokta2=nokta1;
tanımında Point sınıfından(class) nokta1 ve nokta2 değişkenleri tanımlanmış, nokta1 değişkeni için yeni(new) adres tanımlanmış, nokta2 değişkenine de aynı adresi (nokta1'in adresini) kullanması soylenmiştir. Bu yüzden programda nokta1 e yeni deger verildiğinde nokta2 nin değeri de aynı değeri alır.
daha sonra kullanılan
nokta1=new Point(100,100);
nokta2=new Point(100,100);
deyimi ile ise nokta1 ve nokta2 için iki ayrı adres yaratılmıştır. Bu yüzden nokta1 değiştiğinde nokta2 eski değerinde kalır.
Aynı adresin iki değişken tarafından kullanılması ancak gerektiği zaman ve çok dikkat sarfederek yapılmalıdır. Gereksiz yere kullanılmasından kesin olarak kaçınılmalıdır. Program güvenlik ve kontrol problemleri yaratabildiği gibi, istemediğimiz değişken değerlerinin silinmesi sonucunu da verebilir.
2.7 ALISTIRMALAR
1. Math kütüphanesindeki Math.random() metotunu kullanarak static zar metotunu yazınız. Bu metotu H4A1a sınıfında(class) tanımlayiniz.
Not : 1-den 6 ya kadar tesadüfi (random) sayıları 1+(int)(Math.random()*6) formülü ile hesaplayabiliriz.
Program 2.19 H4A1a.java ve static int zar metodu
public class H4A1a
{
public static int zar()
{
return 1+(int)(Math.random()*6);
}
}
H4A1b sinifinda(class) java konsol ana metotu (public void main) yazarak zar degerini yazdiriniz.
Program 2.20 H4A1b.java
import java.io.*; // giris cikis
import H4A1a;
class H4A1b
{
public static void main (String args[]) throws IOException
{
System.out.println("zar degeri : "+H4A1a.zar());
}
}
H4A1c sinifinda java konsol ana metotunda (public void main) metotunda yüz(100) kere zar attırarak ortalamasını hesaplayınız.
Not : for veya while döngüsü kullanabilirsiniz.
Program 2.21 H4A1c.java
import java.io.*; // giris cikis
import H4A1a;
class H4A1c
{
//yuz zarin ortalamasi
public static void main (String args[]) throws IOException
{
double ortalama;
double toplam=0;
for(int sayi=0;sayi<100;sayi++)
{
toplam+=H4A1a.zar();
}
ortalama=toplam/100.0;
System.out.println("100 zarin ortalamasi = "+ortalama);
}
}
H4A1d sinifinda java konsol ana metotunda (public void main) bin(1000) kere zar attırarak her rakamın kac kere geldigini bulunuz ve yazdırınız.
Not : switch – case deyimi bu tür programlar için idealdir
Program 2.22 H4A1d.java
import java.io.*; // giris cikis
import H4A1a;
public class H4A1d
{
//bin zar atiminda her zar kac kere gelir
public static void main (String args[]) throws IOException
{
int zardegeri;
int zar1,zar2,zar3,zar4,zar5,zar6;
int zaratimsayisi=0;
zar1=0;
zar2=0;
zar3=0;
zar4=0;
zar5=0;
zar6=0;
while(zaratimsayisi<1000)
{
zardegeri=H4A1a.zar();
switch(zardegeri)
{
case 1:
zar1++;
break;
case 2:
zar2++;
break;
case 3:
zar3++;
break;
case 4:
zar4++;
break;
case 5:
zar5++;
break;
case 6:
zar6++;
break;
}
zaratimsayisi++;
}
System.out.println("toplam zar 1 sayisi : "+zar1);
System.out.println("toplam zar 2 sayisi : "+zar2);
System.out.println("toplam zar 3 sayisi : "+zar3);
System.out.println("toplam zar 4 sayisi : "+zar4);
System.out.println("toplam zar 5 sayisi : "+zar5);
System.out.println("toplam zar 6 sayisi : "+zar6);
}
}
toplam zar 1 sayisi : 169
toplam zar 2 sayisi : 165
toplam zar 3 sayisi : 165
toplam zar 4 sayisi : 146
toplam zar 5 sayisi : 178
toplam zar 6 sayisi : 177
2. Math kütüphanesindeki Math.random() metotunu kullanarak static zar metotunu yazılmıştır. Bu metot H4A1a sınıfında(class) Problem 1 de tanımlanmıştır.
H4A1bSW sinifinda(class) java konsol ana metotu (public void main) yazarak zar degerini yazdiriniz. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Program 2.23 H4A1bSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
class H4A1bSW
{
public static void main (String args[])
{
JOptionPane.showMessageDialog(null,"atılan zar = "+H4A1a.zar()
,"sınıf örneği, zar atımı ",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
H4A1cSW sinifinda java konsol ana metotunda (public void main) metotunda yüz(100) kere zar attırarak ortalamasını hesaplayınız. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Not : for veya while döngüsü kullanabilirsiniz.
Program 2.24 H4A1cSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
class H4A1cSW
{
//yüz zarin ortalamasi
public static void main (String args[])
{
double ortalama;
double toplam=0;
for(int sayi=0;sayi<100;sayi++)
{
toplam+=H4A1a.zar();
}
ortalama=toplam/100.0;
JOptionPane.showMessageDialog(null,"100 zarın ortalaması = "+ortalama
,"sınıf örneği, 100 kez zar atımı ortalaması H4A1c",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
H4A1dSW sinifinda java konsol ana metotunda (public void main) bin(1000) kere zar attırarak her rakamın kac kere geldigini bulunuz ve yazdırınız. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Not : switch – case deyimi bu tür programlar için idealdir
Program 2.25 H4A1dSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
public class H4A1dSW
{
//bin zar atiminda her zar kac kere gelir
public static void main (String args[])
{
int zardegeri;
int zar1,zar2,zar3,zar4,zar5,zar6;
int zaratimsayisi=0;
zar1=0;
zar2=0;
zar3=0;
zar4=0;
zar5=0;
zar6=0;
while(zaratimsayisi<1000)
{
zardegeri=H4A1a.zar();
switch(zardegeri)
{
case 1:
zar1++;
break;
case 2:
zar2++;
break;
case 3:
zar3++;
break;
case 4:
zar4++;
break;
case 5:
zar5++;
break;
case 6:
zar6++;
break;
}
zaratimsayisi++;
}
String s="";
s+="toplam zar 1 sayisi : "+zar1+"\n";
s+="toplam zar 2 sayisi : "+zar2+"\n";
s+="toplam zar 3 sayisi : "+zar3+"\n";
s+="toplam zar 4 sayisi : "+zar4+"\n";
s+="toplam zar 5 sayisi : "+zar5+"\n";
s+="toplam zar 6 sayisi : "+zar6+"\n";
JOptionPane.showMessageDialog(null,s
,"sınıf örneği, 1000 kez zar atımı gelen zarlar H4A1cdSW",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02006.JPG
3.
· zarApplet.java programini incele ve calistir.
· ZarApplet.java programindaki zar metotunu H4A2b.java sınıfına yerlestir. ZarApplet.java programindaki zar metotunu sil ve import H4A2b; deyimini ekle.
· ZarApplet.java programını H4A2c olarak değiştir. sinifindan yeni nesne z yi H42c.java programına ekle ve Paint methodunda çağırılan zar metotunda gerekli değişiklikleri yap. Programi yeni sekliyle calıştır.
Program 2.26 : ZarApplet.java, zar atma metot örneği
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class zarApplet extends Applet implements ActionListener
{
int toplamzaratisi=0;
int toplam=0;
TextField ilkzar,ikincizar;
Button salla; //zar atma düğmesi
int zar1,zar2;
public static int zar()
{
return 1+(int)(Math.random()*6);
}
public void init()
{
//programi baslat
ilkzar=new TextField(10); // Textfield sinifi ilkzar nesnesini yarat
add(ilkzar); // ilk zar nesnesini pencereye ekle
ikincizar=new TextField(10);// Textfield sinifi ikincizar nesnesini yarat
add(ikincizar); // ikinci zar nesnesini pencereye ekle
salla=new Button("Zari salla ve at");
add(salla);
salla.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
zar1=zar();
zar2=zar();
ilkzar.setText(Integer.toString(zar1));
ikincizar.setText(Integer.toString(zar2));
toplam+=(zar1+zar2);
toplamzaratisi++;
repaint();
}
public void paint( Graphics g)
{
g.drawString("toplam = "+toplam+" Atilan zar sayisi = "+toplamzaratisi,25,50);
}
}
public class H4A2b
{
public static int zar()
{
return 1+(int)(Math.random()*6);
}
}
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import H4A2b;
public class H4A2c extends Applet implements ActionListener
{
int toplamzaratisi=0;
int toplam=0;
TextField ilkzar,ikincizar;
Button salla; //zar atma d�gmesi
int zar1,zar2;
H4A2b z=new H4A2b();
public void init()
{
//programi baslat
ilkzar=new TextField(10); // Textfield sinifi ilkzar nesnesini yarat
add(ilkzar); // ilk zar nesnesini pencereye ekle
ikincizar=new TextField(10);// Textfield sinifi ikincizar nesnesini yarat
add(ikincizar); // ikinci zar nesnesini pencereye ekle
salla=new Button("Zari salla ve at");
add(salla);
salla.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
zar1=z.zar();
zar2=z.zar();
ilkzar.setText(Integer.toString(zar1));
ikincizar.setText(Integer.toString(zar2));
toplam+=(zar1+zar2);
toplamzaratisi++;
repaint();
}
public void paint( Graphics g)
{
g.drawString("toplam = "+toplam+" Atilan zar sayisi = "+toplamzaratisi,25,50);
}
}
02007.JPG
Şekil 2.7 ZarApplet.html çıktısı
4. faktoriyeltesti1.java programını inceleyiniz, ve applet ortamında çalıştırınız.
Program 2.27 FaktoriyelTesti
import java.awt.Graphics;
import java.applet.Applet;
public class faktoriyeltesti extends Applet
{
public void paint(Graphics g)
{
int y=25;
for(long i=0;i<=10;i++)
{
g.drawString(i+"! = "+faktoriyel(i),25,y);
y+=15;
}
}
public long faktoriyel(long sayi)
{
if(sayi <=1) return 1;
else return sayi*faktoriyel(sayi - 1);
}
}
5. fibonachitesti1.java programını inceleyiniz ve applet ortamında çalıştırınız.
Program 2.28 Fibonachitesti1.java
import java.awt.Graphics;
import java.applet.Applet;
public class fibonachitesti1 extends Applet
{
public void paint(Graphics g)
{
int y=25;
for(long i=0;i<=15;i++)
{
g.drawString("Fibonachi("+i+") = "+fibonachi(i),25,y);
y+=15;
}
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
6. fibonnachitesti1SWA.java swing applet programını inceleyiniz ve appletviewer ile çalıştırınız
Program 2.29 Fibobachi testi, swing applet programı fibonnachitesti1SWA.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class fibonnachitesti1SWA extends JApplet
{
private JTextArea cikti;
public void init()
{
Container c=getContentPane();
c.setLayout(new FlowLayout());
cikti=new JTextArea(" ");
c.add(cikti);
cikti.setBackground(c.getBackground());
String s="";
for(long i=0;i<=15;i++)
{
s+="Fibonachi("+i+") = "+fibonachi(i)+"\n";
}
cikti.setText(s);
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
02008.JPG
Şekil 2.8 fibonnachitesti1SWA swing applet çıktısı
7. fibonnachitesti1SWF.java swing Frame programını inceleyiniz ve java komutu ile çalış tırınız
Program 2.30 Fibobachi testi, swing applet programı fibonnachitesti1SWA.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class fibonnachitesti1SWF extends JFrame
{
private JTextArea cikti;
public fibonnachitesti1SWF()
{
super("Fibonacchi Testi 1 Swing Frame");
Container c=getContentPane();
c.setLayout(new FlowLayout());
cikti=new JTextArea(" ");
c.add(cikti);
cikti.setBackground(c.getBackground());
String s="";
for(long i=0;i<=15;i++)
{
s+="Fibonachi("+i+") = "+fibonachi(i)+"\n";
}
cikti.setText(s);
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
public static void main(String[] args)
{
fibonnachitesti1SWF pencere= new fibonnachitesti1SWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(150,350);
pencere.setVisible(true);
}
}
02009.JPG
Şekil 2.9 fibonnachitesti1SWF çıktısı
8. fibonachitesti2.java programını inceleyiniz ve applet ortamında çalıştırınız.
Problem 2.31 fibonachitesti2.java programı
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class fibonachitesti2 extends Applet implements ActionListener
{
Label rakametiketi,sonucetiketi;
TextField rakam,sonuc;
public void init()
{
rakametiketi=new Label("Bir tamsayi giriniz : ");
rakam=new TextField(10);
rakam.addActionListener(this);
sonucetiketi=new Label("Fibonachi degeri : ");
sonuc=new TextField(10);
sonuc.setEditable(false);
add(rakametiketi);
add(rakam);
add(sonucetiketi);
add(sonuc);
}
public void actionPerformed( ActionEvent e)
{
long sayi;
long fibonachisayisi;
sayi=Long.parseLong(rakam.getText());
showStatus("Fibonachi hesaplan�yor....");
fibonachisayisi=fibonachi(sayi);
showStatus("Fibonachi hesaplandi....");
sonuc.setText(Long.toString(fibonachisayisi));
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
02010.JPG
Şekil 2.10 Fibonachi testi 2 çıktısı (AWT Aplet)
9. fibonachitesti2SWA.java programında bir önceki programda yazılan fibonachi testi swing appletiortamında yazılmıştır. Programı inceleyiniz ve applet ortamında çalıştırınız.
Problem 2.32 fibonachitesti2SWA.java programı
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class fibonachitesti2SWA extends JApplet implements ActionListener
{
JLabel rakametiketi,sonucetiketi;
JTextField rakam,sonuc;
public void init()
{
Container c=getContentPane();
c.setLayout(new FlowLayout());
rakametiketi=new JLabel("Bir tamsayi giriniz : ");
rakam=new JTextField(10);
rakam.addActionListener(this);
sonucetiketi=new JLabel("Fibonachi degeri : ");
sonuc=new JTextField(10);
sonuc.setEditable(false);
c.add(rakametiketi);
c.add(rakam);
c.add(sonucetiketi);
c.add(sonuc);
}
public void actionPerformed( ActionEvent e)
{
long sayi;
long fibonachisayisi;
sayi=Long.parseLong(rakam.getText());
showStatus("Fibonachi hesaplanıyor....");
fibonachisayisi=fibonachi(sayi);
showStatus("Fibonachi hesaplandi....");
sonuc.setText(Long.toString(fibonachisayisi));
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
Java API kütüphanelerinin bazıları şunlardır :
java.applet : (java applet paketi) Java applet paketi applet grafik ortamını sağlar (grafik programlarının internet browser programları aracılığıyla görüntülenebilmesinin temellerini oluşturur.). Bu sınıfa paralel olarak Java 1.2 de grafik applet arayüz birimi javax.swing.JApplet geliştirilmiştir.
java.awt : ( java window araçları paketi) Bu sınıf grafik arayüzleri tanımlamaya yara. Java 1.2 de paralel sınıf javax.swing geliştirilmiştir.
java.awt.color: renk tanımlar
java.awt.datatransfer: bilgisayarın geçic hafızasıyla java programı arasında bilgi akışını sağlar.
java.awt.dnd : ekle ve çalıştır türü programlar arasında geçiş yapabilen paketlerden oluşur.
java.awt.event : grafik programlamaortamıyla kullanıcı arasındakiilişkiyi sağlar. Örneğin grafik penceresinde return tuşuna basıldığında veya farenin düğmesine basıldığında ne yapılması gerektiğini belirler. Java.awt ve javax.swing sınıflarının ikisiyle de kullanılır.
java.awt.font : yazı fontları ve bu fontların değiştirilmesiyle ilgili programalrı içerir.
java.awt.geom : iki boyutlu geometrik şekilleri tanımlar.
java.awt.im : java programlarına çince, japonca ve kore dilinde girdi girebilmek için tanımlanmış bir arabirimdir.
java.awt.image : java görüntü işleme paketi
java.awt.image.renderable : bir program içindeki resimleri depolama ve değiştirme için gerekli olan programları içerir.
java.awt.print : java programlarından yazıcılara yazım için bilgi aktaran paketleri içerir.
java.beans : java fasulyeleri paketi, bu paketin detayları için ilgili bölümü inceleyiniz.
java.beans.beancontext : tekrar kullanılabilen ve otomatik olarak birleştirilebilen program parçacıkları tanımlar.
java.io : dosya ve ekrandan girdi ve çıktı yapmak için gerekli program paketleri tanımlanır.
java.lang : bu paket birçok temel program içerir Bunlardan biri olan Math paketi aşağıda açıklanacaktır. Lang paketi java programlarınca otomatik olarak kullanılır. İmport deyimiyle iave edilmesi gerekmez.
java.lang.ref : bu paket java programıyla garbage collector (çöp toplayıcısı) denilen otomatik kullanılmayan hafıza temizleme programıyla ilişkiyi sağlar.
java.lang.reflect : bu paketteki programlar java programının çağrıldığında içinde bulunan değişken ve metotları dinamik olarak tespit etmesinive kullanma izni almasını sağlar.
java.math : bu sınıf değişebilir hassasiyette arimetik işlemler yapmak için gereken tanımları ve sınıfları içerir.
java.net : ağ işlemlerinde kullanılan çeşitli paketleri tanımlar
java.rmi , java.rmi.activation, java.rmi.dgc, java.rmi.registry, java.rmi.server: programların ve metodların uzaktan çalışabilmeleri için gerekli tanımlamaları içerir.
java.security, java.security.acl, java.security.cert, java.security.interfaces, java.security.spec : güvenlikle ilgili programlar demetini içerir.
java.sql : databaseprogramıyla java programlarını bağlantısını sağlar.
java.text : sayı karekter ve string tarih gibi işlemlerle ilgili programlar demeti içerir. Örneğin çok dilli programlar yazmayı sağlayan internalisation paketi bu paket içinde yer alır.
java.util : bu sınıf tarih ve zamanla ilgili fonksiyonlar, tesadüfi sayı üreticileri, StringTokenizer gibi programları barındırır.
java.util.jar bu paket java programlarını paketlemeye yarıyan jar yapılarını tanımlamada gerekli olan programları tanımlar.
java.util.zip : bu paket programları sıkıştırmaya yarayan programları tanımlar.
Java.accessibility : bu paket özürlülerin kullanabileceği ara üniteler tanımlar. Ekran okuyucular ve ekran büyüteçleri gibi.
javax.swing : grafik kullanıcı arabirimi tanımlar. Bu sınıftakitanımlar aracılığıyla ekrandan grafik ortamında veri transferi kolaylıkla yapılabilir.
javax.swing.borders : grafik arabirimi sınır yaratımında çeşitli sınır şekilleri yaratmakta kullanılır.
Javax.swing.colorchooser : renk seçimi için tanımlanmış grafik kullanıcı arabirimini tanımlar.
Java API dosyalarındaki metotlarin sadece isimlerinin listesi yaklaşık 200 sayfa boyutunda bir liste tuttuğundan burada sadece yeri geldiğine programları kullanırken örneklerde gerekli API isimlerini göreceğiz. Şu ana kadar kullandığımız java programlarında java.applet, java.awt, java.io javax.swing, javax.swing.JApplet ve javax.awt.event API paketlerini kullandık. Java.applet paketi appletleri oluşturma, appletlere giriş çıkısları ve dosyaları applet içerisinde çalıştırmayı sağlar. java.awt pencere(window) ortamındaki tüm programlama sınıflarını ve metotlarını içerir. Java swing (javax.swing) paketi yine aynı tür pencere(window) ortamında programlama için gerekli girdi çıktı grafik ortamlarını içerir. awt grafik ortamına göre daha zengin ve gelişmiş bir kolleksiyondur. Bu metotları ilerideki bölümlerde daha detaylı inceleyeceğiz. java.io paketi javaya dışarıdan(dosya,ekran v.b) bilgi giriş çıkışını ayarlar.
Java metodlarının tamamının listesini (İngilizce olarak) Java doküman kütüphanesindeki api alt gurubunda bulabilirsiniz. Java döküman kütühanesi http://java.sun.com/ adresinden çekilebilir.
Java dilinde en çok kullanılan API sınıflarından birisi Math sınıfıdır. Bu sınıf(class) java.lang paketinde yer alır. Java.lang paketi java programı açılırken otomatik olarak çağırılır. Bütün diğer paketler import deyimi kullanılarak programa ilave edilirler. Math sınıfında tanımlanan metotların bazıları Şekil 2.1 de listelenmiştir. Tablodaki x veya y değişkenleri double değişken türündendir. Math sınıfında(class) iki tane de sabit tanımlanmıştır. Bu sabitlerden birisi Math.PI 3.14159265358979323846 (pi) sayısına eşittir. Diğeri Math.E 2.7182818284590452354 (e) sayısına eşittir.
Tablo 2.1 Math sınıfı nda(class) çalışan metotlardan bazıları
Metot
Tanım
Örnek
abs(x)
x değişekeninin mutlak değeri
türkçesi : Mutlak
Math.abs(9.2) = 9.2
Math.abs(-9.2) = 9.2
ceil(x)
x degişkenini bir üst tamsayıya dönüştürür (türkçesi : tavan)
Math.ceil(9.2) = 10
Math.ceil(-9.8) = -9
floor(x)
x değişkenini bir alt tamsayıya dönüştürür. (türkçesi : taban)
Math.floor(9.2) = 9
Math.floor(-9.8) = -10
cos(x)
x in trigonometrik cosünisü
(x radyan cinsinden tanımlanmıştır.)
Math.cos(1.0)=0.54030230568
sin(x)
x in trigonometrik sinüsü
(x radyan cinsinden tanımlanmıştır.)
Math.sin(1.0)=0.8414709840709
tan(x)
x in trigonometrik tanjantı
(x radyan cinsinden tanımlanmıştır.)
Math.tan(1.0)=1.557040724655
acos(x)
x in trigonometrik cosünisünün tersi
(sonuç radyan cinsindendir)
Math.acos(0.54030230568)=1.0
asin(x)
x in trigonometrik sinüsü
(x radyan cinsinden tanımlanmıştır.)
Math.asin(0.8414709840709)=1.0
atan(x)
atan2(x,y)
x in trigonometrik tanjantı
(x radyan cinsinden tanımlanmıştır.)
x,y noktanın x,ykoordinatlarıdır
4.0*Math.atan(1.0)=3.14159265359
4.0*Math.atan2(1.0,1.0)=3.14159265359
exp(x)
e(2.7182818284590452354) nin x inci kuvveti
Math.exp(1.0) =2.718281828459
Math.exp(2.0) =7.389056098931
log(x)
e tabanına göre logaritma
Math.log(2.718281828459)=1.0
pow(x,y)
x in y inci kuvveti
Math.pow(3,2)=9.0
max(x,y)
x ve y nin büyük olanı
Math.max(2.3,12.7)=12.7
min(x,y)
x ve y nin küçük olanı
Math.min(2.3,12.7)=2.3
random()
Raslantısal sayı (0 ile 1 arasinda)
Math.random() = 0 ila bir arasında her sayı çıkabilir
Program 2.1 de Math sınıfındaki metotları kullanan Matematik1 sınıfını görüyoruz.
Program 2.1 Math sınıfında(class) çalışan metotlardan bazılarını gösteren Matematik1.java programı
import javax.swing.JOptionPane; // giriş çıkı
class matematik1SW
{
public static void main (String args[])
{
double x,y;
String s="";
x=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
y=Double.parseDouble(JOptionPane.showInputDialog
("İkinci bir gerçek sayı giriniz : "));
s +="Statik Matematik kütüphanesi Math de \n";
s+="en cok kullanilan metodlar :\n" ;
// Math.abs(3.2)=3.2 Math.abs(-3.2)=3.2
s+="Math.abs("+x+") = "+Math.abs(x)+"\n";
// Math.ceil(9.2)=10 Math.ceil(-9.8)=-9
// Math.ceil(x) x den buyuk en kucuk tam say�ya yuvarlar
s+="Math.ceil("+x+") = "+Math.ceil(x)+"\n";
// Math.floor(9.2)=9 Math.floor(-9.8)=-10
// Math.floor(x) x den kucuk en buyuk tam say�ya yuvarlar
s+="Math.floor("+x+") = "+Math.floor(x)+"\n";
// Trigonometrik fonksiyonlar sin(x) cos(x) tan(x) x:radyan
// Math.PI pi sayisi
s += "Math.PI = "+Math.PI+"\n";
s += "Math.sin("+x+") = "+Math.cos(x)+"\n";
s += "Math.cos("+x+") = "+Math.sin(x)+"\n";
s += "Math.tan("+x+") = "+Math.tan(x)+"\n";
//Trigonometrik fonksiyonlar asin
// asin,acos,atan : radyan
s += "Math.asin("+y+") = "+Math.acos
s += "Math.acos("+y+") = "+Math.asin
s += "Math.atan("+y+") = "+Math.atan
// Math.log(x) dogal logaritma (e) taban�na gore
// Math.E e sayisi = 2.718281828...
s += "Math.E = "+Math.E+"\n";
s += "Math.log("+x+") = "+Math.log(x)+"\n";
// Math.pow(x,y) x in y inci kuvveti
s += "Math.pow("+x+","+y+" ) = "+Math.pow(x,y)+"\n";
// Math.exp(x) Math.E=e=2.718281828.. in x inci kuvveti
s += "Math.exp("+x+" ) = "+Math.exp(x)+"\n";
// Math.sqrt(x) x in kare koku
s += "Math.sqrt("+x+" ) = "+Math.sqrt(x)+"\n";
// Maximum - minimum functions
// Math.max(x,y) Math.min(x,y)
s += "Math.max("+x+","+y+" ) = "+Math.max(x,y)+"\n";
s += "Math.min("+x+","+y+" ) = "+Math.min(x,y)+"\n";
JOptionPane.showMessageDialog(null,s,
"Math kütüphanesi işlemleri",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02001.JPG
Şekil 2.1 matematik1SW.java programının çıktısı
2.2 METOTLAR
Metotlar java programlarının ana parçalarıdır. Metotlar sınıfların(class) içinde yer alan küçük program parçacıklarıdır. Metotların çoğunda değişken parametreler metotlar ve sınıflar arasında iletişimi sağlarlar. Ayrıca her metotun kendine özgü değişkenleri de vardır. Metot yapısının ana sebebi programları modüler hale getirmektir. Aynı zamanda aynı program parçacığının tekrarlanmasını önlemeyi de sağlar. Her metot çağrıldığı proğram parçacığına belli bir değişkeni aktarabilir. Metotların tanımlarında aktardıkları değişken türü tanımlanır. Eğer metot hiçbir değişken aktarmıyorsa void sözcüğü yle tanımlanır. Metotların genel tanımı aşağıdaki gibidir. Parantez içindeki terimler kullanılmıyabilir.
Genel Metot tanımı
(public) (static) sınıf değişken türü sınıf ismi( sınıf değişken girdi listesi)
{
sınıf içinde geçerli degişken tanımları
Metotun ana gövdesi
return metot çıktı değişkeni
}
Örnek olarak aşağıdaki metotu verebiliriz :
Public static double metotornegi(int x,double y)
{
double z = 3.5;
double f ;
f = z*x*x+y;
return f;
}
Bu metotdaki x ve y gerçek (double) değişkenleri metotun girdi değişkenleridir. z ve f değişkenleri metotun yerel değişkenleridir ve bu metot dışında tanımları yoktur. Metot f değişkeninin değerini çıktı olarak metotun dışina aktarmaktadır. Eğer yukarıdaki metot aynı sınıfın içindeki başka bir metotda veya main metotunda aşağıdaki gibi bir örnekte kullanılırsa,
double z = 2.5;
double r ;
int i = 3;
r = metotornegi(i,z);
System.out.println(“r = “+r);
r = 34 sonucuna ulaşılır. Şimdi aynı metotun statik metot olarak bir appletin içinde kullanılmasını görelim.
Program 2.2 : metotornegi1.java programında kare statik metotunun kullanılması
import java.io.*;
public class metotornegi1
{
// sayinin karesi static metotu
public static double kare(double x)
{
return x*x;
}
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
System.out.println("Bir tam sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin karesi : "+kare(sayi));
}
}
Program 2.3 : metotornegi2.java programında kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
public class metotornegi2 extends Applet
{
double sayi=5; // Gercek degisken sayi
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+kare(sayi),25,50);
}
}
02002.JPG
Şekil 2.2 metotornegi2.java programında kare metotunun kullanılması
Şekil 2.2.3 de tanımlanan public double kare(double x) metotu, public void paint(Graphics g) metotundaki
g.drawString(sayi+"nin karesi = "+kare(sayi),25,50);
işleminde çağırılmıştır. Bilgisayar kare(sayi) ifadesini gördüğünde metotun içine gider, orada tanımlanan tüm işlemleri yaptıktan sonra return kelimesinin karşısındaki işlemleri çağırıldığı yere geri iletir. Metotorneği1 java programında çağırılan kare(sayi) metotunda sadece sayının kendisiyle çarpımı return kelimesinin karşısına yazıldığından, kare(sayı ) ifadesi sayı*sayı ifadesiyle eşdeğerdir. Burada kare metotundandaki değişken adının sayı değil x olarak verildiğini de burada not edelim. Sayı değişkeni metotun girişinde x degişkenine yüklenir. Gerekli işlemler metotda yapıldıktan sonra sadece metotun sonuçları return deyimiyle metodun değişken türü olarak (bu metod için double ) geri döner.
2.3 NESNE (OBJECT) TANIMI VE METOTLARDA KULLANIMI
Birinci bölümde temel değişken türlerini (double,int,boolean v.b.) nasıl tanımladığımızı görmüştük. Nesne tipi programlamanın en önemli özelliği kendi değişken türlerimizi yaratabilmemizdir. İlerideki bölümlerde kendi değişken türlerimizi sınıf (class) yapısını kullanarak nasıl yaratacağımızı daha detaylı olarak inceleyeceğiz. Bu bölümde nesnelerin program içindeki tanımlanmasına göz atalım. Daha önce tanımladığımız bazı applet programlarında nesne tanımları zaten geçmişti. Örneğin daha önceki programlarımızda bilgi okutmak için kullandığımız
Text cin=new Text();
Terimi Text sınıfından(class) cin nesnesini tanımlar. Nesne(object) tanımı yaparken aynı metotlarda olduğu gibi değişken veya nesneleri girdi olarak tanımlamamız mümkündür.
Diğer bir örnek olarak yine daha önceki örnek problemlerde kullandığımız Label sınıfından(class) kutubasligi nesnesinin tanımını ve TextField sınıfından(class) kutugirdisi nesnesini gösterebiliriz.
Label kutubasligi; //Label sinifi degiskeni (nesnesi) kutubasligi
kutubasligi=new Label("Ogrencinin notunu giriniz (A B C.. : ");
TextField kutugirdisi;//Textfield sinifi degiskeni (nesnesi) kutugirdisi
kutugirdisi=new TextField(5);
Bu örneklerde de görüldüğü gibi Nesne tanımı şu şekilde yapılmaktadır:
Sınıf (class) isminesne(object) ismi ;
nesne(object) ismi = new Sınıf (class) ismi(değişken veya nesne girdi listesi)
Nesne tanımını daha iyi anlamak için metotornegi2 sınıfını yazdığımız programı biraz değiştirerek metotornegi3 ve metotornegi3a sınıflarını olusturalım ve kare metotumuzu metotornegi3a sınıfına yerlestirelim.
Program 2.4 : metotornegi.java programında kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
class metotornegi3a
{
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
}
public class metotornegi3 extends Applet
{
double sayi=5; // Gercek degisken sayi
metotornegi3a nesne1=new metotornegi3a();
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+nesne1.kare(sayi),25,50);
}
}
Metotornegi3.java programında iki tane sınıf(class) yaratılmıştır. İlk sınıf metotornegi3a da kare metotu tanımlanmıştır. İkinci sınıf(class) metotornegi3 de ise metotornegi3a sınıfı nesne1 nesnesi tanımlanmış, ve kare metotu nesne1 nesnesi üzerinden nesne1.kare(sayi) olarak çağırılmıştır. Bu metot nesne1 nesnesi için bilgisayar belleğinde bir yer ayırır. Kare metotunu çağırırken bu yerin adresini kullanır. Metotornegi2.java programında kare(sayı) dogrudan kullanılmıştı. Çunku kare metotu aynı sınıfın(class) içinde tanımlanmıştı. Metotornegi3.java programında ise kare metotu ayrı bir sınıf(class) ta tanımlandığından yerinin tanımlanması gerekir. Bu bizim kendi odamızın yatak odasını tanımlarken sadece yatak odası dememizle baska bir evin yatak odasını tanımlarken Ahmet beyin evinin yatak odası dememiz gibidir. Metotlar statik olarak da tanımlanabilirler. Statik olarak tanımlanan metotlar nesne kullanılmadan direk olarak sınıf(class) adları kullanılarak çağırılabilirler.
Program 2.5 : metotornegi4.java programında static kare metotunun kullanılması
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
class metotornegi4a
{
// sayinin karesi dinamik metotu
public static double kare(double x)
{
return x*x;
}
}
public class metotornegi4 extends Applet
{
double sayi=5; // Gercek degisken sayi
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+ metotornegi4a.kare(sayi),25,50);
}
}
Görüldüğü gibi metotornegi4 sınıfında(class) kare metotu metotornegi4a.kare(sayi) olarak tanımlanmış ve ek bir nesne adresi kullanılmamıştır. Static olarak tanımlanan metotların kendikendine yeterli metotlar olaması gerekir. Yani içinde bulunduğu sınıfla veya baska sınıflarla direk olarak veri alışverişi olamaz. Girdileri sadece girdi parantezleri () arasinda verilen değişkenlerdir.dinamik metotlar ise kendi sınıfları ve diğer sınıflarla değişik yollardan bilgi ve değişken aktarımı yapabilirler
Metotornegi3.java ve Metotornegi4.java programlarında iki sınıf(class) aynı dosyada yer almiştı. Her sinifi ayri bir dosyada da tanımlamak mumkündür. Bu yapıldığında diğer dosya import(ithal) terimiyle diğer programa aktarılır. Şekil 2.6 ve 2.7 de Şekil 2.5 de verilen programın iki ayrı dosyada yazılımını görüyoruz.
Program 2.6 : metotornegi6.java programında kare metotunun tanımlanması
class metotornegi6
{
// sayinin karesi dinamik metotu
public double kare(double x)
{
return x*x;
}
}
Program 2.7 : metotornegi7.java programında kare metotunun metotornegi6 sınıfı x nesnesi üzerinden kullanılışı.
import java.applet.Applet; // java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import metotornegi6; // metotornegi6 sınıfını çağır
public class metotornegi7 extends Applet
{
double sayi=5; // Gercek degisken sayi
metotornegi6 x=new metotornegi6();
public void paint(Graphics g)
{
g.drawString(sayi+"nin karesi = "+ x.kare(sayi),25,50);
}
}
2.4 METOTLARIN KENDİ KENDİNİ ÇAĞIRMASI (RECURSION)
Bazı problemlerin çözümünde bir metotun kendi kendini çağırması yararlı olabilir. Java bir metotun kendi kendini çağırmasına izin verir. Burada dikkatli olunması gereken nokta bu kendi kendine çağırılma döngüsünün sonsuza kadar sürmesinin bir kontrol yapısı kullanılarak engellenmesidir. Kendi kendini çağıran programlarda mutlaka bir döngü çıkış şartı tanımlanmalıdır.
Daha önceki alıştırmalarımızda faktoriyel sınıfı tanımlanmıştı. Önce bu programdaki faktoriyel hesabını ayrı metot haline dönüştürelim. Program 2.8 de daha önce de gördüğümüz faktoriyeli ana metotumuz olan main içinde hesaplayan faktoriyel programını görmekteyiz. Program 2.9 da faktoriyel hesabı for döngüsü kullanılarak faktoriyel metotonda gerçekleştirilmektedir.
Program 2.8 : Metot kullanılmadan (main metotunun içinde) faktoriyel hesaplayan faktoriyel.java programı
import java.io.*;
import Text;
class faktoriyel
{
public static void main(String args[]) throws IOException
{
int faktoriyel=1;
Text cin=new Text();
int faktoriyelsayi;
System.out.print("Bir tamsayi giriniz : ");
faktoriyelsayi=cin.readInt();
for(int sayi=1;sayi<=faktoriyelsayi;sayi++)
{ faktoriyel*=sayi;}
System.out.println(faktoriyelsayi + " faktoriyel: " + faktoriyel);
}
}
değişik giriş çıkış opsiyonlarını biraz daha anlamak için aynı programın JOPtionPane kullanılarak yazılmış eşdeğerini de verelim :
Program 2.9 : Metot kullanılmadan (main metotunun içinde) faktoriyel hesaplayan faktoriyeSW.java programı
import javax.swing.JOptionPane;
class faktoriyelSW
{
public static void main(String args[])
{
int faktoriyel=1;
int faktoriyelsayi;
faktoriyelsayi=Integer.parseInt(JOptionPane.showIn putDialog("Bir tam sayı giriniz : "));
for(int sayi=1;sayi<=faktoriyelsayi;sayi++)
{ faktoriyel*=sayi;}
String s=faktoriyelsayi+" faktoriyel: "+faktoriyel;
JOptionPane.showMessageDialog(null,s, "Metod örneği faktoriyelSW.java ",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
Şimdi aynı programın faktoriyel metodu ayrı yazılmış fakat yine for döngüsü kullanan şekillerine göz atalım. Program 2.10 ve 2.11 de birbirinin aynı olu, program 2.10 da çıktı System.out.println deyimiyle alınırken 2.11 de çıktı JOptionPane.showMessageDialog metodu kullanılarak aktarılmıştır.
Program 2.10 : for döngülü faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel1.java programı
import java.io.*;
import Text;
class faktoriyel1
{
public static long faktoriyel(int x)
{
long faktoriyel=1;
for(int sayi=1;sayi<=x;sayi++)
{ faktoriyel*=sayi;}
return faktoriyel;
}
public static void main(String args[]) throws IOException
{
Text cin=new Text();
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=cin.readInt();
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
Program 2.11 : for döngülü faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel1SW.java programı
(JoptionPane girdi çıktı sistemi kullanarak hesaplıyor)
import javax.swing.JOptionPane;
class faktoriyel1SW
{
public static long faktoriyel(int x)
{ long faktoriyel=1;
for(int sayi=1;sayi<=x;sayi++)
{ faktoriyel*=sayi;}
return faktoriyel;
}
public static void main(String args[])
{ int faktoriyelsayi;
faktoriyelsayi=Integer.parseInt(
JOptionPane.showInputDialog("Bir tam sayı giriniz : "));
String s=faktoriyelsayi+" faktoriyel: "+faktoriyel(faktoriyelsayi);
JOptionPane.showMessageDialog(null,s,"Metod örneği faktoriyel1SW.java ",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
Program 2.12 ve 2.13 de faktoriyeli kendi kendini çağıran(recursive) faktoriyel metotunu kullanarak hesaplayalım.
Program 2.12 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan faktoriyel2.java programı
import java.io.*;
import Text;
class faktoriyel2
{
public static long faktoriyel(int x)
{
if( x <= 1 )
return 1;
else
return x * faktoriyel( x – 1);
}
public static void main(String args[]) throws IOException
{
DataInputStream cin=new DataInputStream(System.in);
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=Text.readInt(cin);
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
}
Bir tamsayi giriniz: 4
4 faktoriyel:24
Program 2.13 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan
Faktoriyel2SW.java programı (JOPtionPage girdi/çıktı)
import java.io.*;
import Text;
class faktoriyel2
{
public static long faktoriyel(int x)
{
if( x <= 1 )
return 1;
else
return x * faktoriyel( x – 1);
}
public static void main(String args[]) throws IOException
{
DataInputStream cin=new DataInputStream(System.in);
int faktoriyelsayi;
System.out.println("Bir tamsayi giriniz:");
faktoriyelsayi=Text.readInt(cin);
System.out.println(faktoriyelsayi+" faktoriyel:" + faktoriyel(faktoriyelsayi));
}
}
02003.JPG
Şekil 2.3 : kendi kendini çağıran (recursive) faktoriyel metotunu kullarak faktoriyel hesaplayan
Faktoriyel2SW.java programının sonuçlarının JOPtionPage çıktısı olarak görülmesi
Program 2.132veya 2.13’ü çalıştırdığımızda faktoriyel hesabı şu şekilde yapılacaktır :
5! = 5 * 4! = 4 * 3! = 3 * 2! = 2 * 1! = 1
faktoriyel metotu 1 e ulastığında tekrar kendisini çağırmıyacağından geriye dogru yaptığı hesapları göndermeye başlıyacaktır.
1 = (2*1!(=1)) = 2 = (3 * 2!(=2)) = 6= (4*3!(=6))=24= (5*4!(24))=120= 5!(=120)
sonuç 120 olarak ana programa gönderilecektir. Kendi kendini çağıran metodlar mutlak bir gereksinim olmadıkça tercih edilmez. Bu tür programlamada hem sonsuz döngülerin görülmesi daha güç olabilir, hemde for, while gibi döngüler kullanılarak programlamaya göre programlar daha yavaş çalışır. Gerçek uygulamalarda kendi kendini çağıran programlar genellikle bir döngü yapısı kurmadan çok tek kerelik çağırmaları gerçekleştirmek için kullanılırlar.
2.5 AYNI ADLI METOTLARIN BİR ARADA KULLANILMASI (OVERLOADİNG)
Java aynı adlı metotların aynı sınıf içerisinda kullanılmasına izin verir. Aynı sınıfta(class) kullanılan metotların girdi değişkenlerinin değişken türlerinin veya değişken sayılarının farklı olması gerekir. Java aynı isimli ve ayni degişken türlü iki metotu birbirinden ayıramaz. Örneğin
Public double Bmetodu(double Adeğişkeni)
Ve
Public double Bmetodu(double Bdeğişkeni)
Veya
Public int Bmetodu(double Cdeğişkeni)
Java tarafindan ayırt edilemez , Fakat
Public double Cmetodu(double Adeğişkeni)
Ve
Public double Cmetotu(int Bdeğişkeni)
veya
Public double Cmetotu(double Adeğişkeni, double Bdeğişkeni)
Java tarafından ayırt edilir ve birlikte aynı sınıfın (class) içinde yer alabilir. Eğer birbirinin tam olarak eşiti metotlar değişik sınıflarda yer alıyorsa bunun herhangi bir sakıncası yoktur. Program 2.11'de ayniisimliikimetot.java programı görülmektedir. Bu programda daha önceki programlarda da kullandığımız kare metotunu int ve double girdi değişkenleriyle iki kere aynı sınıfın içerisinde tanımlayacağız.
Program 2.14 : ayniisimliikimetot.java programı
import java.awt.Graphics;
import java.applet.Applet;
public class ayniisimliikimetot extends Applet
{
// void tipi paint metotu
public void paint( Graphics g)
{
g.drawString(“ 7 nin karesi = “+kare(7),25,25);
g.drawString( 7.5 un karesi = “+kare(7.5),25,40);
}
// int tipi kare metotu
int kare(int x)
{
return x*x;
}
// double tipi kare metotu
double kare(double x)
{
return x*x;
}
}
02004.JPG
Şekil 2.4 ayniisimliikimetot.html programıyla ayniisimliikimetot.class ın gösterilmesi
Bu programda parantez içerisinde 7 (tamsayı) verildiğinde java tamsayi metotu kare(int x), 7.5(gerçek sayı) verildiğinde gerçeksayi metotu kare(double x) i çağırır.
Benzer bir örneği swing applet olarak verelim :
Program 2.15 : H3AL9_2000 programı
import java.awt.Container;
import javax.swing.*;
public class H3AL9_2000 extends JApplet
{
JTextArea ciktiAlani;
public void init()
{
ciktiAlani=new JTextArea();
Container c=getContentPane();
c.add(ciktiAlani);
int x1=7;
double x2=7.0;
ciktiAlani.setText(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
x1=5;
x2=5.0;
ciktiAlani.append(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
}
// double girisli exp metodu
public double exp(double x)
{
double faktoriyel=1;
double us=1;
double exponent=1;
for(double i=1;i<=300;i++)
{
faktoriyel*=i;
us*=x;
exponent+=us/faktoriyel;
}
return exponent;
}
// int girişli exp metodu
public double exp(int x)
{
double exponent=1.0;
for(int i=1;i<=x;i++)
{
exponent*=Math.E;
}
return exponent;
}
}
02005.JPG
Şekil 2.5 Gerçek ve tamsayı değişkenleri çağıran aynı adlı metodların çağırılması örneği
2.6 METOT (METHOD) VE SINIF(CLASS) DEĞİŞKENLERİ
Metotların içinde kullanılan değişkenler sadece metotlara aittir. O metotun dışında tanımları yoktur. Eğer değişkenler metotların dışında sınıf(class) değişkenleri olarak tanımlanırsa metota da aynen aktarılırlar. Sınıf değişkeniyle aynı isimde bir değişken mettotta da tanımlanmışsa bu değişken metotun içinde kullanılan metotun değişkenidir
Program 2.16 : metotvesinifdeg.java programında metot değişkenlerinin sınıfa aktarılması
import java.awt.Container;
import javax.swing.*;
public class H3AL9_2000 extends JApplet
{
JTextArea ciktiAlani;
public void init()
{
ciktiAlani=new JTextArea();
Container c=getContentPane();
c.add(ciktiAlani);
int x1=7;
double x2=7.0;
ciktiAlani.setText(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
x1=5;
x2=5.0;
ciktiAlani.append(" exp ("+x1+") (int metod girdisi ) = "+exp(x1)+"\n");
ciktiAlani.append(" exp ("+x2+") (double metod girdisi) = "+exp(x2)+"\n");
}
// double girisli exp metodu
public double exp(double x)
{
double faktoriyel=1;
double us=1;
double exponent=1;
for(double i=1;i<=300;i++)
{
faktoriyel*=i;
us*=x;
exponent+=us/faktoriyel;
}
return exponent;
}
// int girişli exp metodu
public double exp(int x)
{
double exponent=1.0;
for(int i=1;i<=x;i++)
{
exponent*=Math.E;
}
return exponent;
}
}
metotvesinifdeg.java programının sonuçları
Metot1 in disi : x=2.5 y=3
Metot1 in ici : x=5.5 y=6
Metot1 in disi : x=5.5 y=6
Program 2.17 : metotvesinifdeg1.java programında metot değişkenlerinin sınıfa aktarılması
import java.awt.Graphics;
import java.applet.Applet;
public class metotvesinifdeg1 extends Applet
{
//buradaki değişkenler tüm sınıfa aittir
double x ;
int y ;
void metot1( Graphics g) //metota hi‡ bir de§iŸken girmiyor
{
double x;
int y;
x=5.5;
y=6;
g.drawString("metot1 in ici : x = "+ x+" y = "+ y,25,40);
}
public void paint(Graphics g)
{
x = 2.5;
y = 3;
g.drawString("metot1 in disi : x = "+ x+" y = "+ y,25,25);
metot1(g);
g.drawString("metot1 in disi : x = "+ x+" y = "+ y,25,55);
}
}
metotvesinifdeg1.java programının sonuçları
Metot1 in disi : x=2.5 y=3
Metot1 in ici : x=5.5 y=6
Metot1 in disi : x=2.5 y=3
Program 2.16'daki metotvesinifdeg sinıfındaki metot1 metotunun içinde değiştirilen x ve y değişkenleri tüm tüm sınıfa(class) aittir. Bu yüzden paint metotundaki drawString metotu tekrar çağırıldığında x ve y nin değerlerinin değiştiğini görürüz.
Program 2.17 deki metotvesinifdeg1 sınıfındaki metot1 metotunun içinde ise yerel değişkenler x ve y tanımlanmıştır. Bu yüzden metot1 in içindeki x ve y değişkenlerinin değişmesi paint metotundaki drawString metotu tekrar çağırıldığında x ve y nin değerlerinin değişmediği görülür.
Nesne tanımı yapıldığında Bilgisayar bu nesne için bir adres yaratır. Yeni adres yarat komutu new komutudur.
Pogram 2.18 : Point1.java programda nokta1 ve nokta2 nesnelerinin yaratılması ve adres paylaşımı.
// java kutuphanelerinde tanimli bir sinifin cagirilip
// nesne olarak tanimlanmasi ve adres paylasimi
import java.io.*; //java girdi cikti sinifini cagir
import java.awt.Point; //Point sinifini cagir
class Point1
{
public static void main(String args[])
{
//Point sinifi x,y koordinatli bir nokta tanimlar
Point nokta1,nokta2;
nokta1=new Point(100,100);
nokta2=nokta1;
// nokta1 ve nokta2 bilgisayarda ayni
// adres kutusunu paylasiyor
System.out.println("nokta1 ve nokta2 ayni degerleri tasiyor");
System.out.println("ve aynı bilgisayar adresini paylasiyor");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
nokta1.x=200;
nokta1.y=200;
System.out.println("nokta1 in degeri degistirildi");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
// nokta1 ve nokta2 nin degerleri ayni fakat bilgisayarda
// degisik adreslerde tanimlanmis
nokta1=new Point(100,100);
nokta2=new Point(100,100);
System.out.println("nokta1 ve nokta2 ayni degerleri tasiyor");
System.out.println("fakat ayni bilgisayar adresini paylasmiyor");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
nokta1.x=200;
nokta1.y=200;
System.out.println("nokta1 in degeri degistirildi");
System.out.println("nokta 1 : "+nokta1.x+" , "+nokta1.y);
System.out.println("nokta 2 : "+nokta2.x+" , "+nokta2.y);
}
}
Point1.java da verilen
Point nokta1,nokta2;
nokta1=new Point(100,100);
nokta2=nokta1;
tanımında Point sınıfından(class) nokta1 ve nokta2 değişkenleri tanımlanmış, nokta1 değişkeni için yeni(new) adres tanımlanmış, nokta2 değişkenine de aynı adresi (nokta1'in adresini) kullanması soylenmiştir. Bu yüzden programda nokta1 e yeni deger verildiğinde nokta2 nin değeri de aynı değeri alır.
daha sonra kullanılan
nokta1=new Point(100,100);
nokta2=new Point(100,100);
deyimi ile ise nokta1 ve nokta2 için iki ayrı adres yaratılmıştır. Bu yüzden nokta1 değiştiğinde nokta2 eski değerinde kalır.
Aynı adresin iki değişken tarafından kullanılması ancak gerektiği zaman ve çok dikkat sarfederek yapılmalıdır. Gereksiz yere kullanılmasından kesin olarak kaçınılmalıdır. Program güvenlik ve kontrol problemleri yaratabildiği gibi, istemediğimiz değişken değerlerinin silinmesi sonucunu da verebilir.
2.7 ALISTIRMALAR
1. Math kütüphanesindeki Math.random() metotunu kullanarak static zar metotunu yazınız. Bu metotu H4A1a sınıfında(class) tanımlayiniz.
Not : 1-den 6 ya kadar tesadüfi (random) sayıları 1+(int)(Math.random()*6) formülü ile hesaplayabiliriz.
Program 2.19 H4A1a.java ve static int zar metodu
public class H4A1a
{
public static int zar()
{
return 1+(int)(Math.random()*6);
}
}
H4A1b sinifinda(class) java konsol ana metotu (public void main) yazarak zar degerini yazdiriniz.
Program 2.20 H4A1b.java
import java.io.*; // giris cikis
import H4A1a;
class H4A1b
{
public static void main (String args[]) throws IOException
{
System.out.println("zar degeri : "+H4A1a.zar());
}
}
H4A1c sinifinda java konsol ana metotunda (public void main) metotunda yüz(100) kere zar attırarak ortalamasını hesaplayınız.
Not : for veya while döngüsü kullanabilirsiniz.
Program 2.21 H4A1c.java
import java.io.*; // giris cikis
import H4A1a;
class H4A1c
{
//yuz zarin ortalamasi
public static void main (String args[]) throws IOException
{
double ortalama;
double toplam=0;
for(int sayi=0;sayi<100;sayi++)
{
toplam+=H4A1a.zar();
}
ortalama=toplam/100.0;
System.out.println("100 zarin ortalamasi = "+ortalama);
}
}
H4A1d sinifinda java konsol ana metotunda (public void main) bin(1000) kere zar attırarak her rakamın kac kere geldigini bulunuz ve yazdırınız.
Not : switch – case deyimi bu tür programlar için idealdir
Program 2.22 H4A1d.java
import java.io.*; // giris cikis
import H4A1a;
public class H4A1d
{
//bin zar atiminda her zar kac kere gelir
public static void main (String args[]) throws IOException
{
int zardegeri;
int zar1,zar2,zar3,zar4,zar5,zar6;
int zaratimsayisi=0;
zar1=0;
zar2=0;
zar3=0;
zar4=0;
zar5=0;
zar6=0;
while(zaratimsayisi<1000)
{
zardegeri=H4A1a.zar();
switch(zardegeri)
{
case 1:
zar1++;
break;
case 2:
zar2++;
break;
case 3:
zar3++;
break;
case 4:
zar4++;
break;
case 5:
zar5++;
break;
case 6:
zar6++;
break;
}
zaratimsayisi++;
}
System.out.println("toplam zar 1 sayisi : "+zar1);
System.out.println("toplam zar 2 sayisi : "+zar2);
System.out.println("toplam zar 3 sayisi : "+zar3);
System.out.println("toplam zar 4 sayisi : "+zar4);
System.out.println("toplam zar 5 sayisi : "+zar5);
System.out.println("toplam zar 6 sayisi : "+zar6);
}
}
toplam zar 1 sayisi : 169
toplam zar 2 sayisi : 165
toplam zar 3 sayisi : 165
toplam zar 4 sayisi : 146
toplam zar 5 sayisi : 178
toplam zar 6 sayisi : 177
2. Math kütüphanesindeki Math.random() metotunu kullanarak static zar metotunu yazılmıştır. Bu metot H4A1a sınıfında(class) Problem 1 de tanımlanmıştır.
H4A1bSW sinifinda(class) java konsol ana metotu (public void main) yazarak zar degerini yazdiriniz. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Program 2.23 H4A1bSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
class H4A1bSW
{
public static void main (String args[])
{
JOptionPane.showMessageDialog(null,"atılan zar = "+H4A1a.zar()
,"sınıf örneği, zar atımı ",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
H4A1cSW sinifinda java konsol ana metotunda (public void main) metotunda yüz(100) kere zar attırarak ortalamasını hesaplayınız. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Not : for veya while döngüsü kullanabilirsiniz.
Program 2.24 H4A1cSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
class H4A1cSW
{
//yüz zarin ortalamasi
public static void main (String args[])
{
double ortalama;
double toplam=0;
for(int sayi=0;sayi<100;sayi++)
{
toplam+=H4A1a.zar();
}
ortalama=toplam/100.0;
JOptionPane.showMessageDialog(null,"100 zarın ortalaması = "+ortalama
,"sınıf örneği, 100 kez zar atımı ortalaması H4A1c",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
H4A1dSW sinifinda java konsol ana metotunda (public void main) bin(1000) kere zar attırarak her rakamın kac kere geldigini bulunuz ve yazdırınız. Yazdırma işlemini java swing sınıfından JoptionPane sınıfını kullanarak yaptırınız.
Not : switch – case deyimi bu tür programlar için idealdir
Program 2.25 H4A1dSW.java
import javax.swing.JOptionPane; // giris cikis
import H4A1a;
public class H4A1dSW
{
//bin zar atiminda her zar kac kere gelir
public static void main (String args[])
{
int zardegeri;
int zar1,zar2,zar3,zar4,zar5,zar6;
int zaratimsayisi=0;
zar1=0;
zar2=0;
zar3=0;
zar4=0;
zar5=0;
zar6=0;
while(zaratimsayisi<1000)
{
zardegeri=H4A1a.zar();
switch(zardegeri)
{
case 1:
zar1++;
break;
case 2:
zar2++;
break;
case 3:
zar3++;
break;
case 4:
zar4++;
break;
case 5:
zar5++;
break;
case 6:
zar6++;
break;
}
zaratimsayisi++;
}
String s="";
s+="toplam zar 1 sayisi : "+zar1+"\n";
s+="toplam zar 2 sayisi : "+zar2+"\n";
s+="toplam zar 3 sayisi : "+zar3+"\n";
s+="toplam zar 4 sayisi : "+zar4+"\n";
s+="toplam zar 5 sayisi : "+zar5+"\n";
s+="toplam zar 6 sayisi : "+zar6+"\n";
JOptionPane.showMessageDialog(null,s
,"sınıf örneği, 1000 kez zar atımı gelen zarlar H4A1cdSW",
JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02006.JPG
3.
· zarApplet.java programini incele ve calistir.
· ZarApplet.java programindaki zar metotunu H4A2b.java sınıfına yerlestir. ZarApplet.java programindaki zar metotunu sil ve import H4A2b; deyimini ekle.
· ZarApplet.java programını H4A2c olarak değiştir. sinifindan yeni nesne z yi H42c.java programına ekle ve Paint methodunda çağırılan zar metotunda gerekli değişiklikleri yap. Programi yeni sekliyle calıştır.
Program 2.26 : ZarApplet.java, zar atma metot örneği
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class zarApplet extends Applet implements ActionListener
{
int toplamzaratisi=0;
int toplam=0;
TextField ilkzar,ikincizar;
Button salla; //zar atma düğmesi
int zar1,zar2;
public static int zar()
{
return 1+(int)(Math.random()*6);
}
public void init()
{
//programi baslat
ilkzar=new TextField(10); // Textfield sinifi ilkzar nesnesini yarat
add(ilkzar); // ilk zar nesnesini pencereye ekle
ikincizar=new TextField(10);// Textfield sinifi ikincizar nesnesini yarat
add(ikincizar); // ikinci zar nesnesini pencereye ekle
salla=new Button("Zari salla ve at");
add(salla);
salla.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
zar1=zar();
zar2=zar();
ilkzar.setText(Integer.toString(zar1));
ikincizar.setText(Integer.toString(zar2));
toplam+=(zar1+zar2);
toplamzaratisi++;
repaint();
}
public void paint( Graphics g)
{
g.drawString("toplam = "+toplam+" Atilan zar sayisi = "+toplamzaratisi,25,50);
}
}
public class H4A2b
{
public static int zar()
{
return 1+(int)(Math.random()*6);
}
}
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import H4A2b;
public class H4A2c extends Applet implements ActionListener
{
int toplamzaratisi=0;
int toplam=0;
TextField ilkzar,ikincizar;
Button salla; //zar atma d�gmesi
int zar1,zar2;
H4A2b z=new H4A2b();
public void init()
{
//programi baslat
ilkzar=new TextField(10); // Textfield sinifi ilkzar nesnesini yarat
add(ilkzar); // ilk zar nesnesini pencereye ekle
ikincizar=new TextField(10);// Textfield sinifi ikincizar nesnesini yarat
add(ikincizar); // ikinci zar nesnesini pencereye ekle
salla=new Button("Zari salla ve at");
add(salla);
salla.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
zar1=z.zar();
zar2=z.zar();
ilkzar.setText(Integer.toString(zar1));
ikincizar.setText(Integer.toString(zar2));
toplam+=(zar1+zar2);
toplamzaratisi++;
repaint();
}
public void paint( Graphics g)
{
g.drawString("toplam = "+toplam+" Atilan zar sayisi = "+toplamzaratisi,25,50);
}
}
02007.JPG
Şekil 2.7 ZarApplet.html çıktısı
4. faktoriyeltesti1.java programını inceleyiniz, ve applet ortamında çalıştırınız.
Program 2.27 FaktoriyelTesti
import java.awt.Graphics;
import java.applet.Applet;
public class faktoriyeltesti extends Applet
{
public void paint(Graphics g)
{
int y=25;
for(long i=0;i<=10;i++)
{
g.drawString(i+"! = "+faktoriyel(i),25,y);
y+=15;
}
}
public long faktoriyel(long sayi)
{
if(sayi <=1) return 1;
else return sayi*faktoriyel(sayi - 1);
}
}
5. fibonachitesti1.java programını inceleyiniz ve applet ortamında çalıştırınız.
Program 2.28 Fibonachitesti1.java
import java.awt.Graphics;
import java.applet.Applet;
public class fibonachitesti1 extends Applet
{
public void paint(Graphics g)
{
int y=25;
for(long i=0;i<=15;i++)
{
g.drawString("Fibonachi("+i+") = "+fibonachi(i),25,y);
y+=15;
}
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
6. fibonnachitesti1SWA.java swing applet programını inceleyiniz ve appletviewer ile çalıştırınız
Program 2.29 Fibobachi testi, swing applet programı fibonnachitesti1SWA.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class fibonnachitesti1SWA extends JApplet
{
private JTextArea cikti;
public void init()
{
Container c=getContentPane();
c.setLayout(new FlowLayout());
cikti=new JTextArea(" ");
c.add(cikti);
cikti.setBackground(c.getBackground());
String s="";
for(long i=0;i<=15;i++)
{
s+="Fibonachi("+i+") = "+fibonachi(i)+"\n";
}
cikti.setText(s);
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
02008.JPG
Şekil 2.8 fibonnachitesti1SWA swing applet çıktısı
7. fibonnachitesti1SWF.java swing Frame programını inceleyiniz ve java komutu ile çalış tırınız
Program 2.30 Fibobachi testi, swing applet programı fibonnachitesti1SWA.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class fibonnachitesti1SWF extends JFrame
{
private JTextArea cikti;
public fibonnachitesti1SWF()
{
super("Fibonacchi Testi 1 Swing Frame");
Container c=getContentPane();
c.setLayout(new FlowLayout());
cikti=new JTextArea(" ");
c.add(cikti);
cikti.setBackground(c.getBackground());
String s="";
for(long i=0;i<=15;i++)
{
s+="Fibonachi("+i+") = "+fibonachi(i)+"\n";
}
cikti.setText(s);
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
public static void main(String[] args)
{
fibonnachitesti1SWF pencere= new fibonnachitesti1SWF();
pencere.addWindowListener(new BasicWindowMonitor());
pencere.setSize(150,350);
pencere.setVisible(true);
}
}
02009.JPG
Şekil 2.9 fibonnachitesti1SWF çıktısı
8. fibonachitesti2.java programını inceleyiniz ve applet ortamında çalıştırınız.
Problem 2.31 fibonachitesti2.java programı
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class fibonachitesti2 extends Applet implements ActionListener
{
Label rakametiketi,sonucetiketi;
TextField rakam,sonuc;
public void init()
{
rakametiketi=new Label("Bir tamsayi giriniz : ");
rakam=new TextField(10);
rakam.addActionListener(this);
sonucetiketi=new Label("Fibonachi degeri : ");
sonuc=new TextField(10);
sonuc.setEditable(false);
add(rakametiketi);
add(rakam);
add(sonucetiketi);
add(sonuc);
}
public void actionPerformed( ActionEvent e)
{
long sayi;
long fibonachisayisi;
sayi=Long.parseLong(rakam.getText());
showStatus("Fibonachi hesaplan�yor....");
fibonachisayisi=fibonachi(sayi);
showStatus("Fibonachi hesaplandi....");
sonuc.setText(Long.toString(fibonachisayisi));
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}
02010.JPG
Şekil 2.10 Fibonachi testi 2 çıktısı (AWT Aplet)
9. fibonachitesti2SWA.java programında bir önceki programda yazılan fibonachi testi swing appletiortamında yazılmıştır. Programı inceleyiniz ve applet ortamında çalıştırınız.
Problem 2.32 fibonachitesti2SWA.java programı
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class fibonachitesti2SWA extends JApplet implements ActionListener
{
JLabel rakametiketi,sonucetiketi;
JTextField rakam,sonuc;
public void init()
{
Container c=getContentPane();
c.setLayout(new FlowLayout());
rakametiketi=new JLabel("Bir tamsayi giriniz : ");
rakam=new JTextField(10);
rakam.addActionListener(this);
sonucetiketi=new JLabel("Fibonachi degeri : ");
sonuc=new JTextField(10);
sonuc.setEditable(false);
c.add(rakametiketi);
c.add(rakam);
c.add(sonucetiketi);
c.add(sonuc);
}
public void actionPerformed( ActionEvent e)
{
long sayi;
long fibonachisayisi;
sayi=Long.parseLong(rakam.getText());
showStatus("Fibonachi hesaplanıyor....");
fibonachisayisi=fibonachi(sayi);
showStatus("Fibonachi hesaplandi....");
sonuc.setText(Long.toString(fibonachisayisi));
}
public long fibonachi(long sayi)
{
if(sayi <=0) return 0;
else if(sayi ==1) return 1;
else return fibonachi(sayi - 1)+fibonachi(sayi - 2);
}
}