inönü üniversitesi mühendislik fakültesi bilgisayar mühendisliği

advertisement
 İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ AD SOYAD: OKUL NO: TESLİM TARİHİ: TESLİM SÜRESİ: 1 hafta ÖDEV NO: 4 1‐  Life Game Java konsol ortamında 17x17 lik bir alanda (hücre habitatı (yaşam alanı)) oynanacaktır. Fakat hucreHabitat[][] dizisi 19x19 olarak belirlenmiş ve şekil 2 de görüldüğü gibi 0. ve 18. satır ile 0. ve 18. sütunlar habitat alanına alınmamıştır. Bunun sebebi ise şekil 2 de kırmızı hücre ve komşularını gösterilen 1,1 hücresinde görüldüğü gibi eğer 1,1 yerine 0,0 hücresi habitat içerisinde olsaydı komşu hücreleri bulunmayacağı için yazılımda dizi sınırı taşma problemleri ile karşılaşıla bilinir.  Life Game için her iterasyonda ekran çıktısı karakterler ile gösterilecektir. LIFE GAME KURALLARI: Kısaca “LIFE” diye de anılan “LIFE GAME” İngiliz matematikçi John Horton Conway tarafından 1970 yılında hücresel simülasyon amaçlı olarak tasarlanmış bir hücresel otomattır. (Cellular Automata, Cellular Spaces) “Game” oyuncusuz bir oyundur. Bunun anlamı temel bir başlangıç durumundan başlayarak, gelişimin iterasyonlar boyunca devam etmesidir. Yani hücrelerin “hayatta kalma” ve “ölüm” kurallarına göre dizayn edimiş bir simülasyon aracı olarak tasarlanmıştır. Bu simülasyonda hücrelerin “YAŞAM” ve “ÖLÜM” olmak üzere iki durumu söz konusudur. Bu oyunda amaç belli bir başlangıç durumu referans alınarak, belli bir bölge içerisinde, herbir yaşam döngüsünde (itrasyonda) hücrelerin hayat ve ölüm durumlarını test edip sonuçları görmektir. LIFE GAME’ nin evreni, her birinin sadece “CANLI”, ”ÖLÜ” olmak üzere 2 olası duruma sahip olduğu 2 boyutlu karelerden oluşur. Her bir kare bir hücreyi temsil eder. Her hücre yatayda dikeyde ve çaprazda olmak üzere 8 bitişik komşu hücre (şekil‐2 kırmızı hücre ve komşuları) ile etkileşim içindedir. Her zaman iterasyonunda aşağıdaki kurallara göre bir sonraki durum belli olur: 1‐
2‐
3‐
4‐
Eğer canlı bir hücrenin 2 canlı hücre hücreden az komşusu olursa o hücre ölür. Eğer canlı bir hücrenin 2 veya 3 canlı hücre komşusu olursa o hücre bir sonraki nesilde yaşar. Eğer canlı bir hücrenin 3 den fazla canlı hücre komşusu olursa o hücre bir sonraki nesilde ölür. Eğer ölü bir hücrenin 3 canlı hücre komşusu olursa o hücre bir sonraki nesilde yeniden üretilir ve yaşamaya başlar. LIFE GAME evreninin başlangıç deseni sistemin çekirdeğini oluşturur. İlk nesil yukarıdaki kuralları uygulayarak aynı anda çekirdekteki tüm hücrelere aynı anda yaratılır. Ölüm ve yaşam aynı anda meydan gelir. Her bir değişim döngüsüne bir iterasyon denir. Simülasyon yukarıdaki kurallar dahilinde devam eder. Şekil‐1: Pulsar deseni TAVSİYE EDİLEN JAVA YORDAMLARI: Uygulamada bir sınıf ve birden fazla yordam yazılması olması tavsiye edilir. Yazılması istenen yordamlar şekil‐4’de gösterilmiş ve aşağıda açıklanarak örnek kod alanı verilmiştir. Şekil‐2: komşu hücre, iç ve dış çerçeve (a) Şekil‐4: LIFE_GAME sınıfı için tavsiye edilen Java yordamları ve değişkenleri 1. public LifeGame(): Life Game yapılandırıcı yordamıdır. 19 x 19 lik bir habitat üzerinde simüle edilecektir. Fakat bu habitatın içdeki 17 x 17 lik bölümü gerçek yaçam alanı olacaktır. Simülasyon başlamadan önce habitat şekil‐1 de verilen pulsar deseni ile başlamalıdır. Bu nedenle gerçek habitat ve geçici habitat sıfırlanmalı, pulsar deseni habitata yüklenmelidir. Yapılandırıcı için gerekli java kodları aşağıda verilmiştir. 2. public void drawHabitat(): (b) Gerçek yaşam alanı (hucreHabitat[][]) şekil‐3’de gösterildiği formatla konsol ekranına bastıran yordamdır. Burada ölü hücreler için tire (‐), canlı hücreler için diyez (#) karakterleri tercih edilmiştir. Şekil‐2’de gösterildiği gibi habitat olarak dış çerçeve değil iç çerçeve bastırılmalıdır. 3. public int komsuCanliSayisi(int satir, int sutun): Koordinatları satır sütun şeklinde parametre olarak girilen hücre merkezde olmak üzere etrafındaki 3x3 lük alanda canlı komşu sayımı yapılacaktır. Eğer kendisi de canlı ise, canlı komşu sayısına eklenmemelidir. Bulunan canlı komşu sayısı geri döndürülür. 4‐ public void newHabitatRule(): (c) Şekil‐3: (a) java konsol ortamı pulsar başlangıç deseni, (b) birinci iterasyon, (c) ikinci iterasyon Life Game’ in yukarıda sıralanan 4 kuralına göre gerçek habitata bakılarak bir sonraki iterasyondaki hücre nesli için geçici habitat (hucreHabitatTmp) güncellenir. Bunun için sırayla iç çerçevede kalan her bir hücrenin canlı komşu sayısı ve hücrenin canlı olup olmadığına bakılarak hucreHabitatTmp güncellenir. Bu güncellemeden sonra ise yedek habitatın gerçek habitata kopyalama işlemi yapılır. 5‐ public void copyHabitat(): hucreHabitatTmp’de değerler gerçek yaşam alanına aktarılır. LIFE GAME JAVA ŞABLON KODLARI: import java.io.IOException; public class LifeGame { final int habitatSatir = 19; final int habitatSutun = 19; int hucreHabitat[][]; int hucreHabitatTmp[][]; int[] pulsarSatir; int[] pSatir; int pulsarSutun[]; public LifeGame() { // pulsar desni oluşması için gerekli ön tanımlamalar pSatir = new int[] { 3, 8, 10, 15 }; pulsarSatir = new int[] { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 }; pulsarSutun = new int[] { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 }; // gerçek yaşam alanı ve değişikliklerin yapılacağı yedek yaşam alanı tanımı hucreHabitat = new int[habitatSatir][habitatSutun]; hucreHabitatTmp = new int[habitatSatir][habitatSutun]; // tüm yedek ve gerçek yaşam alanı sıfırlanıyor int c = 0; for (int i = 0; i < habitatSatir; i++) { for (int y = 0; y < habitatSutun; y++) { hucreHabitatTmp[i][y] = c; hucreHabitat[i][y] = c; } } // pulsar deseni gerçek yaşam alanına atanıyor for (int satir = 0; satir < pSatir.length; satir++) { for (int sutun = 0; sutun < habitatSutun; sutun++) { hucreHabitat[pSatir[satir]][sutun] = pulsarSatir[sutun]; } } for (int sutun = 0; sutun < pSatir.length; sutun++) { for (int satir = 0; satir < habitatSutun; satir++) { hucreHabitat[satir][pSatir[sutun]] = pulsarSatir[satir]; } } } public void drawHabitat() { // gerçek yaşam alanı (hucreHabitat) ekrana çizdiriliyor // *******KODLANACAK********* } public int komsuCanliSayisi(int satir, int sutun) { int canliKomsuSayisi = 0; // koordinatları girilen hücre merkezde olmak üzere 3x3 lük alanda // canlı komşu sayısı tespiti yapılıyor. Eğer kendiside canlı ise // canlı komşuya eklenmemelidir. // *******KODLANACAK********* return canliKomsuSayisi; } public void newHabitatRule() { int cks; // Life Game'in 4 kuralına göre gerçek habitata bakılarak // bir sonraki iterasyon için geçici habitat (hucreHabitatTmp) // güncelleniyor // *******KODLANACAK********* } public void copyHabitat() { // yedek hücreden tekrar orjinaline yükleme yap // *******KODLANACAK********* } public static void main(String[] args) throws Exception { LifeGame lg = new LifeGame(); for (int i = 0; i < 20; i++) { lg.drawHabitat(); lg.newHabitatRule(); System.out.println(); Thread.sleep(1500); }}} 2‐ Java.util.LinkedList; sınıfı Java tasarımcıları tarafından geliştirilmiş ve JAVA’ya eklenmiş bir Bağlı Liste sınıfıdır. Bu sınıf içerisinde hazır olarak verilmiş add(…), addFirst(…), addLast(…) gibi fonksiyonlar ile tanımlanan ve bir bağlı liste nesnesine ekleme çıkarma ve listeleme gibi bir çok işlem yapılabilir. Bu ön bilgilere dayanarak bir satranç oyununda karşılıklı olarak 2 oyuncunun yaptıkları hamleleri iki ayrı bağlı listede tutmak istenmektedir. Oyuncular A ve B olarak isimlendirilmelidir. Yapılan hamleleri tutacak iki bağlı liste LinkedList sınıfından yararlanarak tanımlanacaktır. Hamleler aşağıda gösterilen “hamle formatı” şeklinde saklanacak ve main yordamında da yine aynı formatla girdi alınması sağlanacak, bu formatın dışında girilen her girdi değeri bağlı listelere eklenmeyecek ve girdi yapan kişi mesajla girdinin yanlış olduğu konusunda uyarılarak yeni girdi istenecektir. Hamle Formatı: Hamle Satır Sütun: <taş_ismi_kısaltması><Hamle_sutun><Hamle_satır> şeklinde oluşturulacaktır. Örnek: AH5, SF3,…. Taş İsmi Kısaltmaları: Kale: K, At: A, Fil: F, Şah: S, Vezir: V, Piyon: P Satır: 1, 2, 3, 4, 5, 6, 7, 8 Sütun: A, B, C, D, E, F, G, H SINIF BİLGİLERİ: HAMLE FORMATI SINIFI: Bu sınıfta hamle formatında tutulması gereken veriler tanımlanmalı ve LinkedList sınıfına bağlanmalıdır. class HamleFormati{…} ANA SINIF: Bu sınıfta LinkedList sınıfları ile iki kullanıcıya özel sınıflar taımlanmalı ve LinkedList sınıfının hazır fonksiyonları* kullanılarak aşağıda tavsiye edilen metodlar yazılmalıdır: hamleEkleA(HamleFormati hamle) {………} hamleEkleB(HamleFormati hamle) {………} hamleListeleA() {………….} hamleListeleB() {………….} sonHamleyiGeriAlA(){…} sonHamleyiGeriAlB(){…} sonHamleleriGerialAB(){…} karsilikliHamleListeleAB(){…} Boolean hamleFormatiUygunmu(String hamleGirdi){…} MAİN METODU: Bu metod içerisinde A ve B oyuncuları içi sırayla karşılıklı hamle girdileri istenecektir. Girdi olarak alınan String ifadeler pars** edilerek her bir karakterin Hamle formatına uygun yapılıp yapılmadığının kontrolü yapan hamleFormatiUygunmu() fonksiyonundan uygun değer dönerse hamleyi A veya B oyuncusunun listesine eklemelidir. Uygun değilse girdiyi tekrar istemelidir. Bu işlemler konsol ortamında olmalı ve aşağıdaki formatla kullanıcı ile etkileşimde bulunmalıdır. Girilen komuta göre işlem yapılması sağlanmalıdır. KONSOL EKRANI FORMATI: * LinkedList sınıfının hazır fonksiyonları hakkında genel 1‐ Oyuncu A için hamle gir bilgiler için bilgilendirici linkler Web sitesinde verilecektir. 2‐ Oyuncu B için hamle gir ** String ifadeleri char dizisine pars etmek için 3‐ Oyuncu A’ nın hamlelerini listele char c = s.charAt(0); gibi bir fonksiyon kullanılabilir. 4‐ Oyuncu B’ nin hamlelerini listele 5‐ Oyuncu A’ nın son hamlesini geri al *** LinkedList sınıfı ile ilgili örnek oluşturacak bir uygulama 6‐ Oyuncu B’ nin son hamlesini geri al aşağıda verilmiştir. 7‐ Oyuncu A ve B’ nin tüm hamlelerini listele Komut Giriniz: ___ LinkedList SINIFI ÖRNEK KOD:*** import java.util.LinkedList; class Col{ int i; String g; byte a; public Col(int i, String g,byte a){ this.a=a; this.g=g; this.i=i; } } public class LinkList { public static void main(String args[]) { // bir bağlı liste oluştur // eğer tek bir temel tip tutulacaksa bağlı liste nesnesi aşağıdaki gibi tanımlanmalı LinkedList<Integer> llint=new LinkedList<Integer>(); LinkedList<String> llStr=new LinkedList<String>(); LinkedList ll=new LinkedList() //eğer birden fazla tip içeren bir liste isteniyorsa bağlı listeye bir sınıf atanabilir: LinkedList<Col> llC = new LinkedList<Col>(); //atanan sınıftan yeni nesne tanımlanır Col c=new Col(65,"fat",(byte) 3); //String de bir sınıftır. tanımlanan string sınıfı bilgi tutan bağlı listeye eleman ekleme: llStr.add("merhaba"); llStr.add("Dünya"); System.out.println("String Bağlı listenin tüm içeriğine erişilir: " + llStr); //İnt. temel bir tiptir. tanımlanan int tip tutan bağlı listeye eleman ekleme llint.add(56); llint.add(3); System.out.println("Integer Bağlı listenin tüm içeriğine erişilir: " + llint); // Sınıf ile bağlı listeye ekleme aşağıdaki gibi yapılır llC.add(c); System.out.println("Con sınıfından c nesnesinin g değişkenine ulaşma: " + llC.get(0).g); System.out.println("Con sınıfından c nesnesinin a değişkenine ulaşma: " + llC.get(0).a); System.out.println("Con sınıfından c nesnesinin i değişkenine ulaşma: " + llC.get(0).i); } } 3‐ JAVA bağlı listeleri kullanarak içeriği string olan bir değer tutan Stack (yığın) sınıfı yazılacaktır. Sınıfa ait istenen yordamlar aşağıda sıralanmıştır. Bu fonksiyonlar ile main yordamında ekleme ve silme işlemleri yapabilmeli ve mevcut yığın listelenebilmelidir. İSTENEN YORDAMLAR: 1‐ Stack’e değer ekleme 2‐ Stack’den değer silme/çekme (Çekilen değer ekrana basılacak) 3‐ Stack listeleme 4‐ Stack eleman sayısı 4‐ JAVA bağlı listeleri kullanarak içeriği string olan bir değer tutan Queue (Kuyruk) sınıfı yazılacaktır. Sınıfa ait istenen yordamlar aşağıda sıralanmıştır. Bu fonksiyonlar ile main yordamında ekleme ve silme işlemleri yapabilmeli ve mevcut kuyruk listelenebilmelidir. İSTENEN YORDAMLAR: 1‐ Kuyruğa değer ekleme 2‐ Kuyruktan değer silme/çekme (Çekilen değer ekrana basılacak) 3‐ Kuyruk listeleme 4‐ Kuyruk eleman sayısı 5‐ JAVA bağlı liste sınıfı (LinkedList) kullanarak içeriği tam sayı olan bir değerler tutan Karma Tablosu (Hash Table) sınıfı yazılacaktır. Sınıfa ait istenen yordamlar aşağıda sıralanmıştır. Ayrıca model ait örnek bir model çizimi aşağıda verilmiştir. Bu fonksiyonlar ile main yordamı altında ekleme ve silme işlemleri yapabilmeli ve mevcut Karma tablo listelenebilmelidir. İSTENEN YORDAMLAR: 1‐ Karma Tabloya değer ekleme 2‐ Karma Tablodan değer silme/çekme (Çekilen değer ekrana basılacak) 3‐ Tüm Karma Tablo listeleme 4‐ Tüm Karma Tablo eleman sayısı 5‐ Herhangi bir satır Karma Tablo listeleme 6‐ Herhangi bir satır Karma Tablo eleman sayısı 
Download