Seite 1 von 1

Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 14:24
von waYnezettl
Hallo liebe Community, ich bin noch relativ neu zum Thema Programmieren und lerne der Zeit Python 2.7 und habe mir aus dem Internet einige Aufgaben rausgesucht um ein bisschen das theoretische Wissen praktisch anwenden zu können und zu üben.

Meine Fragen betreffen Aufgaben 3 und 4 von folgendem Link:
http://www.fb10.uni-bremen.de/homepages ... t/ueb2.pdf

Zur Frage 3:

Ich habe den ersten Teil programmieren können nun bin ich mir aber nicht sicher, wie ich nachdem "Stop" eingegeben wird die Liste der vorherigen raw_input() aufzeigen soll.

Code: Alles auswählen

def drucke_zk_liste():
    print "Bitte geben Sie einen Satz ein. Vorgang mit 'Stop' beenden:"
    Stop = "Stop"
    while raw_input() != Stop:   
        print "Bitte geben Sie einen Satz ein. Vorgang mit 'Stop' beenden:"
    else:
        print "Beendet"

Zur Frage 4:

Ich habe das hier programmiert und bin mir sicher das ich was falsch gemacht habe, komme aber selber nicht darauf:

Code: Alles auswählen

import random
random.seed()
a = random.randint(1,25)

def rate_die_zahl():
    print "Bitte geben Sie eine Zahl zwischen 1 und 25 ein"
    x = raw_input()
    while x != a:
        if x < a:
            print "Ihre Zahl ist zu klein. Nochmal von vorne."
            rate_die_zahl()
        elif x > a:
            print "Ihre Zahl ist zu gros. Nochmal von vorne."
            rate_die_zahl()
        else:
            print "Richtig! Das ist die gesuchte Zahl!"

Mein problem ist das die shell mir immer anzeigt den Print: "Ihre Zahl ist zu gros. Nochmal von vorne." und ich verstehe nicht warum es gleich zu dem Befehl springt und nicht den ersten einnimmt. Zudem funktioniert das programm leider nicht da ich irgendwas einfach eingeben kann und er immer nur den print ausspuckt.

Hoffe ihr könnt einen noobie helfen :)

Vielen Danke

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 14:40
von mutetella
@waYnezettl
Zu Aufgabe 3:
Es gibt kein ``while: ... else: ...`` Konstrukt. Die Schleife wird so lange durchlaufen, bis `Stop` nicht mehr 'Stop' ist.

Zu Aufgabe 4:
`raw_input()` gibt immer einen String zurück. Auch wenn in diesem String nur eine Zahl steht bleibt es trotzdem ein String...

mutetella

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 14:43
von Hyperion
Ohne den Zettel angeguckt zu haben, sehe ich einige offensichtliche Probleme / Fehler:

Zu Aufgabe 3): Du musst Dir die Eingaben von ``raw_input`` merken! Dazu muss die Eingabe raus aus der Bedingung von ``while`` hinein in den Rumpf und die Bedingung anderweitig lauten; evtl. wäre eine Endlosschleife ok, die Du bei der Abbruchbedingung mittels ``break`` verlässt.

Zu Aufgabe 4): Du mischst eine Schleife mit einer (ungewollten!) Rekursion, indem Du im Rumpf die Funktion erneut aufrufst. Das ist doch total unnötig! Du willst auch hier die Schleife bei einem Treffer einfach verlassen (``break``). Zudem musst Du die Eingabe *in* die Schleife verlagern und den Rückgabewert in einen Integer-Wert wandeln! Im Moment vergleichst Du den gegebenen Integer-Wert mit einem String.

Zudem würde ich die zu erratene Zahl als Parameter in die Funktion hinein reichen und nicht global definieren.

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 14:45
von BlackJack
@mutetella: Python kennt auch einen ``else``-Zweig für ``for``- und ``while``-Schleifen. Der macht aber nur Sinn wenn in der Schleife auch irgendwo die Möglichkeit besteht das eine ``break``-Anweisung ausgeführt wird, weil nur dann wird der ``else``-Zweig *nicht* ausgeführt.

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 15:25
von mutetella
@BlackJack
Ui, das wusste ich nicht... :oops:

Hab' dazu gerade das Beispiel gefunden:

Code: Alles auswählen

def party():
    running = 1
    friends = []
    while running:
        said = raw_input('Who\'s coming to the party? ')
        if said == 'parents':
            print 'Party plans abandoned'
            break
        elif said == '':
            print 'Data entry complete'
            running = 0
        else:
            friends.append(said)
    else:
        print 'Having a party for ',
        print friends
    print 'program exiting'
Ok, kann man so machen, aber gefallen tut's mir nicht...

mutetella

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 15:45
von /me
waYnezettl hat geschrieben:Ich habe den ersten Teil programmieren können nun bin ich mir aber nicht sicher, wie ich nachdem "Stop" eingegeben wird die Liste der vorherigen raw_input() aufzeigen soll.
Wenn du eine Liste haben möchtest, dann solltest du auch eine verwenden. Erstelle zu Beginn eine leere Liste und füge die eingegebenen Texte in der Schleife an. Im Tutorial sind Listen ziemlich am Anfang.

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Montag 2. Juni 2014, 15:58
von BlackJack
@mutetelle: Das typische Muster wo man so etwas gebrauchen kann ist das hier:

Code: Alles auswählen

    for item in items:
        if item.answer == 42:
            break
    else:
        item = None  # Or some other default.

    # Do something with `item`.
Nach der Schleife hat `item` entweder einen Wert aus `items` oder falls nichts passendes gefunden wurde, das was im ``else``-Zweig zugewiesen wurde.

Ohne das ``else`` würde man sonst üblicherweise ein zusätzliches Flag und einen Test einführen:

Code: Alles auswählen

    found = False
    for item in items:
        if item.answer == 42:
            found = True
            break
    if not found:
        item = None  # Or some other default.

    # Do something with `item`.

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Mittwoch 4. Juni 2014, 12:37
von waYnezettl
Aufgabe 4 habe ich jetzt so gelößt:

Code: Alles auswählen

def rate_die_zahl():
    x = "bla"
    import random
    random.seed()
    a = random.randint(1,25)
    print "Bitte geben Sie eine Zahl zwischen 1 und 25 ein"
    while x != a:
        x = raw_input()
        xint = int(x)
        if xint < a:
            print "Ihre Zahl ist zu klein. Nochmal von vorne."
                        
        elif xint > a:
            print "Ihre Zahl ist zu gros. Nochmal von vorne."
            
        else:
            print "Richtig! Das ist die gesuchte Zahl!"
            break
Hättest du es auch so gemacht oder hast du noch ein paar tipps für mich?

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Mittwoch 4. Juni 2014, 13:00
von Hyperion
Ich hätte es sicherlich ein wenig anders gelöst.

Was Du leicht verbessern könntest wären folgende Punkte:

- Import aus der Funktion in den Kopf des Moduls ziehen!
- Spare Dir den Aufruf von ``random.seed``.
- Aus

Code: Alles auswählen

x = raw_input()
        xint = int(x)
mache

Code: Alles auswählen

x = int(raw_input())
- Benenne Namen nicht mit Typen (``xint``), sondern nach *Bedeutung*! Hier z.B. ``guess``.
- Entferne die Leerzeilen zwischen den ``if``-Ästen
- Setze ``x`` auf 0 ;-)

Re: Schwierigkeiten bei folgenden Programmierungen

Verfasst: Dienstag 10. Juni 2014, 12:21
von waYnezettl
Danke für die ganzen Tipps :)