Arrayelemente schreiben und lesen
-
Schauen ob lesen funktioniert, dann einfügen.
Index erhöhen.double tmp; if (cin>>tmp) arr[i]=tmp
-
Schauen ob lesen funktioniert, dann einfügen.
Falsch. Dann wird solange gewartet bis überhaupt ein Zeichen eingegeben wird das kein Whitespace ist.
Wenn ich beim Eingeben der 10 Werte, einmal keinen Wert eingebe und nur die Entertaste drücke, dann soll der Array Werte auch keinen Wert aufnehmen. Sprich das jeweilige Arrayelement soll leer bleiben und dennoch soll Werte hochzählen....
Es sollte aber einen Wert annehmen.
Vorschlag: Es wird Null zugewiesen.Nun zum Ansatz: Du musst durch einen String puffern, d. h. zuerst den String einlesen und dann in einen String-Stream stopfen und daraus extrahieren. Vor dem Stopfen prüfst du dann die Länge.
Die genannten Sachen sollten in einem guten Buch erklärt werden.Ok, ich will dir mal was erklären.
Hier erstmal goldene Eigenschaften von Code:- Flexibilität
- Lesbarkeit
- Wartbarkeit
- Kürze und Aussagekräftigkeit/Selbsterklärlichkeit
- Nicht wiederholend
So, jetzt was mir auffällt:
- Du deklarierst Variablen viel zu global - siehe bspw. Z. 7-9. Also wenn das mal goldig ist!
- Schon mal was von der Refactoring-Technik extract method gehört?
Viel von deinem Code in dermain()lässt sich auslagern sodass das Ganze viel goldiger ist! - Du flushst den Stream viel zu oft. Merke dir: Unnötige Sachen machen den Code weniger goldig!
- Seinen Code mit einer Einrückungstiefe von zwei oder z. T. sogar nur einem Leerzeichen zu formatieren ist überhaupt nicht goldig!
- So wenig Abstände in Form von Leerzeilen und Leerzeichen zu machen ist auch gar nicht goldig! Sieh dir mal das Gesetz der Nähe an, das lässt sich sehr schön auf Code-Gestaltung übertragen.
-
Sone schrieb:
Schauen ob lesen funktioniert, dann einfügen.
Falsch.
Sone, der alte Fuchs, hat mich wieder voll erwischt!
Und warum?
Weil ich kein kompilierbares Beispiel hatte....Ich muss mich verbessern:
Schauen ob lesen funktioniert
wenn ja: einfügen
wenn nein: Eingabe Puffer leeren
Index erhoehenCheers,
FW
-
Oje...
Einen Compiler zur Hand schwant mir böses....
-
Schauen ob lesen funktioniert
wenn ja: einfügen
wenn nein: Eingabe Puffer leeren
Index erhoehenFalsch... ^^
Dein Prinzip ist daneben. Es macht nicht was der TE will, denn die Extraktion ist formatiert und wartet bis ein Zeichen eingegeben wird was kein Whitespace ist - zum zweiten Mal...
-
Sone schrieb:
Dein Prinzip ist daneben.
Warum ist Deiner Meinung nach das Prinzip daneben?
Die erste Ausführung in C++ kränkelt etwas...Aber ich kann es nach dem Prinzip(bzw. dem ersten) in ausreichender Qualität auch ordentlich hinbekommen und das newline schlucken...
double tmp; std::string s; if(std::getline(cin,s)) if(std::stringstream(s) >> tmp) arr[j]=tmp; ++j;
-
Furble Wurble schrieb:
Sone schrieb:
Dein Prinzip ist daneben.
Warum ist Deiner Meinung nach das Prinzip daneben?
Die erste Ausführung in C++ kränkelt etwas...Aber ich kann es nach dem Prinzip(bzw. dem ersten) in ausreichender Qualität auch ordentlich hinbekommen und das newline schlucken...
double tmp; std::string s; if(std::getline(cin,s)) if(std::stringstream(s) >> tmp) arr[j]=tmp; ++j;Ach, so meinst du das!
Ich hab verstanden du willst direkt auscinextrahieren.
-
Sone schrieb:
Ich hab verstanden du willst direkt aus
cinextrahieren.Ja.
Das war auch mein ursprünglicher Plan.Aber Du und mein Compiler wussten es besser....
Prinzipiell war's richtig ("schauen ob lesen funktioniert"), allein C++s Besonderheiten brachten mich zu Fall...

Danke! und
evtl. ist das auch ein Signal an den TE, warum kurze kompilierbare Beispiel von Nutzen sind!
-
Werde ich ab sofort beherzigen, aber was soll ich machen, wenn der Programmcode wirklich nur drei Switch Anweisungen enthält, aber doch so lang ist??
Gruß
Max
-
Ich habe es schon wie Furble Wurble gemeint.
Gruß
-
Sone schrieb:
Ich hab verstanden du willst direkt aus
cinextrahieren.#include <limits> #include <vector> #include <iostream> void clear_istream( std::istream &is ) { is.clear(); is.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); } int main() { int input = 0; std::vector< int > numbers; for( std::size_t i = 0; i < 10; ++i ) { while( !( std::cin.peek() == '\n' || std::cin >> input ) ) { std::cout << "Input error, try again!\n"; clear_istream( std::cin ); } numbers.push_back( input ); input = 0; clear_istream( std::cin ); } for( std::size_t i = 0; i < 10; ++i ) std::cout << numbers[i] << '\n'; }
-
Hui, peek hab' ich ganz vergessen.

-
silent_max schrieb:
Wert[8] und Wert[9] sollen durch Betätigung von Enter keinen Wert aufnehmen, während Wert[i] dennoch inkrimentiert.
Wie kann ich das bewerkstelligen???
Hallo Max,
wenn Du die Helferlein is_endl und skipline zur Verfügung hast - würdest Du es dann hin bekommen?
Gruß
Werner
-
So weit wie Du Werner bin ich noch lange nicht.
Gruß
-
Hallo Max,
silent_max schrieb:
So weit wie Du Werner bin ich noch lange nicht.
Brauchst Du ja auch nicht. Du sollst die beiden Funktionen auch nicht selber schreiben, sondern nur benutzen. Ich dachte etwa in der Art:
if( is_endl( cin ) ) // ist die Zeile leer? cout << "keine Eingabe" << endl; else if( cin >> wert >> skipline ) // nein, Zeile nicht leer, dann 'wert' lesen und Rest der Zeile überspringen { cout << "Ihre Eingabe: " << wert << endl; // .. wert speichern, oder was auch immer }Ist das verständlich?
Gruß
Werner
-
Werner Salomon: Falls dir die Zeit zur Verfügung steht, hast du schon einmal darüber nachgedacht, einen Artikel über die Parser-Fähigkeiten von
std::istreamzu schreiben? Davon könnten viele Leute profitieren (ich eingeschlossen). Müsste nicht zu sehr ins Detail über Stream-Interna gehen, darüber gibt es hier schon einen Artikel. Aber halt die netten Tricks mitoperator>>, um nicht alles mitgetline()undstd::stringzu zerstückeln