Zahlentest; Vorzeichenfunktion
-
Hallo, ich bin C++ - Neuling. Die Aufgabe ist folgende:
Die Vorzeichenfunktion
int sign( int i)
soll einen ganzzahligen Wert entgegennehmen und Folgendes zurückliefern:
-1, wenn der Wert negativ war,
0, wenn der Wert 0 war,
1, wenn der Wert positiv war.Ich habe das Ganze so gemacht:
#include <iostream> using namespace std; int j; int sign(int i) { if (i==0) { j=0; } if (i < 0) { j=-1; } if (i>0) { j=1; } return j; } int main() { int i; cout << "Geben Sie eine Zahl ein." << endl; cin >> i; sign(i); cout << "Es ergibt sich: " << j << endl; if(j<0) { cout << "Damit ist Ihre eingegebene Zahl negativ." << endl; } if(j>0) { cout << "Damit ist Ihre eingegebene Zahl positiv." << endl; } if(j==0) { cout << "Damit haben Sie die Zahl 0 eingegeben." << endl; } }
Sehe ich das richtig, daß die Funktion den Wert j an den Aufrufer (d.h. die Main-Funktion) zurückgibt? Ist es richtig, die Variable j global zu definieren?
(Wie gesagt: Ich bin Neuling.)
-
Besorge dir mal eine bessere Formatierung...
Es ist falsch/überflüssig, dass j global ist (Generell ist j ein besch**erter Name für eine globale Variable...).
Deine Funktion sign() sollte so aussehen:int sign(int value) { if (value > 0) return 1; else if (value == 0) return 0; else return -1; }
Die liefert jetzt eine Zahl zurück.
Im Hauptprogramm muss diese abgespeichert werden:int main() { int i; ... int result = sign(i); if (result > 0) ... }
result speichert nun diese Zahl.
-
computing1 schrieb:
Sehe ich das richtig, daß die Funktion den Wert j an den Aufrufer (d.h. die Main-Funktion) zurückgibt? Ist es richtig, die Variable j global zu definieren?
1. Ja.
2. richtig im Sinne der Aufgabe schon - die ist ja erfüllt. Aber die globale Variable ist unnötig, damain()
mit dem Rückgabewert arbeiten kann.
Ich sage also nicht, richtig oder falsch, aber: Die globale Variable einzusparen und mit möglichst lokalen Variablen zu arbeiten ist "best practice".z.B.
int sign(int i){ int j = ... ... return j; } int main(){ int s = sign(...); ... }
Technisch ist es ein sog. Nebeneffekt Deiner Funktion j zu setzen.
Überleg Dir noch, ob Du mit Hilfe der Logik die Funktion noch vereinfachen kannst.
Und weiter:
Manche halten ein - und nur ein -return
für richtig, andere benutzen u.U. mehrerereturn
s, um eine Funktion an unterschiedlichen Stellen zu verlassen.
-
Danke.
Wie kann ich das so sauber formatieren?
Was für einen Editor benutzt Du?
Stimmt es, daß eine Funktion immer nur einen Wert von dem Typ zurückgeben kann, wie bei der Deklaration der Funktion vor dem Funktionsnamen steht?
Also hier: int ?
-
Ja.
Ich verwende den integrierten Editor von Code::Blocks, der rückt automatisch ein.
Beispiele für gute Einrückung hast du schon in meinem und Furble Wurbles Post gesehen.
-
int sign(int value) { if (value > 0) return 1; else if (value == 0) return 0; else return -1; }
Bitte:
int sign(int value) { if (value > 0) return 1; if (value == 0) return 0; return -1; }
-
Eisflamme schrieb:
Bitte:
Was genau soll hier der Vorteil sein? Man braucht länger um zu sehen, dass sich die Fälle gegenseitig ausschliessen. Tolle Verbesserung, dafür kriegst du sicher von niemandem ein Danke!
Wenn schon, dann
int sign(int value) { return (value > 0) - (value < 0); }
-
Oder
return value > 0 ? 1 : value < 0 ? -1 : 0;
-
teh emper0r:
Ich brauche dafür nicht länger. Da stehen returns, da braucht man einfach kein else, auch nicht zum Verständnis. Ich lese das schneller, weil es weniger Zeilen sind, und habe diesen Vorschlag auch schon häufig gelesen. Machst Du bei einem switch hinter jedem case, das returnt, auch ein break?Und eine eigentlich logische Verzweigung in eine Rechnung umzuwandeln... kann mir nicht vorstellen, dass jemand ernsthaft denkt dadurch Übersichtlichkeit beizufügen. Da muss ich Dich einfach als Troll abstempeln.
-
Th69 schrieb:
Oder
return value > 0 ? 1 : value < 0 ? -1 : 0;
Die Nachteile beider Varianten vereint: Unübersichtlich und möglicherweise langsam.
Eisflamme schrieb:
Ich brauche dafür nicht länger. Da stehen returns, da braucht man einfach kein else, auch nicht zum Verständnis.
Du musst zuerst die jeweiligen Anweisungen unter dem if lesen, damit klar ist, dass sich die einzelnen ifs ausschliessen. Bei else-if ist das im Vornherein klar. Ausserdem brichst du die Symmetrie, weil das letzte return in einem anderen Scope mit anderer Einrückung steht.
Eisflamme schrieb:
Und eine eigentlich logische Verzweigung in eine Rechnung umzuwandeln... kann mir nicht vorstellen, dass jemand ernsthaft denkt dadurch Übersichtlichkeit beizufügen. Da muss ich Dich einfach als Troll abstempeln.
Ich habe nie behauptet, meine Version sei übersichtlich. Aber sie ist elegant und möglicherweise effizienter, da kein Branching vorkommt.
Bitte lesen, bevor man mit der Troll-Keule kommt. Danke.