bool
-
Hallooo
Ich bin jetzt seit einer Woche C++ am programmieren und mir selber Aufgaben gemacht und zum Teil aus Büchern und Internet.
Mein Programm die ihr hier unten sieht ist eigentlich nichts besonderes.
ich habe eine untere und eine obere Grenze (Zahlen bereich) wenn die Zahl die man eingibt im oberen oder unteren zahlenbereich ist dann geht es weiter und dann wird noch überprüft ob die Zahl gerade oder ungerade ist. mehr nicht. wie ihr sieht etwas ganz simples abr nicht einfach für einer der erst seit 1 woche programmiert.zu meiner Frage:
Ich möchte eine Funktion implementieren, die sowohl den negativen als auch den positiven bereich überprüfen kann.
Habe mir vorgenommen das man maximal ein mal "if - else" verwendet kann.
if (...)
{ ...
}
else
{ ...
}prototyp:
bool isInRange(int zahl, int untereGrenze, int obereGrenze);ist das überhaupt möglich? bin schon seit einer Zeit am hirnen und im Internet am schauen (bücher sollten kommen habe ich bestellt) aber komme nicht drauf.
Ich sehe es schon vor mir muss sicher nur eine kleine Änderung machen aber schaffe es nicht.kann mir jemand dabei helfen?
#include <iostream> #include <cmath> #define ERR_UNGERADE "Die Zahl ist ungerade" #define ERR_GRENZE "Die Zahl ist ausserhalb der Grenze" #define OBEREGRENZE (100) #define UNTEREGRENZE (50) #define TEST 1 #define DEBUG 1 using namespace std; //Funktionprototypen //bool insideRange (int zahl,int unten, int oben); bool isInRange(int zahl, int untereGrenze, int obereGrenze); bool isEven (int zahl); int main() { //Check bounds. if(UNTEREGRENZE>OBEREGRENZE) { cout<< "Falsche Konfiguration"<< endl; return EXIT_FAILURE; } #if TEST==1 //cout << "Testfunktion: "<<boolalpha << insideRange(50, 0, 100) << endl; //cout << "Testfunktion: "<<boolalpha << insideRange(5, 90, 100) << endl; cout << "Testfunktion: "<<boolalpha << isEven(80)<< endl; cout << "Testfunktion: "<<boolalpha << isEven(85)<< endl; #endif int zahl = 1; #if DEBUG == 1 cout << "zahl: "<< zahl << endl; #endif //Zahl eingeben cout << "bitte eingeben: " << endl; cin >> zahl; // zahl von der konsole einlesen mittels std::cin cout << "zahl: "<< zahl << endl; // Zahl darf nicht groesser sein als +/- GRENZE // Zahl>= -100 und Zahl<= 100 // Vergleiche die Zahl mit der Oberegrenze // Ausgabe // Vergleich mit der Unteregrenze // Ausgabe // Fehlermeldung int error = 0; //if ((zahl>= -OBEREGRENZE && zahl <= -UNTEREGRENZE) || (zahl>= UNTEREGRENZE && zahl<= OBEREGRENZE)) //Überprüfung war erfolgreich wir befinden uns entweder im Oberer oder Unterer Bereich if (isInRange(zahl, UNTEREGRENZE, OBEREGRENZE) || isInRange(zahl, -OBEREGRENZE, -UNTEREGRENZE)) { cout << "Oberegrenze: " << endl; cout << "Unteregrenze: " << endl; } else { // error==0 error+=1; //error=error+1; Fall 2: Zahl ausserhalb der Grenze } // erfolgreich=keine Fehler=true if (!error) { if(isEven(zahl)) { cout << "Zahl ist gerade" << endl; } else { error+=1; //Fall 1: Zahl ist ungerade } } switch (error) { case 0: //cout << "Zahl ist gerade" << endl; break; case 1: cout << "Ist ein Fehler aufgetreten" << endl; // Fall 1; Fall 2 break; default: break; } return (error>0 ? EXIT_FAILURE : EXIT_SUCCESS); } //Funktionsimplementation /*bool insideRange (int zahl,int unten, int oben) { if (zahl>= unten && zahl<= oben) { return true; } else { return false; } } */ bool isInRange(int zahl,int untereGrenze,int obereGrenze) { if (zahl>=untereGrenze && zahl<=obereGrenze ||zahl<=-untereGrenze && zahl>=-obereGrenze) { return true; } else { return false; } } bool isEven(int zahl) { // Resultat invertieren if (!(zahl%2)) { return true; } else { return false; } }
-
Ohne allzu lange drüber nachzudenken würde ich vermuten, Du musst lediglich die Bedingungen (&& || &&) noch ordentlich klammern. Denn entweder müssen (die beiden linken Bedingungen) erfüllt sein oder (die beiden rechten).
-
- Verwende [cpp]- und nicht [code]-Tags.
- Hör endlich mit diesen Makros auf und verwende C++-Alternativen (Funktionen,
const-Variablen). Das gilt natürlich nicht für diejenigen, die für bedingte Kompilierung zuständig sind. - Sobald du mehrere logische Bedingungen hast, brauchst du grundsätzlich mehrere Abfragen. Du kannst vielleicht mit AND, OR und NOT etwas zusammenfassen, aber oft wird der Code dadurch schlechter.
- Es gibt auch noch
operator?:- das wäre dann wohl die Cheaterlösung.
-
Du könntest dann das hier auch noch abkürzen:
if ( Bedingung ) return true; else return false;Ist ersetzbar mit:
return ( Bedingung )Die Bedinung ist schlussentlich auch ein boolscher Ausdruck.
-
Nexus schrieb:
...
Ich möchte noch
- Verwende aussagekräftige Titel für deine Threads
hinzufügen.
-
whaaatz schrieb:
bool
int
-
whaaatz schrieb:
prototyp:
bool isInRange(int zahl, int untereGrenze, int obereGrenze);inline bool isInRange(int zahl, int untereGrenze, int obereGrenze) { const unsigned u = untereGrenze; return (zahl-u) <= (obereGrenze-u); }So?
Gruß,
SP
-
Sebastian Pizer schrieb:
whaaatz schrieb:
prototyp:
bool isInRange(int zahl, int untereGrenze, int obereGrenze);inline bool isInRange(int zahl, int untereGrenze, int obereGrenze) { const unsigned u = untereGrenze; return (zahl-u) <= (obereGrenze-u); }So?
Gruß,
SPMein Mathe-Verständnis sagt dazu
zahl-u <= oberGrenze-u | auf beiden Seiten +u
zahl <= obergrenze
Das verwirtrt mich.
-
volkard schrieb:
Mein Mathe-Verständnis sagt dazu
zahl-u <= oberGrenze-u | auf beiden Seiten +u <=> zahl <= obergrenzeDas verwirtrt mich.
Es ist wegen der Modulo-Arithmetik nicht ganz korrekt. u ist ein
unsignedint. => zahl-u und obereGrenze-u sind auchunsignedints (nie negativ) => Die Äquivalenz (<=>) ist an der Stelle falsch. Es muss heißenuntergrenze <= zahl <= obergrenze | überall u abziehen ~~~~~~~~~~~ ~~~~ ~~~~~~~~~~ int int int <=> 0 <= zahl-u <= obergrenze-u ~~~~~~ ~~~~~~~~~~~~ unsigned unsigned...und da 0<=zahl-u immer gilt (ist ja unsigned), kann man sich diesen Test sparen.
Gruß,
SP
-
Netter Trick.

-
Ist trotzdem nicht ganz richtig. So würde die Funktion nämlich bei z.B. isInRange(2, 1, 0) true zurückgeben..
-
Du hast recht. Ich habe stillschweigend untereGrenze <= obereGrenze vorausgesetzt.