Gerade oder ungerade? (Zahlentest 2)
-
Hallo, ich habe noch eine kleine Aufgabe zu bewältigen:
Die Funktion
bool iseven(int i)soll einen wahren Wert zurückliefern, wenn der übergebene ganzzahlige Wert gerade und einen falschen Wert, wenn er ungerade ist.
Entschuldigt bitte, wenn das mit dem schönen Formatieren noch nicht so klappt. Ich habe die Aufgabe so gelöst und wüsste gerne, ob das okay ist:
#include <iostream> using namespace std; bool iseven(int value) { if(value % 2 == 0) { return true; } else return false; } main() { int j; bool k; cout << "Bitte eine Zahl eingeben:" << endl; cin >> j; k=iseven(j); cout << "Die Funktion liefert: " << k << endl; if(k) { cout << "Das bedeutet: Die eingegebene Zahl ist gerade." <<endl; } else cout << "Das bedeutet: Die eingegebene Zahl ist ungerade." <<endl; }Wenn die übergebene Zahl gerade istm wird 1 zurückgegeben (das steht doch für: wahr) und ansonsten 0 (falsch).
Viele Grüße und vielen Dank fürs Lesen!
computing1
-
Ist ok, bis auf eine Sache (siehe unten). Es ist aber möglich und üblich, den exakt gleichen Code mit einfachen Mitteln deutlich abzukürzen:
#include <iostream> using namespace std; bool iseven(int value) { return value % 2 == 0; } int main() // WICHTIG: Implizites int gibt es in C++ nicht! { int j; cout << "Bitte eine Zahl eingeben:\n"; cin >> j; bool k = iseven(j); cout << "Die Funktion liefert: " << k << '\n'; if(k) { cout << "Das bedeutet: Die eingegebene Zahl ist gerade.\n"; } else cout << "Das bedeutet: Die eingegebene Zahl ist ungerade.\n"; }
-
du kannst dir das if hier sparen.
bool iseven(int x) { return x % 2 == 0; }
-
die funktion sieht vom prinzip gut aus, aber du machst dir zu viel schreibarbeit....
einfach "return value%2 == 0;"

-
da war ich wohl zu spät

-
Hey, danke!
Ja, da merkt man, daß ich noch am Anfang stehe...
Aber ich lerne gerne dazu, wie sich Arbeit einsparen lässt.

-
da war ich wohl zu spät
3 mal die geiche antwort in einer minute....
-
Ich hätte da noch eine Variante:
bool iseven(int value) { return (value & 1) == 0; }
-
da musst man aber auf die byte order aufpassen.
-
tntnet:
Unabhängig von Byteorder: Weniger intuitiv, man kann mit der Klammer Fehler machen (wenn man sich die Schreibweise angewöhnt und die Warnung ignoriert) und die Optimierung dahinter wird vom Compiler sowieso gemacht. Bin also nach wie vor für die %2-Variante.
-
Der Kommentar mit der "byte order" ist ja wohl nicht ernst gemeint?!
Noch eine Variante:
return !(x % 2);
Aber egal welche Variante man wählt, der Compiler wird eh daraus den gleichen Code generieren (bei aktivierter Optimierung).
-
vario-500 schrieb:
da musst man aber auf die byte order aufpassen.
Eisflamme schrieb:
tntnet:
Weniger intuitiv, man kann mit der Klammer Fehler machen (wenn man sich die Schreibweise angewöhnt und die Warnung ignoriert) und die Optimierung dahinter wird vom Compiler sowieso gemacht. Bin also nach wie vor für die %2-Variante.Th69 schrieb:
Aber egal welche Variante man wählt, der Compiler wird eh daraus den gleichen Code generieren (bei aktivierter Optimierung).
Schwache Antworten
. Dass die Byteorder keine Rolle spielt, sollte klar sein.Die Klammersetzung ist auch kein Problem, die Operatorprecedence sollte man als C++-Programmierer verinnerlicht haben (notfalls ein Klammerpaar mehr als nötig).
Aber das Wichtigste: Bei signed Typen wird eben nicht der gleiche Code erzeugt.
-
unreg schrieb:
Aber das Wichtigste: Bei signed Typen wird eben nicht der gleiche Code erzeugt.
Doch!
-
unreg schrieb:
Aber das Wichtigste: Bei signed Typen wird eben nicht der gleiche Code erzeugt.
Falls der Computer 1er-Komplement für die Darstellung verwendet...
-
Du meinst wegen der Doppelbedeutung der Null bei 1er-Komplement, so daß die Binäre-Und-Verknüpfung nicht das richtige Ergebnis liefern würde?
Da ich noch nie mit einem 1er-Komplement Prozessor gearbeitet habe: würde denn dann der Modulo-Operator beide Null-Darstellungen mit beachten?
-
-1 im Einer-Komplement ist 11111110.
-
SG1 schrieb:
-1 im Einer-Komplement ist 11111110.
Im prinzip richtig. Aber der Computer arbeitet normalerwiese im Zweierkomplement und da ist -1 11111111. Und damit sind die Lösungen wieder äquivalent. Aber der Hinweis auf Intuitivität ist richtig. Die Modulo-Lösung ist tatsächlich offensichtlicher und daher besser.