1
Çankırı Karatekin Üniversitesi
Bilgisayar Mühendisliği Bölümü 2019-2020 Bahar Yarıyılı JAVA Dersi Vize Projesi
Proje Adı:
Güneş Sistemi Kayıtları.
Proje Yapısı:
2
Proje Açıklaması:
1. Projenizin kayıtlı olduğu klasör içine “dosyalar” isimli klasör oluşturunuz. Oluşturduğunuz klasör içine de aşağıda verilen .txt uzantılı dosyaları oluşturunuz. Oluşturduğunuz .txt uzantılı
dosyalardan Katalog.txt dosyasının içini aşağıdaki şekilde doldurunuz. Diğer .txt uzantılı dosyaların içleri boş kalmalı, program aracılığı ile dolmalıdır. Bu aşamada anlatılan dosya oluşturma ve doldurma işlemlerinin hepsini el ile manuel yapınız.
2. Super Class: GokCismi.java
Bu sınıfta gök cisminin ismi, konumu, çapı, güneşe uzaklığı, gün uzunluğu, yıl uzunluğu, kütlesi, yüzey çekim ivmesi bilgileri tutulacaktır. Bu bilgiler için set / get metotları yazınız. Bu bilgilerin hepsi UygulamaMain,java sınıfında kullanıcıdan alınarak sub classlardan obje oluştururken sub classın kurucu metotlarına gönderilecektir. Super classın kurucu metodunda çekim ivmesi parametresi olmayacak fakat metot içinde ataması yapılacaktır (Örnek: this.cekim_ivmesi = ivmeHesapla(kutle, cap);).
Yüzey çekim ivmesi kullanıcıdan alınan kütle ve çap bilgileri ile bu sınıf içinde otomatik olarak hesaplanacaktır (Örnek: ivmeHesapla(kutle, cap)). Kepler Çekim Kanununa göre her gök cisminin yüzey çekim ivmesi şu şekilde hesaplanır:
𝑔 = 𝐺(𝑀𝑔𝑒𝑧/𝑅𝑔𝑒𝑧2 ) 𝑔: Yüzey Çekim İvmesi (𝑚/𝑠2)
G: 6.67x10−11 (𝑚3/𝑘𝑔𝑠2) (sabit)
3 𝑀𝑔𝑒𝑧: Gezegenin Kütlesi (kg)
𝑅𝑔𝑒𝑧: Gezegenin Yarı Çapı (m)
Gezegen kütleleri çok yüksek değerde oldukları için bu sınıf içinde 1019 değerinde bir sabit tanımlanabilir (Örnek: final double kat = Math.pow(10, 19)). Kullanıcı kütle değerini girerken veri seti tablosundaki değerleri girebilir fakat ivme hesaplanırken 𝑀𝑔𝑒𝑧 = kutle*kat şeklinde alınabilir. Aynı şekilde G değeri sınıf içinde sabit olarak tanımlanmalıdır. Veri setinde çap değeri km cinsinden verilmiştir formüle göre yarı çap ve metre cinsinden olması gerektiğini gözden kaçırmayınız. Doğru birim ve değerleri kullanarak doğru hesap yaptığınız sürece istediğiniz algoritmayı üretip kullanabilirsiniz. Son olarak bu sınıfa ait toString metodu yazınız.
3. Interface: IGokCismi.java
Bu interface içinde dosyayaYaz() ve ivmeyiDosyayaYaz() isimli iki adet abstract metot olmalıdır. Sub classların hepsi GokCismi.java sınıfından türetilecek ve IGokCismi.java arayüzünü implement edecektir.
4. Sub Class 1: Gezegen.java
Bu sınıfta gezegenin tipi, uydu sayısı ve uydu bilgileri tutulacak diğer bütün özelliklerini süper classından miras alacaktır. Uydu bilgileri, Uydu.java sınıfından aggregation yoluyla bu sınıfa özellik olarak gelmekte ve dizi yapısındadır (Örnek: uydu [] uyduBilgileri). Bir gezegenin iki adet uydusu varsa; uyduBilgileri[0] birinci uydu bilgilerini, uyduBilgileri[1] ise ikinci uydu bilgilerini tutmaktadır.
Bu sınıfa ait constructor ve toString metodunu yazınız. İmplement ettiğiniz arayüz nedeniyle override etmeniz gereken dosyayaYaz metodunda gezegene ait tüm bilgileri "dosyalar\\Gezegen.txt" dosyasına yazdırınız. Aynı şekilde hangi gezegen girildiyse ivme değerini ivmeyiDosyayaYaz isimli metodu override ederken gezegen ismi ve ivmesi şeklinde "dosyalar\\ivme.txt" dosyasına yazdırınız.
5. Sub Class 2: Uydu.java
Uydu isimli sınıf GokCismi sınıfından türetilmelidir. Bu sınıfın kendine ait özellikleri yoktur. Tüm özelliklerini super classtan miras almaktadır. Bu sınıfa constructor ve toString metotları yazınız.
Kullanıcı gezegen girerken uydu bilgilerini de gireceğinden uygulama tek başına uydu eklemesi yapmayacak gezegen ve uydu bilgilerini birlikte alacaktır (Her uydu bir gezegene aittir). Gezegen bilgileri, Gezegen.java sınıfı aracılığı ile "dosyalar\\Gezegen.txt" dosyasına yazdırılacak, uydu bilgileri ise Uydu sınıfı aracılığı ile "dosyalar\\Uydu.txt" dosyasına yazdırılacaktır. İmplement ettiğiniz arayüz nedeniyle override etmeniz gereken dosyayaYaz metodunda uyduya ait tüm bilgileri
"dosyalar\\Uydu.txt" dosyasına yazdırınız. Aynı şekilde gezegenle birlikte hangi uydu girildiyse uydunun ivme değerini, ivmeyiDosyayaYaz isimli metodu override ederken uydu ismi ve ivmesi şeklinde "dosyalar\\ivme.txt" dosyasına yazdırınız.
6. Sub Class 3: Yildiz.java
Bu sınıfta yıldızın yaş bilgisi tutulacak diğer bütün özelliklerini süper classtan miras alacaktır. Bu sınıfa constructor ve toString metotları yazınız. İmplement ettiğiniz arayüz nedeniyle override etmeniz gereken dosyayaYaz metodunda yıldıza ait tüm bilgileri "dosyalar\\Yıldız.txt" dosyasına yazdırınız.
Aynı şekilde yıldızın ivme değerini, ivmeyiDosyayaYaz isimli metodu override ederken yıldız ismi ve ivmesi şeklinde "dosyalar\\ivme.txt" dosyasına yazdırınız.
7. Sub Class 4: Asteroit.java
4
Bu sınıfta asteroitin tip bilgisi tutulacak diğer bütün özelliklerini süper classtan miras alacaktır. Bu sınıfa constructor ve toString metotları yazınız. Asteroitin tip bilgisi otomatik olarak bu sınıf içinde hesaplanmalıdır. Kurucu metodunda parametre olarak bulunmayacak fakat içinde ataması yapılacaktır (Örnek: this.tip = tipBul(cap)). Çapları 10−2 ile 10−7 km arasında kalan asteroitlere “meteorit” denir.
Diğer çap boyutunda olanların tipi “asteroit” olarak isimlendirilir. Bu bilgilere göre tipBul() metodunu yazınız. İmplement ettiğiniz arayüz nedeniyle override etmeniz gereken dosyayaYaz metodunda asteroite ait tüm bilgileri "dosyalar\\Asteroit.txt" dosyasına yazdırınız. Aynı şekilde asteroitin ivme değerini, ivmeyiDosyayaYaz isimli metodu override ederken asteroit ismi ve ivmesi şeklinde
"dosyalar\\ivme.txt" dosyasına yazdırınız.
8. Class: UygulamaMain.java
Bu sınıf uygulamayı şekillendiren temel işlemlerin yapıldığı sınıftır. Main() metodu ve obje oluşturmalar bu sınıf içinde yapılacaktır. Bu sınıfta genel olarak hangi işlemlerin yapılacağı ekran görüntüleri ile aşağıda anlatılmaktadır.
• Kullanıcı için ana menü yazılmalıdır. Kullanıcı 0 seçmediği sürece program çalışmalı, 0 seçtiğinde program sonlanmalıdır.
• Kullanıcı 1 seçerse gök cisimleri menüsü açılmalıdır. Açılan menü, Katalog.txt dosyasından okunarak ekrana yazdırılırken numaralandırılması gerekmektedir.
• Kullanıcı eklemek istediği gök cisminin numarasını girdikten sonra kullanıcıdan gök cismine ait bilgiler istenmelidir. Örneğin gezegen eklemek istersek; uydu bilgileri de gezegenle birlikte istenmeli. Uydusu yok ise uydu bilgileri istenmemelidir (gezegenEkle()). Yıldız ve asteroit eklenirken kendine ait tüm özellikleri istenmelidir (yildizEkle(), asteroitEkle()). Kullanıcı uydu eklemek isterse “Her uydu bir gezegene aittir” kuralını unutmayınız ve gezegenle birlikte uydu bilgilerini isteyiniz (uyduEkle()). Her eklenen gök cismi türü için; kendine ait sınıfından obje oluşturulacak kurucu metoduna kullanıcıdan alınan bilgiler olması gereken sırasıyla gönderilecek böylece dosyalara tüm bilgileri ile yazdırılacaktır.
Seçim:2 için ekran görüntüsü:
5
• Kullanıcı ana menüden 2’yi seçerek dosyalarda kayıtlı olan gök cisimlerini kategorik olarak listelemek isterse ilk önce gök cisimleri menüsü açılmalıdır. Açılan menü, Katalog.txt dosyasından okunarak ekrana yazdırılırken numaralandırılması gerekmektedir. Örneğin; gök
Gezegenin uydusu yoksa uydu bilgileri girilmesini istemiyor.
Gezegenin kaç uydusu varsa tüm uydularının bilgilerini istiyor.
Seçim:1 için ekran görüntüsü
6
cisimleri menüsünden 2’yi seçerek Uydu kategorisini listelemek isterse Uydu.txt dosyasındaki tüm uydu kayıtları okunarak ekrana basılmalıdır (uyduListele()).
• Kullanıcı ana menüden 3’ü seçerek tüm gök cisimlerini listelemek isterse; tüm gök cisimlerinin .txt dosyaları okunmalı ve ekrana basılmalı (hepsiniListele()).
• Kullanıcı ana menüden 4’ü seçerek gök cisimlerinin yüzey çekim ivmelerini listelemek isterse; ivme.txt dosyası okunarak ekrana basılmalıdır.
• Dosya içi görünümleri şu şekilde olmalıdır:
7
• Uygulama için gereken verileri aşağıdaki tablodan elde edebilirsiniz.
İsim Tür Konum Çap
(km)
Güneşe Uzaklık (km)
Gün Uzunluğu (gün)
Yıl Uzunluğu (yıl)
Kütle (x𝟏𝟎𝟏𝟗 kg) Yıldız Yaşı (yıl)
Ceres Cüce Gezegen
Asteroit Kuşağı
960 423.000.000 0,377777778 4,10 94,45
Dünya Gezegen İç Güneş Sistemi
12709 148.000.000 1 1 597237
Ay Uydu (Dünya)
İç Güneş Sistemi
3483 148.384.000 1 0,07392355 7347,7
Mars Gezegen İç Güneş Sistemi
6767 230.000.000 1 1,80 64171
Phobos Uydu (Mars)
İç Güneş Sistemi
23 230.009.000 1 0,001026716 0,00107
Deimos Uydu (Mars)
İç Güneş Sistemi
12 230.023.000 1 0,003422387 0,0002
Orcus Cüce Gezegen
Kuiper Kuşağı
1342 5.918.000.000 0,549305556 245 486852
Vanth Uydu (Orcus)
Kuiper Kuşağı
278 5.918.104.000 0,549305556 0,027379093 64,1 Eris Cüce
Gezegen
Dağınık Disk
2438 10.854.000.000 1,07916667 569,8 1670
Dysnomia Uydu (Eris)
Dağınık Disk
254 10.854.210.000 1,07916667 0,041068639 14,3
Vesta Asteroit Asteroit Kuşağı
524 372.000.000 0,208333333 3,6 25,9
Pallas Asteroit Asteroit Kuşağı
542 460.000.000 0,208333333 4,6 12
Hygiea Asteroit Asteroit Kuşağı
433 523.000.000 1,16666667 5,4 8,67
Halley Kuyrulu Yıldız
Değişken 11 93.000.000 2,2 76,1 0,00017 4.500.000
Güneş Süper Yıldız
Merkez 1324332 0 26 224.000.000 198.910.000.000 4.500.000
Proje Teslimi ve Değerlendirilmesi:
• Genel olarak bireysel çalıştığınız sürece projenizdeki tüm işlemler için internetten yardım alabilirsiniz buna ek olarak dosyaya yazma ve dosyadan okuma işlemleri için aşağıdaki sitelerden yardım alabilirsiniz:
✓ https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android- 101/javada- dosya-islemleri
✓ https://www.youtube.com/watch?v=yfew3_730zQ buradaki video serisi
✓ https://www.yazilimbilisim.net/java/java-dosya-islemeleri/
✓ https://yazdoldur.com/programlama/java/java-i-o-islemleri-dosya-islemleri/
• Proje yapısı bölümünde verilen diyagramları takip ederek projenizi oluşturunuz. Projeniz içinde eksik ya da fazla sınıf oluşturmayınız. Kod isimlendirmelerinize dikkat ediniz, Türkçe karakterler kullanmayınız. Her sınıfın içine kod başına: /* ÖğrenciNo Ad Soyad ŞubeNo*/ ekleyiniz. Her kod bloğu için açıklama satırı yazınız. Ekran çıktısı yazıları, sınıf isimleri bu yazıda verilenlerle birebir
8
aynı olmalıdır. Projenizi tam çalışıyor şeklinde kodlayamazsanız dahi gönderiniz. Yazdığınız her bir satır kod değerlendirmeye alınacaktır. Projeyi bireysel olarak yapınız. Tek bir projeyi grup şeklinde kodlayarak birden fazla kişinin gönderdiği ya da bireysel gönderilen projelerin birebir aynı olduğu tespit edilirse hiçbir sebep göstermeye hakkınız yoktur ve projeniz değerlendirmeye alınmayacaktır. Bu maddede yazan her şey değerlendirmeye dahildir.
• Klasör adı, “ÖgrNo_AdSoyad_SubeNo “ olan bir klasör oluşturunuz. Bu klasör içine eclipse workspace’te bulunan tüm proje klasörünüzü eksiksiz koyup sıkıştırılmış şekliyle mail atınız.
Proje dosyası çalıştırılabilir olmalı eksik göndermeyiniz. Ayrıca mailinizin gereksiz/istenmeyen kutusuna düşmemesi için mailinize konu başlığını mutlaka ekleyiniz. Mailinizin konusuna “JAVA Vize Projesi”, içine ise öğrenci numaranızı, adınızı, soyadınızı, şube numaranızı mutlaka yazınız.
Eklemek istediğiniz açıklamaları da resmi şekilde mail içine yazabilirsiniz.