lehrkraefte:blc:informatik:ffprg1-2020:loops

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg1-2020:loops [2020/02/02 11:37]
Ivo Blöchliger [Typischer Fall]
lehrkraefte:blc:informatik:ffprg1-2020:loops [2022/04/07 13:16] (current)
Ivo Blöchliger [Aufgaben]
Line 38: Line 38:
 k=100 k=100
 p=1.01 p=1.01
-while (k<200): +while (k<200):   # Wiederhole solange wie k<200 
-    k*=p +    k*=p   # Kurzform für k = k*
-    n+=1+    n+=1   # Kurzform für n = n+1
 print(n) print(n)
 </code> </code>
 Was berechnet das obige Programm? Was berechnet das obige Programm?
  
 +<hidden Lösung>
 +Das Programm berechnet die Anzahl Jahre, die nötig sind, bis das Ausgangskapital $k$ bei einem Zinsatz von $p-1$ auf über 200 angewachsen ist.
 +</hidden>
 ==== Endlos-Schleife ==== ==== Endlos-Schleife ====
 <code python> <code python>
-while true:+import time 
 +while True:
    print("immer und immer wieder")    print("immer und immer wieder")
 +   time.sleep(0.5)   # Ein bisschen Pause, damit die Ausgabe nicht komplett überläuft.
 </code> </code>
  
 ===== break, continue ===== ===== break, continue =====
-Manchmal ist es wünschenswert, eine Schleife abzubrechen (**break**) oder direkt zur nächsten Wiederholung (**continue**) zu springen.+Manchmal ist es wünschenswert, eine ''while''- oder ''for'-Schleife irgendwo innerhalb abzubrechen (**break**) oder direkt zur nächsten Wiederholung (**continue**) zu springen, ohne den Rest des Blocks auszuführen
  
 <code python> <code python>
Line 60: Line 65:
     if a>5:     if a>5:
         break  # Sofort die while-Schlaufe beenden         break  # Sofort die while-Schlaufe beenden
 +    print("Sonst noch was mit %d tun" % a)
 </code> </code>
  
Line 65: Line 71:
 a = 1 a = 1
 while a<10: while a<10:
-   if a%2==0:+   if a%2==0:   # Wenn der Rest der Divison von a durch 2 Null ist, d.h. wenn a gerade ist. 
 +       a+=3
        continue  # Nächste Wiederholung        continue  # Nächste Wiederholung
    # Was kompliziertes mit a machen    # Was kompliziertes mit a machen
Line 78: Line 85:
         print("%d * %d = %d" %(i,j,i*j))         print("%d * %d = %d" %(i,j,i*j))
 </code>         </code>        
 +
 +
 +===== Zeilenumbrüche =====
 +Sie können eine print-Ausgabe ohne Zeilenumbruch erreichen, indem Sie nach der schliessenden Klammer ein Komma anfügen:
 +<code python>
 +print("Es geht "),
 +print("noch weiter")
 +</code>
 +Leider wird damit auch ein Leerschlag eingefügt. 
 +
 +Noch mehr Kontrolle hat man, wen man die ganze Zeile erst in einem String aufbaut und diesen am Schluss ausgibt:
 +<code python>
 +zeile = "Die Zahlen 1"
 +for i in range(2,5):
 +   zeile += ", %d" % (i*i)
 +print(zeile)                 # Ausgabe: Die Zahlen 1, 4, 9, 16
 +</code>
  
 ====== Aufgaben ====== ====== Aufgaben ======
Line 87: Line 111:
 Sie können wie folgt überprüfen, ob eine Zahl a durch eine Zahl b teilbar ist: Sie können wie folgt überprüfen, ob eine Zahl a durch eine Zahl b teilbar ist:
 <code python> <code python>
-if a % b == 0:  # Wenn der Rest der Division von a durch b gleich Null ist, ist a druch b teilbar+if a % b == 0:  # Wenn der Rest der Division von a durch b gleich Null ist, ist a durch b teilbar
     # Tu was     # Tu was
 </code> </code>
  
-Sie können eine print-Ausgabe ohne Zeilenumbruch erreichen, indem Sie nach der schliessenden Klammer ein Komma anfügen: 
-<code python> 
-print("Es geht "), 
-print("noch weiter") 
-</code> 
-Leider wird damit auch ein Leerschlag eingefügt. Eine flexiblere Methode ist die Verwendung von sys.stdout.write(): 
-<code python> 
-import sys 
- 
-sys.stdout.write("Es geht") 
-sys.stdout.write("noch weiter\n" # Am Schluss ein Zeilenumbruch mit \n 
-</code> 
  
   * Schreiben Sie ein Programm, das sämtliche Teiler der eingegebenen Zahl ausgibt.   * Schreiben Sie ein Programm, das sämtliche Teiler der eingegebenen Zahl ausgibt.
   * Schreiben Sie ein Programm, das überprüft, ob die eingegebene Zahl eine Primzahl ist.   * Schreiben Sie ein Programm, das überprüft, ob die eingegebene Zahl eine Primzahl ist.
-  * Schreiben Sie ein Programm, das die Primfaktorenzerlegung der eingegeben Zahl ausgibt.+  * Schreiben Sie ein Programm, das die Primfaktorenzerlegung der eingegeben Zahl ausgibt. In einem der beiden Formate 
 +    * Primfaktorzerlegung von 123456 = 1 * 2 * 2 * 2 * 2 * 2 * 2 * 3 * 643 
 +    * Primfaktorzerlegung von 123456 = 1 * 2^6 * 3 * 643 
 +  * Schreiben Sie ein Programm, das eine Primzahl nach der anderen ausgibt.
   * Schreiben Sie ein Programm, das perfekte Zahlen sucht, d.h. solche, die gleich der Summe Ihrer Teiler (sich selbst ausgenommen) sind.   * Schreiben Sie ein Programm, das perfekte Zahlen sucht, d.h. solche, die gleich der Summe Ihrer Teiler (sich selbst ausgenommen) sind.
  
 <hidden Lösungsvorschläge> <hidden Lösungsvorschläge>
 <code python teiler.py> <code python teiler.py>
 +import sys
 +z = int(raw_input("Zahl = "))
  
 +sys.stdout.write("Teiler von %d: " % z)
 +for t in range(1,z):
 +    if (z % t == 0):
 +        sys.stdout.write("%d, " %t)
 +print(z)
 </code> </code>
 +<code python isprime.py>
 +z = int(raw_input("Zahl = "))
 +isprime = True
 +for t in range(2,int(z**0.5)+1):
 +    if (z%t==0):
 +        isprime = False
 +        print("%d ist nicht prim, weil durch %d teilbar!" % (z,t))
 +        break
 +if isprime:
 +    print("%d ist prim!" % z)
 +</code>
 +<code python faktorzerlegung1.py>
 +import sys
 +z = int(raw_input("Zahl = "))
 +
 +sys.stdout.write("Primfaktorzerlegung von %d = 1" % z)
 +t =2 
 +while z>1:
 +    while (z % t == 0):
 +        z/=t
 +        sys.stdout.write(" * %d" % (t,))
 +    t+=1
 +
 +</code>
 +<code python faktorzerlegung2.py>
 +import sys
 +z = int(raw_input("Zahl = "))
 +
 +sys.stdout.write("Primfaktorzerlegung von %d = 1" % z)
 +t =2 
 +while z>1:
 +    e = 0
 +    while (z % t == 0):
 +        e+=1
 +        z/=t
 +    if e>1:
 +        sys.stdout.write(" * %d^%d" % (t,e))
 +    elif e>0:
 +        sys.stdout.write(" * %d" % (t,))
 +    t+=1
 +</code>
 +
 +<code python primes1.py>
 +import sys
 +n = 0
 +z = 2
 +while True:
 +    prime = True
 +    for t in range(2,z):
 +        if (z % t==0):
 +            prime = False
 +    if prime:
 +        sys.stdout.write("%d " % z)
 +        n+=1
 +        if n%20 == 0:
 +            print
 +    z+=1
 +</code>
 +
 +<code python primes2.py>
 +import sys
 +n = 0
 +z = 2
 +while True:
 +    prime = True
 +    for t in range(2,int(z**0.5)+1):
 +        if (z % t==0):
 +            prime = False
 +    if prime:
 +        sys.stdout.write("%d " % z)
 +        n+=1
 +        if n%20 == 0:
 +            print
 +    z+=1
 +</code>
 +
 +<code python primes3.py>
 +import sys
 +n = 0
 +primes = [2]
 +sys.stdout.write("2 ")
 +z=3
 +while z<1000000:
 +    prime = True
 +    for p in primes:
 +        if p*p>z:
 +            break
 +        if (z % p==0):
 +            prime = False
 +    if prime:
 +        sys.stdout.write("%d " % z)
 +        n+=1
 +        primes.append(z)
 +        if n%20 == 0:
 +            print
 +    z+=2
 +</code>
 +
 +<code python eratosthenes.py>
 +import sys
 +n = 1000000
 +primes = [i>1 for i in range(0,n+1)]
 +p = 2
 +while (p*p<=n):
 +    for i in range(p*p,n+1,p):
 +        primes[i]=False
 +    p+=1
 +    while (not primes[p]):
 +        p+=1
 +np=0
 +for i in range(0,n+1):
 +    if primes[i]:
 +        sys.stdout.write("%d " % i)
 +        np+=1
 +        if np%20 == 0:
 +            print
 +</code>
 +
 +<code python perfektezahl.py>
 +z = 2
 +while True:
 +    s = 1
 +    t = 2
 +    while t*t<=z:
 +        if z%t == 0:
 +            s+=t
 +            if t!=z/t:
 +                s+=z/t
 +        t+=1
 +    if s==z:
 +        print("Perfekte Zahl %d" % z)
 +    z+=1
 +    if (z%100000==0):
 +        print("[%d]" % z)
 +</code>
 +
 </hidden> </hidden>
  • lehrkraefte/blc/informatik/ffprg1-2020/loops.1580639821.txt.gz
  • Last modified: 2020/02/02 11:37
  • by Ivo Blöchliger