Ich bin zu dumm,- while schleife mit mehreren Bedingungen

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
Torfxx
User
Beiträge: 1
Registriert: Donnerstag 2. April 2020, 18:41

Hallo,
ich bin quasi ein absoluter Anfänger im Bereich Python, deswegen entschuldigt meine vermutlich unnötig langen codes.
Ich hab ein Problem: Ich programmiere gerade ein Programm, welches eine Reihe von Zahlen miteinander Verrechnet und zu einem Ergebnis kommt. Jedoch fehlt die erste Zahl (wird zu X). Das ganze soll im Kopf aufgelöst werden, deswegen möchte ich das das Ergebnis keine Kommastellen hat, sowie unter + und - Tausend bleibt. Jetzt habe ich das ganze in eine while schleife eingebunden. Das mit den Kommastellen klappt super, aber sobald ich versuche ein "and" einzufügen, werden meine Variablen in der nächsten if abfrage nicht mehr erkannt. Deswegen hier eine abgespeckte Version. Zusatzfrage, gibt es einen Trick, das meine Ausgabe am Ende ohne " " und ,,, ausgegeben wird?
LG

Code: Alles auswählen

import random

x= random.randrange(1, 50)
a= random.randrange(1, 50)
b= random.randrange(1, 50)
o2= 2.5
while o2 %1 > 0 ### and o2 > 1000 ####:
    OpA =[x+a, x-a, x/a, x*a]
    o1= random.choice(OpA)
    OpB= [o1+b, o1-b, o1/b, o1*b]
    o2= random.choice(OpB)
if o1==x+a:
    OpX= '+'
if o1==x-a:
    OpX= '-'
if o1==x/a:
    OpX= '/'
if o1==x*a:
    OpX= '*'

if o2==o1+b:
    Op1= '+'

if o2==o1-b:
    Op1= '-'
if o2==o1/b:
    Op1= '/'
if o2==o1*b:
    Op1= '*'

print("X", OpX,a,Op1,b, '=', o2)
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist seltsam, erst etwas auszurechnen um dann hinterher abzufragen, welcher Operator dahintersteckt. Die Variablennamen sind so kryptisch, dass ich ständig hin und herspringen muß, weil ich schon nicht mehr weiß, welcher Name was bedeutet. Das macht das Lesen unerträglich.
Deshalb gebe ich auf, das Programm verstehen zu wollen.
Besser ist sowieso der umgekehrte Weg. Du würfelst Dir erst eine Operation. Dann würfelst Du Dir eine Zahl. Die zweite Zahl wird dann aus der Menge ausgewählt, so dass Deine Nebenbedingungen eingehalten werden. Dann brauchst Du keine Schleife.
Beispiel: a - b soll eine Zahl zwischen 1 und 100 ergeben und a und b sollen auch in diesem Bereich liegen.

Code: Alles auswählen

if operation == "-":
    a = randint(2, 100)
    # b so wählen, dass a - b zwischen 1 und 100 liegt
    b = randint(1, a-1)
    ergebnis = a - b
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Torfxx: Die Zusatzfrage zuerst: Hör einfach auf Python 2 zu verwenden. Das hat sein verdientes Lebensende erreicht und wird von den Entwicklern nicht mehr unterstützt.

Ganz allgemein sind das besch…eidene Namen. Namen sollten nicht aus kryptischen Abkürzungen oder gar Einzelbuchstaben bestehen, sondern gut verständlich beschreiben was der Wert bedeutet. Zudem schreibt man die klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Das Programm, also das gesamte Vorgehen ist IMHO für die Tonne. Ich finde das nur fürchterlich verwirrend und das dürfte auch interessant werden nachvollziebar zu erklären warum die ``while``-Schleife a) nicht in eine Endlosschleife mutieren kann, und b) wie denn die Wahrscheinlichkeit für die einzelnen Rechenoperationen ist, denn wenn "/" nur gewählt wird wenn das Ergebnis eine ganze Zahl ist und ansonsten neu gewürfelt wird, dann sinkt ja schon mal die Wahrscheinlichkeit das "/" als Rechenoperation raus kommt. Sinnvoller wäre es die Rechenoperationen getrennt zu behandeln, also erst die Operation auszuwählen, und dann je nach Operation die Operanden so zu wählen das die gewünschten Kriterien eingehalten werden. Falls es dabei bei Operanden Gemeinsamkeiten gibt, kann man das ja in Funktionen herausziehen.

Ganze Zahl bei Division kann man beispielsweise einfach und in linearer Zeit erreichen in dem man nicht die beiden Operanden auswürfelt, sondern einen Operanden und das Ergebnis. Den anderen Operanden kann man damit dann einfach durch Multiplikation ausrechnen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten