Seite 1 von 1

Evtl. doppelte while Schleife - Problem

Verfasst: Freitag 20. Oktober 2006, 09:17
von Schlappohr
Hallo an alle Python-Fans,

ich beginne gerade erst mit der Python-Programmierung und hoffe hier bei euch Hilfe finden zu können. Ich poste einfach mal kurz den Code

Code: Alles auswählen

# -*- coding: cp1252 -*-

# Programm zur Berechnung einer Iterationsfolge
# fuer ein beliebigen Startwert n und der bekannten
# Iterationsvorschrift für a_(n+1) des Collatz-Problems




def inKrement():
    weiter = True
    i = 0
    
    while weiter:
        n = int(raw_input('Bitte geben sie eine Zahl ein: '))
        print n, '\t',   
        i = i+1
        if n == 0 or n == 1:
            print '\n'
            print 'Das waren',i-1,'Schritte um zur 1 zu gelangen!\n'
        elif (n % 2) != 0:
            n = 3*n+1
            i = i+1
            print n, '; ',
        elif (n % 2) == 0:
            n = n/2
            print n, '; ',
            i = i+1
        elif n=='ende':
            break
    print 'Sie haben das Programm beendet!'
inKrement()
print 'Fertig!'
Lass ich dieses Programm nun starten liest er immer schon nach einem Iterationsschritt eine neue Zahl obwohl er die Iterationsvorschrift erst komplett durchlaufen und dann eine neue Zahl lesen soll.

Ich habe mir mal überlegt eine weitere while-Schleife zu setzen habe aber keine Ahnung unter welcher Vorraussetzung ich das machen soll und wo sie am Besten zu setzen ist.

Eine weitere Frage ist, wie ich den gesamten Rechenprozess von einer Zahl bei dieser Iterationsabfolge dann in einer Datei speichern kann...
Wie kann ich nur Teile der Ausgabe des Programm in einer anderen Datei abspeichern?

Hoffe ihr könnt mir helfen :).

Lieben Gruß und schonmal jetzt vielen Dank für eure Hilfe!

Schlappohr

Verfasst: Freitag 20. Oktober 2006, 09:45
von Rebecca
Aus deiner Funktion wuerde ich die Benutzereingabe und die Abbruchbedingung mit dem "ende" rausnehmen. Diese Funktion sollte besser als Paramter den Startwert nehmen und dann deine while-Schleife ausfuehren.

Das mit der Benutzereingabe wuerde ich dann getrennt machen, also im Hauptteil eine while-Schleife machen, die Benutzer-Eingaben entgegennimmt und dann zu jeder Benutzereingebe entweder die oben programmierte Funktion aufruft oder abbricht.

Klar?

Verfasst: Freitag 20. Oktober 2006, 12:30
von Schlappohr
Hi :),
danke für deine Antwort :)

ich habe es wie folgt probiert:

Code: Alles auswählen

# -*- coding: cp1252 -*-

# Programm zur Berechnung einer Iterationsfolge
# fuer ein beliebigen Startwert n und der bekannten
# Iterationsvorschrift für a_(n+1) des Collatz-Problems



def inKrement():
    weiter = True
    start = True
    i = 0 

    
    while start:
            n = int(raw_input('Bitte geben sie eine Zahl ein: '))
            if n!=0:        
                print n, '\t',   
                i = i+1
                while weiter:
        
                    if n == 1:
                        print '\n'
                        weiter = False
                    elif (n % 2) != 0:
                        n = 3*n+1
                        i = i+1
                        print n, '; ',
                    elif (n % 2) == 0:
                        n = n/2
                        print n, '; ',
                        i = i+1
                print 'Das waren',i-1,'Schritte um zur 1 zu gelangen!\n'
            else:
                break
    print 'Sie haben das Programm beendet!'
inKrement()
print 'Fertig!'
Bei der Ausgabe errreiche ich aber nur einmalig mein Ziel. Schon beim zweiten Mal Variablen eintippen geht das Programm gar nicht mehr auf die while-Schleife ein, und das verstehe ich nicht.
Desweiteren habe ich als while-Bedingung einfach mal start (=True) gewählt. Ist das elegant oder eher blödsinnig?
Und dann noch eine Frage, ich muss aus welchen Gründen auch immer
# -*- coding: cp1252 -*- am Anfang des Programmes haben. Aber es ist doch sowieso eigentlich egal da diese Zeile nur als Kommentar vorliegt und auch keine Umlaute vorliegen... Komisch.

Lieben Gruß,

Andy

Verfasst: Freitag 20. Oktober 2006, 13:22
von Rebecca
Ich habe einige wenige Aenderungen zugefuegt (siehe Kommentare), so funktioniert das Programm richtig:

Code: Alles auswählen

def inKrement():
    while True:  #Hierfuer brauchts du nicht extra eine Variable einfuehren
        weiter = True # Diese beiden Variablen muessen bei jeder neuen 
        i = 0         # User-Eingabe wieder neu gesetzt werden!!!

        n = int(raw_input('Bitte geben sie eine Zahl ein: '))
        if n!=0:       
            print n, '\t',   
            i = i+1
            while weiter:

                if n == 1:
                    print '\n'
                    weiter = False
                elif (n % 2) != 0:
                    n = 3*n+1
                    i = i+1
                    print n, '; ',
                elif (n % 2) == 0:
                    n = n/2
                    print n, '; ',
                    i = i+1
            print 'Das waren',i-1,'Schritte um zur 1 zu gelangen!\n'
        else:
            break
    print 'Sie haben das Programm beendet!'

    
inKrement()

Verfasst: Freitag 20. Oktober 2006, 13:37
von BlackJack
`weiter` würde ich auch beseitigen und die Zuweisung in der inneren Schleife ebenfalls durch ``break`` ersetzen.

Als nächstes könnte man die Berechnung in eine Funktion auslagern die eine Liste berechnet und Ausgabe und Berechnung trennen.

Verfasst: Freitag 20. Oktober 2006, 13:38
von Schlappohr
Wunderbar, danke Rebecca, verstanden :)...

Und nun zu meinen anderen Fragen deren Antworten mich sehr interessieren :)

1. Ich möchte die Anzahl der Iterationsschritte im Zusammenhang mit der eingegebenen Zahl in einem Text-Dokument (also einer Datei) abspeichern, und das nach jeder neuen Anfangzahl und auch im selben Dokument sodass sich letztlich eine Tabelle ergibt mit der ich weiterarbeiten kann :)

2. ...s.o.


Danke danke danke :))

Schlappohr aus HB :)))

Verfasst: Freitag 20. Oktober 2006, 13:38
von Rebecca
Und so in etwa wuerde ich es machen: :)

Code: Alles auswählen

def berechneFolge(n):
    i = 0;
    
    while True:
        print n, "\t",
        
        if n in (0, 1):
            print "\n"
            return i
        
        if (n % 2) != 0:
            n = 3*n+1
        else:
            n = n/2
 
        i = i+1


#Hauptteil:
while True:  
    n = raw_input('Bitte geben sie eine Zahl ein: ')
    if n == "":
        print 'Sie haben das Programm beendet!';
        break;
    
    schritte = berechneFolge(int(n));
    
    print 'Das waren', schritte ,'Schritte um zur 1 zu gelangen!\n'
EDIT: BlackJacks Vorschlag mit der Liste ist natuerlich noch besser!

Verfasst: Freitag 20. Oktober 2006, 14:05
von BlackJack
Schlappohr hat geschrieben:1. Ich möchte die Anzahl der Iterationsschritte im Zusammenhang mit der eingegebenen Zahl in einem Text-Dokument (also einer Datei) abspeichern, und das nach jeder neuen Anfangzahl und auch im selben Dokument sodass sich letztlich eine Tabelle ergibt mit der ich weiterarbeiten kann :)
Dann musst Du eine Datei zum schreiben öffnen und dort die beiden gewünschten Zahlen und einen Zeilenumbruch pro Schleifendurchlauf hineinschreiben. Wenn Dir alle Werte für n=1..10000 ausreichen, dann gibt's die auch schon fertig im Netz:

http://www.research.att.com/~njas/sequences/b006577.txt

Ansonsten:

Code: Alles auswählen

from itertools import imap

def inkrement(n):
    result = [n]
    while n != 1:
        if n & 1:
            n = 3 * n + 1
        else:
            n = n // 2
        result.append(n)
    return result


def main():
    table_file = open('collatz.txt', 'w')
    while True:
        n = int(raw_input('Startzahl oder 0 für Ende: '))
        if n == 0:
            break
        else:
            result = inkrement(n)
            steps = len(result) - 1
            print '; '.join(imap(str, result))
            print 'Das waren %d Schritte um zur 1 zu gelangen!\n' % steps
            table_file.write('%s %s\n' % (n, steps))
    table_file.close()


if __name__ == '__main__':
    main()
Aber Vorsicht: Die Textdatei wird bei jedem Programmstart neu angelegt bzw. die alte überschrieben.

Verfasst: Freitag 20. Oktober 2006, 14:13
von Schlappohr
Vielen Dank :))

ich werde mir das jetzt erstmal zur gemüte führen und mich dann später wieder melden :)

Habt mir schon jetzt sehr geholfen!!! :)

Bis denne,

Schlappohr