osa1 feed

Java ile süper gereksiz işler

October 8, 2010 - Tagged as: java, tr.

Bugün bil113 lab dersinde çözmemiz istenen 3 problemden birisi benim daha önceden Python ile çözdüğüm şeyin biraz daha basit haliydi. Kullanıcıdan istenen bir tek pozitif tam sayıya göre aşağıdaki gibi bir şekil çizmemiz gerekiyordu:

Tek pozitif bir tamsayi giriniz:
5

  *
 ***
*****
 ***
  *

Neyse, daha önceden çözdüğümden az da olsa bir fikrim vardı, çözüm sadece for ve if(kullanıcının girdiği sayıyı kontrol amacıyla) döngüleri kullanılarak yapılmalıydı. Ders sırasında, bazı yerlerde deneme-yanılma yoluyla(şu anda sorsanız anlatamam), aşağıdaki kodu yazdım:

import java.util.Scanner;
public class LabUcgen {
    public static void main(String[] args) {
        int tamsayi;
        Scanner girdi = new Scanner(System.in);
        System.out.println("Lutfen bir tek tamsayi degeri giriniz:");
        tamsayi = girdi.nextInt();
        int tamsayi2 = tamsayi;
        for (int satir=1; satir < tamsayi2-1; satir++) {
            for (int bosluk=0; bosluk + tamsayi < tamsayi2-bosluk; bosluk++ ) {
                System.out.print(" ");
            }
            for (int yildiz = 1; yildiz < tamsayi+1; yildiz++) {
                System.out.print("*");
            }
            System.out.println("");
            tamsayi = tamsayi - 2;
        }
    }
}

Daha sonra biraz daha düşündüm, kağıt kalem elde, satır sayısına göre kaç boşluk ve kaç yıldız koyulması gerektiğini döndüren bir fonksiyon yazmaya kalktım, Java’da beceremedim(çok uğraşmadım da, henüz arrayden başka veri yapısı bilmiyorum Java’da), fakat Python’da şöyle bir recursive fonksiyon yazabildim:

def hesap(yildiz, satir):
    bb = yildiz/2+1
    if satir <= yildiz/2:
        bosluk = bb-satir # kac tane bosluk?
        yildiz_sayisi = yildiz-bosluk*2
    else:
        return hesap(yildiz, yildiz-satir+1)
    return (bosluk, yildiz_sayisi)

>>> hesap(9, 3)
(2, 5)
>>> hesap(9, 3) == hesap(9, 7)
True

Bu fonksiyonun olayı şu: örneğin 9 yıldızlık bir şekil çizdirecekseniz, 2. ve 8. satırlar birbirinin aynısı olacak. Şekil 5. satıra göre simetrik olacak yani. Dolayısıyla kullanıcı 8. satırda ne olmalı diye fonksiyonu çağırdığında, fonksiyon aslında 2. satırda ne olduğunu gösterecek(bkz hesap(yildiz, yildiz-satir+1), satir 8 ise, 9-8+1’den 2. satırı çağıracak).

Java’da da benzer bir şekilde, fakat herhangi bir method kullanmadan şu şekilde çözdüm:

public class LabUcgen3 {
    public static void main(String[] args) {
        int yildizSayisi = 13;
        int bb = yildizSayisi/2+1;
        int satir = 1;
        
        for (int baslangic = 0; satir < yildizSayisi; satir++) {
            int yazilanSatir;
            
            if (satir >= yildizSayisi/2) {
                yazilanSatir = yildizSayisi-satir-1;
            } else {
                yazilanSatir = satir;
            }
            int yazilacakBoslukSayisi = bb-yazilanSatir;
            int yazilacakYildizSayisi = yildizSayisi-yazilacakBoslukSayisi*2;
            
            for (int yazilanBosluk = 0; yazilanBosluk < yazilacakBoslukSayisi; yazilanBosluk++) {
                System.out.print(" ");
            }
            for (int yazilanYildiz = 0; yazilanYildiz < yazilacakYildizSayisi; yazilanYildiz++) {
                System.out.print("*");
            }
            System.out.println("");
        }
    }
}

Bu kodda aslında yukarıda yazdığım Python kodunun yaptığı işi yapmaya çalıştım, toplamSatirSayisi(ki bu yildizSayisi’na eşit)/2+1 simetri eksenim oldu, onun aşağısı ve yukarısı simetrik. if-else içerisinde yazdığım kod bu işe yarıyor, örneğin 9 yıldızlı bir şekil çizdereceksem ve 6.satırdaysam, satır sayım 9/2 den 4’ü geçtiği için, yazilanSatir = yildizSayisi-satir-1; kodu ile yazdığım satırı değiştiriyorum.

Daha kısa bir şekilde çözen var mı? Benim aklıma gelen en kısa yöntem buydu, onu da Python’da yazıp Java’ya çevirdim zaten(bu arada Java’ya da alışıyorum, uzun değişken isimleri falan, ehehe).