struct elemente in funktionen



  • @Th69 oh stimmt das hab ich übersehen 😃 danke



  • @Th69
    kannst du mir eventuell sagen, was genau mit den while(true) gemeint ist?
    ich versuche gerade noch immer zu verstehen, was hier genau gemacht wird. Bieht sich das true auf die äußere Schleife, oder auf int pos=0?
    bisher bin ich davon ausgegangen, dass damit die äußere schleife gemeint ist

    for (int k = 0; k < z_count; k++)
    {
    	int pos = 0;
    	while (true) // solange k kleiner als z_count ist mache...
    	{
    		wort = naechstes_wort(eingabe[k], pos); // wort muss oben in der funktion ausgegeben werden
    		if (wort == "")
    			break;
    		zaehle_wort(wort, haeufigkeit, w_count);
    	}
    }


  • @Wade1234 zu deinem ersten code beispiel. Das geht (meines Erachtens ) nicht, weil ja die wörte noch gar nicht getrennt vorliegen. Ich gehe davon aus, dass dies genau in dieser funktion gemacht werden soll... also wort.length gibt es noch nicht, oder?



  • @mmm_1482_ das sollte eigentlich wort.length() heißen. im prinzip wird text ab position i mit wort verglichen.

    dies ist ein ganz toller text. //i = 0, keine übereinstimmung
    text
    
    dies ist ein ganz toller text. //i = 1, keine übereinstimmung
     text
    
    dies ist ein ganz toller text. //i = 2, keine übereinstimmung
      text
    
    dies ist ein ganz toller text. //i = 3, keine übereinstimmung
       text
    
    ...
    
    dies ist ein ganz toller text. //i = 25, übereinstimmung
                             text
    
    dies ist ein ganz toller text. //i = textlänge - wortlänge, keine übereinstimmung
                              text
    

    ich hab das oben übrigens mal korrigiert: es muss text[i + j] == wort[j] heißen.



  • @Wade1234 wäre dieser Code auch korrekt? also er ist nicht ganze korrekt, weil beim debuggen nimmt er zwar das erste zeichen des strings, aber er überspringt die schleife, obwohl die bedingung noch erfüllt ist
    außer er nimmt den integerwert von zeichen[pos] aber eigentlich sollte es das nicht tun, oder? 😃 ist ja ein string und ich vergleiche die position des strings

    string naechstes_wort(string zeile, int& pos) // zeile ="laura hat" pos=0 (referenz)

    {

    for (; zeile[pos]< zeile.length(); ) // zeile wird übersprungen
    {
    
    	if (zeile.at(pos) != ' ')
    	{
    		zeile += zeile[pos];
    		pos++;
    	}
    	
    	else
    	{
    		break;
    	}
    }
    return zeile; // wort vor leerzeichen wir in zeichen gespeichert
    

    }



  • @mmm_1482_ sagte in struct elemente in funktionen:

    zeile += zeile[pos];

    was soll zeile += zeile[pos]; genau bewirken? und was zeile[pos]< zeile.length();?



  • @Wade1234 eigentlich soll sie bewirken, dass mit jeder positiven ifbedingung ( also alles was ungleich eines leerzeichens ist) buchstabe für buchstabe angehängt wird. Aber mir fällt gerade auf, dass ich dafür am besten einen leeren string definiere .. weil zeile ja bereits den string von eingabe [k] besetzt. ich nehme das zurück XD die positionen des strings werden ja mit neuen werten besetzt

    zeile[pos]< zeile.length() soll bewirken, dass jedes Zeichen des strings durchgegangen wird.
    ich gehe somit jedes zeichen des strings durch. aber irgendwas stimmt mit der bedinungung nicht, weil sie anscheinen direkt falsch ist und übersprungen wird
    Im debugger hat zeichen[pos] auch den wert des ersten buchstabens, aber dieser wert kann nicht in der inneren schleife gespeichert werden, weil die bedingung falsch ist



  • @mmm_1482_ ach jetzt verstehe ich das. ja dafür musst du einen leeren string nehmen und diesen dann zurückgeben.

    mit zeile[pos]< zeile.length(); vergleichst du jedenfalls den wert des zeichens (mindestens 48 für 0 und für z irgendwas noch größeres) mit der länge der zeile. aber du willst ja sicherlich die position mit der länge der zeile vergleichen......



  • @mmm_1482_: Den Fehler bzgl. zeile[pos]< zeile.length() hattest du doch schon mal und ich habe dich drauf hingewiesen (wie man richtig iteriert)?!



  • @Th69 ich komm da irgendwie immer durcheinander.. ich dachte das müsste so gehen und hab mich total gewundert



  • @mmm_1482_ dann ist es mal an der zeit, sich die jeweiligen methoden anzusehen und zu überlegen, ob die überhaupt zusammen passen:

    http://www.cplusplus.com/reference/string/string/operator[]/
    http://www.cplusplus.com/reference/string/string/length/

    string allgemein: http://www.cplusplus.com/reference/string/string/



  • @Wade1234
    Mit dieser bedingung geht es zumindest in die schleife rein 😃

    string tmpstr = "";

    for (int i=0; zeile[i]>='a' && zeile[i]<='z'; i++) // zeile wird übersprungen
    {
    	if (zeile.at(i) != ' ')
    	{
    		tmpstr += zeile[pos];
                        zeile[pos] == tmpstr[pos];
    		pos++;
    		
    	}
    	
    	if(zeile.at(pos)== ' ')
    	{
    		return zeile;
    	}
    	 // wort vor leerzeichen wir in zeichen gespeichert
    }


  • @Wade1234 danke für die links 🙂
    im grunde weiß ich das mit den zahlen, nur hab ich irgendwie gedacht, dass ( wenn es es die position des strings ist) auch das zeichen selbst verglichen wird. Aber das muss ich mir definiv einprägen



  • @mmm_1482_ wie wäre es mit

    while(pos < zeile.length())
    {
         //mach irgendwas
    
         pos++;
    }
    

    ?



  • @Wade1234 jap ist mir auch beim debuggen aufgefallen 😳 außerdem hatte ich den falschen rückgabewert. Hab das jetzt aur return tmpstr gesetzt und es klappt. Bin gerade bei der zweiten funktion. Wenn ich die auch schaffe, bin ich echt glücklich 😃



  • @Wade1234 ich komm einfach nicht voran... ich starre diesen code jetzt stunden an und sehe zwar den fehler, aber hab keine ahung was ich machen soll... die zweite funktion (zaehle_wort) funktioniert soweit, aber das Programm stürtzt beim zweiten aufruf der ersten funktion immer an der stelle pos++ ab.. außerdem nimmt es immer wieder die gesamte zeile und somit bringt es nichts....

      string naechstes_wort(string zeile, int& pos) // zeile ="mona hat" pos=0 (referenz)
    
    {
    string tmpstr = "";
    
    for (int i = 0; zeile[i] >= 'a' && zeile[i] <= 'z'; i++, pos++) //isoliert jedes Wort
    {
    	if (zeile.at(i) != ' ')
    	{
    		tmpstr += zeile[pos];
    		zeile[pos] == tmpstr[pos];
    								//problem entsteht hier mit dem arraybereich, nachdem beide funktionen einmal durchgeführt wurden und eingabe[k] nochmal hier rein springt.
    	}									//außerdem muss izeile[i] irgendwie die bereits durchlaufenden wörter der zeile überspringen.
    
    	if (zeile.at(pos) == ' ')
    	{
    		i = zeile[i];
    		break;
    	}
    
    }return tmpstr; //ab hier wird das erste wort an die main überwiesen
    

    }



  • Du kommst irgendwie mit den 2 Variablen pos und i durcheinander. Warum hast du da 2 Variablen?

    string naechstes_wort(const string &zeile, int& pos) {
        // Überspringe Spaces am Anfang
        while (pos < zeile.size() && isspace(zeile[pos])) ++pos;
    
        string result;
        // nicht-whitespacezeichen anhängen
        while (pos < zeile.size() && !isspace(zeile[pos]))
            result += zeile[pos++];
        return result;
    }
    

    Wenn du jetzt statt Leerzeichen nur a-z haben willst, musst du das isspace durch eine eigene Funktion ersetzen, die true für Nicht-Wortzeichen zurückgibt und sonst false.



  • @wob ja lustigerweise ist mir das auf dem Heimweg auch aufgefallen. Ich hab nun nur noch pos als Zählervariable. Aber es stürtzt immer noch ab der 10 Zeile ab. Selber FehlerCode
    und isspace darf ich nicht verwenden

       string naechstes_wort(string zeile, int& pos)
     {
    string tmpstr = "";
    
    for (; zeile[pos] >= 'a' && zeile[pos] <= 'z'; ) //isoliert jedes Wort
    {
    	if (zeile.at(pos) != ' ')
    	{
    		tmpstr += zeile[pos];
    		zeile[pos] == tmpstr[pos]; // programm stürtzt hier ab dem zweiten funktionsaufruf ab
    		//zeile += zeile[pos];
    	}								
    
    
    	if (zeile.at(pos) == ' ')
    	{
    		pos = zeile[pos];
    		break;
    	}
    	pos++;
    }
    
    return tmpstr;
    //return zeile; 
    

    }



  • Du checkst in deiner for-Schleife (ohne Start und Inkrement, also eigentlich eine while-Schleife in for-Syntax), dass zeile[pos] ein Buchstabe a-z ist. Warum dann das if in Zeile 7? Das ist somit immer true und dein if in Zeile 15 ist niemals true.
    Zeile 10 ist ein Fehler. Was soll die überhaupt tun? Erstens ist == ein Vergleich und du benutzt das Ergebnis nicht. Und wenn pos beim Funktionsaufruf > 0 ist, dann hat tempstr doch gar nicht so viele Zeichen. Kurzum: ich verstehe deine Logik nicht.

    Außerdem: Warum hast du Checks auf das Leerzeichen und auf a-z? Was soll bei anderen Zeichen, zum Beispiel bei Großbuchstaben, Punkten, Kommas, Umlauten etc. passieren? Daher würde ich lieber in einer Funktion festlegen, welche Zeichen Trennzeichen sind und alle anderen als Wortzeichen ansehen (das habe ich mit isspace gemacht, aber schreib dir doch deine eigene Funktion dafür, wenn du isspace nicht verwenden darfst - vielleicht möchtest du auch lieber !std::isalpha bzw. deine eigene Variante davon verwenden)



  • und was soll Zeile 17 tun?


Anmelden zum Antworten