Python Üçgen Oluşturma Uygulaması

       Bugün python örneklerinde sıkça kullanılan üçgen yapma uygulamasını yapacağız. Aşama aşama ilerleyip, en sonunda baklava dilimi halinde istediğimiz sürece uzayan bir motif çıktı almaya kadar gideceğiz. Yapacağımız uygulamada herhangi bir kütüphaneyi projemize dahil etmemize gerek yok. İlk olarak kullanıcdan bir değer alarak, verilen değer kadar uzayan bir üçgen yapmayı halledelim. Bunun için pythonun sağladığı bir metod olan "input" u kullanacağız. "input" metodu sayesinde kullanıcıdan girdi alabiliyorsunuz. Örnek kullanımı görmek için ufak bir örnek yapmak gerekirse:

kullaniciSecimi = int(input("Lütfen bir sayi giriniz: ")) 
print("Girdiğiniz sayinin iki katı: {sayi}".format(sayi=kullaniciSecimi*2))

       Çıktı:

Lütfen bir sayi giriniz: 2
Girdiğiniz sayinin iki katı: 4

       Görebileceğiniz üzere kullanıcıdan bir girdi alıp iki katını çıktı verdik. Artık kullanıcıdan veri alma yolunu öğrendiğimize göre ilk örneğimize devam edebiliriz. Bahsettiğim üzere kullanıcıdan oluşacak üçgenin uzunluğunu alacağız.

kacSatir = int(input("Lütfen kac satir istediginizi giriniz: "))

       Bu alacağımız girdi bizim oluşturacağımız üçgenin satır sayısı olacağından, yapacağımız işlemin tekrar sayısı olarak görebiliriz. Yani bu demek oluyorki çalıştıracağımız döngümüz bu sayı kadar tekrar edecek. Bu tekrar sayısını belirtirken bir yandan da oluşturacağımız metini çıktı alırken de kullacağımızdan forumuzda range komutuyla iterasyon sırasında kullanılıcak rakamlar dizesini belirliyoruz. Bu aşamadan itibaren daha rahat anlamanız açısından, kod üzerinden devam  etmek istiyorum.

for satirSayisi in range(1,kacSatir+1):
    print ("*" * satirSayisi) 

       Şimdi bahsettiğim üzere for döngümüzü oluşturduk lakin burada bir detayı fark etmişsinizdir. Şöyle ki; range fonksiyonu girdiğiniz ilk parametre ile ikinci parametrenin bir eksiğine kadar oluşan bir liste döndürür. Örnek vermek gerekirse: range(1,10) derseniz eğer, size [1,2,3,4,5,6,7,8,9] sayıları döner. Fark edeceğiniz üzere belirlediğimiz ikinci parametreyi dahil etmiyor. Bizimde kullanacağımız çıktı şeklinde satir sayisini aktif olarak kullandığımızdan "kacSatir+1" diyerek bize verilen rakamı da dahil eden bir liste oluşturuyoruz. Ardından da for un çalışma mantığını kullanıyoruz. Yani vermiş olduğumuz dizi elemanlarını bir bir dolaşmasını sağlıyoruz. Bunun içinde farazi olarak her bir elemana açıklayıcı olsun diye "satirSayisi" diyoruz. İki noktamızı da koyduktan sonra içerisine tek bir satırda, şu an yaptırmak istediğimiz işlemi halledicek çıktı komutunu veriyoruz. Print metodunun içerisine yazılan işlem aslında bir çarpma işlemi gibi düşünebilirsiz. Eğer sayı olarak aynı işlemi yaptırmak isteseydiniz yine sıkıntı olmayacaktı. print(2*3) dediğiniz zaman çıktı olarak 6 dönecekti yani. Burada tek yaptığımız işlem; bir sayının çarpılması değil, bir metinin çarpılması yani. Bu sayede her bir satırda, bulunduğu satır sayısı kadar "*" karakterini basıyor. Yani bizim istediğimiz şeyi.

       Yazdığımız kodları çalıştırırsak eğer:

Lütfen kac satir istediginizi giriniz: 5
*
**
***
****
*****

       Görebileceğiniz gibi, vermiş olduğumuz sayı kadar satırlık bir üçgen oluşturduk. Şimdi ise aynısının yaslandığı duvarı tam zıttı halini yapalım. Bunun için ise şöyle düşünmelisiniz.

        Önceki örnekten bakarak anlayacağınız üzere bizim bir satırda çıkabileceğimiz maksimum karakter sayısı aslında kullanıcı tarafından verilen rakam. Yani eğer 5 satır isteniyorsa, maksimum 5 tane yıldız bir araya gelerek son satırı oluştaracak. Bizim yapmak istediğimiz de oluşturmuş olduğumuz üçgenin tarafını tam terse çevirmek. Bunun içinde aslında normalde hemen bastığımız yıldızların önüne belli bir miktar boşluk koyup öyle basmalıyız ki tam zıt tarafta olsun. Bunu yaparkende az önce bahsetmiş olduğum satır sayısını kullanacağız. Örnek vermek gerekirse, 6 satırlı bir yıldız istedik. Bu durumda bizim üçgenimiz maksimum 6 karakter olabilir. Yani ilk satıra bakacak olursak, 6 satır uzunluğunda olmalı ki altında oluşacak üögenle uyumlu olsun, ayırcada işte asıl olay olan: 6-1=5 satır önünde boşluk olsun. Bunu da otomatik hale getirmek bizim için çok kolay. Az önce yapmış olduğumuz döngüde "*" karakterini basarken kullandığımız çarpma işlemini " " (boşluk) karakteri içinde yapıcaz:

 for satirSayisi in range(1,kacSatir+1):
        print(" "* (kacSatir-satirSayisi) + "*"*satirSayisi)

       Çalıştırdığımız zaman elde edeceğimiz örnek çıktıya bakarsak eğer:

 

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

       İşte istediğimizi yaptık. Sırada ise bu iki örneği birleştirerek birer baklava deseni oluşturmak. Bunun için ise ilk önce yapmış olduğumuz örnekleri beraber nasıl çıktı alırız onu halletmemiz lazım. Yapmamız gereken işlem aslında yine tek satırda halledilebilir. Sadece az önce yaptığımız ters üçgeni oluştururken araya koymuş olduğumuz boşluk sayısını ikiye katlamak. Bunun içinde print metodu içerisinde ikiyle çarpmamız gayet işimizi görüyor. Koda ve örnek çıktısına bakalım:

 for satirSayisi in range(1,kacSatir+1):
        print("*" * satirSayisi+" "* ((kacSatir-satirSayisi)*2) + "*"*satirSayisi)

Çıktımız:

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

       Tam olarak istediğimiz şey olmuş durumda. Şimdi ise makalenin başında bahsetmiş olduğum, baklava desenini çıkarmak için bu üçgenleri ters çevirmemiz lazım. Bunun içinde aslında içine yazmış olduğumuz parametlerin yerlerini değiştirmemiz yeterli:

for satirSayisi in range(1,kacSatir+1):
        print("*" * satirSayisi+" "* ((kacSatir-satirSayisi)*2) + "*"*satirSayisi)
for satirSayisi in range(1,kacSatir+1):
        print("*" * (kacSatir-satirSayisi)+" "* (satirSayisi*2) + "*"*(kacSatir-satirSayisi))

 

       Çıktımız:

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

       Şimdi ise bu oluşturduğumuz deseni tekrar ederek basmamız lazım ki birleştiğinde bir baklava görünümünü alsın. Bunun için ben yine istenilen satır kadar tekrar eden bir for döngüsü kullandım.

for tekrar in range(0,kacSatir):
    for satirSayisi in range(1,kacSatir+1):
            print("*" * satirSayisi+" "* ((kacSatir-satirSayisi)*2) + "*"*satirSayisi)
    for satirSayisi in range(1,kacSatir+1):
            print("*" * (kacSatir-satirSayisi)+" "* (satirSayisi*2) + "*"*(kacSatir-satirSayisi))

       Mutlak çıktımız ise:

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

       Şeklinde oldu. Göreceğiniz üzere sadece bir üçgen yaparak başladığımız bu yazımızın sonunda, bir kaç sayı ile oynarak kendi deseninizi basabileceğiniz bir uygulamanız oldu. Dilerim faydalı olmuştur. Başka örneklerle görüşmek üzere. Kodunuz bol ama öz olsun!

Add comment