Problem mit Programm, Schleife wird nicht durchlaufen



  • Folgendes, schmeiß das char array raus, und benutze nur dein string array

    und dann machst du eine ganz normale eingabe via:

    void WordChart::setwords()
    {
      cout << "setwords" << endl;
      for(int i=0; i < 255; i++) // 2555 ist ganz schön groß,wofür brauchst du so viele Wörter?
      {
        cin>>wordarray[i];
        enteredwords = i-1;
        if(wordarray[i] == "") i = 255;
      }
    }
    


  • Hallo,

    danke schonmal.
    Das würde so sogar funktionieren.

    Das Problem ist, ich weiß nicht wie groß die Eingabe sein muss, da es dazu keine Angabe gibt. Die Schleife muss ja durch irgendwas wieder beendet werden, dafür hatte ich die Abfrage drin für ein einfaches Enter.

    Allerdings habe ich eben in der Aufgabenstellung entdeckt, dass wir KEINE STRINGS benutztn dürfen, somit weiß ich nun gar nicht mehr weiter 😞

    Wobei alleine die aufgabenstellung schon total unverständlich ist ..



  • poste mal die Aufgabestellung, wenn ihr keine Strings verwenden dürft dann müsstest du wieder zurück auf Char Arrays ausweichen.Was natürlich nicht die eleganteste Lösung ist.



  • Hi,

    also desto öfter ich mir das durchlese, desto weniger verstehe ich. Ich hoffe ich bekomme etwas geholfen 🙂

    // link habe ich wieder entfernt



  • Mach mal so den stream leer

    void WordChart::setwords()
    {
      cin.clear();
      cin.ignore(std::cin.rdbuf()->in_avail());
    
      ...
    }
    


  • Guten Morgen,

    weiß zufällig jemand, was genau hier von mir verlangt wird? Ich finde die Aufgabenstellung total verwirrend ... 😞

    http://skizz.sk.funpic.de/PG1-Uebung6-SS08.pdf

    Mit den ganzen Klassen und Objekten, ich weiß gar nicht mehr wo hinten und vorne ist.



  • Hmm, verglichen mit andereren Aufgaben, die wir hier schon zu lesen bekommen haben, finde ich diese eigentlich gut strukturiert und verständlich gestellt.
    Voraussetzung ist natürlich, dass die verwendeten Begriffe schon irgendwie bekannt sind. Davon gehe ich allerdings einmal aus, denn sonst wäre die Aufgabe wahrscheinlich nicht so gestellt worden.



  • Ich fang mal an, wie ich das ganz verstanden habe...

    1. Klasse Wordchart habe ich so aufgebaut

    class WordChart
    {
    private:
    	LetterStatistic lettStat;
    	vector <Word> words;
    
    public:
    	WordChart(LetterStatistic a);
    	~WordChart(void);
    	void start();
    	void read();
    	void show();
    };
    

    2. Klasse Word habe ich so aufgebaut

    class Word
    {
    private:
    	char wordletters[];
    public:
    	Word(char oneWord[]);
    	~Word(void);
    	void getWordletters();
    };
    

    3. Klasse LetterStatistic habe ich so aufgebaut

    class LetterStatistic
    {
    private:
    	int letters[26];
    public:
    	LetterStatistic(void);
    	~LetterStatistic(void);
    };
    

    So, ich habe das Aufwahlmenü fertig... toll 🙂

    Ich weiß nur nun irgendwie nicht wirklich weiter



  • So, ich nun nun so weit, dass ich einmal eine Zeichenkette in einen char array speichere und diesen dann auch in einem vektor ablege.

    nun habe ich zwei Probleme:

    1. Wie kann ich den Array wieder ausgeben?
    -es funktioniert zwar, allerdings gibt er mir bei den nicht belegten Zeichen einfach nur Müll aus.
    Und wie kann ich die Zeichenanzahl des Arrays ausgeben?

    2. Wie kann ich den Inhalt von dem Vektor wieder ausgeben?



  • einen char array speichere und diesen dann auch in einem vektor ablege.

    wieso beides?
    nicht, dass ich was ggn vektoren hätte - aber wenn du eh mit char* arbeitest, lass es doch auch gleich so gespeichert...

    Wie kann ich den Inhalt von dem Vektor wieder ausgeben?

    da musst du dir shcon ne eigene funktion schreiben - allerdings solltest du darauf achten, dass er aufhört auszugeben, wenn irgendwann mal ne zelle den wert 0 angenommen hatte - weil char* meist länger ist als man gebraucht hat - und dann nach der 0 noch ewig viel müll steht ^^

    bb



  • Wir MÜSSEN es in einem char-Array speichern, dass wir es noch weiter analysieren können und MÜSSEN es auch noch in einem Vektor ablegen 😞

    Das funktioniert ja auch soweit.

    Ich habe es nun geschafft, dass mir kein Müll mehr ausgegeben wird.

    Wenn ich nun aber mit

    cout << words << endl;
    

    den Array ausgeben lassen will, dann wird das alles doppelt ausgegeben?!



  • ich hab mir einfach mal die ersten Stichpunkte durchgelesen (und mit deiner bisherigen klasse verglichen) und folgendes draus gemacht (ist aber halt nur nen kleines stück deiner aufgabe):

    iwie sieht deine klasse nicht so aus, als ob sie das könnte, was verlangt ist (die ja auch noch lang nicht, aber wahrscheinlich besser, als deine bisherige 😛 ) ^^

    class WordChart
    	{
    		private:
    			std::vector <char *> data;
    		public:
    			bool /*fail*/ einlesen (void);
    			bool /*found*/ suchen (char *tosearch); //allerdings versteh ich hier das beispiel nicht ganz...
    			bool /*empty*/ Show_Haeufigkeit (void) //das ist in meinen Augen geeignet genug um zu zeigen, dass die Liste leer ist
    			void sort (bool aufsteigend = true);
    			void edit (void); //kein plan, ob man das wort oder den index angeben soll, welches man ändern soll
    			void reset (void); //data leeren
    			void Show_Menu (void); //Menü zeigen
    	};
    

    Wo ist dein Problem, einfach so weiterzuverfahren? Bin mir jetzt zwar auch nicht 100prozentig sicher, ob das alles richtig ist, aber so hast du wenigstens noch was durchzulesen 😉

    dass wir es noch weiter analysieren können und MÜSSEN es auch noch in einem Vektor ablegen

    nein - du könntest es auch einfach so machen: char **bla;
    hatte verstanden, dass du es so meintest: vector <char>, aber joar - so ist in Ordnung, wie du das meintest ^^

    den Array ausgeben lassen will, dann wird das alles doppelt ausgegeben?!

    1. warum den? ^^
    2. was sagt denn der debugger? ist es evtl schon 2x im array? und wie sieht die ausgabefkt an sich aus? so weit ich weiß, hat vector keinen << operator ^^

    class LetterStatistic
    {
    private:
        int letters[26];
    /*1. unsigned wär toll -> unsigned int --> nimm size_t - ist so und so die standard-zähl-variable in C++ ^^
    2. was machst du eigtl bei ä,ö,ü,ß etc? (und was bei satzzeichen? und wie gehst du mit zahlen um undundund ^^)*/
    public:
        LetterStatistic(void);
        ~LetterStatistic(void); //wozu deklarierst du den hier? wirst du eh nie brauchen
    };
    

    bb

    edit:

    void getWordletters();
    

    und wie soll so was funktionieren? wohin soll es denn die buchstaben übergeben oder so?



  • Um ehrlich zu sein weiß ich im Moment selbst nicht mehr was ich mache 🙂

    Mir sind bisher eigentlich alle Aufgaben leicht gefallen, doch hier blicke ich ehrlich gesagt absolut gar nicht mehr durch.

    Ich weiß nicht, warum wir drei Klassen benötigen usw.

    Ich versuche es nun mal mit deiner Klasse umzusetzen, allerdings soll der Vektor ja vom Datentyp Word sein und nicht char.

    Mein Array gebe ich ganz normal aus mit

    cout << blabla << endl;

    dann bekomm ich untereinander
    test
    test

    angezeigt

    das dumme, wenn ich das morgen nich richtig abgebe, dann heisst es prüfung ade 😕

    class LetterStatistic 
    { 
    private: 
        int letters[26]; 
    /*1. unsigned wär toll -> unsigned int --> nimm size_t - ist so und so die standard-zähl-variable in C++ ^^ 
    2. was machst du eigtl bei ä,ö,ü,ß etc? (und was bei satzzeichen? und wie gehst du mit zahlen um undundund ^^)*/ 
    public: 
        LetterStatistic(void); 
        ~LetterStatistic(void); //wozu deklarierst du den hier? wirst du eh nie brauchen 
    };
    

    Das soll mir ja nur eine Statistik für a-z ausgeben



  • skizZ schrieb:

    das dumme, wenn ich das morgen nich richtig abgebe, dann heisst es prüfung ade 😕

    Naja, Du hattest fast zwei Wochen Zeit, und hast bis jetzt anscheinend noch nichts gemacht. Was erwartest Du?



  • ja - und ich wollte von dir, dass du mal in den debugger gehst und guckst, was in dem array drin ist (nicht, dass es dort scho 2mal drin ist)... ansonsten: versuch halt erst ma dein glück so, ich bin heut abend wieder da ; ) ^^

    bb



  • Wieso hast Du denn Deine Klasse "Word" über Bord geworfen? Die steht doch extra in der Aufgabe drin, und kann Dir die Arbeit mit den C-Strings ordentlich vereinfachen.

    So koennte das Interface z.B. aussehen:
    word.h

    class Word
    {
    public:
        Word(char* w = NULL);   //Std-Ctor
        Word(const Word& word); //Copy-Ctor
        ~Word(); //Dtor
        char charAt(size_t idx) const; //char at ;)
        size_t length() const;  //Wortlaenge
        Word& operator=(const Word& w); //zuweisen
        bool operator<(const Word& w) const; //Vergleich
        bool operator>(const Word& w) const; //Vergleich
        bool operator==(const Word& w) const; //Vergleich
        operator const char*() const; //cast
        const char* findSubStr(const char* str, size_t startIdx = 0) const; //Substring
    private:
        void assign(const char* cStr);
        char* word;
    };
    


  • Danke schonmal,

    habe es mittlerweile geschafft, hänge aber im Moment an der letzten Funktion ein Wort zu bearbeiten

    void WordChart::editWord() 
    {
      int index;
      char input[256];
      for (int i=0; i<wordList.size(); i++)
      {
    	cout << "(" << i << ") "; wordList[i].printWord();
      }
      cin.clear();
      cin.sync();
      cout << "\nWelches wort?";
      cin >> index;
      cout << "\nBitte das neue Wort eingeben: ";
      cin.clear();
      cin.sync();								//previous inputs deprecated
      cin.getline(input, 256, '\n');
      wordList[index] = Word(input);
    }
    

    Die Auswahl klappt, die neue Eingabe klappt auch, doch wenn ich die dann abschicke, passiert einfach gar nichts mehr. Was mache ich falsch?



  • Hat sich erledigt, konnte das Problem wie folgt lösen

    void WordChart::editWord() 
    {
      int index;
      for (int i=0; i<wordList.size(); i++)
      {
    	cout << "(" << i << ") "; wordList[i].printWord();
      }
      char userInput;
      Word currentWord;
      cout << "Bitte den Index eingeben: ";
      cin.clear(); cin.sync();  
      cin >> index;
      cin.clear(); cin.sync();
      cout << "Bitte neues Wort eingeben: ";
      do 
      {
        userInput = cin.get(); 
    	if (cin.fail())  
    	{
          cin.clear(); cin.sync();
    	  return;
    	}
    	switch (userInput) 
    	{
          case ' ':
    	  case '\n':
    	  case '\t': wordList[index] = currentWord; currentWord.clear(); break; 
    	  default: currentWord.appendChar(userInput); break; 
    	}
      } while (userInput != '\n');
      lettStat.update(wordList);
    }
    

Anmelden zum Antworten