Seite 1 von 3

Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 3:04 am
von ProgBeginner
Hallo zusammen

Ich habe mich vor kurzem mal dadran gemacht, in Python ein kleines Zahlenratespielchen zusammenzufrickeln, in welchem der User den Zahlenbereich, in welchem die zu ratende Zahl liegen soll, selbst bestimmen kann.

Dafür habe ich die Variablen minZahl und maxZahl.

Wenn die Eingabe für minZahl größer ist als maxZahl, wird ausgetauscht. Der Code für dieses Prozedere ist recht unübersichtlich gestaltet, weil hin und her kopiert wird mit Behelfsvariablen.

Das Ganze mal in Code:

Code: Alles auswählen

  # Make sure that "minZahl" is less than "maxZahl"
  if maxZahl < minZahl:
    minZahl1 = maxZahl
    maxZahl1 = minZahl
    maxZahl = maxZahl1
    minZahl = minZahl1


Dieses Austauschen sollte doch auch irgendwie anders gehen oder?

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 6:14 am
von nouseforname
ProgBeginner hat geschrieben: Wenn die Eingabe für minZahl größer ist als maxZahl, wird ausgetauscht. Der Code für dieses Prozedere ist recht unübersichtlich gestaltet, weil hin und her kopiert wird mit Behelfsvariablen.
Das mit den Hilfsvariablen ist ja nicht falsch, aber es genügt eine einzige. Nach dem Kopieren der ersten Variable steht diese ja zur Verfügung einen neuen Wert zu erhalten:

Code: Alles auswählen

if maxZahl < minZahl:
    tmp = minZahl
    minZahl = maxZahl
    maxZahl = tmp   
Dieses Austauschen sollte doch auch irgendwie anders gehen oder?
Python unterstützt Mehrfachzuweisung, das macht das ganze sehr einfach:

Code: Alles auswählen

minZahl, maxZahl = maxZahl, minZahl

Hab das gerade selbst durchgetestet...

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 7:15 am
von ProgBeginner
Ich bedanke mich ;)

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 7:19 am
von mfro
nouseforname hat geschrieben:
ProgBeginner hat geschrieben: Wenn die Eingabe für minZahl größer ist als maxZahl, wird ausgetauscht. Der Code für dieses Prozedere ist recht unübersichtlich gestaltet, weil hin und her kopiert wird mit Behelfsvariablen.
Man kann die Hilfsvariable auch ganz weglassen (warum?):

Code: Alles auswählen

minZahl = minZahl ^ maxZahl 
maxZahl = minZahl ^ maxZahl
minZahl =  minZahl ^ maxZahl
Lesbarer wird es dadurch nicht, aber manchmal ist es nützlich, wenn man den Trick kennt (und versteht).

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 7:27 am
von ProgBeginner
Den check ich jetzt nicht.


Gegeben Sei :

Code: Alles auswählen

try:
  minZahl = int(input("Bitte geben Sie den Mindestwert ein: ")) 
  maxZahl = int(input("Bitte geben Sie den Maximalwert ein: "))
except ValidationError:
  print("Es sind nur Ganzzahlen erlaubt!")
  continue


Jetzt gehe ich mit deinem Algorithmus her :

Als Mindestwert geb ich mal 50 ein und als Maximalwert 10, damit dieser "Fehlerfall" auf jeden Fall eintritt und folgende if-Bedingung zum Tragen kommt:

Code: Alles auswählen

if maxZahl < minZahl:
  minZahl = minZahl ^ maxZahl   # heisst: minZahl = 50 ^ 10 ... 50 * 50 * 50 [...]
  maxZahl = minZahl ^ maxZahl # heisst hier: Das Ergebnis aus dem vorherigen 50 ^ 10 nochmal ^ 10 
  minZahl = minZahl ^ maxZahl # minZahl = 50 ^ 10 ^ ((50 ^ 10) ^ 10) ? 


Das soll mal jemand blicken ... da kommen doch total andere Werte bei raus als ursprünglich gewünscht.

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 7:42 am
von mfro
ProgBeginner hat geschrieben:

Code: Alles auswählen

if maxZahl < minZahl:
  minZahl = minZahl ^ maxZahl   # heisst: minZahl = 50 ^ 10 ... 50 * 50 * 50 [...]
...


Das soll mal jemand blicken ... da kommen doch total andere Werte bei raus als ursprünglich gewünscht.
Ich gebe zu, das war jetzt ein bißchen fies...

Aber 50 ^ 10 ist 56, nicht 50 * 50 * 50 * ... und der Code liefert so wie hingeschrieben das richtige Ergebnis.

Schlag' mal den "^"-Operator nach!

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 7:59 am
von ProgBeginner
Ok, Recht haste ... so ganz verstehen tu ichs trotzdem noch nicht.

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 10:03 am
von cloidnerux
Ok, Recht haste ... so ganz verstehen tu ichs trotzdem noch nicht.
Der XOR-Operator "^" hat folgende Eigenschaft für zwei Eingaben A und B:

Code: Alles auswählen

(A ^ B) ^ B = A
(A ^ B) ^ A = B
Daher, ein erneutes Anwenden mit einem der beiden Operanden ergibt den anderen Operanden.
Das wird z.B auch für primitive Verschlüsselung genutzt.

In dem Fall hier(minZahl = A, maxZahl = B, C ist eine Zwischenvariable fürs bessere Verständnis):

Code: Alles auswählen

C = A ^ B
B = C ^ B = (A ^ B) ^ B = A
A = C ^ B = (A ^ B) ^ A = B

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 10:26 am
von oenone
Lesbarer wird es aber auf jeden fall mit der Mehrfachzuweisung. Lass solche obfuscated tricks und schreib einfach

Code: Alles auswählen

A,B=B,A
.

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Verfasst: Fr Okt 31, 2014 5:55 pm
von ProgBeginner
Zu der Sache mit dem XOR ( bzw bei Python mit dem ^ dargestellt ) :

Und jeder Taschenrechner der AND, OR, XOR kann, spuckt mir die gleichen Ergebnisse aus :

FRAGE

Wie lautet der Rechenalgorithmus, mit dem man bei der Aufgabenstellung 50 XOR 10 auf 56 kommt?

Aus anderen Kontexten glaube ich, mich zu erinnern, XOR = Exklusiv Oder = Entweder Oder.

Um das in die Formularauswertung von beispielsweise PHP einfliessen zu lassen :

Code: Alles auswählen

if (isset($_POST['Name']) XOR (isset($_POST['Vorname'])) 
{
  echo "Hallo Welt";
}


Würde bedeuten :

ENTWEDER Name ODER Vorname des vorgeschalteten Formulars müssen ausgefüllt sein. Sind beide ausgefüllt, ist die Bedingung nicht erfüllt und es kommt nicht zum echo "Hallo Welt".

Übertragen auf Rechenoperationen mit Zahlen :

Entweder 50 Oder 10 = 56 ?

HÄ ?
Entweder Bahnhof oder ProgBeginner klaut Koffer