Python ile İbre oluşturma

Herkese selamlar,

Bir ibre oluşturmak istiyorum ama nasıl koda dökeceğimi bilemedim.

print("||-----*-----||") 

şeklinde bir ibremiz olduğunu varsayalım. İbrenin başlangıcı 8, bitişi 24 ve güncel durumu da 16 olsun. Yıldızın solunda 5 sağında da 5 tane " - " kalır (10 tane " - " olduğunu varsayarsak).

Tabi bu noktada başlangıç, bitiş ve güncel değerlerin değişeceğini düşünürsek nasıl bir fonksiyon oluşturmalı ki fonksiyona her 3 değeri de gönderdiğimizde " * " ın doğru yerini tespit etsin.

Teşekkürler

Selam,

Şimdi benim, x uzunluğunda bir ibrem var diyelim. Bu ibrenin 0 noktası yani başlangıç değeri baslangic, bitiş değeri de bitis olsun. Yani x uzunluğundaki bir çizginin baslangıç değerini ve bitiş değerini biliyorum.

baslangic'in değeri 0, bitis'in değeri 100 ve x'in de değeri 100 olsaydı, (bitis - baslangic) // x oranı 1 olurdu. Bu durumda, guncel_deger ne olursa olsun, ibredeki yeri guncel_deger kadar olurdu. Ama bu oran 1 olmadığına göre, guncel_deger'in gerçek değerini guncel_deger * (bitis - baslangic) // x işlemiyle bulurum. İbreyi çizmek için guncel_durum'u ve x'i kullanabilirim artık.

1 Beğeni

Bu tur problemlerde ilk yaklasim tum menzilleri 0–1 arasina almak olmali.

ibre_kusur = durum_to_kusur(8, 24, 16) #[0, 1]
ibre_ascii = kusur_to_ascii("-", 10, ibre_kusur)

Selam,

Buradaki formülde ufak bir hata var sanırım.

x (ibre uzunluğu) = 10
baslangic=0
bitis=100
guncel_durum=50

varsaydığımızda olması gereken değer 5

ibre_degeri=(50 * ((100 - 0))) // 10

işleminin sonucu 500

yüz katlık bir hata çıkıyor :slight_smile:

5*(100-0)= 500

Bölü işareti forumda sorun olduğu için iki kere yazılmış.

Yani 500 Bölü 10 = 50.

Yani söylediğin hali ile bile sadece on kat çıkardı ki işlem ve formül doğru.

Dostum ya işlemini ya matematiğini kontrol etsen iyi olur.

5 çarpı DEĞİL 50 çarpı parantez içinde 100 eksi 0 O da eşittir 5,000 (Beşbin) bunu da 10’a (ibre uzunluğuna) bölersen 500 çıkar bu da olması gereken rakamdan 10 kat fazladır (50 çarpı 10 eşittir 500)

Düşük Yüksek ve Güncel değeri toplayıp 3 e bölünce sonra da ibre uzunluğuna bölünce sonuç ortaya çıkıyor.

ibre_degeri=((baslangic + bitis + guncel_durum)/3)/ibre_uzunlugu

((100+0+50)/3)/10 = 5

10 a böl, 100e böl 1000’e böl sana kaç segment lazımsa ona göre ayarla bir satır çarp böl topla mekanizması örneği vermiş hangisi lazımsa kendine göre ayarla büyütülecek bir sorun görmüyorum bunda.

Sıfırla neden toplamaya gerek gördün diye sormuyorum bak, ihtiyacına göre üst marj alt marj ayarlarsın.

Aslında sorunun daha eli yüzü düzgün çözümleri var ama problemleri var ama şu an bunlara değinmek bile istemiyorum.

Rakam 3’e bölünmezse ne yapacaksın mesela?

Eliyüzü düzgün bir kod eklerim sonra eğer ihtiyaç olursa.

Selam,

def draw_arrow(start, end, current, left_dash=5, right_dash=5):
    arrow_length = end - start
    arrow_position = current - start

    left_space = left_dash * " "
    right_space = right_dash * " "

    left_arrow = "-" * (arrow_position - 1) + "*" + "-" * (left_dash - arrow_position)
    right_arrow = "-" * (right_dash - arrow_length + arrow_position - 1) + "*" + "-" * (arrow_length - arrow_position)

    arrow = "||" + left_space + left_arrow + right_arrow + right_space + "||"
    return arrow

start = 8
end = 24
current = 16
left_dash = 5
right_dash = 5

arrow = draw_arrow(start, end, current, left_dash, right_dash)

print(arrow)

İşini gören bir tasarım mı? Değer değişkenleri üzerinden artışlar ve değişiklikler yapılarak düzenleme sağlanabilir.

verilen başlangıç, bitiş ve güncel değerlerin yanı sıra yıldızın solunda ve sağında kaç adet “-” karakteri olacağı da fonksiyona parametre olarak veriliyor. Fonksiyon, verilen değerlere göre bir ok/ibre şekli oluşturuyor.

Fonksiyon, öncelikle okun uzunluğunu ve pozisyonunu hesaplar ve sol ve sağdaki boşlukları ve “-” karakterlerini oluşturur. Daha sonra, sol ve sağ okların “-” karakterleri de hesaplanarak ok oluşturulur ve döndürür

Evet, hata yapmışım. guncel_deger * (bitis - baslangic) // x yerine guncel_deger * x // (bitis - baslangic) olması gerekiyor.

def ibre_ciz(bitis, baslangic, uzunluk, deger):
     ibre = deger * uzunluk // (bitis - baslangic)
     return "-" * ibre + "+" + "-" * (uzunluk - ibre)
     
     
         
print(ibre_ciz(100, 0, 10, 70))
1 Beğeni

Teşekkür ederim. Aslında anlatmaya çalıştığım buydu.

noktaların uzunluğu değerler değiştikçe azalıyor veya artıyor (mesela hepsi standart 20 " - " olmuyor) ama onu çözerim sanırım. Eğer çözemezsem tekrar danışırım

1 Beğeni

Gelelim sizin “İbre” konunuza:

def gauge(size, percentage):
   gauge_list=['-']*size
   pointer = round (percentage*size/100)
   gauge_list[pointer]='*'
   gauge_list = ['|','|']+gauge_list+['|','|']
   print(''.join(str(item) for item in gauge_list))


gauge(20,50)

Bu kadar.

Fonksiyonun 1. Parametresi yüzdelik kısım kaç karakterde gösterilecek, bunu 20 seçtik. (Başta ve sondaki çift pipe ‘||’ karakterleri bu sayıya dahil değil.

İkinci parametre, %Kaç’ı işaretlemek istiyorsanız o değer. Mesela %50 için 50.

round ile de küsüratlı sayı çıkarsa, en yakın değere yuvarlasın diye. round ile ilgili eksra bir durum yok yanlış yuvarladı zevzekliği dinleyemem, beğenmeyen başka bir yuvarlatma fonksiyonu kullanabilir.

Sonuçta:

image

20+4 pipe karakeriyle beraber bir “ibre”.

Bu kadar basit.

Ama asıl sorman gereken konu bu değil.

Windows terminalinde cursorü doğru yere taşıyıp hep aynı yerde bu “ibre” yi nasıl göstereceğim?

Hadi bakalım sor cevap versinler.

EDIT 1:

İnsan düşününce belirli bir aralıkta yüzde almayı da bilmeme ihtimaliniz de geldi aklıma.

Çünkü soru kodlama sorusundan çok basit matematikle ilgili bir problem.

Bu nedenle belirli bir aralıkta % alan fonksiyon da ekleyim.

def ilk_degeri_ve_son_degeri_olan_aralıkta_yuzde_almayı_bilmiyorum(boyut,ilk_deger, son_deger, mevcut_deger):
   fark = son_deger-ilk_deger
   percentage =  (mevcut_deger*100)/fark 
   
   gauge(boyut,percentage)


def gauge(size, percentage):
   gauge_list=['-']*size
   pointer = round (percentage*size/100)
   gauge_list[pointer-1]='*'
   gauge_list = ['|','|']+gauge_list+['|','|']
   print(''.join(str(item) for item in gauge_list))



ilk_degeri_ve_son_degeri_olan_aralıkta_yuzde_almayı_bilmiyorum(20, 50, 100, 25)

Hala altın soru duruyor. Bu göstergeyi bir konuma nasıl taşırız?

Hocam desteğin için teşekkür ederim. Sana ilk cevapta da biraz ters birşeyler yazmışım, tekrar okuyunca farkettim kusura bakma.

gauge fonksiyonu ok yalnız matematik kısmında bir sorun hala var :slight_smile:

en_dusuk=3.41
en_yuksek=13.67
guncel=11.12
percentage = (100*guncel_deger)/(en_yuksek-en_dusuk)

percentage = 108.38
haliyle fonkisyon IndexError: list assignment index out of range hatası veriyor.

formülü
percentage = (100*(guncel_deger-en_dusuk))/(en_yuksek-en_dusuk)

şeklinde güncelleyince doğru çalışıyor.

Bu gibi konulara takılma, ben takılmam. Nicklere bakarak cevap yazmıyorum.

Haklısın başlangıcı 0 Kabul etmişim, şöyle düşündüm bu aralıkta vereceği değeri birim gibi hayal ettim.

ilk değer, son değer. arasında 5 birim gibi.

Veriyi getirdiğiniz yerde mevcut bir değer ki bu değer birim cinsinden ve belirlediğiniz aralık içinde gibi.

Ama evet, eğer değeriniz de aralıkla beraber güncellenmiyor ve offseti alınması gerekiyorsa, tabi ki,

Ötelenen başlangıç değerinizi güncel değerden çıkarmanız gerekir ki bu durumda ilgili satır;

Satırları için:

 fark = son_deger-ilk_deger
   percentage =  ((mevcut_deger-ilk_deger)*100)/fark 

şeklinde ötelemeniz gerekiyor.

Sorundaki ilk mesajta, değerlerle ilgil bir bilgi vermemişsin, round ile yuvarlatmasak şimdi float değer kullandığını görecektik.

O da ayrı mevzu.

Asıl kodun çekirdeği, yani sorduğun kısım,

Fonksiyonu, bundan sonrası matematik problemi diye belirttim.

Çarp böl topla sana gelen verileri bu ana kadar kestiremediğimden bu konuda çok detaylı düşünmedim.

Şimdi bakınca, bu mantıkla range dışında bir veri gönderirsen yine benzer hatalar alınabilir.

Yani tüm olasılıkları düşünmek, gelen verilerin bu kadar kod parçasıyla nereden nasıl geldiğini tahmin etmek gibi konularda soru sorduğunda beklentini yüksek tutma.

Bunu yerine daha açıklayıcı, sınır koşullarını daha anlatacak bilgiler yazarak sorarsan daha net kodlar alabilrsin.

Mesela yüzde alma konusunda:

ara değer ve dış değer almakla ilgili uğraşmak istersen;

Microsoft Word - 02- Eðri uydurma ve interpolasyon.doc (itu.edu.tr)

Konularına da bakabilirsin.

Değerleri elde ettikten sonra yüzdelik oranlamak dert değil.

Yani enterpolasyon ve ekstrapolasyon kısmını ve yüzdeliği sembolik kodladım, fonksiyonun çalışmasını görmen açısından.

Burada gelen veriler ve onları ne şekilde kullanacağın sana kalmış.