//===========================================
// bayağı kesir sınıfı tanımı
// Dr. Turhan Coban
//===========================================
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*; // giriş çıkış


// sınıf bayağı kesir
// bu sinif bayağı kesir sayılarının matamatik
// işlemlerini
//

public class bayagikesir {
    // sınıf degişkenleri
    protected int   pay;
    protected int   payda;

    // kurucu metodlar

public bayagikesir()
{
pay=0;
payda=1;
}

public bayagikesir(int npay,int npayda)
{
pay=npay;
payda=npayda;
}

public bayagikesir(int numer)
{
pay=numer;
payda=1;
}

public bayagikesir(bayagikesir c )
{
pay=c.Pay();
payda=c.Payda();
}

//hesap metodları

public int enbuyukortakbolen()
{
// iki tam sayinin en buyuk ortak bolenini hesaplar
int n=pay;
int m=payda;
if(n==0)
   return m;
if(m==0)
   return n;
while(m != n)
{
  if(n>m)
     n=n-m;
  else
     m=m-n;
}
return n;
}

public void sadelestir()
{
//bayağı kesiri sadeleştirir
int isaret=1;
if(pay<0)
{
 isaret=-isaret;
 pay=-pay;
}
if(payda<0)
{
 isaret=-isaret;
 payda=-payda;
}
if(payda==0)
   { JOptionPane.showMessageDialog(null,toString(),
     "Bayağı kesir sıfıra bölme hatası",
     JOptionPane.ERROR_MESSAGE);System.exit(0);
   }
int ebob=enbuyukortakbolen();
ebob=Math.abs(ebob);
pay=isaret*pay/ebob;
payda=payda/ebob;
}


// giriş - çıkış metotları

public int Pay()
{
return pay;
}

public int Payda()
{
return payda;
}

public void payGir(int r)
{
pay=r;
}

public void paydaGir(int i)
{
payda=i;
}

public void bayagikesirGir(bayagikesir sag)
{
pay=sag.Pay();
payda=sag.Payda();
}

public void bayagikesirGir(int nr,int ni)
{
pay=nr;
payda=ni;
}

public void bayagikesirGir(int nr)
{
pay=nr;
payda=1;
}

public void bayagikesirGir(double d)
{
// tam sayinin bayagikesir esitini yükle
// eh birazcık yaklaşım var tabi
bayagikesirGir((int)d*10000,10000);
sadelestir();
}

public double toDouble()
{
//bayagikesir sayinin gercek sayi esidi
return ((double)pay/(double)payda);
}

public static bayagikesir BayagikesireCevir(double d)
{
// tam sayinin bayagikesir esiti
// eh birazcık yaklaşım var tabi
bayagikesir b=new bayagikesir();
b.bayagikesirGir((int)d*10000,10000);
b.sadelestir();
return b;
}


public void topla(bayagikesir  sag)
{
//ikinci bir bayagikesirle topla
pay = pay*sag.Payda() + sag.Pay()*payda;
payda = payda*sag.Payda();
sadelestir();
}

public void topla(int sag)  
{
//bir gercek sayıyla topla
pay = pay + sag*payda;
sadelestir();
}

public void cikar(bayagikesir  sag)  
{
//ikinci bir bayagikesirle topla
pay = pay*sag.Payda() - sag.Pay()*payda;
payda = payda*sag.Payda();
sadelestir();
}

public void cikar(int sag)  
{
//bir gercek sayıyla topla
pay = pay - sag*payda;
sadelestir();
}

public void carp(bayagikesir sag )  
{
//bir bayagikesir sayiyla carp
pay = pay*sag.Pay();
payda = payda*sag.Payda();
sadelestir();
}

public void carp(int sag )  
{
//bir gercek sayiyla carp
pay = pay*sag;
sadelestir();
}

public void bol(bayagikesir sag )  
{
//bir bayagikesir sayıyla bol
pay = pay*sag.Payda();
payda = payda*sag.Pay();
sadelestir();
}

public void bol(int sag )  
{
//bir Pay sayıyla bol
payda = payda*sag;
sadelestir();
}

public static bayagikesir topla(bayagikesir sol, bayagikesir sag)  
{
 // iki bayagikesir sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1= sol.Pay() * sag.Payda() + sag.Pay() * sol.Payda();
 int i1= sol.Payda()* sag.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir topla(bayagikesir sol, int sag)  
{
 // bir bayagikesir ve bir Pay sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1=sol.Pay() + sag*sol.Payda();
 int i1=sol.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir topla(int sol, bayagikesir sag)  
{
 // bir bayagikesir ve bir Pay sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1=sag.Pay() + sol*sag.Payda();
 int i1=sag.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

//===================================
public static bayagikesir cikar(bayagikesir sol, bayagikesir sag)  
{
 // iki bayagikesir sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1= sol.Pay() * sag.Payda() - sag.Pay() * sol.Payda();
 int i1= sol.Payda()* sag.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir cikar(bayagikesir sol, int sag)  
{
 // bir bayagikesir ve bir Pay sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1=sol.Pay() - sag*sol.Payda();
 int i1=sol.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir cikar(int sol, bayagikesir sag)  
{
 // bir bayagikesir ve bir int sayının toplamını return deyimiyle bayagikesir olarak
 // aktarır
 int r1=sag.Pay() - sol*sag.Payda();
 int i1=sag.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir(r1,i1);
 sonuc.sadelestir();
 return sonuc;
}

//===================================

public static bayagikesir carp(bayagikesir sol, bayagikesir sag)  
{ // iki bayagikesir sayinin carpimini aktarır
 bayagikesir sonuc;
 sonuc=new bayagikesir(sol.Pay()*sag.Pay(),sol.Payda()*sag.Payda());
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir carp(bayagikesir sol, int sag)  
{ // bir bayagikesir ve bir double sayinin carpimini aktar
 bayagikesir sonuc;
 sonuc=new bayagikesir(sol.Pay()*sag,sol.Payda());
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir carp(int sol, bayagikesir sag)  
{ // bir bayagikesir ve bir double sayinin carpimini aktar
 bayagikesir sonuc;
 sonuc=new bayagikesir(sag.Pay()*sol,sag.Payda());
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir bol(bayagikesir sol, bayagikesir  sag)  
{ // iki bayagikesir sayinin bölümlerini aktar
 double a=sag.Pay()*sag.Pay()+sag.Payda()*sag.Payda();
 bayagikesir sonuc;
 sonuc=new bayagikesir((int)(sol.Pay()*sag.Payda()),(int)(sol.Payda()*sag.Pay()));
 sonuc.sadelestir();
 return sonuc;
}

public static bayagikesir bol(bayagikesir sol, int  sag)  
{ // bayagikesir sayıyı double sayıya bol
 bayagikesir sonuc;
 sonuc=new bayagikesir(sol.Pay(),(sol.Payda()*sag));
 sonuc.sadelestir();
 return sonuc;
}

public boolean kucuktur(bayagikesir sol,bayagikesir sag)
{
// less then comparison of two bayagikesir numbers
return (sol.toDouble() < sag.toDouble());
}

public boolean kucuktur_esittir(bayagikesir sol,bayagikesir sag)
{
// less then and esittir comparison of two bayagikesir numbers
return (sol.toDouble() <= sag.toDouble());
}

public boolean buyuktur(bayagikesir sol,bayagikesir sag)
{
// buyuktur then comparison of two bayagikesir numbers
return sol.toDouble() > sag.toDouble();
}

public boolean buyuktur_esittir(bayagikesir sol,bayagikesir  sag)
{
// buyuktur then and esittir comparison of two bayagikesir numbers
return sol.toDouble() >= sag.toDouble();
}


public boolean esittir(bayagikesir sol,bayagikesir sag)
{
// esittir comparison of two bayagikesir numbers
return sol.toDouble() == sag.toDouble();
}

public boolean esit_degildir(bayagikesir sol,bayagikesir  sag)
{
// not esittir comparison of two bayagikesir numbers
return sol.toDouble() != sag.toDouble();
}

public static String toString(bayagikesir  value)
{
String b="";
if(Math.abs(value.Payda())!=1)
  {
    b=b+"( "+value.Pay()+" / "+value.Payda()+" )";
  }
else
  {
    b=b+value.Pay()+" ";
  }
return b;
}

public String toString()
{
// yazima hazır bayagikesir formda String deşiskenini iletir.
String b="";
if(Math.abs(Payda())!=1)
  {
    b=b+"( "+pay+" / "+Payda()+" )";
  }
else
  {
    b=b+Pay()+" ";
  }
return b;
}
     public static bayagikesir bayagikesirgir(String s)
     {
	 //bumetod bayagı kesiri ekrandan okur.    
     String s1=JOptionPane.showInputDialog(s);        
     StringTokenizer token=new StringTokenizer(s1);
     int n=token.countTokens()-1;
     int m=n+1;
     double a[]=new double[m];
     int j=0;           
     while(token.hasMoreTokens())
     {
     Double ax=new Double(token.nextToken());
     a[j++]=ax.doubleValue();
     }
     bayagikesir b=new bayagikesir((int)a[0],(int)a[1]);
     return b; 
     }
     
};

//bayagikesir sınıfının sonu


