While ve For Döngüleri

Merhaba
While ve for dongulerini ogrenmeye calisiyorum kucuk bir kod blogu yazdim
Yapmak istedigim kullanicinin girdigi ders sayisi ve mezun sayisi kadar donguleri calistirmak
yani ders sayisi 2 ve ogrenci sayisi 2 'olarak girildiginde sonucun
oguz turkyilmaz Matematik vize1 50 vize2 60 final 60
Fizik vize1 50 vize2 60 final 70
doruk turkyilmaz Matematik vize1 50 vize2 60 final 50
Fizik vize1 70 vize2 60 final 55
seklinde olmasi. Bu sonuca ulasmak, zannetmiyorum ama sadece While dongusunun kosulunu revize etmekle mumkun olur mu. Ya da bu sonuca nasil ulasabilirim. Tesekkurler.


mezunlar = []
dersSayisi = int(input("Karnede gosterilecek ders sayisini giriniz : "))
mezunSayisi = int(input("Mezun Olan Ogrenci sayisini giriniz : "))
dersSayaci = 0
mezunSayaci = 0

while dersSayaci < dersSayisi and mezunSayaci < mezunSayisi:
    ogrenciNo = int(input("Ogrenci Numarasini Giriniz : "))
    ogrenciAdi = input("Ogrenci Adini Giriniz : ")
    ders = input("Sinav yapilan Dersi  Giriniz : ")
    vize1 = int(input("1.Vize Sinav Sonucunu Giriniz : "))
    vize2 = int(input("2.Vize Sinav Sonucunu Giriniz : "))
    final = int(input("Final Sinav Sonucunu Giriniz : "))
    mezunlar.append(dict(ogrenciNo=ogrenciNo, ogrenciAdi=ogrenciAdi, ders=ders, vize1=vize1, vize2=vize2, final=final))
    dersSayaci += 1
    mezunSayaci += 1

for mezun in mezunlar:
    print(f"2019-2020 Egitim yili {mezun['ogrenciNo']} No'lu {mezun['ogrenciAdi']}, {mezun['ders']} dersinden "
          f" 1.Vize notu : {mezun['vize1']}, 2.Vize notu : {mezun['vize2']} ve Final notu : {mezun['final']}")


benim aldigim sonuc:

Bu durumda iç içe iki tane for döngüsü kullanmanız gerekiyor.

mezunlar = []
ders_sayisi = int(input("Karnede gosterilecek ders sayisini giriniz : "))
mezun_sayisi = int(input("Mezun Olan Ogrenci sayisini giriniz : "))

for i in range(mezun_sayisi):
    mezun = {}
    ogrenci_no = int(input("Ogrenci Numarasini Giriniz : "))
    ogrenci_adi = input("Ogrenci Adini Giriniz : ")
    mezun["Öğrenci No"] = ogrenci_no
    mezun["Öğrenci Adı"] = ogrenci_adi
    mezun["Ders"] = {}
    for j in range(ders_sayisi):
        ders = input("Sinav yapilan Dersi Giriniz : ")
        vize1 = int(input("1.Vize Sinav Sonucunu Giriniz : "))
        vize2 = int(input("2.Vize Sinav Sonucunu Giriniz : "))
        final = int(input("Final Sinav Sonucunu Giriniz : "))
        mezun["Ders"][ders] = {
            "Vize 1": vize1,
            "Vize 2": vize2,
            "Final": final
        }
    mezunlar.append(mezun)

print()
for mezun in mezunlar:
    print(
        f"{mezun['Öğrenci No']} No'lu {mezun['Öğrenci Adı']} "
        f"isimli öğrencinin 2019-2020 Eğitim yılında aldığı notlar:\n"
    )
    for ders in mezun["Ders"]:
        print(
            f"Ders: {ders}\n",
            f"\t1. Vize notu : {mezun['Ders'][ders]['Vize 1']}\n"
            .expandtabs(4),
            f"\t2. Vize notu : {mezun['Ders'][ders]['Vize 2']}\n"
            .expandtabs(4),
            f"\tFinal notu : {mezun['Ders'][ders]['Final']}\n"
            .expandtabs(4)
        )

Sn.dildeolupbiten yanıtınız için çok teşekkür ederim. Gece yarısı Python çalışırken soruyu yazdım sonrada uykum geldi diye yatağa yattım fakat heyhat uyku kaçtı bende yatakta dönüp durdum :smile: bu soruyu neden bu kadar çabuk yazdım ki bunu içiçe döngü diye bir konu izlemiştim bir ara neden o yöntemle çözme yoluna gitmek aklıma gelmedi diye içim içimi yedi. Ama konu başlığım While döngüsü olduğundan bu seferde bır okulda olsam böyle notları sisteme elimdeki listeden giriyor olsam ders ve öğrenci sayılarını başta sisteme girmenin saçma olacağından farklı bir metod la yapılması gerekir diye düşünmüştüm. Sabahtan beri bilgisayarın başına oturmak için saatleri saydım. Sizde cevaplandırmışsınız sağ olun , çaktırmadan göz ucuyla baktım tamda tüm gün şunları yapmalıydım dediğim şekilde çözmüş gibisiniz. Çözümünüze daha fazla bakmadan yine kendi kendime For döngüleriyle düşündüğüm yoldan öğrendiklerimle yapmaya çalışıp en son pes edersem ki umarım beceririm sizin çözümden kopya çekerim diye düşünüyorum. Sonrada ders ve öğrenci sayılarına bağlı kalmadan kullanıcının istediği kadar öğrenci ve ders sayısını girdiği farklı bır metod ile çözmenin yoluna bakacağım. Yani benden ayrılmayın takipte kalın mutlaka bir yerde çuvallarım nasılsa. :smile: Tekrar teşekkürler.

1 Beğeni

Siz forumdan ayrılmayın dildeolupbiten ve Ekrem abimiz hep burada :smile:

İçiniz içinizi yemesin lütfen. Hepimizin bazen aklına bazı şeyler gelmiyor. Bunun bir çok sebebi olabilir. O gün biraz dalgın olabiliriz, moralimiz bozuk olabilir, belki sadece aklımızdaki yöntemi takip etmek istediğimiz için, başka yöntemleri nasıl oluşturacağımızı düşün(e)memiş olabiliriz… Bu son bahsettiğim ihtimal bazen benim başıma gelir mesela. Ayrıca daha birçok neden de olabilir.

Halledersiniz, moralinizi bozmayın lütfen. Aslında kodu direkt sizinle paylaşarak bir hata yaptım. Bunun yerine size iki adet for döngüsü kullanmanız gerektiğini ve bunu neden yapmanız gerektiğini söyleseydim ve sizin problemle uğraşmanızı bekleseydim daha iyi olurdu. Ama acele ettim biraz. :confused:

1 Beğeni

Sn.dildeolupbiten affiniza siginarak bir konuda yonlendirmenize ihtiyacim var.
Yapmak istedigim bu uygulama ile ilgili gercek hayatta Okullarda nasil bir yol izleyebilirler diye dusununce sil bastan daha farkli bir cozume yoneldim.
bir ogrenci 11.sinifa gidiyorsa bu ogrencinin gorecegi dersler sabittir ve bunlari kullanicidan istemek abes diyerek dersler adli sabit bir Liste olusturdum. For dongusu ile bu liste uzerinde dolasirim. Burda sorun yok.
11.siniftaki ogrencil no ve ogrenciler her sene degistiginden bu bilgileri input ile ogrenciler listesine (ogrencino ve ogrenci adi / key-value seklinde) sozluk elemani olarak atama yaptiktan sonra for dongusu ile liste uzerindeki sozluk elemanlarina ulasmak istiyorum. ( bu dogru bir yaklasim mi ?) Ama range fonksiyonuna ogrenciler listesini atayamiyorum. Bu dusunce tarzim dogrumu bilmiyorum ama bunu yapmak icin ne gibi bir yol izlemeliyim fikir vermenizi rica ederim.


ogrenciler = []
ogrenci = {}
dersler = ["Matematik", "Fizik", "Kimya", "Bioloji"]

for number in range([ogrenciler]):
    ogrenciNo = input(' Ogrencinin numarasini giriniz : ')
    ogrenciAdi = input(" Ogrencinin Ad ve Soyadini giriniz : ")

    #ogrenci[ogrenciNo] = ogrenciAdi
    #ogrenciler.append(ogrenci)
    print(ogrenciler)

number’ı zaten kullanmamışsınız, bu for döngüsü ile ne yapmak istiyorsunuz?

Estağfurullah. Elimden geleni yaparım.

Bu arada madem gerçek verilerle çalışacaksınız. O halde öğrenci bilgilerinin ve derslerde aldıkları notların tutulduğu bir json dosyası da oluşturulabilir. Belki henüz kütüphane nedir bilmiyor olabilirsiniz ama kısa bir süre sonra öğreneceğiniz konulardan bir tanesi de bu.

Şimdi burada bazı ifadeler aslında kafa karışıklığına yol açıyor. Örneğin anahtarı öğrenci no ve bu anahtarın değeri öğrenci ismi olan sözlüğü, listeye atama yapamazsınız. Listeye ancak eklersiniz. Yani listeye atama yapmak gibi bir kavram yok. Ayrıca listedeki elemanlara tam olarak neden ulaşmak istiyorsunuz? Yani ekrana yazdırmak için mi yoksa her bir öğrencinin ders listesinde olan derslerinin notlarını girmek için mi?

Sizin paylaştığınız kodlarda bir yazım yanlışı var. range fonksiyonu parametre olarak int bir değer alır. range(10) veya range(10, 20) veya range(10, 20, 2) gibi bir kullanımı vardır. Siz range([ogrenciler]) yazarak bir listeyi başka bir listenin içine alıyorsunuz. Dıştaki listenin eleman sayısı zaten 1 olmuş oluyor. Ama kullanımı da yanlış, range fonksiyonuna listenin uzunluğunu yazmanız gerekiyor.

İlk etapta ogrenciler listesi boş olduğu için, for döngüsü blokundaki satırlar zaten çalışmayacaktır.

Ayrıca bu for döngüsünü ogrenciler listesinin uzunluğu kadar çalıştırdığınız anda, bu blokun altında bir de ogrenciler listesinin uzunluğunu da artırmış oluyorsunuz. Bu önerilen bir yaklaşım değil. Örnekle göstereyim:

a = [1]
for i in a:
    a.append(input(">>> "))

Böyle yaparak, sonsuz bir döngü oluşturmuş oluyorsunuz. Ama sizin ogrenciler listesi zaten boş olduğu için for döngüsü anında sonlanacaktır.

Benim tavsiyem biraz daha farklı olacaktır aslında. Bunu şimdi size nasıl anlatabilirim diye düşünüyorum. Aslında, fonksiyon, sınıf gibi kavramları öğrenince anlatmak istediklerimi daha rahat anlayabileceğinizi düşünüyorum. Sınıf konusuna girsek mi şu anda acaba ? :confused: Ayrıca verileri dosyada tutmak için bazı kütüphaneleri de kullanabilirdim.

Sn dildeolupbiten
Yazilimla ilgili kavramlar konusunda kusuruma bakmayin henuz cok yeniyim aslinda ifade etmek istedigim sey listeye ekleme yapmak tabi ki ama haklisiniz atama kelimesi bir degiskene deger atama gibi farkli bir anlam ifade ediyor yazilimda, bundan sonra daha dikkatli olmaya calisirim. Listeye ulasma istegim ikinci for dongusunde ders notlarini vermek en sonundada tum ogrencilerin notlarini ayni anda gosterebilmek icindi. Bir konuda daha sanirim yanlis ifadem oldu Amacim gercek verilerle calismak degil sadece gercekten boyle bir program kullanilacak olsa kullanicilar verileri nasil girmek isterler diye dusunmekten ibaret. Bu tarz basit bir program yazmak icin dogru yaklasim dediginiz gibi sinif kavramlari vs gibi farkli konularida kapsiyorsa zaten o konulara geldigimde bu deftere kaldigim yerden devam ederim benim icin onemli olan sadece for ve while dongusu ile bu istegimin neden gerceklesmeyecegini ogrenmis olmak. Vakit ayirip yanit verdiginiz icin tesekkur ederim. For dongusu ile cozumunuzu inceleyecegim simdi izledigim videolarda henuz rastlamadigim 2 - 3 tane unsur var, onlarin ne ise yaradigini tespit etmeye calisacagim. Iyi geceler.

Ekrem bey iyi aksamlar yapmak istedigim input ile girilen ogrenci no ve ogrenci isimlerini ogrenciler listesine bir sozluk olarak ekledikten sonra For dongusu ile dersler listesindeki kayitli derslerin herbirinden ogrencilere input ile 3 sinav notu vermek sonrasinda ogrencilerin aldigi notlari for dongusu ile yazdirmakdi.

Tekrar merhabalar Oğuz Bey,

Böyle bir program kullanılacak olsa, sanırım kullanıcılar bir grafiksel arayüz programı kullanmak isterler. Aslında her farklı durumda, kod yapısı biraz daha farklı olacak. Sizinle paylaştığım kod, konsolda çalışan bir uygulama için. Ve program kapandığı zaman bilgiler de kaybolduğu bir uygulama o.

Sınıf kullanmak gibi bir zorunluluğunuz yok tabi, ama ben kodların düzenli bir yapıda olmasını istediğim için, kullanmayı tercih ediyorum.

while döngüsü de kullanabilirsiniz. Mesela;

for i in range(mezun_sayisi):

yerine,

while mezun_sayisi:
    mezun_sayisi -= 1

yukarıdaki kodu da kullanabilirdiniz.

Rica ederim, bir bakın, işin özü şu aslında:

2 tane öğrencimiz var, her bir öğrencinin ise 2 tane dersi varsa, ders girişi sayısı 2 * 2 olacaktır.
Basit bir örnek yapalım. Mesela burada input’un bir kere yazılıp bir çok kez çağrıldığı bir durum var.

nolar = [123, 345]
ogrenciler = ["Ahmet", "Mehmet"]
dersler = ["Matematik", "Fizik"]
sinavlar = ["1. Vize", "2. Vize", "Final"]

veriler = {}

for no, ogrenci in zip(nolar, ogrenciler):
    # Her bir no, veriler isimli sözlüğün anahtarı olsun.
    # Bu no anahtarının değeri de bir sözlük olsun.
    # Bu sözlüğün ilk anahtarının değeri "İsim", değeri de ogrenci olsun.
    veriler[no] = {"İsim": ogrenci} 
    for ders in dersler:
        # Her bir ders, veriler[no] sözlüğünün bir anahtarı olsun.
        # Ve bu anahtarın değeri boş bir sözlük olsun.
        veriler[no][ders] = {}
        for sinav in sinavlar:
            # Her bir sınav, veriler[no][ders] sözlüğünün bir anahtarı 
            # olsun. Ve bu anahtarın değeri bir input fonksiyonu olsun.
            # Bu fonksiyonla biz notlarımızı alalım.
            veriler[no][ders][sinav] = input(
                f"{ogrenci} isimli öğrencinin {ders} "
                f"dersinin {sinav} notu: "
            )
              
print(veriler)

Kendinize yeniyim demeyin.%999 doğrulukla söylüyorum ki benden daha çok Python biliyorsunuz.Devam edin.Ancak sadece konu ile alakalı soruları sormaya çalışın.Sorunuzu başka bir konu açarak dile getirebilirsiniz.İnsanlar geçmişte ne olmuş diye baktıklarında yeni bir konu açmalıymış falan dememeliler.

Evet bu konuda haklisiniz daha dikkatli olmaya calisacagim. Iyi geceler

Sayenizde gomulu fonksiyon turu zip ile tanistim.:slight_smile: Bu iyi oldu. Benim access ile biraz tecrubem var Bazi esnaf arkadaslarim icin Forumdaki ( accesstr.net ) hocalarin buyuk destegi ile ( emlak, cafe, siparis-teklif gibi 3 program yazmistim. Zorlandigim cozemedigim yerleri hallettiler sagolsunlar. En son Antalya sakatlar dernegine Uye Takip programi yaptim %90 i bana ait Pandemiden dolayi yukleyemedim. Bu aralar yukleyecegim insallah. Tamamen ucretsiz kendimi gelistirmek adina yaptim hepsini. Arayuz dizayn etmeyide cok severim saatlerce ugrasirim daha guzel ve kullanisli olsun diye. Fakat amacim web tabanli Tam profesyonel bir ticari uygulamayi herseyiyle uretebilecek bilgi birikimine ulasabilmek. Ticari bir kaygi vs kesinlikle yok sadece evet yapabildim bunu ben yaptim diyebilmek. Olmeden bu hedefime sizlerinde sayesinde ulasirim insallah. Konumuza gelirsek bu yazilan kodlari Console icin yazdigimizdan bir veritabanina kayit tabiki yapilmiyor Kayit ekle kayit sil gibi uygulamalarla veritabani uzerinde islem yapmiyoruz Ama ben sanki onumde bir arayuz varmisda ben o arayuzden kayitlari veritabanina kaydediyormus gibi dusunerek kodlari yazmaya calisiyorum. Mesela ogrenci bilgilerinin veritabaninda kayitli oldugunu ve ogrenci numarasinin girildiginde ogrencinin adinin ekranda belirdigi bir arayuz de calistigimi farzedip input ile kullanicidan aldigim ogrenci no ve isim bilgilerini ekrana getirmek istiyorum. Yani onumde bir arayuz varmisda ben oraya ogrenci numarasini yazdigimda veritabanindan o numaraya karsilik gelen veriyi alip arayuzdeki ilgili alana cekmisim gibi dusunmek istiyorum. Denemelerimde vs hep bu sekilde orneklemeler yapmaya calisiyorum. Yani yazdiginiz su koddaki ogrenci no ve ogrenci numaralarini Listeden degil INPUT fonksiyonu ile kullanicidan alabilmekdi tum amacim diger her sey zaten olmasi gerektigi gibi. Bunun yolunu ariyordum ozetle. Bilmedigim konularda ne istedigimi karsiya dogru aksettirecek kadar da kalemim kuvvetli degil maalesef kusurum olursa affedin.