25 Kasım
2008
00:00

Veri Yapıları: Proje 2

Bilgisayar & Bilmuh'cular için & JAVA 25 Kasım 2008

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
/* 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"
toplam 1.304 kez okundu | bugün okuyan olmadı

İlk yorum sizin olabilir!