lehrkraefte:blc:informatik:glf22:python:woertlitrainer

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:glf22:python:woertlitrainer [2022/12/12 09:28]
Ivo Blöchliger [Besserer Programmierstil]
lehrkraefte:blc:informatik:glf22:python:woertlitrainer [2022/12/16 07:02] (current)
Ivo Blöchliger [Python Snippets]
Line 236: Line 236:
 for i in range(10):  # 10 mal wiederholen, zum Testen for i in range(10):  # 10 mal wiederholen, zum Testen
     # Vokabular sortieren, wobei ein Eintrag mit score+zufallszahl bewertet wird:     # Vokabular sortieren, wobei ein Eintrag mit score+zufallszahl bewertet wird:
-    voci = sorted(voci, key = lambda eintrag: eintrag['s']+random.random())+    voci.sort(key = lambda eintrag: eintrag['s']+random.random())
     print(f"Erster Eintrag ist jetzt: {voci[0]}")     print(f"Erster Eintrag ist jetzt: {voci[0]}")
 </code> </code>
Line 333: Line 333:
 daten_speichern(voci, datei) daten_speichern(voci, datei)
 </code> </code>
 +
 +Dazu gibt es einen [[https://fginfo.ksbg.ch/~ivo/videos/informatik/22-23/09-woertli-trainer-refactoring.mp4|Screencast]], oder als [[https://bldsg-my.sharepoint.com/:v:/g/personal/ivo_bloechliger_ksbg_ch/EcT9M_iPJspIrRz0shkQa54BrZ2OdumLJKvhopAFmU3Bnw?e=bpmcYw|SharePoint-Stream]] (neu auch für jeden Internauten, zumindest für 18 Monate)
  
 <hidden Lösungsvorschlag> <hidden Lösungsvorschlag>
-<code python voci-v2.py>+<code python voci-refactored.py>
 import sys  import sys 
 import os import os
Line 341: Line 343:
 import random import random
  
- +################## 
- +Daten einlesen # 
-def wort_bestimmen(voci): +##################
-    voci.sort(key = lambda eintrag: eintrag['s']+random.random()) +
-    Aktuelles paar ist das erste in der Liste +
-    return voci[0] +
- +
-def wort_abfragen(paar, anzahlfehler): +
-        print(f"Übersetze: {paar['d']}     (score {paar['s']})"+
-        if anzahlfehler>2: +
-            print(f"   Hinweis: {paar['f']}"+
-        Eingabe vom Benutzer +
-        eingabe = sys.stdin.readline().strip() +
-        return eingabe +
- +
-def wort_korrekt(eingabe, paar, anzahlfehler): +
-    if (eingabe!=paar['f']): +
-        return False +
-    if eingabe==paar['f']:  gleich dem Fremdwort? +
-        if anzahlfehler==0: +
-            paar['s']+=2 +
-        if anzahlfehler==1: +
-            paar['s']+=1 +
-        else: +
-            paar['s'] -= 1 +
-            if (paar['s']<0): +
-                paar['s']=0 +
-        return True +
- +
- +
-def wort_lernen(paar): +
-    """Liefert True, wenn das Programm abgebrochen werden soll. Sonst False.""" +
-    ok = False Benutzer hat noch nicht richtig geantwortet +
-    anzahlfehler = 0 +
-    while not ok:  Wiederholen, bis der Benutzer richtig geantwortet hat. +
-        eingabe = wort_abfragen(paar, anzahlfehler) +
- +
-        if eingabe=="x": +
-            return True   Fertig, mit Programmabbruch +
- +
-        if wort_korrekt(eingabe, paar, anzahlfehler): +
-            return False  Fertig ohne Programmabbruch +
- +
-        anzahlfehler = anzahlfehler + 1 +
- +
- +
-def abfragen(voci): +
-    """Abfragen, bis der Benutzer das Programm beendet""" +
-    while True: +
-        paar = wort_bestimmen(voci) +
-        programmAbbruch = wort_lernen(paar) +
-        if programmAbbruch: +
-            break +
  
 def dateinamen_bestimmen(): def dateinamen_bestimmen():
Line 414: Line 365:
  
 def daten_einlesen(): def daten_einlesen():
-    """Daten einlesen, entweder aus Standarddatei voci.json oder von der Kommandozeile.""" +    # Datei bestimmen (default oder von der Kommandozeile) 
-    datei = dateinamen_bestimmen()+    dateinamen = dateinamen_bestimmen()
     # Daten einlesen     # Daten einlesen
-    with open(datei, "r") as f:   # Datei zum Lesen (read) öffnen+    with open(dateinamen, "r") as f:   # Datei zum Lesen (read) öffnen
         voci = json.loads(f.read())       # Inhalt lesen, interpretieren und in die Variable voci speichern.         voci = json.loads(f.read())       # Inhalt lesen, interpretieren und in die Variable voci speichern.
 +    # Scores hinzufügen, falls nötig
     scores_hinzufuegen(voci)     scores_hinzufuegen(voci)
-    return voci, datei+    return voci, dateinamen
  
  
-def daten_speichern(vocidatei): +########## 
-    """Speichert die Daten im JSON-Format in den gegebenen Dateinamen""" +# Lernen # 
-    with open(datei, "w") as f:   # Datei zum Schreiben (write) öffnen+########## 
 + 
 +def hole_eingabe(paaranzahlfehler): 
 +    # Wort auf Deutsch anzeigen 
 +    print(f"Übersetze: {paar['d']}     (score {paar['s']})"
 +    if anzahlfehler>2: 
 +        print(f  Hinweis: {paar['f']}"
 +    # Eingabe vom Benutzer 
 +    return sys.stdin.readline().strip() 
 + 
 + 
 +def wort_korrekt(eingabe, paar, anzahlfehler): 
 +    if eingabe != paar['f']: 
 +        return False   # Funktion sofort beenden 
 +    # Eingabe ist korrekt 
 +    if anzahlfehler>1: 
 +        paar['s'-= 1 
 +        if (paar['s']<0): 
 +            paar['s']=0 
 +        return True 
 +    paar['s'] += 2 - anzahlfehler 
 +    return True 
 + 
 + 
 +def wort_abfragen(paar): 
 +    anzahlfehler = 0 
 +    while True:  # Endlos Schleife 
 +        eingabe = hole_eingabe(paar, anzahlfehler) 
 +        if eingabe=="x"
 +            return True   # Programmabbruch 
 +        if wort_korrekt(eingabe, paar, anzahlfehler): 
 +            return False  # Wort korrekt, aber Programm nicht beenden 
 +        anzahlfehler = anzahlfehler + 1 
 + 
 + 
 +def wort_bestimmen(voci): 
 +    voci.sort(key = lambda eintrag: eintrag['s']+random.random()) 
 +    # Aktuelles paar ist das erste in der Liste 
 +    return voci[0] 
 + 
 + 
 +def abfragen(voci): 
 +    while True: # Endlosschleife 
 +        paar = wort_bestimmen(voci) 
 +        programmAbbruch = wort_abfragen(paar) 
 +        if programmAbbruch: 
 +            return 
 + 
 + 
 +def daten_speichern(voci, dateinamen): 
 +    with open(dateinamen, "w") as f:   # Datei zum Schreiben (write) öffnen
         f.write(json.dumps(voci, indent=2))    # Daten in Datei schreiben         f.write(json.dumps(voci, indent=2))    # Daten in Datei schreiben
         f.write("\n")         f.write("\n")
-    print("Daten gespeichert") 
  
-##################### 
-### Hauptprogramm ### 
-##################### 
  
-voci, datei = daten_einlesen()+voci, dateiname = daten_einlesen()
 abfragen(voci) abfragen(voci)
-daten_speichern(voci, datei)+daten_speichern(voci, dateiname)
 </code> </code>
 </hidden> </hidden>
  
  • lehrkraefte/blc/informatik/glf22/python/woertlitrainer.1670833684.txt.gz
  • Last modified: 2022/12/12 09:28
  • by Ivo Blöchliger