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.
Ş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.
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)
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.
İş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
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
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:
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.
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;