Veri Yapıları: Proje 2

Banka Kuyruğu JAVA Ekran Görüntüsü Banka Kuyruğu JAVA Ekran Görüntüsü   Veri yapılarında ikinci projemiz bağlı liste (linked list), yığıt (stack) ve kuyruk (queue) yapılarının kullanımını pekiştirmek içindi.

Veri yapıları ödevlerini dört kişilik bir ekip olarak yapmaktayız. 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.

Elipse kurulumu hakkında yardıma ihtiyacınız varsa şu yazım işinize yarayabilir.

Balon Patlatma

Proje2.java ```java import java.util.*;

public class Proje2 { public static void main(String[] Args){ int m,n; do{ System.out.println("m degerini (balon sayisini) giriniz:"); Scanner str1 = new Scanner(System.in); m = str1.nextInt(); }while(m<=0); do{ System.out.println("n degerini (kac balonda bir patlatma isleminin yapilacagini) giriniz:"); Scanner str2 = new Scanner(System.in); n = str2.nextInt(); }while(n<=0); //girdiler alindi. Stack<BListe> yigit = new Stack<BListe>(); //yigit olusturuldu. int sayac1=1; int sayac2=1; int katNo=1; while(sayac1<=m){ BListe gecici = new BListe(katNo); System.out.println("\n"+katNo+". kattaki listedeki balonlar:"); sayac2=1; while(sayac2<=10 && sayac1<=m){ gecici.Ekle(sayac1); sayac1++; sayac2++; } gecici.yazdir(); yigit.push(gecici); katNo++; //kucuk dongude her bir liste 10 eleman sayisina ulasinca o anki liste //yigita atılır, kat no artırılıp //dongunun basina donulup yeni katin listesi olusturulur. } System.out.println("----------------------------------------------------------------------------"); int problemSayisi=0; //cozulen problemleri saymak icin long zaman; //problemlerin cozuldugu aralikta gecen zaman final long baslangic = System.currentTimeMillis(); //sistem saati degeri milisaniye olarak alindi. while(!yigit.empty()){ BListe gecici = yigit.pop(); gecici.patlat(n); problemSayisi++; }//yigit bosalana kadar her bir eleman gecici listeye atilip patlat metoduna maruz //birakildi ve her bir liste bir balon problemi sayildi. final long bitis = System.currentTimeMillis(); //islem bitince sistem saatine bakildi. zaman=bitis-baslangic; if(zaman==0){ System.out.println("Problemin cozum suresi, sistem saatinin algilayabilecegi kadar buyuk degil."); } else{ System.out.println("----------------------------------------------------------------------------"); System.out.println("\n\n"+problemSayisi+" problem cozuldu."); System.out.println("1 adet problem yaklasik "+zaman/(long)problemSayisi+" milisaniyede cozuldu."); System.out.println("1 saniyede cozulebilecek balon problemi sayisi = "+(long)1000*problemSayisi/zaman); } } }


*BListe.java* ```java
 import java.util.*;

public class Proje2 { public static void main(String[] Args){ int m,n; do{ System.out.println("m degerini (balon sayisini) giriniz:"); Scanner str1 = new Scanner(System.in); m = str1.nextInt(); }while(m<=0); do{ System.out.println("n degerini (kac balonda bir patlatma isleminin yapilacagini) giriniz:"); Scanner str2 = new Scanner(System.in); n = str2.nextInt(); }while(n<=0); //girdiler alindi. Stack<BListe> yigit = new Stack<BListe>(); //yigit olusturuldu. int sayac1=1; int sayac2=1; int katNo=1; while(sayac1<=m){ BListe gecici = new BListe(katNo); System.out.println("\n"+katNo+". kattaki listedeki balonlar:"); sayac2=1; while(sayac2<=10 && sayac1<=m){ gecici.Ekle(sayac1); sayac1++; sayac2++; } gecici.yazdir(); yigit.push(gecici); katNo++; //kucuk dongude her bir liste 10 eleman sayisina ulasinca o anki liste //yigita atılır, kat no artırılıp //dongunun basina donulup yeni katin listesi olusturulur. } System.out.println("----------------------------------------------------------------------------"); int problemSayisi=0; //cozulen problemleri saymak icin long zaman; //problemlerin cozuldugu aralikta gecen zaman final long baslangic = System.currentTimeMillis(); //sistem saati degeri milisaniye olarak alindi. while(!yigit.empty()){ BListe gecici = yigit.pop(); gecici.patlat(n); problemSayisi++; }//yigit bosalana kadar her bir eleman gecici listeye atilip patlat metoduna maruz //birakildi ve her bir liste bir balon problemi sayildi. final long bitis = System.currentTimeMillis(); //islem bitince sistem saatine bakildi. zaman=bitis-baslangic; if(zaman==0){ System.out.println("Problemin cozum suresi, sistem saatinin algilayabilecegi kadar buyuk degil."); } else{ System.out.println("----------------------------------------------------------------------------"); System.out.println("\n\n"+problemSayisi+" problem cozuldu."); System.out.println("1 adet problem yaklasik "+zaman/(long)problemSayisi+" milisaniyede cozuldu."); System.out.println("1 saniyede cozulebilecek balon problemi sayisi = "+(long)1000*problemSayisi/zaman); } } }

Balon.java ```java public class Balon { public int no; private String renk; public Balon sonraki;

public Balon(int no) { this.no = no; String str[] = { "yavru ağzı", "cam göbeği", "van dyke kahverengisi", "hint sarısı", "alizarin kırmızısı", "kadmiyum sarısı", "gece yarısı siyahı", "prusya mavisi", "titanyum beyazı", "koyu siena" }; this.renk = str[(int) (Math.random() * str.length)]; }

public void yazdir() { System.out.println("Balonun numarası:" + no + "\t" + "Balonun rengi:" + renk); } }


## Banka Kuyruğu

*Musteri.java* ```java
 /* Class: Musteri * Author: Didem KAYALI * * Müşteri bilgilerinin tutulduğu veri sınıfıdır. Normal * sıralı bekleme bilgileri FIFOBeklemeSuresi değişkeninde * tutulurken öncelikli kuyrukta ne kadar beklediği * PBeklemeSuresi değişkeninde tutulmaktadır. */

public class Musteri { public final int musteriNo; public final int islemSuresi; public Musteri sonraki; public int FIFOBeklemeSuresi; public int PBeklemeSuresi;

/* * Musteri sınıfı için iki constructor bulunmaktadır. Müşterileri hem normal * kuyrukta hem de öncelikli kuyrukta sıraladıktan sonra ne kadar * beklediklerini karşılaştırmak için iki bekleme sürsinin de ne kadar * olduğunu bilmek önemlidir. * * Programda önce standart kuyruk simüle edilir. Daha sonra buradan gelen * verileri de kullanarak öncelikli kuyruğu simüle etmek üzere kuyruk * yeniden oluşturulur. Bu yeniden oluşturma esnasında standart bekleme * süreleri daha önce hesaplanmış olduğu için müşteri bilgileri içine * atılabilir. */ public Musteri(int musteriNo, int islemSuresi) { this.musteriNo = musteriNo; this.islemSuresi = islemSuresi; this.FIFOBeklemeSuresi = 0; }

public Musteri(int musteriNo, int islemSuresi, int FIFOBeklemeSuresi) { this.musteriNo = musteriNo; this.islemSuresi = islemSuresi; this.FIFOBeklemeSuresi = FIFOBeklemeSuresi; }

}

BListe.java ```java /* Class: BListe * Author: Umut BENZER * * Öncelikli ve normal kuyruk oluşturmak için kullanılan sınıftır. * Öncelikli ya da normal olacağı constructordaki oncelikli * ifadesinin değerine göre belirlenir. * * Kuyruk ile öncelikli kuyruk metotları arasında çok ufak farklar * olduğu için ikisini birleşik yapmak uygun görüşmüştür. */

public class BListe { private Musteri bas; // Kuyruğun ilk elemanının referansı private Musteri son; // Kuyruğun son elemanının referansı private boolean oncelikli; // Kuyruğun özelliği

/* İlk yaratıldığında boş olan bir kuyruk */ public BListe() { bas = null; son = null; oncelikli = false; }

public BListe(boolean oncelikli) { this.oncelikli = oncelikli; bas = null; son = null; }

/* * Müşteri nesnesini gelen verilere uygun bir şekilde yaratır ve ekle * metoduna gönderir. */ public void ekle(int musteriNo, int islemSuresi, int FIFOBeklemeSuresi) { Musteri yeniMusteri = new Musteri(musteriNo, islemSuresi, FIFOBeklemeSuresi); ekle(yeniMusteri); }

public void ekle(int musteriNo, int islemSuresi) { Musteri yeniMusteri = new Musteri(musteriNo, islemSuresi); ekle(yeniMusteri); }

/* * Müşteriyi listenin öncelikli olup olmama durumuna uygun bir şekilde * kuyruğun uygun yerine ya da sonuna atar. */ private void ekle(Musteri yeniMusteri) { if (oncelikli) { Musteri onceki = null; Musteri etkin = bas;

while (etkin != null && yeniMusteri.islemSuresi > etkin.islemSuresi) { onceki = etkin; etkin = etkin.sonraki; }

if (onceki == null) { bas = yeniMusteri; } else { onceki.sonraki = yeniMusteri; } yeniMusteri.sonraki = etkin;

} else {

if (son != null) { son.sonraki = yeniMusteri; son = yeniMusteri; } else { bas = yeniMusteri; son = yeniMusteri; } }

}

/* Sıradaki müşteriyi al ve çıkar */ public Musteri cikar() { Musteri dondurulecek = bas; if (bas != null) { bas = bas.sonraki; } return dondurulecek; }

/* Kuyruğun bitip bitmediğini döndürür. */ public boolean bosMu() { return (bas == null ? true : false); }

}


*Gorsel.java* _Görsel kodlar Eclipse Ganymede görsel editörü ile otomatik yaratılmıştır._ ```java
 /* Class: Gorsel * Author: Umut BENZER * * Görsel öğeler de içeren asıl sınıftır. Ayrıntılı bilgi için * public void actionPerformed(java.awt.event.ActionEvent e) { * kısmındaki commentlere bakınız. * * Görsel kodlar Eclipse Ganymede üzerinde Visual Editör ile yaratılmıştır. */

import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.Dimension; import javax.swing.JButton; import java.awt.Rectangle; import javax.swing.JLabel; import javax.swing.JTextField; import java.awt.List; import javax.swing.WindowConstants; import java.awt.Checkbox;

public class Gorsel extends JFrame {

private static final long serialVersionUID = 1L; private JPanel jContentPane = null; // @jve:decl-index=0:visual-constraint="82,26" private JButton butonMusteri = null; private JLabel etiketBaslik = null; private JTextField textMusteriSayisi = null; private List listSonuc = null; private List listSonucP = null; private JLabel labelUyari = null; private List listMusteri = null; private List listeCokBekleyen = null; private Checkbox checkTorpil = null;

/* * Gelen string verisinin bir Integer olup olmadığını TRUE ya da FALSE * olarak geri döndürür. */ public boolean isParsableToInt(String i) { try { Integer.parseInt(i); return true; } catch (NumberFormatException nfe) { return false; } }

private JButton getButonMusteri() { if (butonMusteri == null) { butonMusteri = new JButton(); butonMusteri.setBounds(new Rectangle(142, 13, 83, 21)); butonMusteri.setText("Yarat"); butonMusteri.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { /* Sayı mı? */ if (isParsableToInt(textMusteriSayisi.getText()) && Integer.parseInt(textMusteriSayisi.getText()) > 0) { /* Gerekli değişkenler ve nesneler yaratılır. */ int musteriSayisi = Integer.parseInt(textMusteriSayisi .getText()); int islemSuresi; int toplamBeklemeSuresi = 0; int oncekiBeklemeSuresi = 0;

BListe kuyruk = new BListe(); BListe oncelikliKuyruk = new BListe(true);

/* * Önceki çalışmadan bir şeyler kalma ihtimaline karşı * listeleri vs. temizlemek gerekir. */ listMusteri.removeAll(); listSonuc.removeAll(); listSonucP.removeAll(); listeCokBekleyen.removeAll(); labelUyari.setText("");

/* Program süpriz yumurta içermektedir. */ /* http://en.wikipedia.org/wiki/Easter_egg_(media) */ if (checkTorpil.getState()) { listMusteri.add("Torpilli müşteri"); listSonuc.add("Torpilli müşteri bekletti de bekletti..."); listSonucP.add("Torpilli müşterilerimiz önceliklidir."); } /* * Rastgele işlem süreli n müşteri yaratıp önceliksiz * kuyruğa atılır. */ for (int i = 1; i <= musteriSayisi; i++) { islemSuresi = (int) (30 + Math.random() * 270); kuyruk.ekle(i, islemSuresi); listMusteri.add(i + ".müşteri işlem süresi: " + islemSuresi); }

/* Tüm kuyruk boşalana kadar simülasyon sürdürülür. */ while (!kuyruk.bosMu()) { Musteri guncel = kuyruk.cikar(); guncel.FIFOBeklemeSuresi = guncel.islemSuresi + oncekiBeklemeSuresi;

/* * Bir yandan önceliksiz kuyruktan müşteriler * çıkarılır ve bu kuyruğa ait ortalamalar * hesaplanırken diğer yandan çıkan müşteriler * önceliksiz bekleme süresi bilgileri ile beraber * öncelikli kuyruğa atılır. */ oncelikliKuyruk.ekle(guncel.musteriNo, guncel.islemSuresi, guncel.FIFOBeklemeSuresi);

oncekiBeklemeSuresi = guncel.FIFOBeklemeSuresi; toplamBeklemeSuresi += guncel.FIFOBeklemeSuresi;

listSonuc.add(guncel.musteriNo + " numaralı müşteri " + guncel.FIFOBeklemeSuresi + " saniye bekledi.\n"); }

listSonuc.add("Ortalama bekleme süresi: " + toplamBeklemeSuresi / musteriSayisi + " saniye.");

/* Aynı işlemler öncelikli kuyruk için tekrarlanır. */ toplamBeklemeSuresi = 0; oncekiBeklemeSuresi = 0; while (oncelikliKuyruk.bosMu() == false) { Musteri guncel = oncelikliKuyruk.cikar(); guncel.PBeklemeSuresi = guncel.islemSuresi + oncekiBeklemeSuresi;

oncekiBeklemeSuresi = guncel.PBeklemeSuresi; toplamBeklemeSuresi += guncel.PBeklemeSuresi;

/* * Çok bekleyen müşterilerin çemkirmesi de listeleme * esnasında yapılır. */ if (guncel.PBeklemeSuresi > guncel.FIFOBeklemeSuresi) { listeCokBekleyen .add(guncel.musteriNo + ". müşteri öncelikli kuyrukta " + (guncel.PBeklemeSuresi - guncel.FIFOBeklemeSuresi) + " saniye daha çok bekledi."); }

listSonucP.add(guncel.musteriNo + " numaralı müşteri " + guncel.PBeklemeSuresi + " saniye bekledi.\n"); }

listSonucP.add("Ortalama bekleme süresi: " + toplamBeklemeSuresi / musteriSayisi + " saniye.");

} else { /* Değil */ textMusteriSayisi.setText("30"); labelUyari .setText("Lütfen insan gibi bir sayı giriniz!"); } }

}); } return butonMusteri; }

/** * This method initializes textMusteriSayisi * * @return javax.swing.JTextField */ private JTextField getTextMusteriSayisi() { if (textMusteriSayisi == null) { textMusteriSayisi = new JTextField(); textMusteriSayisi.setBounds(new Rectangle(96, 12, 45, 24)); textMusteriSayisi.setText("30"); } return textMusteriSayisi; }

/** * This method initializes listSonuc * * @return java.awt.List */ private List getListSonuc() { if (listSonuc == null) { listSonuc = new List(); listSonuc.setBounds(new Rectangle(232, 36, 293, 366)); } return listSonuc; }

/** * This method initializes listSonucP * * @return java.awt.List */ private List getListSonucP() { if (listSonucP == null) { listSonucP = new List(); listSonucP.setBounds(new Rectangle(532, 37, 250, 367)); } return listSonucP; }

/** * This method initializes listMusteri * * @return java.awt.List */ private List getListMusteri() { if (listMusteri == null) { listMusteri = new List(); listMusteri.setBounds(new Rectangle(8, 37, 218, 365)); } return listMusteri; }

/** * This method initializes listeCokBekleyen * * @return java.awt.List */ private List getListeCokBekleyen() { if (listeCokBekleyen == null) { listeCokBekleyen = new List(); listeCokBekleyen.setBounds(new Rectangle(10, 410, 768, 155)); } return listeCokBekleyen; }

/** * This method initializes checkTorpil * * @return java.awt.Checkbox */ private Checkbox getCheckTorpil() { if (checkTorpil == null) { checkTorpil = new Checkbox(); checkTorpil.setBounds(new Rectangle(232, 16, 238, 19)); checkTorpil.setLabel("Tanıdıklara torpil geç"); } return checkTorpil; }

public static void main(String[] args) { Gorsel form = new Gorsel(); form.setVisible(true); }

/** * This is the default constructor */ public Gorsel() { super(); initialize(); }

/** * This method initializes this * * @return void */ private void initialize() { this.setSize(800, 600); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setResizable(false); this.setContentPane(getJContentPane()); this.setTitle("Banka Kuyruğu - Çökmez Bilişim Sistemleri"); }

/** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { labelUyari = new JLabel(); labelUyari.setBounds(new Rectangle(531, 18, 239, 16)); labelUyari.setText(""); etiketBaslik = new JLabel(); etiketBaslik.setBounds(new Rectangle(13, 12, 82, 24)); etiketBaslik.setText("Müşteri sayısı:"); jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.setSize(new Dimension(448, 272)); jContentPane.add(getButonMusteri(), null); jContentPane.add(etiketBaslik, null); jContentPane.add(getTextMusteriSayisi(), null); jContentPane.add(getListSonuc(), null); jContentPane.add(getListSonucP(), null); jContentPane.add(labelUyari, null); jContentPane.add(getListMusteri(), null); jContentPane.add(getListeCokBekleyen(), null); jContentPane.add(getCheckTorpil(), null); } return jContentPane; }

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