Mehmet Ethem SULAN :: Java Recursive Methods :: How to using Recursive Method in Java(Java ile Recursive Metod Kullanarak Geliştirilen Pizza Uygulaması)

Sınıf Diagramları Test.java ve Aşağıdaki Kodların Hepsi Için Tıklayın(Ana Sınıf)
Pizza.java

package Pizza;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import ethemsulan.com.Malzeme;
import ethemsulan.com.MalzemeListesi;
public abstract class Pizza
{
	protected static double karOrani=0;
//Malzeme ismi ve fiyati tutan HashMap.
	protected Map<String, Integer> gerekliMalzeme=new HashMap<String, Integer>();
	protected MalzemeListesi ml = null;
	protected int satisFiyati = 0;
	private double kalanMalzeme=0;
	MalzemeListesi enSon_kalan_malzemeler=null;
//Piza olsuturmaya yetecek kadar menu varsa true donderir.
	public boolean pizzaYap()
	{
//pizzaYap() metodu cagrildiginda istenen malzeme miktari mevcutsa o zaman toplamdan dusuruluyor ve
//menu olusturuluyor
		boolean kontrol=malzemeYetiyormu();
		Iterator it=gerekliMalzeme.keySet().iterator();
		double hesaplananOran = 0.0;
//Malzeme yetmiyorsa bir islem gerceklestirilimiyor
		if(kontrol){
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();

			Malzeme m = ml.getMalzeme(isim);
			kalanMalzeme=0;
//Ikinci sefer gene malzeme miktari yetip yetmedigi kontrol ediliyor.Bunu yazmazsakta olur
			if( m != null && m.getMiktar() >= miktar){
				m.miktarDusur(miktar);
//Miktar gr oldugundan /1000 diyecez. kg cinsindendir.
				hesaplananOran += (miktar / 1000.0) * m.getFiyat();
				this.kalanMalzeme=hesaplananOran;
			}
		}
		return true;
		}
		return false;

	}
//Istenen menude kullanilan malzeme miktari kontrol ediliyor.
//Eger uretilecek menude yeterince mealzeme varsa true donderir.Bir tane bile eksik malzeme varsa
//false donderiyor
	public boolean malzemeYetiyormu(){
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();
			Malzeme m = ml.getMalzeme(isim);
			if( m != null && m.getMiktar() < miktar ){
				return false;
			}
		}
		return true;
	}
//O anda hangi menu uretiliyorsa bir ust dugume(syotu olarak) ciktiginda
//son uretilen menuı malzemeleri geri ekleniliyor.Bu geri ekleme sanki bir ust dugume
//cikmis gibi oluyor.
	public void pizzayaGeriEkle(){
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();

			Malzeme m = ml.getMalzeme(isim);
			m.miktarEkle(miktar);
		}
	}
//Butun menuler uretildikten sonra kalan malzemeler cope gittiginden bunlar zarar olarak hesaplaniliyor.
//Burada bu malzemeler ne kadar tutugunu hesapliyor ve kar orani hesaplanacagi yerde bunu zarar olarak cikartiyoruz.
	public double kalanMalzeme(){
		kalanMalzeme=0;
		Iterator it=gerekliMalzeme.keySet().iterator();
		while (it.hasNext())
		{
			Object gecerlimalzeme = it.next();
			int miktar=gerekliMalzeme.get(gecerlimalzeme);
			String isim=gecerlimalzeme.toString();
			Malzeme m = ml.getMalzeme(isim);
			kalanMalzeme += (m.getMiktar() / 1000.0) * m.getFiyat();
		}
		return kalanMalzeme;
	}

}

Ana Sınıf
Malzeme.java

package ethemsulan.com;

public class Malzeme
{
//Mlazemeismi,miktari ve fiyati.Mesela sogan,100 gr ve 1 ytl kilosu
	private String isim;
	private int miktar=0;
	private int fiyat;
	public Malzeme(String isim, int miktar, int fiyat) {
		this.isim=isim;
		this.miktar=miktar;
		this.fiyat=fiyat;
	}

	public String getIsim()
	{
		return isim;
	}

	public int getMiktar() {
		return miktar;
	}

	public int getFiyat() {
		return fiyat;
	}
//Tek tek miktarlari dusuruyor.Mesela sogan kullanilan miktar kadar toplamdan dusuluyor.
	public void miktarDusur(int miktar)
	{
		this.miktar -=miktar;
	}
	public void miktarEkle(int miktar){
		this.miktar+=miktar;
	}
}

Ana Sınıf
MalzemeListesi.java

package ethemsulan.com;

import java.util.ArrayList;

public class MalzemeListesi {
//Başlangıç malzemeleri bu listeye ekliyoruz.
	public ArrayList<Malzeme> liste = new ArrayList<Malzeme>();
//Malzeme ekliyor
	public void addMalzeme(Malzeme m)
	{
		liste.add(m);
	}
//Gelen malzeme ismi listede varsa donderirir.
	public Malzeme getMalzeme(String isim)
	{
		for (Malzeme m : liste) {
			if( m.getIsim().equals(isim) )
				return m;
		}

		return null;
	}
//O anda kalan malzemeleri yazar.
	public void sonDurumuYazdir()
	{
		for (Malzeme m : liste) {
			System.out.println( m.getIsim() + ": " + m.getMiktar() );
		}
	}

}

Ana Sınıf
MenuUretRecursive.java

package ethemsulan.com;

import Pizza.AciliVejeteryan;
import Pizza.Mantar;
import Pizza.Pizza;
import Pizza.Sucuklu;
import Pizza.Vejeteryan;

public class MenuUretRecursive{
	public static int vejeteryanToplam=0;
	public static int sucukluToplam=0;
	public static int mantarliToplam=0;
	public static int aciliVejeteryanToplam=0;
	static double enKarliDurum=0;
	private static double toplamKarimiz=0;
//Ilk olarak vejeteryan uretiyoruz.
	static int vejeteryanSon=0;
	static int sucukSon=0;
	static int mantarSon=0;
	static int aciSon=0;
	public static double zarar=0;
	private double toplamSatis=0;
	public static double satisFiyati=0;
	public void menuUret(MalzemeListesi ml) {
		Vejeteryan v1=new Vejeteryan(ml);
//Mlazeme yetiyor mu diye kontrol ediyor.Yani kalan malzeme bir tane vejeteryan pizza uretmeye yetiyor mu?
//Eger yetmiyorsa sucukluya geciyor.Yani bir sonraki durumu kontrol ediliyor.Yetiyorsa
		if(v1.malzemeYetiyormu()){
//Pizza yapiyor
//Vejeteryan nesnesi uretildigi anda vejeteryan icin harcanan malzeme miktari toplam
//miktardan dusurulur. Eger vejeteryan uretilebiliyorsa true donderir.
			if(v1.pizzaYap()){
				vejeteryanToplam+=1;
			}
//Pizzaci elindeki malzemelerle kac tane vejeteryanli, kac tane sucuklu ve
//kac tane acili vejeteryan yaparsa en cok kar eder.Eger bu bilgi elinde varsa
//Gelen musteriye size sunnu tavsiye edebiliriz seklinde bir imkani olur.Bazi musteriler
//hangisini tavsiye edersiniz diye sorarlar.
			durumlariKontrolEt(ml, v1);
//Vejeteryan uretildise sayisi bir artiyor
//Recusrive olarak kendi kendini cagirir. Bu tur problemler, butun durumlarin test edilebilmesi
//icin recursive yazilmalilar.Vejeteryan olsuturuluncaya kadar surekli vejeteryan olusturur.Sonra
//Artik kalan malzemeyle yeni bir vejeteryan menusu olusturulamiyorsa diger menuleri test etmeye basliyor.
			menuUret(ml);
//Diyelim 2 tane vejeteryan, 3 tane sucuklu olusturdu ve kalan malzemeden hic bir menu uretilemiyorsa
//en son menude harcanan malzeme geri ekleniyor ve bir sonraki durum test ediliyor.yani 2 vejeteryan ve
//2(once 3 tu) sucukludan sonra eger eklenen malzeme acili yapmaya yetiyorsa acili olusturur.
//Yetmiyorsa bu sefer bir ust node(soyut olarak node) cikar ve o node icin harcanan malzeme geri eklenilir toplam
//malzeme miktarina.Bu sekilde tum durumalr test edilir.
			v1.pizzayaGeriEkle();
//Bir ust node cikarken yukarda 3 taneden 2 ye dusuru yani 1 azaltir sayiyi.
			if(vejeteryanToplam>0){
				vejeteryanToplam-=1;
			}
		}
//Bunlarda ayni Vejeteryan mantigiyla calisiyorlar.Mesela bir test yapabiliriz.Once vejeteryan
//ilk uretmeye baslatin sonra asagidaki sucukluyu vejeteryandan onceye koyun.Eger ikisinin sonucu ayni ise
//demek ki program tum durumlari kontrol ediyor.Yada acilivejeteryani ilk siraya alin.
		Sucuklu s1=new Sucuklu(ml);
		if(s1.malzemeYetiyormu()){
			if(s1.pizzaYap()){
				sucukluToplam+=1;
			}
			durumlariKontrolEt(ml, s1);
			menuUret(ml);
			s1.pizzayaGeriEkle();
			if(sucukluToplam>0){
				sucukluToplam-=1;
				}
		}
		Mantar m1=new Mantar(ml);
		if(m1.malzemeYetiyormu()){
			if(m1.pizzaYap()){
				mantarliToplam+=1;
			}
			durumlariKontrolEt(ml, m1);
			menuUret(ml);
			m1.pizzayaGeriEkle();
			if(mantarliToplam>0){
				mantarliToplam-=1;
			}
		}
		AciliVejeteryan ac1=new AciliVejeteryan(ml);
		if(ac1.malzemeYetiyormu()){
			if(ac1.pizzaYap()){
				aciliVejeteryanToplam+=1;
			}
			durumlariKontrolEt(ml, ac1);
			menuUret(ml);
			ac1.pizzayaGeriEkle();
			if(aciliVejeteryanToplam>0){
				aciliVejeteryanToplam-=1;
			}
		}
	}
	private void durumlariKontrolEt(MalzemeListesi ml, Pizza p) {
//MenuyeOzguFiyat*menuMalzemeIsmi ile toplam satisi hesapliyor
		toplamSatis=vejeteryanToplam*50+sucukluToplam*100+
		        mantarliToplam*90+aciliVejeteryanToplam*75;
//Toplam satis parasindan kalan malzemeleri cikartiyor.Cunku kalan malzemeden yeni menu
//olusturulmadigina gore cope gidiyor artan miktarlar.Yani zarar olarak hesapliyor.
		toplamKarimiz=toplamSatis-p.kalanMalzeme();
//Baslangicta enkarli duruma sifir veriyor.Sonraki bulunnan kar bu degerden buyukse
//yani daha karli ise o durumun degerlerini aliyoruz.Yani simdiye kadarki en karli durumu bulmus oluyoruz.
//Bu sekilde program bittikten sonra tum durumlarin en karlisi bulunur.Gostermek icin de ekrana yaziyorum.
		if(enKarliDurum<toplamKarimiz){
			enKarliDurum=toplamKarimiz;
			vejeteryanSon=vejeteryanToplam;
			sucukSon=sucukluToplam;
			mantarSon=mantarliToplam;
			aciSon=aciliVejeteryanToplam;
			zarar=p.kalanMalzeme();
			satisFiyati=toplamSatis;
//Bulunan en karli durumu yazdiriyorum.Arama sonunda elimizde en karli durum olur.Ilk durum sifir atadim
//sonraki durumlarla karsilastir daha karli ise o ana kadar ki en karli durumu bulmus oluyoruz.
			ml.sonDurumuYazdir();
			System.out.println("Toplam satis--> "+satisFiyati+"nZarar: "+zarar);
System.out.println("V:"+vejeteryanSon+"tS:"+sucukSon+"tM:"+mantarSon+"tAc:"+aciSon+
		"tAdetle yapilan kar->"+enKarliDurum+"n");
		}
//Karli olma ihtimali dusuk degerleri yazdirmiyorum.Cunku yazma islemi icin baya zaman gidiyor
	}
}

Ana Sınıf
Vejeteryan.java

package Pizza;
import ethemsulan.com.MalzemeListesi;
public class Vejeteryan extends Pizza
{
	public Vejeteryan(MalzemeListesi ml)
	{
		this.ml = ml;
//Vejeteryanli icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 350);
		gerekliMalzeme.put("Mantar", 275);
		gerekliMalzeme.put("Biber", 200);
		gerekliMalzeme.put("Aci", 50);

		satisFiyati = 50;
	}
}

Ana Sınıf
Sucuklu.java

package Pizza;
import ethemsulan.com.MalzemeListesi;

public class Sucuklu extends Pizza
{
	public Sucuklu(MalzemeListesi ml)
	{
		this.ml = ml;
//Sucuklu icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 150);
		gerekliMalzeme.put("Biber", 200);
		gerekliMalzeme.put("Aci", 50);
		gerekliMalzeme.put("Sucuk", 250);

		satisFiyati = 100;
	}
}

Ana Sınıf
Mantar.java

package Pizza;
import ethemsulan.com.MalzemeListesi;

public class Mantar extends Pizza
{
	public Mantar(MalzemeListesi ml)
	{
		this.ml = ml;
//Mantarli icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 100);
		gerekliMalzeme.put("Mantar", 300);
		gerekliMalzeme.put("Biber", 300);
		gerekliMalzeme.put("Peynir", 250);

		satisFiyati = 90;
	}
}

Ana Sınıf
AciliVejeteryan.java

package Pizza;
import ethemsulan.com.MalzemeListesi;
public class AciliVejeteryan extends Pizza
{
	public AciliVejeteryan(MalzemeListesi ml)
	{
		this.ml = ml;
//Acili vejeteryan  icin kullanilan malzeme miktarlari
		gerekliMalzeme.put("Sogan", 300);
		gerekliMalzeme.put("Peynir", 250);
		gerekliMalzeme.put("Mantar", 150);
		gerekliMalzeme.put("Biber", 250);
		gerekliMalzeme.put("Aci", 300);
//Bir menu fiyati
		satisFiyati = 75;
	}
}

Ana Sınıf

Write a Comment

Let me know what you think?