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