Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:ffprg1-2020:loops [2022/02/08 09:09] – Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg1-2020:loops [2022/04/07 11:16] (current) – [Aufgaben] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== 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 | ||
| + | ===== for-loops ===== | ||
| + | Ein for-loop besteht aus zwei Elementen: Eine **Laufvariable** und einen Bereich. | ||
| + | |||
| + | ==== Typischer Fall ==== | ||
| + | <code python> | ||
| + | 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-Varianten ==== | ||
| + | * range(n): Zahlen von 0 bis und mit n-1 | ||
| + | * range(a,b): Zahlen von a bis und mit b-1 | ||
| + | * range(a, | ||
| + | <code python> | ||
| + | for i in range(10, | ||
| + | print(i) | ||
| + | # Liefert 10,13,16,19 | ||
| + | </ | ||
| + | |||
| + | ==== Iteration über Listen und Arrays ==== | ||
| + | <code python> | ||
| + | prim = (2, | ||
| + | for p in prim: | ||
| + | print(" | ||
| + | </ | ||
| + | Die Elemente des Arrays könnten auch beliebige Dinge sein. | ||
| + | |||
| + | |||
| + | ===== while-loops ===== | ||
| + | Ein while-loop wird so lange wiederholt, wie eine Bedingung wahr ist. | ||
| + | <code python> | ||
| + | n=0 | ||
| + | k=100 | ||
| + | p=1.01 | ||
| + | while (k< | ||
| + | k*=p # Kurzform für k = k*p | ||
| + | n+=1 # Kurzform für n = n+1 | ||
| + | print(n) | ||
| + | </ | ||
| + | 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. | ||
| + | </ | ||
| + | ==== Endlos-Schleife ==== | ||
| + | <code python> | ||
| + | import time | ||
| + | while True: | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ===== break, continue ===== | ||
| + | Manchmal ist es wünschenswert, | ||
| + | |||
| + | <code python> | ||
| + | a = 1 | ||
| + | while a<10: | ||
| + | a+=1 | ||
| + | if a>5: | ||
| + | break # Sofort die while-Schlaufe beenden | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | a = 1 | ||
| + | while a<10: | ||
| + | if a%2==0: | ||
| + | a+=3 | ||
| + | | ||
| + | # Was kompliziertes mit a machen | ||
| + | a+=1 | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Verschachtelte loops ===== | ||
| + | <code python> | ||
| + | for i in range(5): | ||
| + | for j in range(5): | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Zeilenumbrüche ===== | ||
| + | Sie können eine print-Ausgabe ohne Zeilenumbruch erreichen, indem Sie nach der schliessenden Klammer ein Komma anfügen: | ||
| + | <code python> | ||
| + | print(" | ||
| + | print(" | ||
| + | </ | ||
| + | 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) | ||
| + | </ | ||
| + | |||
| + | ====== Aufgaben ====== | ||
| + | Lesen Sie jeweils die Eingabe für das Programm von der Tastatur ein: | ||
| + | <code python> | ||
| + | z = int(raw_input(" | ||
| + | </ | ||
| + | |||
| + | Sie können wie folgt überprüfen, | ||
| + | <code python> | ||
| + | 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, | ||
| + | * 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. | ||
| + | |||
| + | <hidden Lösungsvorschläge> | ||
| + | <code python teiler.py> | ||
| + | import sys | ||
| + | z = int(raw_input(" | ||
| + | |||
| + | sys.stdout.write(" | ||
| + | for t in range(1,z): | ||
| + | if (z % t == 0): | ||
| + | sys.stdout.write(" | ||
| + | print(z) | ||
| + | </ | ||
| + | <code python isprime.py> | ||
| + | z = int(raw_input(" | ||
| + | isprime = True | ||
| + | for t in range(2, | ||
| + | if (z%t==0): | ||
| + | isprime = False | ||
| + | print(" | ||
| + | break | ||
| + | if isprime: | ||
| + | print(" | ||
| + | </ | ||
| + | <code python faktorzerlegung1.py> | ||
| + | import sys | ||
| + | z = int(raw_input(" | ||
| + | |||
| + | sys.stdout.write(" | ||
| + | t =2 | ||
| + | while z>1: | ||
| + | while (z % t == 0): | ||
| + | z/=t | ||
| + | sys.stdout.write(" | ||
| + | t+=1 | ||
| + | |||
| + | </ | ||
| + | <code python faktorzerlegung2.py> | ||
| + | import sys | ||
| + | z = int(raw_input(" | ||
| + | |||
| + | sys.stdout.write(" | ||
| + | t =2 | ||
| + | while z>1: | ||
| + | e = 0 | ||
| + | while (z % t == 0): | ||
| + | e+=1 | ||
| + | z/=t | ||
| + | if e>1: | ||
| + | sys.stdout.write(" | ||
| + | elif e>0: | ||
| + | sys.stdout.write(" | ||
| + | t+=1 | ||
| + | </ | ||
| + | |||
| + | <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(" | ||
| + | n+=1 | ||
| + | if n%20 == 0: | ||
| + | |||
| + | z+=1 | ||
| + | </ | ||
| + | |||
| + | <code python primes2.py> | ||
| + | import sys | ||
| + | n = 0 | ||
| + | z = 2 | ||
| + | while True: | ||
| + | prime = True | ||
| + | for t in range(2, | ||
| + | if (z % t==0): | ||
| + | prime = False | ||
| + | if prime: | ||
| + | sys.stdout.write(" | ||
| + | n+=1 | ||
| + | if n%20 == 0: | ||
| + | |||
| + | z+=1 | ||
| + | </ | ||
| + | |||
| + | <code python primes3.py> | ||
| + | import sys | ||
| + | n = 0 | ||
| + | primes = [2] | ||
| + | sys.stdout.write(" | ||
| + | z=3 | ||
| + | while z< | ||
| + | prime = True | ||
| + | for p in primes: | ||
| + | if p*p>z: | ||
| + | break | ||
| + | if (z % p==0): | ||
| + | prime = False | ||
| + | if prime: | ||
| + | sys.stdout.write(" | ||
| + | n+=1 | ||
| + | primes.append(z) | ||
| + | if n%20 == 0: | ||
| + | |||
| + | z+=2 | ||
| + | </ | ||
| + | |||
| + | <code python eratosthenes.py> | ||
| + | import sys | ||
| + | n = 1000000 | ||
| + | primes = [i>1 for i in range(0, | ||
| + | p = 2 | ||
| + | while (p*p< | ||
| + | for i in range(p*p, | ||
| + | primes[i]=False | ||
| + | p+=1 | ||
| + | while (not primes[p]): | ||
| + | p+=1 | ||
| + | np=0 | ||
| + | for i in range(0, | ||
| + | if primes[i]: | ||
| + | sys.stdout.write(" | ||
| + | np+=1 | ||
| + | if np%20 == 0: | ||
| + | |||
| + | </ | ||
| + | |||
| + | <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(" | ||
| + | z+=1 | ||
| + | if (z%100000==0): | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | </ | ||