2.3 NESNE (OBJECT) TANIMI VE METOTLARDA KULLANIMI
2.4 METOTLARIN KENDİ KENDİNİ ÇAĞIRMASI (RECURSION)
2.5 AYNI ADLI METOTLARIN BİR ARADA KULLANILMASI (OVERLOADİNG)
2.6 METOT (METHOD) VE SINIF(CLASS) DEĞİŞKENLERİ
2.7 ALISTIRMALAR
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 mevcutur.
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 programlama ortamı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 : database programı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 |
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 |
floor(x) |
x değişkenini bir alt tamsayıya dönüştürür. (türkçesi : taban) |
Math.floor(9.2)
= 9 |
cos(x) |
x in
trigonometrik cosünisü |
Math.cos(1.0)=0.54030230568 |
sin(x) |
x in
trigonometrik sinüsü |
Math.sin(1.0)=0.8414709840709 |
tan(x) |
x in
trigonometrik tanjantı |
Math.tan(1.0)=1.557040724655 |
acos(x) |
x in
trigonometrik cosünisünün tersi |
Math.acos(0.54030230568)=1.0 |
asin(x) |
x in
trigonometrik sinüsü |
Math.asin(0.8414709840709)=1.0 |
atan(x)
atan2(x,y) |
x in
trigonometrik tanjantı |
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(y) acos(y) atan(y)
// asin,acos,atan : radyan
s += "Math.asin("+y+") = "+Math.acos(y)+"\n";
s += "Math.acos("+y+") = "+Math.asin(y)+"\n";
s += "Math.atan("+y+") = "+Math.atan(y)+"\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ı
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.
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);
}
}
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.showInputDialog("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 javax.swing.JOptionPane;
class faktoriyel2SW
{
public static long faktoriyel(int x)
{
if( x <= 1 )
return 1;
else
return x * faktoriyel( x - 1);
}
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, "kendi kendini çağıran (recursive) Metod örneği faktoriyel2SW.java ",
JoptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
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.
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
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.Graphics;
import java.applet.Applet;
public class
metotvesinifdeg 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
{
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);
}
}
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.
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);
}
}
02011.JPG
Şekil 2.11Fibonachi testi 2 çıktısı (swing applet)
10. Bir kürenin hacmini hesaplayacak bir applet programı yazınız. Kürenin hacmi küreHacmi isimli metot tarafından hesaplansın. Applet bir girdi alanına kürenin yariçapını sorsun ve yarıçap girildiğinde yeni küre hacmi ekranda gösterilsin.
Not : Kürenin hacmi : (4.0/3.0)*Math.PI*Math.pow(r,3);
Problem 2.33 : Bir kürenin hacmini hesaplayan H5A1.java programı
import java.applet.Applet;
// java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import java.awt.event.*; // java pencereyi dinleme sinifini cagir
public class
H5A1 extends Applet implements ActionListener
{
// bu sinif kurenin hacmini hesaplar
//=====================================================
// sinif degiskenleri
// bu degiskenler tum s�n�fa aittir
Label kutubasligi; //Label sinifi degiskeni (nesnesi) kutubasligi
TextField kutugirdisi;// Textfield sinifi degiskeni (nesnesi) kutugirdisi
double yaricap; // Gercek degisken yar�cap
double hacim; // Gercek degisken hacim
//=====================================================
// pencereyi baslatma metotu
// pencere ilk basladiginda
// degiskenler buradaki degerleri alirlar
public void init()
{
kutubasligi=new Label("Kurenin yaricapini (m)giriniz : ");
add(kutubasligi);
kutugirdisi=new TextField(10);
add(kutugirdisi);
yaricap=0;
hacim=0;
kutugirdisi.addActionListener(this);
}
//=====================================================
// girdi alanindaki olan olaylari dinleme metotu
// Her yeni rakam girildiginde bu metot cagirilir
public void actionPerformed(ActionEvent e)
{
Double sayi1=new Double(e.getActionCommand() );
yaricap=sayi1.doubleValue();
hacim=kureninhacmi(yaricap);
kutugirdisi.setText(" ");//kutudaki rakami sil
repaint();//pencereyi yeniden paint metotuna gore ciz
}
//=====================================================
// paint (boya=pencereye ciz metotu)
public void paint(Graphics g)
{
g.drawString(yaricap+" m capindaki kurenin hacmi : "+hacim+" m^3",25,50);
}
//=====================================================
//kurenin hacmini hesaplama metotu
public double kureninhacmi(double r)
{
return (4.0/3.0)*Math.PI*r*r*r;
}
}
02012.JPG
Şekil 2.12 Kürenin hacmini hesaplayan H5A1.html applet çıktısı
11. Bir dik üçgenin hipotenüsünü hesaplayan bir applet programı yazınız. Program dik üçgenin iki dik kenarını applet de girsin ve hipotenus metotuyla hesaplasın ve sonucu applete yazdırsın.
Not : Dik üçgenin
hipotenüsü :
Hipotenüs = Math.sqrt(dikkkenar1*dikkenar1+dikkenar2*dikkenar2);
Problem 2.34 : Bir dik üçgenin hipotenüsünü hesaplayan H5A2.java programı
import java.applet.Applet;
// java applet sinifini cagir
import java.awt.*; // java pencere kullanma sinifini cagir
import java.awt.event.*; // java pencereyi dinleme sinifini cagir
public class H5A2 extends Applet implements ActionListener
{
// bu sınıf dik ucgenin hipotenusunu hesaplar
//=====================================================
// sinif degiskenleri
// bu degiskenler tum sınıfa aittir
Label kutubasligi1; //Label sinifi degiskeni (nesnesi) kutubasligi1
TextField kutugirdisi1; // Textfield sinifi degiskeni (nesnesi) kutugirdisi1
Label kutubasligi2; //Label sinifi degiskeni (nesnesi) kutubasligi2
TextField kutugirdisi2; // Textfield sinifi degiskeni (nesnesi) kutugirdisi2
double dikkenar1; // Gercek degisken dikkenar1
double dikkenar2; // Gercek degisken dikkenar1
//=====================================================
// pencereyi baslatma metotu
// pencere ilk basladiginda
// degiskenler buradaki degerleri alirlar
public void init()
{
kutubasligi1=new Label("Birinci dik kenari giriniz : ");
add(kutubasligi1);
kutugirdisi1=new TextField(10);
add(kutugirdisi1);
kutubasligi2=new Label("Ikinci dik kenari giriniz : ");
add(kutubasligi2);
kutugirdisi2=new TextField(10);
add(kutugirdisi2);
dikkenar1=0;
dikkenar2=0;
kutugirdisi2.addActionListener(this);
}
//=====================================================
// girdi alanindaki olan olaylari dinleme metotu
// Her yeni rakam girildiginde bu metot cagirilir
public void actionPerformed(ActionEvent e)
{
Double sayi1=new Double(kutugirdisi1.getText() );
dikkenar1=sayi1.doubleValue();
Double sayi2=new Double(kutugirdisi2.getText() );
dikkenar2=sayi2.doubleValue();
//kutugirdisi.setText(" ");//kutudaki rakami sil
repaint();//pencereyi yeniden paint metotuna gore ciz
}
//=====================================================
// paint (boya=pencereye ciz metotu)
public void paint(Graphics g)
{
g.drawString(" hipotenus = "+hipotenus(dikkenar1,dikkenar2),25,80);
}
//=====================================================
//ucgenin hipotenusunu hesaplama metotu
public double hipotenus(double dk1,double dk2)
{
return Math.sqrt(dk1*dk1+dk2*dk2);
}
}
02013.JPG
Şekil 2.13 Bir dik üçkenin hipotenüsünü hesaplayan H5A2.html applet çıktısı
12. H3OD5_2000
iki kenar ve aralarındaki açı (derece cinsinden ) verildiğinde üçgenin üçüncü kenarını hesaplayacak
public static double ucgenkarsıkenar(double birinciyan, double ikinciyan,
double aciderece)
metodunu yazınız.
not:karsikenar=Math.sqrt(birinciyan*birinciyan+ikinciyan*ikinciyan-2*birinciyan*ikinciyan*Mathd.cosd(aradakiaçı derece));
bu metodu H3OD5_2000 sınıfı JoptionPane konsol programı main metodunda kullanınız (iki yan kenar ve aradaki açı derece cinsinden verilecek, üçüncü kenar hesaplanarak yazılacak)
Problem 2.35 H3OD5_2000.java programı diküçgenin hipotenüsünü hesaplar
import javax.swing.JOptionPane; // giriş çıkışı
import Mathd;
public class H3OD5_2000
{
// ucgenin kenarinin bulunmasi metodu
public static double kkenar(double a,double b,double t)
{
double kenar;
kenar=Math.sqrt(a*a+b*b-2*a*b*Mathd.cosd(t));
return kenar;
}
public static void main(String[] args)
{
Text cin=new Text();
double sayi1;
double sayi2;
double sayi3;
sayi1=Double.parseDouble(JOptionPane.showInputDialog
("birinci kenarı giriniz : "));
sayi2=Double.parseDouble(JOptionPane.showInputDialog
("ikinci kenarı giriniz : "));
sayi3=Double.parseDouble(JOptionPane.showInputDialog
(" iki kenar arasındaki açıyı derece cinsinden giriniz : "));
JoptionPane.showMessageDialog(null,
"üçgenin üçüncü kenarı : "+kkenar(sayi1,sayi2,sayi3),
"üçgen kenar hesabı",
JoptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02014.JPG
Şekil 2.14 Bir dik üçkenin hipotenüsünü hesaplayan H3OD5_2000.java programının JoptionPane çıktısında görülmesi
13. H3AL2 sınıfında static double exp(double x) metodunu yaz ve aynı sınıf içinde çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem 2.36 : H3AL2.java
exp metotunun çağrılması
import java.io.*;
public class H3AL2
{
// sayinin exponenti static metodu
public static 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;
}
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
System.out.println("Bir sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin exponenti : "+exp(sayi));
}
}
Bir sayi giriniz : girilen sayinin exponenti : 2.7182818284590455
14. H3AL2_2000 sınıfında static double exp(double x) metodunu yaz ve aynı sınıf içinde çağırarak ekrandan JoptionPane kullanılarak girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem 2.37 : H3AL2_2000.java exp metotunun çağrılması
import javax.swing.JOptionPane; // giriş çıkı
public class H3AL2_2000
{
// sayinin exponenti static metodu
public static 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;
}
public static void main(String[] args)
{
double sayi;
sayi=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
JoptionPane.showMessageDialog(null,"exp("+sayi+") = "+exp(sayi),
"sayının exponenti statik metodu",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02015.JPG
Şekil 2.15 Sayının exponentini statik metodla hesaplayan H3AL2_2000.java programını JoptionPane kullanan çıktısı
Problem
2.38 :
H3AL3.java exp metotunun çağrılması
import java.io.*;
import H3AL2;
public class H3AL3
{
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
System.out.println("Bir sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin exponenti : "+H3AL2.exp(sayi));
}
}
16. H3AL2_2000 sınıfındaki static double exp(double x) metodunu H3AL3_2000 sınıfında çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem
2.39 :
H3AL3.java exp metotunun çağrılması
import javax.swing.JOptionPane; // giriş çıkı
import H3AL2_2000;
public class H3AL3_2000
{
public static void main(String[] args)
{
double sayi;
sayi=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
JoptionPane.showMessageDialog(null,"exp("+sayi+") = "+H3AL2_2000.exp(sayi),
"H3AL2_2000.exp() statik metodu",JoptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02016.JPG
Şekil 2.16 Sayının exponentini statik metodla hesaplayan H3AL3_2000.java programını JoptionPane kullanan çıktısı
17. H3AL4 sınıfında yazılan double exp(double x) metodunu aynı sınıfda çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem 2.40 : H3AL4.java exp metotunun çağrılması
import java.io.*;
public class H3AL4
{
// sayinin exponenti dinamik 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;
}
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
H3AL4 y=new H3AL4();
System.out.println("Bir sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin exponenti : "+y.exp(sayi));
}
}
18. H3AL4_2000 sınıfında yazılan double exp(double x) metodunu aynı sınıfda çağırarak ekrandan girilen bir x değeri için sonucu JOPtionPage kullanarak konsol ortamında hesaplattır.
Problem 2.41 : H3AL4_2000.java exp metotunun çağrılması
import javax.swing.JOptionPane; // giriş çıkı
public class H3AL4_2000
{
// sayinin exponenti dinamik 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;
}
public static void main(String[] args)
{
double sayi;
sayi=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
H3AL4 y=new H3AL4();
JoptionPane.showMessageDialog(null,"exp("+sayi+") = "+y.exp(sayi),
"H3AL4_2000, exp() dinamik metodu",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
02017.JPG
Şekil 2.17 Sayının exponentini dinamik metodla hesaplayan H3AL3_2000.java programını JoptionPane kullanan çıktısı
19. H3AL5a sınıfında yazılan double exp(double x) metodunu H3AL5 sınıfında çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem
2.42 :
H3AL5.java
, exp metotunun çağrılması
import java.io.*;
class H3AL5a
{
// sayinin exponenti dinamik 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;
}
}
public class H3AL5
{
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
H3AL5a y=new H3AL5a();
System.out.println("Bir sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin exponenti : "+y.exp(sayi));
}
}
20. H3AL5a sınıfında yazılan double exp(double x) metodunu H3AL5_2000 sınıfında çağırarak ekrandan girilen bir x değeri için sonucu swing JOPtionPane kullanarak konsol ortamında hesaplattır.
Problem
2.43 :
H3AL5.java, exp metotunun çağrılması
import javax.swing.JOptionPane; // giriş çıkı
class H3AL5a
{
// sayinin exponenti dinamik 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;
}
}
public class H3AL5_2000
{
public static void main(String[] args)
{
double sayi;
sayi=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
H3AL5a y=new H3AL5a();
JOptionPane.showMessageDialog(null,"exp("+sayi+") = "+y.exp(sayi),
"H3AL5a, exp() dinamik metodu",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
21. H3AL5a sınıfında yazılan double exp(double x) metodunu H3AL6 sınıfında ve H3AL6.java dosyasından çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem 2.44 :
H3AL6.java
, exp metotunun çağrılması
import java.io.*;
import H3AL5a;
public class H3AL6
{
public static void main(String[] args) throws IOException
{
double sayi;
Text cin=new Text();
H3AL5a y=new H3AL5a();
System.out.println("Bir sayi giriniz : ");
sayi=cin.readDouble();
System.out.println("girilen sayinin exponenti : "+y.exp(sayi));
}
}
22. H3AL5a sınıfında yazılan double exp(double x) metodunu H3AL6_2000 sınıfında ve H3AL6_2000.java dosyasından çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.
Problem
2.45 : H3AL6_2000
, exp metotunun çağrılması
import javax.swing.JOptionPane; // giriş çıkı
import H3AL5a;
public class H3AL6_2000
{
public static void main(String[] args)
{
double sayi;
sayi=Double.parseDouble(JOptionPane.showInputDialog
("Bir gerçek sayı giriniz : "));
H3AL5a y=new H3AL5a();
JOptionPane.showMessageDialog(null,"exp("+sayi+") = "+y.exp(sayi),
"H3AL5a, exp() dinamik metodu",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
23 . H3OD1
Math kütüphanesinde aşağıdaki metotlar tanımlanmıştır.
public static native double sin(double a)
a radyan cinsinden
public static native double cos(double a)
a radyan cinsinden
public static native double tan(double a)
a radyan cinsinden
public static native double asin(double a)
sonuç değeri : -pi/2 den pi/2 ye kadar.
public static native double acos(double a)
sonuç değeri 0 dan pi’ ye kadar
public static native double atan(double a)
sonuç değeri : -pi/2 den pi/2 ye kadar.
public static native double atan2(double a,
double b)
sonuç değeri : -pi den pi ye kadar
bu metotların
hepsi radyan cinsinden tanımlıdır. Bu metotların derece eşitlerini tanımlamak
istiyoruz. Mathd
sınıfı yaratarak, bu sınıfta
public static double sind(double a)
a derece cinsinden
public static double cosd(double a)
a derece cinsinden
public static double tand(double a)
a derece cinsinden
public static double asind(double a)
sonuç değeri : -90 dan 90 dereceye kadar.
public static double acosd(double a)
sonuç değeri 0 dan 180 dereceye kadar
public static double atand(double a)
sonuç değeri : -90 dan 90 a kadar.
public static double atan2d(double a,
double b)
sonuç değeri : -180 den 180 dereceye kadar
statik metotlarını oluşturunuz. H3OD1.java applet programını yazınız. Bu programa derece cinsinden bir girdi giriniz ve hesaplanmış sin,cos,tan değerlerini apletde yazdırınız.
not :
derece=radyan/Math.PI*180;
Problem 2.46 : Mathd.java
class Mathd
{
public static double sind(double a)
{
double pi=Math.PI;
double r=(a/180.0)*pi;
double sind=Math.sin(r);
return sind;
}
public static double cosd(double a)
{
double pi=Math.PI;
double r=(a/180.0)*pi;
double cosd=Math.cos(r);
return cosd;
}
public static double tand(double a)
{
double pi=Math.PI;
double r=(a/180.0)*pi;
double tand=Math.tan(r);
return tand;
}
public static double asind(double b)
{
double asind=Math.asin(b)*180.0/Math.PI;
return asind;
}
public static double acosd(double b)
{
double acosd=Math.acos(b)*180/(Math.PI);
return acosd;
}
public static double atand(double b)
{
double atand=Math.atan(b)*180/(Math.PI);
return atand;
}
public static double atan2d(double a,double b)
{
double atand=Math.atan2(a,b)*180.0/(Math.PI);
return atand;
}
}
Problem 2.47 : H3OD1.java
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import Mathd;
public class H3OD1 extends Applet implements ActionListener
{
double a;
double b;
Label s1;
TextField t1;
Label s2;
TextField t2;
public void init()
{
s1=new Label("Derece cinsinden aciyi giriniz : ");
t1=new TextField(15);
s2=new Label("0 ile 1 arasinda arc giriniz : ");
t2=new TextField(15);
add(s1);
add(t1);
add(s2);
add(t2);
t1.addActionListener(this);
t2.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
Double sayi1=new Double(t1.getText() );
a=sayi1.doubleValue();
Double sayi2=new Double(t2.getText() );
b=sayi2.doubleValue();
t1.setText("");
t2.setText("");
repaint();
}
// trigonometrik fonksiyonların derece cinsinden yazılmış hali
public void paint(Graphics g)
{
g.drawString("sin("+a+") : " + Mathd.sind(a),35,70);
g.drawString("cos("+a+") : " + Mathd.cosd(a),35,90);
g.drawString("tan("+a+") : " + Mathd.tand(a),35,110);
g.drawString("asin("+b+"): " + Mathd.asind(b),35,130);
g.drawString("acos("+b+"): " + Mathd.acosd(b),35,150);
g.drawString("atan("+b+"): " + Mathd.atand(b),35,170);
}
}
02018.JPG
Şekil 2.18 Bir derece cinsinden trigonometrik fonksiyonları hesaplayan
H3OD1.html çıktısı
24.
H3OD2
Bir konsol programı
oluşturunuz. Bu programa 0-1 arasında bir girdi giriniz. Mathd sınıfından
atand,acosd ve asind statik metotlarını kullanarak bu metotların sonuçlarını
konsol ortamında çıktıya yazdırınız.
Problem 2.48 : H3OD2.java,
import java.io.*;
import Text;
import Mathd;
public class H3OD2
{
// trigonometrik fonksiyonların derece cinsinden yazılmış hali
public static void main(String args[]) throws IOException
{
double a;
Text cin=new Text();
System.out.println("0-1 arasinda bir sayi giriniz : ");
a=cin.readDouble();
System.out.println("asin("+a+"): " + Mathd.asind(a)+" derece");
System.out.println("acos("+a+"): " + Mathd.acosd(a)+" derece");
System.out.println("atan("+a+"): " + Mathd.atand(a)+" derece");
}
}
25.
H3OD3
kendi kendini
çağıran (recursive), tabanın kuvvetinci kuvvetini hesaplayacak ( taban^kuvvet,
2^3=8 gibi)
public static pow(double taban, double kuvvet)
metotunu H3OD3 sınıfında, konsol programı olarak yazınız. main metotunda
dışarıdan bir sayı okuyarak bu metot yardımıyla sonucu hesaplayınız.
not: H3OD3.pow(taban,1) çağırımı taban değerini geri verecektir.
Problem 2.49 : H3OD3.java ,
import java.io.*;
public class H3OD3
{
// sayinin exponenti dinamik metodu
public double kuvvet(double x,double y)
{
// y nin pozitif olduğu kabul edilmistir.
if(y<0) return 0;
if(y ==0) return 1;
else return x*kuvvet(x,y-1);
}
public static void main(String[] args) throws IOException
{
Text cin=new Text();
double sayi1;
double sayi2;
H3OD2 x=new H3OD2();
System.out.println(" sayiyi giriniz : ");
sayi1=cin.readDouble();
System.out.println(" kuvveti giriniz : ");
sayi2=cin.readDouble();
System.out.println(""+sayi1+" nin "+sayi2+" inci kuvveti : "+x.kuvvet(sayi1,sayi2));
}
}
26.
H3OD4
döngü yapısıyla
hesap yapan, tabanın kuvvetinci kuvvetini hesaplayacak ( taban^kuvvet,
2^3=8 gibi)
public pow(double taban, double kuvvet)
H3OD4a sınıfında yazınız. H3OD4 sınıfında bir applet programı oluşturarak
H3OD4a sınfındaki pow metotu yardımıyla verilen bir sayının verilen bir
kuvvetini hesaplayınız. ve appletde çıktı olarak yazdırınız.
Problem 2.50 : H3OD4.java,
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
class H3OD4a
{
public static double kuvvet(double a,double b)
{
double k=1.0;
if(b<0)
{
for(int i=0;i<(int)(-b);i++)
{k*=a;}
k=1.0/k;
}
else if(b==0)
{
k=1.0;
}
else if(b>0)
{
for(int i=1;i<=(int)b;i++)
{k*=a;}
}
return k;
}
}
public class H3OD4 extends Applet implements ActionListener
{
double a;
double b;
Label s1;
TextField t1;
Label s2;
TextField t2;
public void init()
{
s1=new Label("tabani giriniz : ");
t1=new TextField(10);
s2=new Label("kuvveti giriniz : ");
t2=new TextField(10);
add(s1);
add(t1);
add(s2);
add(t2);
t1.addActionListener(this);
t2.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
Double sayi1=new Double(t1.getText() );
a=sayi1.doubleValue();
Double sayi2=new Double(t2.getText() );
b=sayi2.doubleValue();
t1.setText("");
t2.setText("");
repaint();
}
// trigonometrik fonksiyonların derece cinsinden yazılmış hali
public void paint(Graphics g)
{
g.drawString("taban "+a+" nin "+b+" inci kuvveti : "+ H3OD4a.kuvvet(a,b),35,70);
}
}
27.
H3OD4_2000
döngü yapısıyla hesap yapan, tabanın kuvvetinci kuvvetini hesaplayacak
( taban^kuvvet, 2^3=8 gibi)
public pow(double taban, double kuvvet)
H3OD4a sınıfında yazınız. H3OD4_2000 sınıfında bir siwng JApplet
programı oluşturarak H3OD4a sınfındaki pow metotu yardımıyla verilen
bir sayının verilen bir kuvvetini hesaplayınız. ve appletde çıktı olarak
yazdırınız.
Problem 2.51 : H3OD4.java,
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class H3OD4a
{
public static double kuvvet(double a,double b)
{
double k=1.0;
if(b<0)
{
for(int i=0;i<(int)(-b);i++)
{k*=a;}
k=1.0/k;
}
else if(b==0)
{
k=1.0;
}
else if(b>0)
{
for(int i=1;i<=(int)b;i++)
{k*=a;}
}
return k;
}
}
public class H3OD4_2000 extends JApplet implements ActionListener
{
double a;
double b;
JLabel s1;
JTextField t1;
JLabel s2;
JTextField t2;
JTextArea cikti;
public void init()
{
cikti=new JTextArea();
Container c=getContentPane();
c.setLayout(new FlowLayout());
s1=new JLabel("tabani giriniz : ");
t1=new JTextField(10);
s2=new JLabel("kuvveti giriniz : ");
t2=new JTextField(10);
cikti=new JTextArea("ilk deðer");
c.add(s1);
c.add(t1);
c.add(s2);
c.add(t2);
c.add(cikti);
t1.addActionListener(this);
t2.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
a=Double.parseDouble(t1.getText() );
b=Double.parseDouble(t2.getText() );
t1.setText("");
t2.setText("");
cikti.setText("taban "+a+" nin "+b+" inci kuvveti : "+ H3OD4a.kuvvet(a,b));
repaint();
}
}
02019.JPG
Şekil 2.19 H3OD1.html çıktısı
28.
H3OD5
iki kenar ve aralarındaki açı (derece cinsinden ) verildiğinde üçgenin
üçüncü kenarını hesaplayacak
public static double ucgenkarsıkenar(double birinciyan, double ikinciyan,
double aciderece)
metotunu yazınız.
not : karsikenar=Math.sqrt(birinciyan*birinciyan+ikinciyan*ikinciyan-2*birinciyan*ikinciyan*Mathd.cosd(aradakiaçı
derece));
bu metotu H3OD5 sınıfı konsol programı main metotunda kullanınız
(iki yan kenar ve aradaki açı derece cinsinden verilecek, üçüncü kenar
hesaplanarak yazılacak)
Problem 2.52 : H3OD5.java,
import java.io.*;
import Mathd;
public class H3OD5
{
// ucgenin kenarinin bulunmasi metodu
public static double kkenar(double a,double b,double t)
{
double kenar;
kenar=Math.sqrt(a*a+b*b-2*a*b*Mathd.cosd(t));
return kenar;
}
public static void main(String[] args) throws IOException
{
Text cin=new Text();
double sayi1;
double sayi2;
double sayi3;
System.out.println(" birinci kenari giriniz : ");
sayi1=cin.readDouble();
System.out.println(" ikinci kenari giriniz : ");
sayi2=cin.readDouble();
System.out.println(" iki kenar arasindaki aciyi derece cinsinden giriniz : ");
sayi3=cin.readDouble();
System.out.println("ucgenin ucuncu kenari : "+kkenar(sayi1,sayi2,sayi3));
}
}
29. Hata fonksiyonu erf(x) aşağıdaki formülle tanımlanabilir.
Bu formülü hesaplayacak
olan statik erf metodunu yazınız ve java swing çıktısı verecek bir örnekte
deneyiniz.
30. Bir konsol programı yazınız. Text sınıfı kullanarak dışarıdan x değerini, celcius, fahrenheight cinsinden girilen değerin celcius eşitini hesaplasın. Bunun için
C=5/9*(F-32)
formülünü kullanabilirsiniz.
İkinci metot, fahrenheight, derece celcius cinsinden girilen değerin fahrenheight eşdeğerini hesaplasın.
31. Bir applet programı yazınız. Bu programın içindeki kubunhacmi metodu kübün hacmini hesaplasın. Applet kullanıcıya kübün kenar uzunluğunu sorsun ve hacmini versin. okuyunuz. erf statik metodu yaratarak formülü hesaplayınız. Ana programda erf metodunu çağırınız ve sonucunu yazdırınız. Hata analizi yaparak döngüyü kaç terim için hesaplamanız gerektiğine karar veriniz.
32. Sıcaklık.java programını denemek için bir swing JApplet programı yazınız.
33. mesafe metodunu yazınız. Bu metod iki noktanın (x1,y1) ve (x2,y2) arasındaki mesafeyi hesaplasın. Bu metodu bir konsol test programında deneyin.
34. Bir tam sayı eğer kendisinden başka bir tam sayıyla bölünemiyorsa, asal sayı adını alır. Örneğin 2,3,5,7,11..
Asal sayıları bulan bir metot yazınız. Bu metotu bir applette kullanarak 1 den 1000 e kadar olan sayılar arasındaki asal sayıları belirleyiniz.
35. Üç (gerçek veya tamsayı) sayının arasından minimum olanı bulan minimum3 metodunu yazınız ve bir konsol programında test ediniz
36. Üç sayının (gerçek veya tamsayı) arasından maksimum olanı bulan maksimum3 metodunu yazınız ve bir konsol programında test ediniz
37. tekmi isimli boolean bir metot yazınız. bu metot eğer girilen sayı tekse true değeri, sayı çiftse false değeri versin. Bu metodu bir applet programında test ediniz.
38. kürenin hacmini hesaplayan hacim(double x) metodunu içeren kureApplet applet programını olusturunuz. Bu program kürenin yarıçapını sorsun, ve sonuç olarak hacim metodunda hesaplanan kürenin hacmini versin.
Problem 2.53 kürenin hacmini hesaplayan küreapplet.java programı
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class kureapplet 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("Kurenin Hacmi : ");
sonuc=new TextField(10);
sonuc.setEditable(false);
add(rakametiketi);
add(rakam);
add(sonucetiketi);
add(sonuc);
}
public void actionPerformed( ActionEvent e)
{
double sayi;
double sayisi;
Double sayi1=new Double(e.getActionCommand() );
sayi=sayi1.doubleValue();
sayisi=hacim(sayi);
showStatus("hesaplandi....");
sonuc.setText(Double.toString(sayisi));
Double sayi2=new Double(e.getActionCommand() );
sayisi=sayi2.doubleValue();
}
public static double hacim(double x)
{
return (4.0/3.0)*Math.PI*Math.pow(x,3);
}
}
<< index
< bölüm 1
> bölüm 3
bülüm başı