lehrkraefte:blc:informatik:ffprg1-2020:loops

Wiederholungen

Es gibt zwei grundlegende Typen von Wiederholungen:

  • Die Anzahl Wiederholungen ist schon vor der Wiederholung bekannt: for-loops
  • Die Anzahl Wiederholungen ist nicht bekannt: while-loops

Ein for-loop besteht aus zwei Elementen: Eine Laufvariable und einen Bereich.

for i in range(10):
    print(i)

Gibt die Zahlen von 0 bis 9 aus (10 Wiederholungen). Die Laufvariable ist i, der Bereich range(10), was den Zahlen von 0 bis und mit 9 entspricht.

  • range(n): Zahlen von 0 bis und mit n-1
  • range(a,b): Zahlen von a bis und mit b-1
  • range(a,b,s): Zahlen von a in s-Schritten bis zur grössten Zahl, die kleiner als b ist
for i in range(10,20,3):
    print(i)
# Liefert 10,13,16,19
prim = (2,3,5,7,11,13,17,19)
for p in prim:
    print("%d ist prim" % (p,))

Die Elemente des Arrays könnten auch beliebige Dinge sein.

Ein while-loop wird so lange wiederholt, wie eine Bedingung wahr ist.

n=0
k=100
p=1.01
while (k<200):   # Wiederhole solange wie k<200
    k*=p   # Kurzform für k = k*p
    n+=1   # Kurzform für n = n+1
print(n)

Was berechnet das obige Programm?

Lösung

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.

import time
while True:
   print("immer und immer wieder")
   time.sleep(0.5)   # Ein bisschen Pause, damit die Ausgabe nicht komplett überläuft.

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.

a = 1
while a<10:
    a+=1
    if a>5:
        break  # Sofort die while-Schlaufe beenden
    print("Sonst noch was mit %d tun" % a)
a = 1
while a<10:
   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
   # Was kompliziertes mit a machen
   a+=1
for i in range(5):
    for j in range(5):
        print("%d * %d = %d" %(i,j,i*j))

Sie können eine print-Ausgabe ohne Zeilenumbruch erreichen, indem Sie nach der schliessenden Klammer ein Komma anfügen:

print("Es geht "),
print("noch weiter")

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:

zeile = "Die Zahlen 1"
for i in range(2,5):
   zeile += ", %d" % (i*i)
print(zeile)                 # Ausgabe: Die Zahlen 1, 4, 9, 16

Aufgaben

Lesen Sie jeweils die Eingabe für das Programm von der Tastatur ein:

z = int(raw_input("Zahl = "))

Sie können wie folgt überprüfen, ob eine Zahl a durch eine Zahl b teilbar ist:

if a % b == 0:  # Wenn der Rest der Division von a durch b gleich Null ist, ist a durch b teilbar
    # Tu was
  • 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 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.

Lösungsvorschläge

Lösungsvorschläge

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)
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)
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
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
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
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
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
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
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)
  • lehrkraefte/blc/informatik/ffprg1-2020/loops.txt
  • Last modified: 2022/04/07 13:16
  • by Ivo Blöchliger