Seite 1 von 1

Ich bin zu dumm,- while schleife mit mehreren Bedingungen

Verfasst: Donnerstag 2. April 2020, 18:54
von Torfxx
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)

Re: Ich bin zu dumm,- while schleife mit mehreren Bedingungen

Verfasst: Donnerstag 2. April 2020, 19:34
von Sirius3
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

Re: Ich bin zu dumm,- while schleife mit mehreren Bedingungen

Verfasst: Donnerstag 2. April 2020, 19:47
von __blackjack__
@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.