Kugelfisch
Nerd
Der Code ist meines Erachtens eine sehr unschöne Mischung aus C und C++. Man muss ja nicht zwingend meine zuvor vorgeschlagene, puristische Einzeiler-Lösung nutzen (die erfüllt den Wortlaut der Aufgabe auch nicht und sollte bloss dazu dienen, den Nutzen der Standardbibliothek aufzuzeigen), doch `math.h` ist kein C++-Header (das passende Äquivalent wäre `cmath`), den kompletten Math-Header zu inkludieren, wenn man bloss die numerischen Limits benötigt scheint mir unschön (INT_MAX wird in limits.h bzw. climits definiert), und den Grund für das Einlesen als String und die explizite Konvertierung in eine Zahl kann ich nicht erkennen. Eher im Gegenteil, die <<- und >>-Operatoren der IO-Streams sind durchaus aus gutem Grund polymorph überladen.
Eine alternative C++-Lösung mit expliziter Schleife wäre:
[src=cpp]#include <iostream>
#include <limits>
int main() {
int res(std::numeric_limits<int>:ax());
while(std::cin.good()) {
int x;
std::cin >> x;
if(x <= 0) break;
res = std:in(res,x);
}
std::cout << "Minimum: " << res << std::endl;
}[/src]
Man beachte die while-Bedingung std::cin.good(). Schlägt das Einlesen des nächsten Tokens im Stream in eine int-Zahl fehl, wird das failbit gesetzt, tritt ein Lesefehler auf das badbit, ist der Stream zu Ende, das eofbit. Wenn eines dieser Bits gesetzt ist, gibt die good()-Methode false zurück und die Schleife bricht ab. Exception-Handling ist an dieser Stelle nicht nötig.
Alternative unter Verwendung eines std::istream_iterator<int>, jedoch ohne std:in_element:
[src=cpp]#include <iostream>
#include <limits>
#include <iterator>
int main() {
int res(std::numeric_limits<int>:ax());
for(std::istream_iterator<int> it(std::cin); *it>0&&std::cin.good(); ++it) {
res = std:in(res,*it);
}
std::cout << "Minimum: " << res << std::endl;
}[/src]
Zu beachten ist bei beiden Beispielen, dass das Resultat ungültig ist, wenn nicht mindestens eine gültige Zahl eingegeben wird. Das könnte man verhindern, indem man res mit -1 initialisiert und dies sowohl in der Schleife als auch vor der Ausgabe überprüft. Alternativ könnte man vor der Ausgabe überprüfen, ob res noch std::numeric_limits<int>:ax() enthält.
Eine alternative C++-Lösung mit expliziter Schleife wäre:
[src=cpp]#include <iostream>
#include <limits>
int main() {
int res(std::numeric_limits<int>:ax());
while(std::cin.good()) {
int x;
std::cin >> x;
if(x <= 0) break;
res = std:in(res,x);
}
std::cout << "Minimum: " << res << std::endl;
}[/src]
Man beachte die while-Bedingung std::cin.good(). Schlägt das Einlesen des nächsten Tokens im Stream in eine int-Zahl fehl, wird das failbit gesetzt, tritt ein Lesefehler auf das badbit, ist der Stream zu Ende, das eofbit. Wenn eines dieser Bits gesetzt ist, gibt die good()-Methode false zurück und die Schleife bricht ab. Exception-Handling ist an dieser Stelle nicht nötig.
Alternative unter Verwendung eines std::istream_iterator<int>, jedoch ohne std:in_element:
[src=cpp]#include <iostream>
#include <limits>
#include <iterator>
int main() {
int res(std::numeric_limits<int>:ax());
for(std::istream_iterator<int> it(std::cin); *it>0&&std::cin.good(); ++it) {
res = std:in(res,*it);
}
std::cout << "Minimum: " << res << std::endl;
}[/src]
Zu beachten ist bei beiden Beispielen, dass das Resultat ungültig ist, wenn nicht mindestens eine gültige Zahl eingegeben wird. Das könnte man verhindern, indem man res mit -1 initialisiert und dies sowohl in der Schleife als auch vor der Ausgabe überprüft. Alternativ könnte man vor der Ausgabe überprüfen, ob res noch std::numeric_limits<int>:ax() enthält.
Zuletzt bearbeitet: