Schleife bricht nicht ab/startet immer wieder neu??
-
Hallo,ich bin im Moment ein ganz einfaches Vokabelprogramm zu schreiben. Mein Problem liegt bei zeile 114 bis 118 oder bei der Schleife selbst. Wenn ich an der entsprechenden Stelle bin und 0 eingebe kommt auch "fertig" das heißt die Anweisungen im If... werden ausgeführt, meine erste annahme war, die schleife bricht nicht ab sie reagiert weder darauf, dass ich die Bedingung durch fertig=1; eigentlich ausser kraft setze noch auf das break. Aber die schleife beginnt von vorne: also das Programm wird ab spätestens Zeile 70 weiter geführt. Die Ausgabe von Zeile 14-19 kommen jedoch nicht noch einmal.
Ich bedanke mich schon einmal führ euer Bemühen, bin im Moment echt ratlos...

Moritz#include <iostream> #include <fstream> #include <string> #include <conio.h> using namespace std; char foo[10]; int main (){ int zahl, i, ia, fertig, zeilnr, eingabe, blah; string zeile, nichts, voc[5000] [10]; ifstream dat_ein; blah=0; while(blah==0){ cout<<"Vollgende Eingaben stehen zur Auswahl: \n"; cout<<"0 : Beenden \n"; cout<<"1 : Datei einlesen \n"; cout<<"2 : abfragen \n"; cout<<"3 : nicht gewusste abfragen \n"; cout<<"4 : falsche abfragen \n"; cin>> eingabe; //cout<<"iwas\n"; switch(eingabe){ case 0: return 0; break; case 1: dat_ein.open("vok.txt"); if(!dat_ein){ cout<<"error\n"; } fertig=0; i=0; while(fertig==0){ std::getline(dat_ein, zeile); if(zeile=="endat"){ fertig=1; break; } else{ if(atoi(zeile.c_str())<40 || atoi(zeile.c_str()) > 50){ itoa(i, foo, 10); voc [i] [0] = foo; //cout<<voc [i] [0]; //cout<<"\n"; //cout<< i; //cout<<"\n"; voc [i] [1] = zeile; std::getline(dat_ein, voc [i] [2]); voc [i] [3] = "0"; voc [i] [4] = "0"; voc [i] [5] = "0"; cout<<"Lese Datensatz "; cout<< i; cout<<" \n"; i++; } } } break; case 2: i=0; ia=0; fertig=0; while(i == atoi(voc [i] [0].c_str())){ voc [i][5] = "0"; i++; } i=0; while(fertig==0){ fertig=1; ia=0; while(ia==atoi(voc [ia][0].c_str())){ if(atoi(voc [ia][5].c_str())==0){ fertig=0; //cout<<"fertig=0\n"; } ia++; //cout<<"while\n"; //cout<<ia; //cout<<" "; //cout<<voc [ia] [0]; //cout<<"\n"; } zahl=i; voc [zahl] [5] = "1"; cout<<voc[zahl][1]; cout<<"\n"; getch(); //cin>>nichts; cout<<"\n"; cout<<voc[zahl][2]; cout<<"\n"; cout<<"1: Richtig \n"; cout<<"2: Falsch \n"; cin>>nichts; if(atoi(nichts.c_str())==1){ voc [zahl][3] = atoi(voc[zahl][3].c_str())+1; } if(atoi(nichts.c_str())==2){ voc [zahl][4] = atoi(voc[zahl][4].c_str())+1; } if(nichts=="0"){ fertig=1; cout<<"fertig\n"; } i++; //cout<<"nechste\n"; } case 3: //nicht gewusste i=0; ia=0; fertig=0; while(i == atoi(voc [i] [0].c_str())){ voc [i][5] = "0"; i++; } i=0; while(fertig==0){ fertig=1; ia=0; while(ia==atoi(voc [ia][0].c_str())){ if(atoi(voc [ia][3].c_str())==0){ fertig=0; //cout<<"fertig=0\n"; } ia++; //cout<<"while\n"; //cout<<ia; //cout<<" "; //cout<<voc [ia] [0]; //cout<<"\n"; } zahl=i; if(atoi(voc [zahl] [3].c_str()) == 0){ voc [zahl] [5] = "1"; cout<<voc[zahl][1]; cout<<"\n"; getch(); //cin>>nichts; cout<<"\n"; cout<<voc[zahl][2]; cout<<"\n"; cout<<"1: Richtig \n"; cout<<"2: Falsch \n"; cin>>nichts; if(atoi(nichts.c_str())==1){ voc [zahl][3] = atoi(voc[zahl][3].c_str())+1; } if(atoi(nichts.c_str())==2){ voc [zahl][4] = atoi(voc[zahl][4].c_str())+1; } } i++; //cout<<"nechste\n"; } break; } } cin>>nichts; return 0; }
-
bei der formatierung will ich das nicht anschauen.
schon mal nen debugger verwendet?
-
Jetzt mal im Ernst, wer tut sich 200 Zeilen grausig formatierten Quelltext freiwillig (ohne Bezahlung) an?
Anscheinend blickst du ja selbst durch den Quelltext nicht mehr durch.
Mein Vorschlag ist, schreib das ganze Ding von Grund auf neu und beachte dabei folgendes:
1. Sinnvolle Einrückungen (TAB-Taste benutzen)
2. Refaktorisieren - Den Quellcode in mehrere seperate Bestandteile aufspalten.
3. Globale Variablen brauchst du hier nicht.Zu 2.:
Keine Code-Monster wie
switch(foo) { case bar1: // Hier denke man sich weiteren Quelltext, so ungefähr 50 Zeilen case bar2: // Hier noch mal 39 }Verwendung von Funktionen schaffen hier mehr Überblick:
switch(foo) { case bar1: tuDies(); break; case bar2: tuJenes(); break; }Grüße...
Heiko
-
och nö schrieb:
bei der formatierung will ich das nicht anschauen.
Ich hab's mal spasseshalber ins Studio 2005 reinkopiert, format selection rüberlaufen lassen und die cases per VAX als funktionen rausfaktorisiert.
Es bleibt grauslich
@moritz92 : vor dem "case 3" der äusseren Schleife fehlt ein break

-
da du getline und cin 'mischt', musst du dich wahrscheinlich um den eingabebuffer kümmern.
http://tutorial.schornboeck.net/hello_world.htm
(kasten, oder forensuche betätigen)
sonst stehen alte zeichen im buffer, die statt händischer eingabe genutzt werden.
-
Muha ... denke mal es soll nen Vokabeltrainer werden oder sowas? Hab mal was aus den Klassen die ich hier die letzten Wochen über gepostet habe zusammen gebastelt ... sollte gehen

#if !defined (MENU_H__INCLUDED) #define MENU_H__INCLUDED #if (_MSC_VER >= 1300) #pragma once #endif // (_MSC_VER >= 1300) #include <iostream> #include <vector> #include <string> #include <limits> class menu { public: menu() : m_out(std::wcout) {} public: void push_back(std::wstring const& item) { m_data.push_back(item); } std::size_t get_selection() const { return m_sel; } friend std::wostream& operator <<(std::wostream& out, const menu& menu) { for (std::size_t i = 0; i < menu.m_data.size(); ++i) out << L"(" << i + 1 << L") " << menu.m_data[i] << std::endl; //menu.m_out = out; return out; } friend std::wistream& operator >>(std::wistream& in, menu& menu) { do { menu.m_out << L"Auswahl: " << std::flush; in.sync(); in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } while (!(in >> menu.m_sel) || menu.m_sel == 0 || menu.m_sel > menu.m_data.size()); --menu.m_sel; return in; } private: std::vector<std::wstring> m_data; std::size_t m_sel; std::wostream& m_out; }; #endif // MENU_H__INCLUDED#if !defined(VOCABULARY_SYSTEM_H__INCLUDED) #define VOCABULARY_SYSTEM_H__INCLUDED #if (_MSC_VER >= 1300) #pragma once #endif // (_MSC_VER >= 1300) #include <vector> #include <string> #include <utility> #include <iostream> #include <ctime> #include <cstdlib> #include <iomanip> template <const char* lang> class vocabulary_system { public: vocabulary_system(std::string const& lang, std::string const& sol) { read(lang, sol); std::srand(static_cast<unsigned>(std::time(NULL)));} public: void read(std::string const& file_lang, std::string const& file_sol) { std::wifstream file_stream(file_lang.c_str()); if (!file_stream) throw std::invalid_argument("file not found"); std::wstring tmp; while (std::getline(file_stream, tmp)) m_data.push_back(std::make_pair(tmp, L"")); file_stream.close(); file_stream.clear(); file_stream.open(file_sol.c_str()); if (!file_stream) throw std::invalid_argument("file not found"); for (std::size_t n = 0; std::getline(file_stream, tmp) && n < m_data.size(); ++n) m_data.at(n).second = tmp; } public: friend std::wostream& operator <<(std::wostream& out, const vocabulary_system& sys) { sys.m_cur = std::rand() % (sys.m_data.size() - 1); out << sys.m_cur + 1 << L":\n\t-" << lang << ": " << sys.m_data[sys.m_cur].first << "\n\t: " << std::flush; return out; } friend std::wistream& operator >>(std::wistream& in, vocabulary_system& menu) { std::wstring tmp; std::getline(in, tmp); if (tmp != m_data[m_cur].second) in.setstate(std::ios_base::failbit) return in; } private: std::vector< std::pair<std::wstring, std::wstring> > m_data; std::size_t m_cur; }; #endif // VOCABULARY_SYSTEM_H__INCLUDED#include <iostream> #include <fstream> #include <string> #include <limits> #include "vocabulary_system.h" #include "menu.h" std::wistream& clstream(std::wistream& in); { in.sync(); in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return in; } int main () { std::wcout << L"Vokabel Lernanwendung V0.0.0.1" << std::endl; vocabulary_system system("vok_en_001.dat", "vok_de_001.dat"); menu inst; inst.push_back(L"Vokabel abfragen"); inst.push_back(L"Beenden"); bool close = false; while (close == false) { std::wcout << menu; std::wcin >> menu; switch (inst.get_selection()) { case 0: { std::wcout << system; std::wcin >> clstream >> system; std::wcout << (!std::wcin ? L"Falsch!" : L"Richtig!"); } break; case 1: { close = true; } break; }; } }...