Veri Yapıları: Proje 3

Çökmez Bilişim Sistemleri Restoran Zinciri

Üçüncü veri yapıları projemizde bizden bir restoran bilgi sistemi yazmamız bekliyordu. Bu bilgi sisteminin verileri tutma biçimini tasarlarken bizden bellekte az yer kaplayacak şekilde optimize edilmesi (en iyileştirilmesi) değil, en çabuk ulaşılabilecek şekilde optimize edilmesi istenmişti.

Bu ödev aynı zamanda JAVA’da dosyalama işlemleri için de iyi bir örnek oluşturuyor. Oluşturduğumuz nesnelerin binary olarak ve doğrudan nesne olarak diske yazılıp diskten okunması ödev kapsamında istenmese bile, bizim teslim ettiğimiz ödevde yer alıyor.

Bu ödevde ikili arama ağacı (binary search tree) uygulaması, Hashtable kullanımına örnekler, JAVA’da vektör kullanımı, basit arayüz tasarımı ve ObjectInputStream ObjectOutputStream nesneleri ile veri kaydedip okuma örneklerine erişebilirsiniz.

Bu JAVA projesi Windows Vista üzerinde Eclipse Ganymede kullanılarak geliştirilmiştir. Proje JAVA 5 ile çalışır. (JDK 1.6)

Metotların işleyişi, programın kullanımı ve benzer konularda daha ayrıntılı bilgiyi projenin raporunda bulabilirsiniz.

Kaynak kodlarını örnek almak, fikir edinmek ve bilgi sahibi olma amaçlı kullanabilirsiniz. Eğer projenin kodlarını indirmeden incelemek isterseniz, yazının devamında kodları bulabilirsiniz. Sınıfların ne işe yaradığı gibi teknik bilgiler proje raporunda bulunmaktadır.

Restoran

Console.java

 import java.awt.*; import javax.swing.*; import javax.swing.JOptionPane;

public class Console extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private TextArea out = null; /** * This is the default constructor */ public Console() { super(); initialize(); }

/** * This method initializes this * * @return void */ private void initialize() { this.setSize(940, 600); this.setContentPane(getJContentPane()); this.setTitle("Çökmez Bilişim Sistemleri"); }

/** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); jContentPane.add(getOut(), BorderLayout.CENTER); } return jContentPane; }

/** * This method initializes out * * @return java.awt.TextArea */ private TextArea getOut() { if (out == null) { out = new TextArea(); out.setBackground(Color.black); out.setEditable(false); out.setFont(new Font("Consolas", Font.PLAIN, 14)); out.setForeground(Color.cyan); } return out; } public void write(String metin) { out.setText(out.getText() + (out.getText().equals("") ? "" : "\n") + metin); } public String read() { return read("Seçim:",true); } public String read(boolean acceptNull) { return read("Seçim:",acceptNull); } public String read(String msg) { return read(msg, true); } public String read(String msg, boolean acceptNull) { String sonuc = null; sonuc = JOptionPane.showInputDialog(msg); if (acceptNull != true) { while (sonuc == null) { sonuc = JOptionPane.showInputDialog(msg); } } return sonuc; } public int readInt() { return readInt("Seçim:"); } public int readInt(String msg) { String metin; metin = read(msg, false); while(!isParsableToInt(metin)) { metin = read(msg, false); } return Integer.parseInt(metin); } public boolean isParsableToInt(String i) { try { Integer.parseInt(i); return true; } catch (NumberFormatException nfe) { return false; } } public float readFloat() { return readFloat("Seçim:"); } public float readFloat(String msg) { String metin; metin = read(msg, false); while(!isParsableToInt(metin)) { metin = read(msg, false); } return Float.parseFloat(metin); } public boolean isParsableToFloat(String i) { try { Float.parseFloat(i); return true; } catch (NumberFormatException nfe) { return false; } } public boolean readBoolean() { return readBoolean("Seçim: (E/H)"); } public boolean readBoolean(String msg) { String metin; metin = read(msg, false); while(!isParsableToBoolean(metin)) { metin = read(msg, false); } return Boolean.parseBoolean(metin); } public boolean isParsableToBoolean(String i) { try { Boolean.parseBoolean(i); return true; } catch (NumberFormatException nfe) { return false; } } public void cls() { out.setText(""); } public void beklet() { JOptionPane.showMessageDialog(null,"Devam etmek için aşağıdaki tuşa basın.","ÇBS Restoran Sistemi",JOptionPane.PLAIN_MESSAGE); this.cls(); }

} // @jve:decl-index=0:visual-constraint="10,10"

Kategori.java ```java import java.io.Serializable; import java.util.Vector;

public class Kategori implements Serializable {

private static final long serialVersionUID = 6860809380021603294L; String kategoriAdi; Vector<String> aitYemekler; public Kategori(String kategoriAdi, Vector<String> aitYemekler) { this.kategoriAdi = kategoriAdi; this.aitYemekler = aitYemekler; } @SuppressWarnings("unchecked") public Vector<String> getYemek(String kategoriAdi) { return (Vector<String>) aitYemekler.clone(); } }


*Main.java* ```java
 import java.io.*; import java.util.*;

public class Main { static Tree Restoranlar = new Tree(); static Hashtable<String, Yemek> Yemekler = new Hashtable<String, Yemek>(); static Hashtable<String, Vector<String>> Malzemeler = new Hashtable<String, Vector<String>>(); static Vector<Kategori> Kategoriler = new Vector<Kategori>(); /* Veri yapilarini dosyaya kaydeder. */ public static int save(String dosyaAdi) { /* Kaynak: http://www.javadb.com/writing-objects-to-file-with-objectoutputstream */ /* Kaynak: Doğan Hoca. (labda anlattıkları) */ ObjectOutputStream outputStream = null; try { outputStream = new ObjectOutputStream(new FileOutputStream(dosyaAdi)); outputStream.writeObject(Restoranlar); outputStream.writeObject(Yemekler); outputStream.writeObject(Malzemeler); outputStream.writeObject(Kategoriler); if (outputStream != null) { outputStream.flush(); outputStream.close(); } } catch (FileNotFoundException e) { return -1; } catch (IOException e) { return -2; } return 0; } /* Veri yapılarını dosyadan okur (tabi varsa) */ @SuppressWarnings("unchecked") public static int load(String dosyaAdi) { /* Kaynak: http://www.javadb.com/reading-objects-from-file-using-objectinputstream */ /* Kaynak: Doğan Hoca. (labda anlattıkları) */ ObjectInputStream inputStream = null; try { inputStream = new ObjectInputStream(new FileInputStream(dosyaAdi)); /* Hangi veriler olduğunu ve sırasını bildiğimden EOF kontrolüne gerek yok. */ Restoranlar = (Tree)inputStream.readObject(); Yemekler = (Hashtable<String, Yemek>)inputStream.readObject(); Malzemeler = (Hashtable<String, Vector<String>>)inputStream.readObject(); Kategoriler = (Vector<Kategori>)inputStream.readObject(); if (inputStream != null) { inputStream.close(); } } catch (FileNotFoundException e) { return -1; } catch (IOException e) { return -2; } catch (ClassNotFoundException e) { return -3; } return 0; } public static String hakkinda() { return "Çökmez Bilişim Sistemleri Restoran Ticaret Sanayi Turizm A.Ş.\n" + "Çökmez Restoran Takip Sistemi\n" + "Sürüm 1\n\n" + "Hüseyin YAŞAR 05-06-7657\n" + "Didem KAYALI 05-06-7669\n" + "Umut BENZER 05-06-7670\n" + "Özlem GÜRSES 05-07-8496\n\n"; } public static void main(String[] args) { String dosyaAdi = "restoran.cokmezbilisim"; /* Konsol İnit */ Console c = new Console(); c.setVisible(true);

/* Progrm İnit */ c.write("Program başlatılıyor...\n" + "Veriler okunurken lütfen bekleyin...\n" + dosyaAdi + " dosyası okunuyor..."); switch(load(dosyaAdi)) { case -1: c.write(dosyaAdi + " dosyası bulunamadı.\nProgram veriler olmadan başlayacak."); break; case -2: case -3: c.write("Dosya bozuk ya da zarar görmüş.\n" + "Program geçersiz bir işlem yürüttü ve kapatılacak.\n" + "İsmimize de o kadar Çökmez Bilişim Sistemleri demiştik. İronik oldu."); c.beklet(); System.exit(0); break; } /* DEBUG Restoranları Seviyeleriyle Beraber Listeleme */ System.out.println("DEBUG Restoranları Seviyeleriyle Beraber Listeleme"); for(Restoran x: Restoranlar.inOrder()) { System.out.println(x.ad + " " + Restoranlar.depthMeter(x)); } /* END DEBUG */ hakkinda(); boolean sag_serbest = false; boolean sag_serbest_child = false; boolean sag_serbest_child_child = false;

int secenek; String secenekS; while (!sag_serbest) {

/* Menu Başlangıcı */ c.write("*** İn misiniz cin mi? ***\n"); c.write("1\. İn"); c.write("2\. Cin"); c.write("3\. Patron"); c.write("4\. Yemek yiyecek yer arayan aç bir insan"); c.write("5\. Meraklı bir kedi"); c.write("6\. Yolunu kaybeden turist\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); switch(secenek) { case 1: c.write("İnmişsiniz. Tebrikler. :)"); c.beklet(); break; case 2: c.write("Cinmişsiniz. Tebrikler. :)"); c.beklet(); break; case 3: sag_serbest_child = false; c.write("Bu bölüme girebilmek için yetkili girişi yapmanız lazım."); String user = "-1"; user = c.read("Kullanıcı adı:"); boolean logged = false; if(user != null && (user.equalsIgnoreCase("daydin") || user.equalsIgnoreCase("ub") || user.equalsIgnoreCase("huss") || user.equalsIgnoreCase("kayali") || user.equalsIgnoreCase("ozlem"))) { logged = true; } if (logged) { logged = false; String pass = ""; pass = c.read("Parola:"); if (pass != null && pass.equals("ant")) { logged = true; } } if (!logged) { sag_serbest_child = true; } else { c.cls(); c.write("Merhaba " + user + "\n"); } while (!sag_serbest_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Yönetici Menüsü ***\n"); c.write("1\. Restoran İşlemleri"); c.write("2\. Yemek Kategorileri İşlemleri"); c.write("3\. Yemek İşlemleri"); c.write("4\. Yemek Malzemeleri İşlemleri"); c.write("5\. Yönetici çıkışı\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); switch(secenek) { case 1: sag_serbest_child_child = false; while (!sag_serbest_child_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Yönetici Menüsü -> Restoran İşlemleri ***\n");

c.write("1\. Restoran Ekle"); c.write(" Sisteme yeni bir restoran ekler. Restoranın çıkardığı \n" + " yemek çeşitlerini daha sonra 'Bir Restorana Yeni Yemek Çeşidi/Çeşitleri Ekle'" + " seçeneğini kullanarak ekleyebilirsiniz.\n"); c.write("2\. Bir Restorana Yeni Yemek Çeşidi/Çeşitleri Ekle"); c.write(" Sistemde var olan bir restorana yeni yemek çeşidi ekler. \n" + " Bu yemek(ler) daha önceden ÇRS'de kayıtlı olmalıdır.\n");

c.write("3\. Bir Restorandan Yemek Çeşidi Sil"); c.write(" Sistemde var olan bir restorandan bir yemek çeşidi siler.\n"); c.write("4\. Restoran Bilgilerinde Düzenleme Yap"); c.write(" Sistemde var olan bir restoranın ad, web adresi ve benzeri bilgilerinde \n" + " değişiklik yapmanızı sağlar.\n"); c.write("5\. Yemek Fiyatlarında Düzenleme Yap"); c.write(" Sistemde var olan bir restoranda çıkan yemeklerin fiyatlarında\n" + " değişiklik yapmanızı sağlar.\n"); c.write("6\. Restoran Sil"); c.write(" Sistemden restoran siler.\n"); c.write("7\. Üst menü\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); String restoranAdi, il, adres, telefon, faks, eposta, www, yemekAdi; float fiyati; switch(secenek) { case 1: /* Restoran Ekle */ restoranAdi = c.read("Restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, eklemek istemiyorsanız giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) != null) { c.write("Bu restoran zaten sistemde var."); c.beklet(); c.cls(); break; } il = c.read("Bulunduğu İl:",false); adres = c.read("Adresi:",false); telefon = c.read("Telefon:",false); faks = c.read("Faks:",false); eposta = c.read("E-Posta:",false); www = c.read("WWW:",false); YemekR ylist = new YemekR();

restoran_ekle(restoranAdi, il, adres, telefon, faks, eposta, www, ylist); c.write("Restoran sisteme eklendi."); c.beklet(); break; case 2: /* Bir Restorana Yeni Yemek Çeşidi/Çeşitleri Ekle */ restoranAdi = c.read("Restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, eklemek istemiyorsanız giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) == null) { c.write("Böyle bir restoran yok."); c.beklet(); c.cls(); break; } do { yemekAdi = c.read("Restorana eklenecek yemeğin adı:", false); if(!is_yemek_exists(yemekAdi)) { if(!yemekAdi.equals("")) { c.write(yemekAdi + " ÇRS'de kayıtlı değil. Bir restorana yemek " + "ekleyebilmek için önce sisteme kaydetmelisiniz."); } continue; } if(Restoranlar.getRestoran(restoranAdi).yemekler.hasYemek(yemekAdi)) { c.write("Bu yemek zaten restoranın menüsünde yer alıyor. İkinci defa " + "eklemeniz mümkün değil."); continue; } fiyati = 0; while(fiyati <= 0) { fiyati = c.readFloat("Yemeğin bu restorandaki fiyatı:"); } Restoranlar.getRestoran(restoranAdi).yemekler.addYemek(yemekAdi, fiyati); Yemekler.get(yemekAdi).olduguRestoranlar.add(restoranAdi); c.write(yemekAdi + " restoranın menüsüne eklendi."); } while(!yemekAdi.equals("")); c.write("Yemek ekleme tamamlandı."); c.beklet(); c.cls(); break; case 3: /* Bir Restorandan Yemek Çeşidi Sil */ restoranAdi = c.read("Restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) == null) { c.write("Böyle bir restoran yok."); c.beklet(); c.cls(); break; } yemekAdi = c.read("Restorandan silinecek yemek çeşidi:", false); if(!Restoranlar.getRestoran(restoranAdi).yemekler.hasYemek(yemekAdi)) { c.write("Bu restoran bu yemeği zaten çıkarmıyor ya da böyle bir yemek yok."); c.beklet(); c.cls(); break; } Restoranlar.getRestoran(restoranAdi).yemekler.removeYemek(yemekAdi); Yemekler.get(yemekAdi).olduguRestoranlar.remove(restoranAdi); c.write(yemekAdi + " artık bu restoranda çıkmıyor."); c.beklet(); c.cls(); break; case 4: /* Restoran Bilgilerinde Düzenleme */ String newRestoranAdi; c.write("Değişiklik yapmak istemediklerinizi boş geçebilirsiniz."); restoranAdi = c.read("Bilgileri düzenlenecek restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) == null) { c.write("Böyle bir restoran yok ki be yav :)"); c.beklet(); c.cls(); break; } newRestoranAdi = c.read("Restoranın yeni adı",false); if (newRestoranAdi.equals("")) { c.write("Tamam, giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(newRestoranAdi) != null) { c.write("Yeni restoran adı sistemde zaten var. :'("); c.beklet(); c.cls(); break; } il = c.read("Bulunduğu İl:",false); adres = c.read("Adresi:",false); telefon = c.read("Telefon:",false); faks = c.read("Faks:",false); eposta = c.read("E-Posta:",false); www = c.read("WWW:",false);

restoran_guncelle(restoranAdi, newRestoranAdi, il, adres, telefon, faks, eposta, www); c.write("İşlem tamam. Afiyet olsun."); c.beklet(); break; case 5: /* Yemek Fiyatlarında Düzenleme Yap */ restoranAdi = c.read("Yemek Fiyatları düzenlenecek restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) == null) { c.write("Böyle bir restoran yok."); c.beklet(); c.cls(); break; } yemekAdi = c.read("Fiyatı düzenlenecek yemek adı:",false); if(!Restoranlar.getRestoran(restoranAdi).yemekler.hasYemek(yemekAdi)) { c.write("Restoranda böyle bir yemek çıkmıyor ya da boş geçtiniz."); c.beklet(); c.cls(); break; }

fiyati = c.readFloat("Yemeğin bu restorandaki yeni fiyatı:"); Restoranlar.getRestoran(restoranAdi).yemekler.changeYemek(yemekAdi, fiyati);

c.write("Fiyat değişikliği tamam. Yemek hakkındaki diğer tüm \n" + " yemek değişikliklerini 'Yemek İşlemleri' kısmından yapabilirsiniz."); c.beklet(); c.cls(); break; case 6: /* Restoran Sil */ restoranAdi = c.read("Silinecek Restoran adı:",false); if (restoranAdi.equals("")) { c.write("Tamam, giderim ben."); c.beklet(); c.cls(); break; } if (Restoranlar.getRestoran(restoranAdi) == null) { c.write("Böyle bir restoran yok."); c.beklet(); c.cls(); break; } restoran_sil(restoranAdi); c.write("Restoran bizi terk etti."); c.beklet(); break; case 7: /* Çıkış */ sag_serbest_child_child = true; break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break; case 2: /* Kategori İşlemleri */ sag_serbest_child_child = false; String kategoriAdi; while (!sag_serbest_child_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Yönetici Menüsü -> Yemek Kategorileri İşlemleri ***\n");

c.write("1\. Kategori Ekle"); c.write(" Sisteme yeni kategori ekler.\n" + " (İsterseniz yemek eklerken de yapabilirsiniz.)\n");

c.write("2\. Kategori Yeniden Adlandır"); c.write(" Bir kategorinin adını değiştirmek için kullanılır.\n");

c.write("3\. Kategorinin Yemeklerini Listele"); c.write(" Bir kategoride hangi yemeklerin bulunduğunu listeler.\n"); c.write("4\. Kategoriyi ve Kategoriye Ait Yemekleri Sil"); c.write(" Adı verilen kategori ve ve bu kategoriye ait tüm yemekleri sistemden\n" + " kaldırır.\n");

c.write("5\. Üst menü\n"); c.write("Kararınızı veriniz.\n"); c.write("Bilgi: Yemeklerin kategorilerindeki değişiklik Yemek İşlemleri kısmından yapılabilir."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); switch(secenek) { case 1: /* Kategori Ekle */ kategoriAdi = c.read("Kategori adı:", false); if(!kategoriAdi.equals("")) { if(kategori_ekle(kategoriAdi)) { c.write(kategoriAdi + " eklendi."); } else { c.write(kategoriAdi + " zaten sisteme kayıtlıymış."); } c.beklet(); }

c.cls(); break; case 2: /* Kategori Yeniden Adlandır */ String yeniKategoriAdi; kategoriAdi = c.read("Yeniden adlandırılacak kategori adı:", false); if(!is_kategori_exists(kategoriAdi)) { c.write("Sistemde böyle bir kategori yok ki yeniden adlandırasınız..."); c.beklet(); break; } yeniKategoriAdi = ""; while(yeniKategoriAdi.equals("")) { yeniKategoriAdi = c.read("Yeni kategori adı:"); } if(is_kategori_exists(yeniKategoriAdi)) { c.write("Var olan bir kategoriye adlandıramazsınız!"); c.beklet(); break; } /* Adım Adım Kategori Yeniden Adlandırma * 1\. Kategoriyi yeniden adlandır. * 2\. Kategorinin tüm yemeklerini gez. * 3\. Yemeklerin kategorilerini de adlandır. */ for(Kategori i : Kategoriler) { if (i.kategoriAdi.equals(kategoriAdi)) { i.kategoriAdi = yeniKategoriAdi; for (String y : i.aitYemekler) { if(Yemekler.get(y) != null) { Yemekler.get(y).kategorisi = yeniKategoriAdi; } } } } c.write("Adlandırma tamam."); c.beklet(); c.cls(); break; case 3: /* Kategorinin Yemeklerini Listele */ kategoriAdi = c.read("Kategori adı:", false); if(!is_kategori_exists(kategoriAdi)) { c.write("Böyle bir kategori yok ki."); c.beklet(); break; }

for (Kategori i: Kategoriler) { if(i.kategoriAdi.equalsIgnoreCase(kategoriAdi)) { for (String x: i.aitYemekler) { c.write(x); } } } c.beklet(); c.cls(); break; case 4: /* Kategoriyi ve Kategoriye Ait Yemekleri Sil */ kategoriAdi = c.read("Kategori adı:", false); if(!is_kategori_exists(kategoriAdi)) { c.write("Böyle bir kategori yok ki."); c.beklet(); break; } kategori_sil(kategoriAdi); c.write("İşlem tamam."); c.beklet(); break; case 5: /* Üst Menü */ sag_serbest_child_child = true; break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break;

case 3: /* Yemek İşlemleri */ sag_serbest_child_child = false; while (!sag_serbest_child_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Yönetici Menüsü -> Yemek İşlemleri ***\n");

c.write("1\. Yemek Ekle"); c.write(" Sisteme yeni yemek ekler. Bir yemeği bir defa sisteme ekledikten sonra\n" + " restoranlar bu yemeği kendi menülerine ekleyebilir. Eğer yemeği ilave\n" + " etmek istediğiniz kategori sistemde yoksa otomatik yaratılacaktır.\n" + " Yemeği bir defa sisteme ekledikten sonra Yemeğe Malzeme Ekle seçeneği ile\n" + " yemeğin içinde neler olduğunu sisteme giriniz.\n");

c.write("2\. Yemek Bilgilerini Düzenle"); c.write(" Sistemde var olan bir yemeğin adı ve diğer bilgilerini değiştirmek için\n" + " bu kısmı kullanabilirsiniz.\n"); c.write("3\. Yemeğe Malzeme Ekle"); c.write(" Yemeğin yapımında yeni bir malzeme kullanılmaya başlandıysa buradan\n" + " yemeğe ilave edebilirsiniz. Yemeğe ilave edeceğiniz malzeme daha önce\n" + " sistemde kayıtlı olmalıdır.\n"); c.write("4\. Yemeğin İçindeki Malzemelere Bak"); c.write(" Adı verilen yemeğin içinde hangi malzemelerin kullanıldığını gösterir.\n"); c.write("5\. Yemeğin Çıktığı Restoranlara Bak"); c.write(" Adı verilen yemeğin hangi restoranlarda çıktığını gösterir.\n"); c.write("6\. Yemekten Malzeme Sil"); c.write(" Yemeğin içeriğinden bir malzeme kaldırmak için gerekli işlem buradan yapılmalıdır.\n");

c.write("7\. Yemek Sil"); c.write(" Sistemden bir yemek silinir.\n"); c.write("8\. Üst menü\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); String yemekAdi, malzemeAdi; Yemek yemek = null; switch(secenek) { case 1: /* Yemek Ekle */ String ekBilgi, kategorisi; yemekAdi = c.read("Yemek adı:", false); if(yemekAdi.equals("") || is_yemek_exists(yemekAdi)) { c.write(((yemekAdi.equals("")) ? "Boşluk geçerli bir yemek değil." : yemekAdi + " sistemde zaten var.")); c.beklet(); break; } ekBilgi = c.read("Ek bilgi: ",false); kategorisi = ""; while(kategorisi.equals("")) { kategorisi = c.read("Yemeğin kategorisi: ",false); } if(is_kategori_exists(kategorisi)) { c.write(yemekAdi + " zaten var olan " + kategorisi + " kategorisine eklenecek."); } else { kategori_ekle(kategorisi); c.write(kategorisi + " kategorisi yok. Yeni yaratıldı."); } for(Kategori i : Kategoriler) { if (i.kategoriAdi.equals(kategorisi)) { if (!i.aitYemekler.contains(yemekAdi)) { i.aitYemekler.add(yemekAdi); } } } yemek_ekle(yemekAdi, ekBilgi, new Vector<String>(), kategorisi, new Vector<String>());

c.write("Yemek sisteme eklendi. :)"); c.beklet(); break; case 2: /* Yemek Bilgilerini Düzenle */ String newYemekAdi; c.write("Değiştirmek istemediklerinizi boş geçebilirsiniz."); yemekAdi = c.read("Düzenlenecek yemek adı:", false); if(!is_yemek_exists(yemekAdi)) { c.write("Böyle bir yemek yok ama. Everybody lies. House MD."); c.beklet(); break; } newYemekAdi = c.read("Yemeğin yeni adı:", false); if(is_yemek_exists(newYemekAdi)) { c.write("Yeni yemek adı zaten sistemde var."); c.beklet(); break; } ekBilgi = c.read("Yeni ek bilgi: ",false); kategorisi = c.read("Yemeğin yeni kategorisi: ",false); if(!kategorisi.equals("")) { if(!is_kategori_exists(kategorisi)) { kategori_ekle(kategorisi); c.write(kategorisi + " kategorisi yok. Yeni yaratıldı."); } } yemek_duzenle(yemekAdi, newYemekAdi, ekBilgi, kategorisi);

c.write("Değişiklik tamam. :)"); c.beklet(); break; case 3: /* Yemeğe Malzeme Ekle */ yemekAdi = c.read("Malzemeler hangi yemeğe eklenecek?",false); if(!is_yemek_exists(yemekAdi)) { c.write("Böyle bir yemek yok!"); c.beklet(); break; } yemek = Yemekler.get(yemekAdi); malzemeAdi = c.read("Malzeme adı:", false); while(!malzemeAdi.equals("")) { if(!yemek.icindekiMalzemeler.contains(malzemeAdi)) { yemek.icindekiMalzemeler.add(malzemeAdi); c.write(yemekAdi + " artık " + malzemeAdi + " içeriyor!"); } else { c.write(yemekAdi + " zaten " + malzemeAdi + " içeriyordu!"); } if(malzeme_ekle(malzemeAdi)) { c.write("Bilgi: " + malzemeAdi + " sisteme de eklendi."); } if(!Malzemeler.get(malzemeAdi).contains(yemekAdi)) { Malzemeler.get(malzemeAdi).add(yemekAdi); } malzemeAdi = c.read("Malzeme adı:", false); } c.cls(); break; case 4: /* Yemeğin İçindeki Malzemelere Bak */ yemekAdi = c.read("Hangi yemeğin malzemelerine bakılacak?",false); if(!is_yemek_exists(yemekAdi)) { c.write("Erör: Böyle bir yemek yok!"); c.beklet(); break; } yemek = Yemekler.get(yemekAdi); for(String y :yemek.icindekiMalzemeler) { c.write(y); } c.beklet(); c.cls(); break; case 5: /* Yemeğin Restoranlarına Bak */ yemekAdi = c.read("Hangi yemeğin restoranlarına bakılacak?",false); if(!is_yemek_exists(yemekAdi)) { c.write("Erör: Böyle bir yemek yok!"); c.beklet(); break; } yemek = Yemekler.get(yemekAdi); for(String y :yemek.olduguRestoranlar) { c.write(y); } c.beklet(); c.cls(); break; case 6: /* Yemekten Malzeme Sil */ yemekAdi = c.read("Hangi yemekten malzeme çıkarılacak?",false); if(!is_yemek_exists(yemekAdi)) { c.write("Böyle bir yemek yok!"); c.beklet(); break; } yemek = Yemekler.get(yemekAdi); malzemeAdi = c.read("Malzeme adı:", false); if(!yemek.icindekiMalzemeler.contains(malzemeAdi)) { c.write(yemekAdi + " zaten bu malzemeyi içermiyordu ki. :)"); c.beklet(); break; } yemek.icindekiMalzemeler.remove(malzemeAdi); if(Malzemeler.get(malzemeAdi) != null) { if(Malzemeler.get(malzemeAdi).contains(yemekAdi)) { Malzemeler.get(malzemeAdi).remove(yemekAdi); } } c.write("İşlem tamam."); c.beklet(); c.cls(); break; case 7: /* Yemek Sil */ yemekAdi = c.read("Hangi yemek silinecek?",false); if(!is_yemek_exists(yemekAdi)) { c.write("Böyle bir yemek yok!"); c.beklet(); break; } yemek_sil(yemekAdi); c.write("Dünyada bu yemek yasaklandı."); c.beklet(); break; case 8: /* Üst menü */ sag_serbest_child_child = true; break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break; case 4: /* Yemek Malzemeleri İşlemleri */ sag_serbest_child_child = false; String malzemeAdi; while (!sag_serbest_child_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Yönetici Menüsü -> Yemek Malzemeleri İşlemleri ***\n");

c.write("1\. Malzeme Ekle"); c.write(" Sisteme yemeklerde kullanılabilecek yen bir malzeme ekler.\n" + " (Pirinç, muz, tuz, biber vs.)\n");

c.write("2\. Yemek Listesi"); c.write(" Adı verilen malzemenin hangi yemeklerde olduğunu bulur.\n"); c.write("3\. Üst menü\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); switch(secenek) { case 1: /* Malzeme Ekle */ malzemeAdi = c.read("Malzeme adı:", false); while(!malzemeAdi.equals("")) { if(malzeme_ekle(malzemeAdi)) { c.write(malzemeAdi + " eklendi."); } else { c.write(malzemeAdi + " zaten sisteme kayıtlıymış."); } malzemeAdi = c.read("Malzeme adı:", false); } c.cls(); break; case 2: /* Malzeme Listesi */ malzemeAdi = c.read("Malzeme adı:", false); if(Malzemeler.get(malzemeAdi) == null) { c.write("Sistemde böyle bir malzeme yok."); c.beklet(); break; } for(String y : Malzemeler.get(malzemeAdi)) { c.write(y); } c.write("Listeleme tamam."); c.beklet(); c.cls(); break; case 3: /* Üst Menü */

sag_serbest_child_child = true; break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break; case 5: /* Yönetici Çıkışı */ do { c.write("Yönetici alanından çıkmak istediğinizden emin misiniz? (E/H) "); secenekS = c.read("Yönetici alanından çıkmak istediğinizden emin misiniz? (E/H) "); if (secenekS.equalsIgnoreCase("E")) { sag_serbest_child = true; secenekS = "H"; } } while (!secenekS.equalsIgnoreCase("H")); c.cls(); break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break; case 4: /* Ziyaretçi kısmı alt menüsü */ sag_serbest_child = false; while (!sag_serbest_child) {

/* Menu Başlangıcı */ c.write("*** ÇRS Müşteri Menüsü ***\n"); c.write("1\. Adına göre restoran arama"); c.write("2\. Adı verilen bir yemeği çıkaran restoranları arama"); c.write("3\. Belirli fiyat aralıklarına göre yemek arama"); c.write("4\. İçindeki malzemeye göre yemek arama"); c.write("5\. Bir ildeki tüm restoranları listeleme"); c.write("6\. Üst menü\n"); c.write("Kararınızı veriniz."); /*Menü Bitimi */ secenek = c.readInt("İstediğiniz seçeneğin numarasını yazınız:"); c.cls(); Vector<Restoran> rest; switch(secenek) { case 1: /* Adına göre restoran arama */ String restoranAdi; c.write("Powered by Google."); restoranAdi = c.read("Restoran adı:",false); Restoran bulundu = Restoranlar.getRestoran(restoranAdi); if (bulundu == null) { c.write("Ne yazık ki adını verdiğiniz restoran para verip sistemimize kaydolmamış.\n" + "Kendileri kaybederler."); c.beklet(); c.cls(); break; } c.cls(); c.write("Restoran Adı: " + bulundu.ad); c.write("Bulunduğu Şehir: " + bulundu.il); c.write("Adres: " + bulundu.adres); c.write("Telefon: " + bulundu.telefon); c.write("Belgegeçer:" + bulundu.faks); c.write("E-posta: " + bulundu.eposta); c.write("WWW: " + bulundu.www); c.write("\n*** Mönü ***\n"); for(YemekRYapi i : bulundu.yemekler.yemekList) { c.write(i.yemekAdi + "\t\t" + i.fiyati + "\t\t" + (Yemekler.get(i.yemekAdi) != null ? Yemekler.get(i.yemekAdi).kategorisi : "")); } c.beklet(); break; case 2: /* Adı verilen bir yemeği çıkaran restoranları arama */ String yemekAdi; c.write("Powered by Google."); yemekAdi = c.read("Aranan yemeğin adı:",false); if(!is_yemek_exists(yemekAdi)) { c.write("Sistemimize böyle bir yemek kayıtlı değildir."); c.beklet(); break; } rest = Restoranlar.preOrder(); for(Restoran x: rest) { if(x.yemekler.hasYemek(yemekAdi)) { c.write("Restoran Adı: " + x.ad); c.write("Bulunduğu Şehir: " + x.il); c.write("Adres: " + x.adres); c.write("Telefon: " + x.telefon); c.write("Belgegeçer:" + x.faks); c.write("E-posta: " + x.eposta); c.write("WWW: " + x.www); c.write("Restorandaki Fiyatı: " + x.yemekler.getYemekFiyati(yemekAdi)); c.beklet(); c.cls(); } }

c.write("Arama tamam."); c.beklet(); c.cls(); break;

case 3: /* Belirli fiyat aralıklarına göre yemek arama */ float altF, ustF; c.write("Powered by Gugıl."); altF = c.readFloat("Fiyat alt limiti:"); ustF = c.readFloat("Fiyat üst limiti:"); if(altF < 0 || ustF < 0 || altF >= ustF) { c.write("Sintaks erör."); c.beklet(); break; } rest = Restoranlar.preOrder(); YemekR yemek = null; for(Restoran x: rest) { yemek = x.yemekler.yemekFiltre(altF, ustF); for(YemekRYapi b: yemek.yemekList) { c.write("Yemek Adı: " + b.yemekAdi); c.write(x.ad + " isimli restoranda " + b.fiyati + "YTL'ye yenilebilir."); c.beklet(); c.cls(); } } c.write("Arama tamamlandı."); c.beklet(); break; case 4: /* İçindeki malzemeye göre yemek arama */ String malzemeAdi; c.write("Powered by Aybars Uğur\n"); malzemeAdi = c.read("Hangi malzemeyi içeren yemekler ve restoranlar?", false); if(Malzemeler.get(malzemeAdi) == null) { c.write("Sistemde böyle bir malzeme yok."); c.beklet(); break; } c.write("*** Olduğu yemek Listesi *** \n"); for(String a: Malzemeler.get(malzemeAdi)) { c.write("Yemek adı:" + a); c.write("Bu yemek aşağıdaki restoranlarda çıkar: "); if(Yemekler.get(a) != null) { for(String b : Yemekler.get(a).olduguRestoranlar) { c.write(b); } } c.beklet(); } c.write("Arama tamamlandı."); c.beklet(); break; case 5: /* Bir ildeki tüm restoranları listeleme */ String il; c.write("Powered by Google.\n"); il = c.read("Hangi ilin restoranları?",false); rest = Restoranlar.preOrder(); for(Restoran x: rest) { if(x.il.equalsIgnoreCase(il)) { c.write("Restoran Adı: " + x.ad); c.write("Bulunduğu Şehir: " + x.il); c.write("Adres: " + x.adres); c.write("Telefon: " + x.telefon); c.write("Belgegeçer:" + x.faks); c.write("E-posta: " + x.eposta); c.write("WWW: " + x.www); c.write("\n*** Mönü ***\n"); for(YemekRYapi i : x.yemekler.yemekList) { c.write(i.yemekAdi + "\t\t" + i.fiyati + "\t\t" + (Yemekler.get(i.yemekAdi) != null ? Yemekler.get(i.yemekAdi).kategorisi : "")); } c.beklet(); c.cls(); } }

c.write("Arama tamamlandı."); c.beklet(); c.cls(); case 6: /* Üst Menü */ sag_serbest_child = true; break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } break; case 5: c.write(hakkinda()); c.beklet(); break; case 6: /* Çıkış */ do { c.write("Cidden çıkmak istiyor musunuz? (E/H) "); secenekS = c.read("Cidden çıkmak istiyor musunuz? (E/H) "); if (secenekS.equalsIgnoreCase("E")) { sag_serbest = true; secenekS = "H"; } } while (!secenekS.equalsIgnoreCase("H")); c.cls(); break; default: /* Elleri yanlış tuşa basan kullanıcılar için */ c.write("Houston houston, hatalı giriş yaptınız."); c.beklet(); break; } } switch(save(dosyaAdi)) { case -1: case -2: c.write("Dosyaya yazmada bir sıkıntı oluştu.\n" + "Program verileri dosyaya yazmadan kapanacak.\n" + "İsmimize de o kadar Çökmez Bilişim Sistemleri demiştik." + "İronik oldu."); break; case 0: c.write("Sistemdeki tüm bilgiler " + dosyaAdi + " dosyasına kaydedildi."); c.write("Programı bir sonraki açışınızda kaldığınız yerden devam edebilirsiniz."); break; }

c.write("ÇRS iyi günler diler..."); c.beklet(); System.exit(0); } /* Restoran İşlemleri */ /* Restoran bilgilerini ekler. Restoran önceden varsa FALSE, restoran eklendiyse TRUE döndürür. */ public static boolean restoran_ekle(String restoranAdi, String il, String adres, String telefon, String faks, String eposta, String www, YemekR yemekler) { if (Restoranlar.getRestoran(restoranAdi) == null) { Restoranlar.addRestoran(new Restoran(restoranAdi, il, adres, telefon, faks, eposta, www, yemekler)); return true; } return false; }

/* Restoran bilgilerini günceller. Restoran yoksa FALSE bilgiler güncellenirse TRUE döndürür. */ public static boolean restoran_guncelle(String oldRestoranAdi, String newRestoranAdi, String newIl, String newAdres, String newTelefon, String newFaks, String newEposta, String newWWW) { Restoran degisiklikYapilacak = Restoranlar.getRestoran(oldRestoranAdi); if (degisiklikYapilacak == null) return false; /* Restoran adı değiştiyse ağaçta da oynama yapılacağı için iki adımda güncelleme yapılır. */ if (newRestoranAdi == null || oldRestoranAdi.equalsIgnoreCase(newRestoranAdi) || newRestoranAdi.equals("")) { if (newIl != null && !newIl.equals("")) { degisiklikYapilacak.il = newIl; } if (newAdres != null && !newAdres.equals("")) { degisiklikYapilacak.adres = newAdres; }

if (newTelefon != null && !newTelefon.equals("")) { degisiklikYapilacak.telefon = newTelefon; } if (newFaks != null && !newFaks.equals("")) { degisiklikYapilacak.faks = newFaks; } if (newEposta != null && !newEposta.equals("")) { degisiklikYapilacak.eposta = newEposta; } if (newWWW != null && !newWWW.equals("")) { degisiklikYapilacak.www = newWWW; } } else { /* Restoran Adı Güncelleme Prosedürü: * 1\. Restoran adı değişince ağacı tekrar ayarla. * 2\. Yemek hash tablosunda yemeklerin bulundukları * restoranlar kısmında restoranın adını değiştir. * 3\. Bu kadar. */ Restoranlar.removeRestoran(oldRestoranAdi); degisiklikYapilacak.ad = newRestoranAdi; Restoranlar.addRestoran(degisiklikYapilacak); for(YemekRYapi i : degisiklikYapilacak.yemekler.yemekList) { Yemek x = Yemekler.get(i.yemekAdi); if(x != null) { for(String y :x.olduguRestoranlar) { if(y.equalsIgnoreCase(oldRestoranAdi)) { y = newRestoranAdi; break; } } } } return restoran_guncelle(newRestoranAdi, null, newIl, newAdres, newTelefon, newFaks, newEposta,newWWW); } return true; } /* Restoranı siler. Restoran yoksa FALSE, başarıyla silindiyse TRUE döndürür. */ public static boolean restoran_sil(String restoranAdi) { /* Restoran Silme Prosedürü: * 1\. Yemek Hashtableden restoran adı silinir. * 2\. Ağaçtan restoran silinir. * 3\. Bu kadar. */ Restoran silinecek = Restoranlar.getRestoran(restoranAdi); if (silinecek == null) return false; for(YemekRYapi i : silinecek.yemekler.yemekList) { Yemek x = Yemekler.get(i.yemekAdi); if(x != null) { for(String y :x.olduguRestoranlar) { if(y.equalsIgnoreCase(restoranAdi)) { x.olduguRestoranlar.remove(y); break; } } } } Restoranlar.removeRestoran(restoranAdi); return true; }

/* Sisteme kategori ekler. Eğer kategori zaten varsa FALSE, eklenirse TRUE döndürür. */ public static boolean kategori_ekle(String kategoriAdi) { if (is_kategori_exists(kategoriAdi)) { return false; } Kategoriler.add(new Kategori(kategoriAdi, new Vector<String>())); return true; }

/* Kategorinin sistemde olup olmadığını döndürür. */ public static boolean is_kategori_exists(String kategoriAdi) { for (Kategori i : Kategoriler) { if(i.kategoriAdi.equals(kategoriAdi)) { return true; } } return false; } /* Kategori İşlemleri */

public static boolean kategori_sil(String kategoriAdi) { if (!is_kategori_exists(kategoriAdi)) { return false; } Vector<String> silinecekYemek = null; Kategori silinecek = null; for(Kategori i:Kategoriler) { if(i.kategoriAdi.equalsIgnoreCase(kategoriAdi)) { silinecekYemek = i.getYemek(kategoriAdi); silinecek = i; break; } } if (silinecekYemek == null) { return false; } for(String y: silinecekYemek) { yemek_sil(y); } /* Kategoriye ait yemekler silinir. */

Kategoriler.remove(silinecek); return false; } /* Malzeme İşlemleri */ public static boolean malzeme_ekle(String malzemeAdi) { if (Malzemeler.get(malzemeAdi) != null) { return false; } Malzemeler.put(malzemeAdi, new Vector<String>()); return true; } /* Malzeme ismi değiştirme ve malzeme silme işlemleri ödev kapsamında * istenmediğinden projede yer almamaktadır. */ /* Yemek İşlemleri */ public static boolean yemek_duzenle(String oldYemekAdi, String newYemekAdi, String newEkBilgi, String newKategorisi) { if(!is_yemek_exists(oldYemekAdi)) { return false; } Yemek degisiklik = Yemekler.get(oldYemekAdi);

/* İsimde değişiklik yok */ if (newYemekAdi == null || oldYemekAdi.equalsIgnoreCase(newYemekAdi) || newYemekAdi.equals("")) { if (newEkBilgi != null && !newEkBilgi.equals("")) { degisiklik.ekBilgi = newEkBilgi; } if (newKategorisi != null && !newKategorisi.equals("")) { degisiklik.kategorisi = newKategorisi; for(Kategori i: Kategoriler) { if(i.kategoriAdi.equals(degisiklik.kategorisi)) { if(i.aitYemekler.contains(oldYemekAdi)) { i.aitYemekler.remove(oldYemekAdi); } } if(i.kategoriAdi.equals(newKategorisi)) { if(!i.aitYemekler.contains(oldYemekAdi)) { i.aitYemekler.add(oldYemekAdi); } } } }

} else { Yemekler.remove(oldYemekAdi); Yemekler.put(newYemekAdi, degisiklik); Vector<Restoran> a = Restoranlar.preOrder(); for(Restoran b: a) { b.yemekler.changeYemek(oldYemekAdi, newYemekAdi); } for(Kategori i: Kategoriler) { if(i.kategoriAdi.equals(degisiklik.kategorisi)) { if(i.aitYemekler.contains(oldYemekAdi)) { i.aitYemekler.remove(oldYemekAdi); i.aitYemekler.add(newYemekAdi); break; } } } for(String i: degisiklik.icindekiMalzemeler) { if(Malzemeler.get(i) != null) { if(Malzemeler.get(i).contains(oldYemekAdi)) { Malzemeler.get(i).remove(oldYemekAdi); Malzemeler.get(i).add(newYemekAdi); } } } return yemek_duzenle(newYemekAdi, null, newEkBilgi, newKategorisi); } return true; } public static boolean yemek_ekle(String yemekAdi, String ekBilgi, Vector<String> olduguRestoranlar, String kategorisi, Vector<String> icindekiMalzemeler) { if(is_yemek_exists(yemekAdi)) { return false; } Yemekler.put(yemekAdi, new Yemek(ekBilgi,kategorisi, icindekiMalzemeler, olduguRestoranlar)); return true; } public static boolean yemek_sil(String yemekAdi) { if(!is_yemek_exists(yemekAdi)) { return false; } Yemek silinecek = Yemekler.get(yemekAdi); for(String i: silinecek.icindekiMalzemeler) { if(Malzemeler.get(i) != null) { Malzemeler.get(i).remove(yemekAdi); } } for(String i: silinecek.olduguRestoranlar) { if(Restoranlar.getRestoran(i) != null) { Restoranlar.getRestoran(i).yemekler.removeYemek(yemekAdi); } } for(Kategori i: Kategoriler) { if(i.kategoriAdi.equals(silinecek.kategorisi)) { if(i.aitYemekler.contains(yemekAdi)) { i.aitYemekler.remove(yemekAdi); } } } Yemekler.remove(yemekAdi); return true; } public static boolean is_yemek_exists(String yemekAdi) { if (Yemekler.get(yemekAdi) != null) { return true; } return false; }

}

Restoran.java ```java import java.io.Serializable;

public class Restoran implements Serializable { private static final long serialVersionUID = 3691088602217859963L; /* Ağaç Hödöleri / public Restoran leftChild; public Restoran rightChild; / Gerekli Bilgiler */ public String ad; public String il; public String adres; public String telefon; public String faks; public String eposta; public String www; public YemekR yemekler; public Restoran (String ad, String il, String adres, String telefon, String faks, String eposta, String www,YemekR yemekler) {

this.ad = ad; this.il = il; this.adres = adres; this.telefon = telefon; this.faks = faks; this.eposta = eposta; this.www = www; if (yemekler == null) { this.yemekler = new YemekR(); } else { this.yemekler = yemekler; } }

}


*Tree.java* ```java
 import java.io.*; import java.util.Vector;

class Tree implements Serializable { private static final long serialVersionUID = 7152535335347442892L; private Restoran root; Vector<Restoran> RestoranVektor = new Vector<Restoran>(); public Tree() { root = null; }

public Restoran getRestoran(String restoranAdi) { if (root == null) { return null; } Restoran current = root; while (!current.ad.equalsIgnoreCase(restoranAdi)) { if (restoranAdi.compareTo(current.ad) < 0) { current = current.leftChild; } else { current = current.rightChild; } if (current == null) { return null; } } return current; }

public void addRestoran(Restoran gelenRest) { if (root == null) { root = gelenRest; } else { Restoran current = root; Restoran parent; while (true) { parent = current; if (gelenRest.ad.compareTo(current.ad) < 0) { current = current.leftChild; if (current == null) { parent.leftChild = gelenRest; return; } } else { current = current.rightChild; if (current == null) { parent.rightChild = gelenRest; return; } } } } }

public boolean removeRestoran(String restoranAdi) { if (root == null) { return false; } Restoran current = root; Restoran parent = root; boolean isLeftChild = true;

while (!current.ad.equalsIgnoreCase(restoranAdi)) { parent = current; if (restoranAdi.compareTo(current.ad) < 0) { isLeftChild = true; current = current.leftChild; } else { isLeftChild = false; current = current.rightChild; } if (current == null) { return false; } }

if (current.leftChild == null && current.rightChild == null) { if (current == root) { root = null; } else if (isLeftChild) { parent.leftChild = null; } else { parent.rightChild = null; } } else if (current.rightChild == null) { if (current == root) { root = current.leftChild; } else if (isLeftChild) { parent.leftChild = current.leftChild; } else { parent.rightChild = current.leftChild; } } else if (current.leftChild == null) { if (current == root) { root = current.rightChild; } else if (isLeftChild) { parent.leftChild = current.rightChild; } else { parent.rightChild = current.rightChild; } } else { Restoran successor = getSuccessor(current); if (current == root) { root = successor; } else if (isLeftChild) { parent.leftChild = successor; } else { parent.rightChild = successor; } successor.leftChild = current.leftChild; } return true; }

private Restoran getSuccessor(Restoran delNode) { Restoran successorParent = delNode; Restoran successor = delNode; Restoran current = delNode.rightChild; while (current != null) { successorParent = successor; successor = current; current = current.leftChild; }

if (successor != delNode.rightChild) { successorParent.leftChild = successor.rightChild; successor.rightChild = delNode.rightChild; } return successor; }

public Vector<Restoran> preOrder() { RestoranVektor.clear(); preOrder_i(root); return RestoranVektor; } public Vector<Restoran> inOrder() { RestoranVektor.clear(); inOrder_i(root); return RestoranVektor; } public Vector<Restoran> postOrder() { RestoranVektor.clear(); postOrder_i(root); return RestoranVektor; } private void preOrder_i(Restoran localRoot) { if(localRoot != null) { RestoranVektor.add(localRoot); preOrder_i(localRoot.leftChild); preOrder_i(localRoot.rightChild); } }

private void inOrder_i(Restoran localRoot) { if(localRoot != null) { preOrder_i(localRoot.leftChild);

RestoranVektor.add(localRoot);

preOrder_i(localRoot.rightChild); } } private void postOrder_i(Restoran localRoot) { if(localRoot != null) { preOrder_i(localRoot.leftChild); preOrder_i(localRoot.rightChild); RestoranVektor.add(localRoot); } } public int depthMeter (Restoran localRoot) { int depth=0; if (root == null) { return -1; } Restoran current = root; while (!current.ad.equalsIgnoreCase(localRoot.ad)) { if (localRoot.ad.compareTo(current.ad) < 0) { current = current.leftChild; depth++; } else { current = current.rightChild; depth++; } } return depth; } }

Yemek.java ```java import java.io.Serializable; import java.util.*;

public class Yemek implements Serializable { private static final long serialVersionUID = -5233500000353592564L; public String ekBilgi; public String kategorisi; Vector<String> icindekiMalzemeler = new Vector<String>(); Vector<String> olduguRestoranlar = new Vector<String>(); public Yemek(String ekBilgi, String kategorisi, Vector<String> icindekiMalzemeler, Vector<String> olduguRestoranlar) { this.ekBilgi = ekBilgi; this.kategorisi = kategorisi; this.icindekiMalzemeler = icindekiMalzemeler; this.olduguRestoranlar = olduguRestoranlar; } }


*YemekR.java* ```java
 import java.io.Serializable; import java.util.*;

public class YemekR implements Serializable { private static final long serialVersionUID = -7004561629413171261L; Vector<YemekRYapi> yemekList = new Vector<YemekRYapi>(); /* Adı ve fiyatı verilen yemeği ekler. */ public void addYemek(String yemekAdi, float fiyati) { yemekList.addElement(new YemekRYapi(yemekAdi,fiyati)); } public void addYemek(YemekRYapi yemek) { yemekList.addElement(yemek); } /* Adı verilen yemeği siler. */ public void removeYemek(String yemekAdi) { for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).yemekAdi.equalsIgnoreCase(yemekAdi)) { yemekList.removeElementAt(i); break; } } } /* yemekAdi isimli yemek olup olmadığını bulur. */ public boolean hasYemek(String yemekAdi) { for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).yemekAdi.equalsIgnoreCase(yemekAdi)) { return true; } } return false; } public float getYemekFiyati(String yemekAdi) { for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).yemekAdi.equalsIgnoreCase(yemekAdi)) { return yemekList.elementAt(i).fiyati; } } return -1; } /* Yemek adında değişiklik yapmak için kullanılır. */ public void changeYemek(String oldYemekAdi, String newYemekAdi) { for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).yemekAdi.equalsIgnoreCase(oldYemekAdi)) { yemekList.elementAt(i).yemekAdi = newYemekAdi; } } }

/* Yemek adında değişiklik yapmak için kullanılır. */ public void changeYemek(String yemekAdi, float newFiyati) { for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).yemekAdi.equalsIgnoreCase(yemekAdi)) { yemekList.elementAt(i).fiyati = newFiyati; } } } /* Alt limit ve üst limit kriterine uygun yemekleri YemekR nesnesi içinde döndürür. * Bir anlamda filtre görevi görür. */ public YemekR yemekFiltre(float fiyatAltLimit, float fiyatUstLimit) { YemekR filtre = new YemekR(); for (int i=0; i < yemekList.size(); i++) { if (yemekList.elementAt(i).fiyati >= fiyatAltLimit && yemekList.elementAt(i).fiyati <= fiyatUstLimit) { filtre.addYemek(yemekList.elementAt(i)); } } return filtre; }

}

YemekRYapi.java ```java import java.io.Serializable;

public class YemekRYapi implements Serializable { private static final long serialVersionUID = 6604357498353361559L; public String yemekAdi; public float fiyati; public YemekRYapi(String yemekAdi, float fiyati) { this.yemekAdi = yemekAdi; this.fiyati = fiyati; } }