BÖLÜM 2 : METODLAR VE OBJECT KULLANIMI

 


  << index       < bölüm 1       > bölüm 3                



2.1 JAVA API KÜTÜPHANESİ 79

2.2 METOTLAR .. 82

2.3 NESNE (OBJECT) TANIMI VE METOTLARDA KULLANIMI 84

2.4 METOTLARIN KENDİ KENDİNİ ÇAĞIRMASI (RECURSION) 86

2.5 AYNI ADLI METOTLARIN BİR ARADA KULLANILMASI (OVERLOADİNG) 89

2.6 METOT (METHOD) VE SINIF(CLASS)  DEĞİŞKENLERİ 91

2.7 ALISTIRMALAR


 

     BÖLÜM 2 : METODLAR VE OBJECT KULLANIMI

 

   

2.1 JAVA API KÜTÜPHANESİ

 

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
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(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ı

 

   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.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.

 

      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.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.

 

      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);

   }

}

 

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ı

 

  1.  H3AL2 sınıfındaki static double exp(double x)  metodunu  H3AL3 sınıfında çağırarak ekrandan girilen bir x değeri için sonucu konsol ortamında hesaplattır.

 

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şı          



1