Anfänger - Römische Zahlen ausgeben
-
-
naja ich muss nach wie vor
case:'M'
case:'m'schreiben. In diesem Programm ist das ja an und für sich kein Ding, ich dachte nur einfach für später mal man kann ihm das mehr oder weniger Global sagen, dass er nicht unterscheiden soll.
-
#include <locale> ... char eingabe; ... locale l; if(!islower(eingabe, l)) eingabe = tolower(eingabe, l); switch(eingabe) { case 'm': ... }
-
char x; std::cin >> x; switch(tolower(x)) { case 'm': std::cout << "ein m!" << std::endl; break; /*...*/ default: std::cout << "ungueltige eingabe!" << std::endl; }
-
Vielen Dank, selten so schnell so umfassende Hilfe bekommen

-
du kannst dir auch mal std::tolower und std::toupper angucken - das bringt aber imho nur nachteile (z.bsp. wenn du ein zeichen angibst, was in großschreibweise nicht in nen char "passt" - z.bsp. 'ß')
also:
int main() { char x = std::toupper('ß', std::locale()); }wird schief gehen...
bb
-
ODer gleich so :p
-
Nur zum Verständnis: Bei deiner anfänglichen if-Abfrage if(eingabe == 'M' || 'L' ... wird, wenn du kein M eingibst, überprüft, ob der Ausdruck 'L' korrekt ist.
Und da 'L' einen Zahlenwert von nicht 0 hat und alles, was nicht 0 ist, true ist, ist deine If-Bedingung immer wahr.
-
.. folgendes ist nichts für Anfänger, aber vielleicht ist es hier von Interesse:
In C++ ist die Schnittstelle für die Eingabe std::istream (also z.B. cin) das gilt auch dann, wenn man das Zahlenformat ändert. Der C++-Standard stellt dafür eine sogenannte Facette std::num_get<> zur Verfügung, die sich um das Einlesen von Zahlen kümmert. Und diese kann man nach eigenem Ermessen überschreiben:#include <locale> #include <iostream> namespace roemisch { namespace { const char* zch = "MDCLXVI"; const unsigned wert[] = { 1000, 500, 100, 50, 10, 5, 1, 0 }; } } template< typename E > class RoemischGet : public std::num_get< E > { public: RoemischGet( std::size_t refs = 0 ) : std::num_get< E >( refs ) {} protected: virtual iter_type do_get( iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, long& v ) const { int val = 0; int cnt = 0; const unsigned int* nr_prev = 0; for( const unsigned int* nr; in != end; ++in, ++cnt, nr_prev = nr ) { char_type c = *in; nr = roemisch::wert; for( const char* p = roemisch::zch; *p ; ++p, ++nr ) if( char_type( *p ) == std::toupper( c, str.getloc() ) ) break; if( *nr == 0 ) break; else if( nr < nr_prev ) { // Subtraktionsregel ist nicht implementiert err |= std::ios_base::failbit; return in; } val += *nr; } if( in == end ) err |= std::ios_base::eofbit; if( cnt == 0 ) err |= std::ios_base::failbit; else v = val; return in; } }; int main() { using namespace std; cin.imbue( locale( cin.getloc(), new RoemischGet< char > ) ); for( int i; cout << "> " && cin >> i; ) cout << i << endl; return 0; }Das sieht dann etwa so aus
> X 10 > D 500 > MMX 2010 > XXXXII 42Gruß
Werner
-
Um mal Werners Beispiel zu folgen und ein wenig abzudriften sei hier noch gesagt, dass man römische Zahlen auch im Code (ohne Laufzeiteinbusse) benutzen kann. :p
[Metaprogrammierung] - Römische Zahlen
Wie viel Sinn das macht sei dahingestellt, aber als ein zur Fakultät Alternatives Einstiegsbeispiel für Metaprogrammierung ist das denke auch mal ganz nett.
