lehrkraefte:blc:informatik:ffprg1-2020:loops

This is an old revision of the document!


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):
    k*=p
    n+=1
print(n)

Was berechnet das obige Programm?

while true:
   print("immer und immer wieder")

Manchmal ist es wünschenswert, eine Schleife abzubrechen (break) oder direkt zur nächsten Wiederholung (continue) zu springen.

a = 1
while a<10:
    a+=1
    if a>5:
        break  # Sofort die while-Schlaufe beenden
a = 1
while a<10:
   if a%2==0:
       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))

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 druch b teilbar
    # Tu was

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. Eine flexiblere Methode ist die Verwendung von sys.stdout.write():

import sys
 
sys.stdout.write("Es geht")
sys.stdout.write("noch weiter\n")  # Am Schluss ein Zeilenumbruch mit \n
  • 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 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
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.1580651584.txt.gz
  • Last modified: 2020/02/02 14:53
  • by Ivo Blöchliger