Anfangs schwierigkeiten beim programmieren lernen?

5 Antworten

Programmieren ist wie Lego - es gibt verschiedene Teile die man zu einem Endergebnis zusammensetzt. Genau wie bei Lego gibt es sehr viele Variationen und Ansätze etwas zu machen.

Zu lernen wie man Aufgaben in Teile herunterbricht die der PC handeln kann ist das wichtigste beim Programmieren.

Man setzt sich auch normalerweise nicht gleich an den PC und bastelt drauf los. Erstell dir einen Plan und erstelle dir ein Ablaufdiagramm. Arbeite eventuell sogar Pseudocode aus - dann wirst du dir deutlich leichter tun...

Für das Einlesen der PIN bis Sie stimmt kannst du zB eine While-Schleife + Status-Variable nehmen:

pin_ok = False
while not pin_ok:
    pin = input("PIN: ")
    if pin.strip() == "1234":
        pin_ok = True

Oder eine Endlosschleife mit break:

while True:
    pin = input("PIN: ")
    if pin.strip() == "1234":
        break

Oder direkt die PIN in der Schleife prüfen:

pin = ""
while pin.strip() != "1234":
    pin = input("PIN: ")

... Wobei du es weiter verbessern kannst und nur 3 Versuche erlauben wie ein echter Bankomat. Dazu greifen wir die erste Variante auf, da wir später wissen müssen ob wir mit der Auszahlung weitermachen oder diese ablehnen.

... es kommt also auch darauf an welches "Werkzeug" für den Job geeigneter ist.

Arbeitet man einfach darauf los, dann kommt schnell dabei raus, dass man bei Änderungen den Code "verbiegt"solange bis er zu den Änderungen passt. (siehe unten)

Ein Projekt das im Vorfeld geplant wird hat deutlich weniger Änderungen am Code denn die konzeptionellen Änderungen wurden da gemacht wo sie hingehören - in der konzeptionellen Phase auf einem (oder mehreren) Blatt Papier. Das sorgt für besseren und wohlüberlegteren Code.

Auf Basis von dem Konzept und dem Ablaufplan kann man dann viel besser sehen und überlegen wie sich etwas umsetzen lässt. Also machen wir das mal:

PIN-Eingabe <--------------------------- Nein
    |                                     |
PIN korrekt? -> Nein -> 3 Versuche erreicht? -> Ja -> ENDE <---|
    |                                                          |
    Ja -> Betrag abfragen? <---------------------------        |
                 |                                    |        |
          Betrag verfügbar? -> Nein -> Fehlermeldung -|        |
                 |                                             |
                 Auszahlung -> Kontostand vermindern           |
                                          |                    |
                                          Restbetrag ausgeben -|

Aber auch das können wir nochmal ein 2 Teilprobleme zerlegen und erstmal an einem und dann am anderen Arbeiten:

A) Die PIN-Prüfung:

PIN-Eingabe <--------------------------- Nein
    |                                     |
PIN korrekt? -> Nein -> 3 Versuche erreicht? -> Ja -> ENDE <---|
    |                                                          |
    Ja -> AUSZAHLUNG PRÜFEN UND VERARBEITEN

B) Die Auszahlung:

          Betrag abfragen? <---------------------------        |
                 |                                    |        |
          Betrag verfügbar? -> Nein -> Fehlermeldung -|        |
                 |                                             |
                 Auszahlung -> Kontostand vermindern           |
                                          |                    |
                                          Restbetrag ausgeben -|

Wenn wir als Programmierer eines aus dem 2. Weltkrieg lernen sollten dann das ein Zwei-Fornten-Krieg keine gute Idee ist. Also kümmern wir uns um ein Problem nach dem anderen.

Formulieren wir nun die PIN-Prüfung wie oben gezeigt dann kommt das raus:

pin_ok = False
versuche = 0
while not pin_ok:
    pin = input("PIN: ").strip()
    if pin == "1234":
        pin_ok = True
        break 
    versuche += 1
    if versuche == 3:
        break

if pin_ok:
     print("Auszahlung verarbeiten ...")

else:
     print("Alter, du kummst do nit rein!")

Man sollte sich auch immer überlegen ob und wie man den Code verbessern kann. Vor allem am Anfang nutzt man nicht immer den besten oder kürzesten Weg und produziert langen und aufgeblähten Code mit sinnlosem Zeug.

Wie du Siehst kommt es drauf an was du machen willst - für das endlose Probieren ist eine while-Schleife ideal aber jetzt brauchen wir einen Zähler für die Versuche, müssen auf das Maximum prüfen und die Schleife abbrechen - all das kann uns die for-Schleife abnehmen:

pin_ok = False
for i in range(3):
    pin = input("PIN: ").strip()
    if pin == "1234":
        pin_ok = True
        break

if pin_ok:
     print("Auszahlung verarbeiten ...")

else:
     print("Alter, du kummst do nit rein!")

So nachdem wir den Teil getestet haben können wir uns um die Abhebung kümmern:

kontostand = 1000 

while True:
    abhebung = int(input("Auszahlung: "))
    if abhebung > kontostand:
        print("Soviel Geld hätten Sie wohl gern...")
    else:
        kontostand -= abhebung
        print("Ihnen bleiben noch " + str(kontostand) + " EUR")
        quit()

pin_ok = False
for i in range(3):
    pin = input("PIN: ").strip()
    if pin == "1234":
        pin_ok = True
        break

if pin_ok:
    print("Abhebung verarbeiten ...")

else:
    print("Alter, du kummst do nit rein!")

... dabei habe ich es mir etwas einfacher gemacht - du wirst anfangs viel Testen also habe ich die Verarbeitung der Abhebung herausgezogen und vor die PIN-Abfrage gesetzt.

Da wir das PIN-Problem bereits gelöst und getestet haben und es läuft sehe ich keinen Grund bei der Arbeit an der Abhebung 20x die PIN eingeben zu müssen.

Daher habe ich auch das Programm mit quit() beendet falls eine Auszahlung stattfindet um erst garnicht zur PIN-Prüfung zu kommen...

Nun kommen wir zur "Hochzeit" in der wir die einzelnen Teile zusammenfügen:

kontostand = 1000 

pin_ok = False
for i in range(3):
    pin = input("PIN: ").strip()
    if pin == "1234":
        pin_ok = True
        break

if pin_ok:
    while True:
        abhebung = int(input("Auszahlung: "))
        if abhebung > kontostand:
            print("Soviel Geld hätten Sie wohl gern...")
        else:
            kontostand -= abhebung
            print("Ihnen bleiben noch " + str(kontostand) + " EUR")
            break

else:
    print("Alter, du kummst do nit rein!")

Dann müssen wir nur die print-Anweisung mit der Schleife ersetzen und aus dem quit() könnten wir auch ein break machen.

Natürlich könnte man das Teilproblem mit der Auszahlung auch in eine Funktion machen:

kontostand = 1000 

def auszahlung(verfuegbar):
    while True:
        abhebung = int(input("Auszahlung: "))
        if abhebung > verfuegbar:
            print("Soviel Geld hätten Sie wohl gern...")
        else:
            return verfuegbar - abhebung

pin_ok = False
for i in range(3):
    pin = input("PIN: ").strip()
    if pin == "1234":
        pin_ok = True
        break

if pin_ok:
    kontostand = auszahlung(kontostand)
    print("Ihnen bleiben noch " + str(kontostand) + " EUR")

else:
    print("Alter, du kummst do nit rein!")

... dazu nehmen wir den kontostand als "Eingabewert" (der in der Funktions-Variable verfuegbar landet) für die Funktion die im Falle einer erfolgreichen Abhebung den neuen Kontostand mit return verfuegbar - abhebung zurückliefert und sich dann beendet.

Mit dem Rückgabewert überschreiben wir den kontostand aus dem Hauptprogramm und gehen dann die Meldung aus.

Funktionen helfen dir auch dabei Code besser zu strukturieren und wiederverwendbare Teile zu erstellen. Außerdem sorgen Sie dafür, dass es weniger wahrscheinlich ist, dass du in langem Code einen bereits verwendeten Variablennamen erneut nutzt denn die Variablen in der Funktion sind von den Variablen im Hauptprogramm abgekapselt...

Woher ich das weiß:Berufserfahrung – Softwareentwickler f. Web, Win. & Linux (seit 2001)
Youaa 
Fragesteller
 29.03.2020, 12:25

Wow, vielen Dank! Das ist eine wirklich gute und verständliche Erklärung!!

0

Die Kunst beim Programmieren besteht darin, große Probleme in kleine zu zerlegen. Viele Anfänger wollen das ganze Ding auf einmal bauen und verzweifeln daran.

Also brich dein großes Problem herunter auf die Schritte: erst die PIN überprüfen. Hat das geklappt? Super! Dann zum nächsten Schritt. Mit diesem Vorgehen wird auch die Struktur deines Programms übersichtlicher.

Dein Programm muss nicht sofort alles können. Es ist viel leichter, auf einer funktionierenden Basis weiterzuarbeiten. Das erleichtert auch die Fehlersuche: du weißt ja, welche Teile schon getestet sind und funktionieren.

Youaa 
Fragesteller
 28.03.2020, 16:37

Hey, danke für die Antwort!

Wie kriege ich es denn hin, das zuerst die Pin geprüft wird?

Immer wenn ich NUR die Pin in einer While schleife auf Ihre richtigkeit prüfen lasse, wird auch wirklich durchgehen die Pin geprüft. Wo bringe ich dann die anderen Anforderungen unter?

macht man dann eine neue while Schleife oder wie?

0
mertkert  28.03.2020, 16:41
@Youaa

Hier empfiehlt sich das gute alte Flussdiagramm/Ablaufdiagramm. Zeichne dir die Schritte mit Verzweigungen doch mal auf, dann kannst du das in Code übersetzen.

1

Meiner Meinung nach erfordert Programmieren eine hohe Frustrationstoleranz. Einen großen Teil der Zeit verbringt man oft nicht damit, zu programmieren, sondern im Testen und Fehlersuchen. Natürlich verschiebt sich das Verhältnis mit Erfahrung etwas - aber eine Anekdote, die ich mal von einem Firmenchef von extrem Sicherheitskritischer Software gehört habe: 1 Monat programmieren, mehr als 1 Jahr testen...

Ich finde es eigentlich ganz hilfreich, sich bestehende Programme anzuschauen - also zum Beispiel die Lösungen zu solchen Aufgaben... und dann ganz intensiv zu versuchen jeden Schritt zu verstehen.

Deine Idee klingt gar nicht so schlecht. Woran es liegt, dass es nicht klappt, kann man ohne Quelltext nicht sagen. Eine mögliche Herangehensweise wäre das Programm schrittweise zu programmieren. Fang erst mal mit einer Überprüfung der Pin und if-else an. Wenn das klappt, baust du die Schleife bei Fehleingabe drumherum.

Youaa 
Fragesteller
 28.03.2020, 16:29

Hey, also das ist gerade mein Code. Immer wenn ich es ausführe, kommt immer die Fehlermeldung "Der Pin ist Falsch", selbst wenn ich den richtigen eingebe.

Ich weiß nämlich nicht wie ich es schaffe das die Schleife erst den Pin prüft ob korrekt oder nicht und dann erst weiter geht mit dem Geld ausgeben (falls richtig). Wie kriege ich das hin das er zuerst nur den Pin prüft, und der rest dann danach erfolgt? LG

**Hier mein Code:**

geheimer_pin = 1234

geraten_pin=int(input("Bitte geben Sie ihren Pin ein: "))

kontostand = 1000

while geraten_pin != geheimer_pin:

   if geraten_pin!= geheimer_pin:

       print("Der Pin war Falsch")

       erneut = input("Versuchen Sie es erneut: ")

   elif geraten_pin== geheimer_pin:

       print("Der Pin ist korrekt")

       geld=input("Wieviel geld benötigen Sie?")

   elif geld==kontostand:

       print("Geld wird ausgezahlt!"

0
Youaa 
Fragesteller
 28.03.2020, 16:30
@Youaa

Hm also der Code sieht jetzt nicht so schön aus.. Ich weiß leider nicht wie man ihn als Code-format einfügen kann.

Ok gefunden :D

Hier der richtige Code:

geheimer_pin = 1234
geraten_pin=int(input("Bitte geben Sie ihren Pin ein: "))
kontostand = 1000


while geraten_pin != geheimer_pin:
    if geraten_pin!= geheimer_pin:
        print("Der Pin war Falsch")
        erneut = input("Versuchen Sie es erneut: ")
        
    elif geraten_pin== geheimer_pin:
        print("Der Pin ist korrekt")
        geld=input("Wieviel geld benötigen Sie?")
        
    elif geld==kontostand:
        print("Geld wird ausgezahlt!")
        
 

  
 
0
kmkcl  28.03.2020, 16:42
@Youaa

Bei der Fehlersuche ist es wichtig, dass du dich möglichst dumm stellst und wirklich nur überlegst, was der Computer macht. (nicht was du möchtest)

Am Anfang wird also nach der Pin gefragt. Wenn die Pin beim ersten Versuch richtig ist, wird die While-Schleife nicht ausgeführt. Wenn sie falsch ist, erscheint die Eingabe: "Versuchen sie es erneut" - aber mit dem Ergebnis "erneut" wird nie etwas gemacht. Weiterhin musst du über die Bedeutung von "elif" nachdenken. Das kann nur ausgeführt werden, wenn ein vorheriges if oder elif nicht ausgeführt wurde. Also elif geld==kontostand kann nie ausgeführt werden, weil entweder die Pin gleich ist, oder ungleich. Außerdem möchtest du in der Regel nicht nur dein gesamtes Geld vom Konto abheben. ;)

1
mertkert  28.03.2020, 16:45
@Youaa

Deine Logik ist durcheinander; du vermischt verschiedene Dinge.

Du willst erstmal die PIN überprüfen. Mach also eine Schleife, die solange wiederholt wird, bis die PIN stimmt (später mal kannst du auch einen Zähler einbauen und nach 3 Versuchen abbrechen)

Erst nach dieser Schleife weißt du, dass die PIN stimmt, und kümmerst du dich um Kontostände und Auszahlungen.

Übrigens nennt man das, was du da baust, in der Informatik "endlicher Automat". Es ist manchmal nicht schlecht, sich das auch so aufzuzeichnen.

1
Youaa 
Fragesteller
 28.03.2020, 16:52
@mertkert

Okay, dankeschön. Ich werde nochmal weiter versuchen diese Aufgabe zu lösen.

Wenn ich es geschafft habe, durch eine While schleife den Code zu überprüfen. Wie würde ich denn dann weiter vorgehen um das Geld zu prüfen? wird die prüfung dann ausserhalb der ersten while schleife stattfinde?

0
mertkert  28.03.2020, 16:53
@Youaa

Wozu machst du die Schleife überhaupt? Um die PIN-Eingabe zu wiederholen, falls nötig.

Hat das was mit dem Kontostand oder der Auszahlung zu tun? Nein. Das ist der nächste Zustand, der nach Eingabe der gültigen PIN erreicht wird.

Da hast du die Antwort. Natürlich ist eine realistische Nachbildung eines Geldautomaten komplizierter und hat viel mehr Zustände, aber im Grunde wird man auch so vorgehen.

0
kragenweiter  28.03.2020, 17:47
@Youaa

Das ist ein bisschen doppeltgemoppelt und auch nicht sauber getrennt.

Wenn du eine While-Schleife machst wie diese, dann drehst du dich so oft in der While-Schleife, bis geraten=geheim. Dann brauchst du aber auch keine If-Abfrage, das hat die While-Schleife ja schon geklärt, sondern nur eine erneute Eingabe. Da sollte dann aber auch die gleiche Variable gefüllt werden, du verwendest jetzt hier "erneut" statt "geraten".

IMHO würde ich hier aber eher eine Do-While-Schleife (fußgesteuert) verwenden, dann kannst du die erste Variablen-Zuweisung "geraten" gleich in die Schleife reinpacken. Die wird dann beim ersten Mal mit durchlaufen und wiederholt sich so lange, bis es passt.

Die ElseIf-Anweisungen brauchst du dann garnicht. Nur die Überprüfung des Kontostands musst du mit einer einen If-Abfrage NACH der Schleife machen.

0

Das braucht alles seine Zeit, dass weiß ich von mir selber. Gehe die Basics aktiv und konsequent durch und dann bekommt einen immer besseren Überblick über die Programmiersprache die du lernen willst. Das geht halt leider nicht in immer in ein paar Tagen oder 2 Wochen.

Woher ich das weiß:eigene Erfahrung

Ich hätte das so gemacht

master_pin = '1234'
user_pin = ''
money = 1000
exit = False
def transferMoney():
    transfer = 0
    global exit
    global money
    while money > 0:
        ok = False
        while not ok:
            try:
                transfer = int(raw_input('How much money do you want to pay out: '))
                ok = True
            except ValueError:
                print('Just input numbers!')
        if(money - transfer) < 0:
            break
        money -= transfer
        print('Money left: ' + str(money))
        a = raw_input('Do you want to pay out more [y/n]: ')
        if a[0].lower() == 'n':
            exit = True
            break




while user_pin != master_pin:
    user_pin = raw_input('Enter your PIN: ')
    if user_pin != master_pin:
        print('PIN invalid!')
print('PIN OK! Logged in.')
transferMoney()
if not exit:
    print('Not enough money in your Bank accoutn.')
    r  = raw_input('Retry? [y/n]: ')
    if r[0].lower() == 'y':
        transferMoney()


Woher ich das weiß:Studium / Ausbildung – Informatikstudent
Youaa 
Fragesteller
 28.03.2020, 16:35

Hey, danke für deine Antwort! Die Antwort funktioniert bestimmt. Jedoch bin ich noch nicht so weit das ich so einen Code schreiben könnte :P

komme momentan noch nicht wirklich klar wo was hin kommt, und wie man was schreibt/schreiben darf..

Habe es bisher nur so hin bekommen, aber das klappt auch nicht :P

geheimer_pin = 1234
geraten_pin=int(input("Bitte geben Sie ihren Pin ein: "))
kontostand = 1000


while geraten_pin != geheimer_pin:
    if geraten_pin!= geheimer_pin:
        print("Der Pin war Falsch")
        erneut = input("Versuchen Sie es erneut: ")
        
    elif geraten_pin== geheimer_pin:
        print("Der Pin ist korrekt")
        geld=input("Wieviel geld benötigen Sie?")
        
    elif geld==kontostand:
        print("Geld wird ausgezahlt!")
        
 

  

1
whgoffline  28.03.2020, 16:39
@Youaa

Ich würde das ca. so machen...

geheimer_pin = '1234'
geraten_pin = '0000'
kontostand = 1000
while geheimer_pin != geraten_pin:
  geraten_pin = raw_input('Geben sie ihren Pin  ein: '))
  if geraten_pin!= geheimer_pin:
    print('Pin falsch')
#Hier unten ist der Pin dann sicher richtig!
print('Erfolgreich eingeloggt!')     
1
whgoffline  28.03.2020, 16:40
@Youaa

Ich glaube du musst übrigens strings für die Pins benutzen, da 0123 als int glaub ich zu 123 wird ;)

0
Youaa 
Fragesteller
 28.03.2020, 16:43
@whgoffline

Ah okay, das ist schonmal gut zu wissen :P

Wie so hast du denn Oben geraten_pin='0000' eingegeben, wenn man den Pin ja selbst eintippen soll? Ist das das notwendig?

1
whgoffline  28.03.2020, 16:45
@Youaa

Das habe ich gemacht, da ich den nutzer erst in der while Schleife nach dem Pin frage. Und 0000 natrülich != 1234 ist.

1