Geht Varialeninhalte tauschen auch irgendwie anders?

Objektorientierte Skriptsprache: (python.org)
ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von ProgBeginner » Fr Okt 31, 2014 3:04 am

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?
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von nouseforname » Fr Okt 31, 2014 6:14 am

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...

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von ProgBeginner » Fr Okt 31, 2014 7:15 am

Ich bedanke mich ;)
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von mfro » Fr Okt 31, 2014 7:19 am

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).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von ProgBeginner » Fr Okt 31, 2014 7:27 am

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.
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von mfro » Fr Okt 31, 2014 7:42 am

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!
Zuletzt geändert von mfro am Fr Okt 31, 2014 8:00 am, insgesamt 1-mal geändert.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von ProgBeginner » Fr Okt 31, 2014 7:59 am

Ok, Recht haste ... so ganz verstehen tu ichs trotzdem noch nicht.
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von cloidnerux » Fr Okt 31, 2014 10:03 am

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von oenone » Fr Okt 31, 2014 10:26 am

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
.

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Geht Varialeninhalte tauschen auch irgendwie anders?

Beitrag von ProgBeginner » Fr Okt 31, 2014 5:55 pm

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
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Antworten