Anfängercommands gesucht
-
Hallo,
ich denke ich habe schon einen Fehler im Titel wegen dem "commands" gemacht.
Nun, ich brauche folgendes:
1.
Eine Eingabe die auf 4 Ziffern beschränkt ist, und die Ziffer darf nur einmal in diesem 4 Ziffercode vorkommen!!Der 4stellige code von oben soll in 4 x 2 - stellige Zahlen unterteilt werden!
Die erste Zahl gibt die Zahl an aus dem vierstelligen Code, die zweite die Position.
Bsp:
4298
1: 41
2: 22
3: 93
4. 84Gibt es einen Wartebefehl? Also z.B.
cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"; warten(5sek); cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n";4. Kann man die schrift so schreiben lassen als ob man sie selbst schreibt? Also ein Text der geschrieben wird und man sieht den Text schreiben? Oder wäre das zu kompliziert?
Hoffe ihr könnt mir helfen,
mfg Marc
-
M4RC schrieb:
Eine Eingabe die auf 4 Ziffern beschränkt ist, und die Ziffer darf nur einmal in diesem 4 Ziffercode vorkommen!!
Ja, lies einen
unsigned shortein, konvertiere diesen zu einemstd::string, konvertiere den string wiederum per Start-End Iteratorepaar zu einemstd::setund vergleiche die Größen.M4RC schrieb:
Der 4stellige code von oben soll in 4 x 2 - stellige Zahlen unterteilt werden!
Die erste Zahl gibt die Zahl an aus dem vierstelligen Code, die zweite die Position.
Bsp:
4298
1: 41
2: 22
3: 93
4. 84Ja, Stringstreams und eine Schleife + Modulo-Operator sollten das tun.
M4RC schrieb:
Gibt es einen Wartebefehl? Also z.B.
cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"; warten(5sek); cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n";Ja, in C++11 ganz einfach mit Chrono, sonst siehe
Sleep()aus der WinAPI.M4RC schrieb:
4. Kann man die schrift so schreiben lassen als ob man sie selbst schreibt? Also ein Text der geschrieben wird und man sieht den Text schreiben? Oder wäre das zu kompliziert?
Ja, mit
Sleep()/Der Chrono Lösung und einer Schleife.Edit: Ich mach gleich mal Beispiele zu allem.
-
M4RC schrieb:
Hallo,
ich denke ich habe schon einen Fehler im Titel wegen dem "commands" gemacht.
Nun, ich brauche folgendes:
1.
Eine Eingabe die auf 4 Ziffern beschränkt ist, und die Ziffer darf nur einmal in diesem 4 Ziffercode vorkommen!!Es gibt keinen fertigen Zauberbefehl, der dies erledigt. Lies eine Zahl (oder eher eine Zeichenkette bei deiner Beschreibung) und prüfe, ob die Bedingung erfüllt ist. Falls nein, lies noch eine Eingabe, falls ja, fahre bei 2. fort.
Der 4stellige code von oben soll in 4 x 2 - stellige Zahlen unterteilt werden!
Die erste Zahl gibt die Zahl an aus dem vierstelligen Code, die zweite die Position.
Bsp:
4298
1: 41
2: 22
3: 93
4. 84Auch dazu gibt es keine fertigen Zauberbefehler. Obwohl, eigentlich schon, weil es so einfach sit: Falls du eine Zeichenkette gelesen hast: substr. Falls du eine Zahl gelesen hast: Division und Modulo.
Gibt es einen Wartebefehl? Also z.B.
cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"; warten(5sek); cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n";4. Kann man die schrift so schreiben lassen als ob man sie selbst schreibt? Also ein Text der geschrieben wird und man sieht den Text schreiben? Oder wäre das zu kompliziert?
Wieso wollen Anfänger immer so einen Quatsch mit Warten und Laufschrift und so? Kennst du ein einziges professionelles Programm, welches dies sinnvoll einsetzt? Wenn ein Programm irgendwo zu warten scheint, dann weil es was rechnet und dabei nicht sehr schnell ist. Es ist kein Zeichen von "richtigen" oder gar guten Programmen, dass sie irgendwo lange Verzögerungen drin haben.
Um zur Frage zu kommen: Jain. Nicht direkt in C++ (außer aktives Warten, d.h. Endlosschleife bis gewisse Zeit vergangen ist - nicht zu empfehlen), aber praktisch bietet jedes Betriebssystem eine Wartefunktion an. Dein 4. kannst du dir dann selber damit basteln und nein, es gibt auch da keine fertige Zauberfunktion für.
Aber: Lass es. Es lohnt den Aufwand nicht, wenn es gut werden soll, dann wird es sehr kompliziert und wahrscheinlich lernst du viel mehr, indem du schöne Algorithmen für Aufgaben wie die 1 und 2 schreibst, anstatt Zeit in schöne Darstellung zu investieren. Ich hoffe auch, dass sich Lehrer heutzutage nicht mehr von Laufschrift&Co. beeindrucken lassen.@Sone: Wenn du hier schon mit deinen 1337-Haxor-Skills protzen willst, dann mach es wenigstens richtig. Eine Lösung unter Nutzung der STL ist nur dann gut, wenn sie keine Nachteile hat, sondern Vorteile durch Abstraktion bringt. Deine short-string-set-Lösung ist totaler Müll zu Laufzeit und bezüglich flexibilität. Und dein chrono-sleep möchte ich auch mal sehen. Du hast wahrscheinlich noch nie geguckt, was in chrono überhaupt für Funktionen sind und was sie können. Aber C++11 ist für dich ja das zweite Kommen von Bjarne Stroustrup, das muss ja einfach eine Lösung parat haben
. Wenn schon, dann verweise auf sleep_for aus thread.
-
Eigentlich meinte ich das:
std::this_thread::sleep_for(std::chrono::seconds(1));Hatte das nur schlecht in Erinnerung, deswegen kam ich auf chrono.
-
SeppJ schrieb:
[Wieso wollen Anfänger immer so einen Quatsch mit Warten und Laufschrift und so?
Wahrscheinlich weil sie gar nicht beurteilen können, was schwierig und was einfach zu implementieren ist.
Hallo Marc,
Deine Anforderungen sind wahrlich nicht mit Anfänger-Code zu machen. Ganz im Gegenteil. Das was Du da forderst sind im wesentlichen gehoben Anforderungen an den Input
M4RC schrieb:
Eine Eingabe die auf 4 Ziffern beschränkt ist, und die Ziffer darf nur einmal in diesem 4 Ziffercode vorkommen!!
.. ich verstehe das als 'jede Ziffer darf nur einmal vorkommen'
und den Output
M4RC schrieb:
Kann man die schrift so schreiben lassen als ob man sie selbst schreibt? Also ein Text der geschrieben wird und man sieht den Text schreiben? Oder wäre das zu kompliziert?
Ja - es ist kompliziert, aber machbar. Und da es Input & Output ist, hat es natürlich viel mit der IO-Library von C++ zu tun - irgendwie logisch - oder?
Ich hab' Dir mal eine kleine Demo geschrieben, falls Du Fragen hast, so nur heraus damit.#define WIN32_LEAN_AND_MEAN #define NOMINMAX // notwendig wegen numeric_limits< streamsize >::max() #include "Windows.h" // falls das OS kein Windows ist, bitte Funktion 'warte_etwas()' ersetzen (s.u.) #include <iostream> #include <locale> #include <algorithm> #include <cassert> #include <limits> // -- Struktur für die vier Zahlen struct VierZahlen { int operator[]( std::size_t idx ) const { assert( idx < 4 ); return digits_[idx] * 10 + idx + 1; } friend std::istream& operator>>( std::istream& in, VierZahlen& vz ); private: int digits_[4]; }; // -- Funktion zum Einlesen der Struktur 'VierZahlen' namespace vierzahlen_detail { bool set( int* arr, int* arrEnd, int val ) { if( std::find( arr, arrEnd, val ) != arrEnd ) return false; *arrEnd = val; return true; } } std::istream& operator>>( std::istream& in, VierZahlen& vz ) { std::istream::sentry ok( in ); if( ok ) { std::ios_base::iostate state = std::ios_base::goodbit; try { typedef std::istream::traits_type Traits; const std::ctype< char >& ctype_ = std::use_facet< std::ctype< char > >( in.getloc() ); for( std::size_t idx = 0; idx < 4; ++idx, in.rdbuf()->sbumpc() ) { std::istream::int_type m = in.rdbuf()->sgetc(); if( Traits::eq_int_type( m, Traits::eof() ) ) { state |= std::ios_base::eofbit | std::ios_base::failbit; break; } const char c = Traits::to_int_type( m ); if( !ctype_.is( std::ctype_base::digit, c ) || !vierzahlen_detail::set( vz.digits_, vz.digits_ + idx, c - '0' ) ) { state |= std::ios_base::failbit; break; } } } catch(...) { state |= std::ios_base::badbit; if( in.exceptions() & std::ios_base::badbit ) throw; // re-throw } in.setstate( state ); } return in; } // -- OS-abhängige Implementierung oder C++11, falls verfügbar void warte_etwas() { // std::this_thread::sleep_for( std::chrono::milliseconds(200) ); Sleep( 200 ); // .. unter Windows } // -- dieser streambuf verzögert die Ausgabe jedes einzelnen Zeichens class Ticker : public std::streambuf { public: explicit Ticker( std::basic_ios< char >& out ) : out_( out ) , sink_( out.rdbuf( this ) ) {} ~Ticker() { out_.rdbuf( sink_ ); } protected: virtual int_type overflow( traits_type::int_type m = traits_type::eof() ) { warte_etwas(); if( traits_type::eq_int_type( m, traits_type::eof() ) ) return sink_->pubsync() == 0? traits_type::not_eof( m ): m; return sink_->sputc( traits_type::to_char_type( m ) ); } private: std::basic_ios< char >& out_; std::streambuf* sink_; // -- nicht kopierbar Ticker( const Ticker& ); Ticker& operator=( const Ticker& ); }; // -- und endlich das Hauptprogramm int main() { using namespace std; VierZahlen vz; cout << "Bitte vier Ziffern eingeben; keine Ziffer darf zweimal vorkommen\n"; for( ; !(cin >> vz); cin.ignore( numeric_limits< streamsize >::max(), '\n' ) ) { cerr << "Fehler bei der Eingabe - bitte noch mal versuchen" << endl; cin.clear(); if( !cin ) return -2; // Fatal Error } Ticker ticktick( cout ); cout << "Die vier Zahlen sind: \n"; for( size_t i = 0; i < 4; ++i ) cout << i << ".) " << vz[i] << endl; return 0; }Gruß
Werner
-
Also ich hab Werners Programm mal ein paar mal ausgeführt, und hab was geschrieben was dasselbe macht:
#include <iostream> #include <windows.h> #include <vector> #include <algorithm> void buchstabieren(const std::string& s) { for(std::string::const_iterator i = s.begin(); i != s.end(); ++i) { std::cout << *i; Sleep(90); } } int main() { std::cout << "4 Ziffern: "; std::vector<char> ziffern; for(char ziffer; ziffern.size() != 4;) if((std::cin.get(ziffer)) && std::isdigit(ziffer) && std::find(ziffern.begin(), ziffern.end(), ziffer) == ziffern.end()) ziffern.push_back(ziffer); buchstabieren("Die Ziffern waren:\n"); for(char i = '0'; i < '4'; ++i) buchstabieren((std::string() += i) + ".) " + (std::string() += ziffern[i - '0']) + (std::string() += i+1) + "\n"); }Ich verstehe nicht, warum man das so aufwändig wie Werner machen sollte. Ich hab früher als Anfänger auch mal sowas gebraucht, und dieses "buchstabieren()" hat mir vollkommen gereicht. Man muss ein bisschen tricksen (oder gleich ne Funktion zu_string(int) schreiben), aber dafür nicht so ein komisches Monster verwenden.
-
Jetzt musst du aber immer erst einen String basteln, anstatt einfach das ganze Programm zu lassen wie es ist. Das ist erstens nicht sehr schön (deine Zeile 24) und wird zweitens sehr kompliziert, wenn es mal nicht um einfache Ziffernfolgen geht. Da müsstest du dann wieder zu einem Stringstream greifen, aus diesem wieder den String holen und den dann buchstabieren lassen. Also über drei Umwege das was Werners Variante direkt erreicht.
Hier kann man schön den Unterschied in den Abstraktionsebenen sehen: Werners Lösung hat eine sehr komplizierte Buchstabierfunktion von der der Threadersteller vermutlich keine einzige Zeile versteht, dafür ist die Benutzung genau die gleiche wie er sie schon aus dem ersten Kapitel eines Lehrbuches kennt. Deine Lösung hat eine sehr leicht verständliche Buchstabierfunktion (kapiert der Threadersteller bestimmt schon beim ersten Lesen komplett), dafür ist die Benutzung umständlich (wenn auch verständlich).
-
Dafür erkennt Werner's Programm keine 0 als Ziffer
