Schwierigkeiten bei folgenden Programmierungen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
waYnezettl
User
Beiträge: 3
Registriert: Montag 2. Juni 2014, 14:19

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
Zuletzt geändert von Hyperion am Montag 2. Juni 2014, 14:38, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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`.
waYnezettl
User
Beiträge: 3
Registriert: Montag 2. Juni 2014, 14:19

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waYnezettl
User
Beiträge: 3
Registriert: Montag 2. Juni 2014, 14:19

Danke für die ganzen Tipps :)
Antworten