brauche hilfe bin absoluter anfaenger



  • hallo liebe experten,
    wie ihr wohl in der ueberschrift gelesen habt bauche ich hilfe....ich hab angefangen kominf zu studieren und werde einfach (noch) nicht schlau aus der c++ geschichte... \folgende aufgabe gilt es zu loesen:

    1. aufgabe:
    fehlerkontrolliert und "endlos" zeilenweise von der
    Standardeingabe ein, ersetzt in jeder Zeile alle Zeichenketten, die
    dem Muster ".*a" entsprechen durch die Zeichenkette "$$" und gibt die
    bearbeitete Zeile auf der Standardausgabe als eigene Zeile aus.

    2.aufgabe:
    fehlerkontrolliert und "endlos" zeilenweise von der
    Standardeingabe ein, ersetzt in jeder Zeile alle Muster "ab" durch
    das Zeichen '$' und gibt die bearbeitete Zeile auf der Standardaus-
    gabe als Zeile aus.


    Inhalte von string-Variablen benutzen und den eingelesenen string nur
    einmal durchlaufen.

    das ist bestimmt sehr einfach fuer euch zu loesen aber fuer mich ist das noch etwas schwer.

    ueber kommentare bei der loesung waere ich auch sehr dankbar...

    vielen vielen dank!!

    gruesse
    vince



  • Ok... Jetzt bitte nochmal in Deutsch Oo

    Ich habe kein Wort der Aufgabenstellung verstanden.



  • Denke nicht das hier, wer deine Hausaufgaben macht.

    Besten fängst du an und wen du nicht weiter kommst, Poste hier dein Problem.

    mfg

    ps: Ich vermute es wird eine Endlos Schleife gefordert. In der man Sachen eingibt. Und am Schluss verändert ausgegeben werden.



  • Du musst noch ankreuzen welche Note Du für die Aufgabe von Deinem Dozenten haben möchtest.
    Nicht das wir Dir eine 1er Lösung schreiben, die Du natürlich nicht haben möchtest.



  • ich komme nicht ueber int main() und ansonsten hab ich schon meine hfg gemacht.. du weisst ja nicht was ich sonst noch gemacht habe

    also aufage 2 hab ich jetzt folgenermassen geloest:
    int main() {
    63
    64 string s("");
    65
    66 while (getline(cin,s)) {
    67
    68 string t("");
    69
    70
    71 for (size_t i(0);i<s.size();i++){
    72
    73 if ((s[i]=='a') && (s[i+1]=='b')){
    74 t+='$';
    75 i+=1;
    76 }
    77 else {
    78 t+=s[i];
    79 }
    80 if (i+1==s.size()-1){
    81 t+=s[i+1];
    82 i=s.size();
    83 }
    84 }
    85 cout << t << endl;
    86 }
    87
    88 if (!cin.eof()) {
    89 cerr << "Fehler beim Einlesen" << endl;
    90 return 1;
    91 }
    92 return 0;
    93 }
    aber ich bin mir nicht sicher ob es noch etwas besser (einfacher || kuerzer) funzt. ach noten gibbet nicht drauf



  • AD 2

    #include <string>
    #include <iostream>
    
    int main() 
    {
    	std::string string_line;
    	while (std::getline(std::cin, string_line)) 
    	{
    		std::string result;
    
    		for (std::size_t i(0); i < (string_line.length() - 1); ++i)
    		{
    			if (string_line[i] == 'a' && string_line[i + 1] =='b')
    			{
    				result.append(1, '$');
    				++i;
    			} 
    			else
    				result.append(1, string_line.at(i);
    		}
    		if (result[result.length() - 1] != '$') result.append(1, '$');  
    		std::cout << result << std::endl;
    	}
    	std::cerr << "FEHLER: Es ist ein Fehler beim einlesen ihrer Eingabe aufgetreten!" << std::endl;
    }
    

    also dein Ansatz war ja ganz gut. Nur dein Problem ist, dass string_line[i + 1] fehlschlägt, weil wenn du das Zeichen am Ende des Strings erwischt (du gehst bis 1 kleiner string_line durch ... + 1 ist außerhalb des Speicherbereiches!) ... ehm dann wird erst operator == bearbeitet, bevor die booleanischen Bindungen beachtet werden ... ehm und dann ist ein Fehler beim einlesen aufgetreten, wenn er aus der while-Schleife geht ... darauf musst du dann nicht mehr prüfen!

    AD 1:
    Was ist mit diesem Muster gemeint? Die genaue Folge ".*a" oder '*' als Platzhalter für einen String (wie '#' und '?')?



  • Das posten von kompletten Lösungen ist verboten. $153 Abs. 3 Satz 2 des Siebten Buches der großen Programmierer.



  • ...es das gleiche wie sed 's/ab/$/g' machen.

    aufgabe 1 soll dies hier machen...

    sed 's/[5-9].*c.*[^B-Kr-z]/$/g'

    und da hakts bei mir ziemlich... ich verlier recht leicht den ueberblick... ich sitze schon ne weile dran.

    vielen dank uebrigens dass du dir die muehe machst



  • und da hakts bei mir ziemlich... ich verlier recht leicht den ueberblick... ich sitze schon ne weile dran.

    Na dann nur nicht aufgeben! Du suchst Zeilen, in denen ein a nach einem . kommt? So schwer wird das schon nicht sein. Wenn du gleich beim Suchen auch die Ausgaben machst, brauchst nicht einmal eine Kopie des Strings zu unterhalten.



  • std::string const& substr(std::string const& str, const char beg='=', const char end=';')
    {
        const std::size_t pos(str.find_first_of(beg));
        if (pos == std::string::npos) throw std::runtime_error("invalid string");
        const std::size_t pos_end(str.find_first_of(end, beg + 1));
        if (pos_end == std::string::npos) throw std::runtime_error("invalid string");
        return str.substr(pos, pos_end - pos);
    }
    

    ...
    wäre eine Möglichkeit ... Aber das ist doch jetzt wirklich nicht soo schwer gewesen, oder?

    int main()
    {
        const std::string src("Das ist ein. Test oder etwa nicht?");
        const std::string dest(substr(src, '.', 'a'));
    }
    

    ... ^^ Kann aber sein das du nicht per Rückgabe das machen kannst sondern per Referenz-Zuweisung ...



  • danke ich werde die vorschläge inhalieren und mal sehen... so einige sachen verstehe ich zwar auch hier nicht aber ich hab mein fettes buch bekommen und werde alles mal nachschlagen. vielen dank nochmal...


Anmelden zum Antworten