Alternativen zur replace Funktion



  • iocc schrieb:

    Kein Grund, Loops zu verwenden!

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <random>
    #include <boost/range/irange.hpp>
    #include <boost/range/algorithm.hpp>
    #include <boost/range/join.hpp>
    #include <array>
    
    int main() {  
      std::array<char, 2*('z'-'a'+1)> from, to;
      boost::copy(boost::join(boost::irange('a', static_cast<char>('z'+1)), 
                              boost::irange('A', static_cast<char>('Z'+1))), from.begin());
      to = from;
      std::shuffle(begin(to), end(to), std::mt19937(std::random_device()()));
      std::transform(std::istreambuf_iterator<char>(std::cin), {},
                     std::ostreambuf_iterator<char>(std::cout),
                     [&](char c) { auto i = std::find(from.begin(), from.end(), c);
                                   return i==from.end() ? c : to[i-from.begin()]; });
    }
    

    🤡



  • Tut mir leid Ethon ich verstehe den QC nicht. kannst du eventuell auskommentieren,
    und mir die Zeilen angeben, die ich brauche, damit der Fehler nicht passiert? Außerdem bitte noch sagen an welche Stelle das gehört. Danke! 🙄



  • Combum schrieb:

    Nächste Frage: Wie kann ich das am besten vermeiden?

    Deine ganze Herangehensweise ist daneben. Dafür braucht man keine Regular Expressions ...

    Vorschlag:

    • Alphabet ( 'a' - 'z' , 'A' - 'Z' ) in ein Array alphabet schreiben

    • alphabet kräftig durchmischen

    • Benutzereingabe nach input lesen

    • Für jedes Zeichen in input

    • Position des Zeichens in einem nicht durchgewürfelten alphabet berechnen

    • Zeichen mit dem Zeichen an berechneter Position von alphabet ersetzen

    • input ausgeben

    Combum schrieb:

    Noch eine Frage: Ich habe erst letztens bemerkt, dass cin nur bis zu einem Leerzeichen einliest, welche eingabemethode wäre am besten für einen kompletten text mit zeilenumbruch und allem?

    std::getline() ließt eine Zeile (bis '\n' ).



  • Da es noch nicht explizit erwähnt wurde: Sobald du alle Buchstaben einzeln in den Code schreibst, und sogar noch Gross-/Kleinschreibung und 2 nacheinander als Varianten, hast du etwas Grundlegendes im Programmieren nicht verstanden. Nämlich Codeduplikation zu vermeiden, indem man ähnlich aussehende Codestücke durch Abstraktion (Funktionen, Schleifen, ...) vereinheitlicht.



  • Bumbum schrieb:

    Da es noch nicht explizit erwähnt wurde: Sobald du alle Buchstaben einzeln in den Code schreibst, und sogar noch Gross-/Kleinschreibung und 2 nacheinander als Varianten, hast du etwas Grundlegendes im Programmieren nicht verstanden. Nämlich Codeduplikation zu vermeiden, indem man ähnlich aussehende Codestücke durch Abstraktion (Funktionen, Schleifen, ...) vereinheitlicht.

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.



  • Combum schrieb:

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.

    Kann man. Aber kennst du den Unterschied zwischen einzelnen Zeichen und Strings?



  • Klar, einzelne Zeichen werden in char definiert, texte in strings, ürsprünglich war es aber gedacht, mehrere zeichen zu verwenden, ich werde es aber ausbessern.

    Ich weiß dass man mit getline(); bis zum Zeilenende lesen kann, ich möchte aber ALLES. 😃

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?
    (bitte so einfach wie möglich)



  • Combum schrieb:

    Ich wusste nicht, dass man einfach "A" - "Z" machen kann.

    Swordfish schrieb:

    Kann man. Aber kennst du den Unterschied zwischen einzelnen Zeichen und Strings?

    Klar, [...]

    Dann ist dir auch klar, daß "a" - "z" etwas anderes ist als 'a' - 'z' ? Btw. was kommt deiner Meinung nach dabei überhaupt heraus?

    Combum schrieb:

    Ich weiß dass man mit getline(); bis zum Zeilenende lesen kann, ich möchte aber ALLES.

    Dann eben ein paar mal std::getline() ?

    Combum schrieb:

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?

    Du brauchst nichts suchen, bloß im Alphabet nachschlagen.



  • Swordfish schrieb:

    Combum schrieb:

    und wie sollte ich deiner Meinung nach die Zeichen suchen und ersetzen?

    Du brauchst nichts suchen, bloß im Alphabet nachschlagen.

    Aber wie soll ich nachschlagen? Kannst du mir Funktionen nennen welche ich am besten benutzen sollte?

    Den Unterschied zwischen " und ' kenne ich nicht, wäre nett wenn du mir den erläutern könntest.

    Gute Nacht bis morgen und Danke, dass du mir bei meinem Lernprozess (wenn man es so nennen kann) hilfst. 😃



  • Combum schrieb:

    Den Unterschied zwischen " und ' kenne ich nicht, wäre nett wenn du mir den erläutern könntest.

    'A' ist ein Zeichen, hat den Typ char und entspricht einem Zahlenwert.
    "A" ist eine Zeichenkette bestehend aus den Zeichen { 'A', '\0' } und ist vom Typ char const [2] .

    Combum schrieb:

    Gute Nacht bis morgen und Danke, dass du mir bei meinem Lernprozess (wenn man es so nennen kann) hilfst. 😃

    Ne du, dir fehlen absolute Grundlagen, die du dir am besten durch das Studium eines Lehrbuches aneignest.


  • Mod

    Nein, vom Typ char const [2] .



  • Stimmt. Korrigiert.



  • Gebt ihm mal ne vernünftige Antwort sonst fang ich an sie auf dem Handy zu tippen.
    Lese hier nur Klugscheißerei und anfängerfeindliche Lösungen die die halbe stdlib nutzen.



  • Dann erlaube ich mir mal, einen Vorschlag zu unterbreiten, den der Threadersteller vermutlich nachvollziehen kann.

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    char alphabet[52] = {
    	'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    };//uups, sollte lokal in der main() sein. 
    
    int main() {
    	srand(time(0));
    	random_shuffle(std::begin(alphabet), std::end(alphabet));
    
    	char ch;
    	while(cin.get(ch)) {
    		if('a'<=ch and ch<='z')
    			cout<<alphabet[ch-'a'];
    		else if('A'<=ch and ch<='Z')
    			cout<<alphabet[ch-'A'+26];
    		else
    			cout<<ch;
    	}
    }
    

    Beispiel:

    Das Pferd frisst keinen Gurkensalat. 
    GrI iwvpn wpMIIW qvMBvB jOpqvBIrErW. 
    Angela ist doof. 
    HBcvEr MIW neew. 
    So, jetzt nur noch raufinden, wie man das Programm beendet...
    fe, svWUW BOp BeDZ prOwMBnvB, gMv ArB nrI ipecprAA yvvBnvW...
    Irgendwie cin bescheid sagen, dass die Eingabe fertig ist. 
    zpcvBngMv DMB yvIDZvMn IrcvB, nrII nMv bMBcryv wvpWMc MIW. 
    Unter Linux drücke man dazu Strg+D. Unter Windows isses Strg+Z. 
    XBWvp VMBOh npüDqv ArB nrUO fWpc+G. XBWvp PMBnegI MIIvI fWpc+a. 
    
    Process returned 0 (0x0)   execution time : 164.044 s
    Press ENTER to continue.
    

    Alternativ

    if(islower(ch))//hoffentlich ist 'ü' nicht lower
    			cout<<alphabet[ch-'a'];
    		else if(isupper(ch))
    			cout<<alphabet[ch-'A'+26];
    		else
    			cout<<ch;
    

    Und hoffentlich nicht

    for(char ch;cin.get(ch);)
            	cout<<(isalpha(ch)?alphabet[islower(ch)?ch-'a':ch-'A'+26]:ch);
    

    Junge, Junge, was treibt Swordfish dazu, sowas zu schreiben?
    face->hit(desk);



  • Combum schrieb:

    Tut mir leid Ethon ich verstehe den QC nicht. kannst du eventuell auskommentieren,
    und mir die Zeilen angeben, die ich brauche, damit der Fehler nicht passiert? Außerdem bitte noch sagen an welche Stelle das gehört. Danke! 🙄

    *lach*
    Da ist Dir was entgangen, ich erklärs mal kurz:

    Swordfish hat erstmal ob Deines Code gefacepalmt aber selber mit seinem Code
    schweren Unfug getrieben, alles unnötig oder unnötig kompliziert gemacht.

    Daraufhin hat iocc ihn parodiert und es auf eine sehr humorvolle Weise auf die Spitze gebracht: Alle Schleifen weggemacht, wie vor ein paar Jahren echt in Büchern empfohlen doch tatsächlich wurde. Der Name iocc spielt auf den ioccc an, http://www.ioccc.org den internationalen Wettbewerb um den möglichst unleserlichsten C-Quellcode.

    Ethon hat applaudiert, weil ioccs Code so lustig unleserlich ist und technisch so ausgefuchst.



  • volkard schrieb:

    Combum schrieb:

    Tut mir leid Ethon ich verstehe den QC nicht. kannst du eventuell auskommentieren,
    und mir die Zeilen angeben, die ich brauche, damit der Fehler nicht passiert? Außerdem bitte noch sagen an welche Stelle das gehört. Danke! 🙄

    *lach*
    Da ist Dir was entgangen, ich erklärs mal kurz:

    Swordfish hat erstmal ob Deines Code gefacepalmt aber selber mit seinem Code
    schweren Unfug getrieben, alles unnötig oder unnötig kompliziert gemacht.

    Daraufhin hat iocc ihn parodiert und es auf eine sehr humorvolle Weise auf die Spitze gebracht: Alle Schleifen weggemacht, wie vor ein paar Jahren echt in Büchern empfohlen doch tatsächlich wurde. Der Name iocc spielt auf den ioccc an, http://www.ioccc.org den internationalen Wettbewerb um den möglichst unleserlichsten C-Quellcode.

    Ethon hat applaudiert, weil ioccs Code so lustig unleserlich ist und technisch so ausgefuchst.

    Ok, jetzt ist es klar, Danke.

    Dein Code ist in der Tat sehr simpel, ich verstehe ihn!
    Deine while schleife vergleicht den wert von ch mit den werten der ascii Tabelle, richtig?

    Und ja ich bin ein Anfänger, das macht aber nichts, da ich noch in der 9. Klasse bin (bald in die 10. komme) und aus Spaß programmiere. 🙂

    Habt ihr alle Informatik studiert?



  • Ne. Programmieren lernst du vor allem selbstständig. Ich habe sehr viel durch dieses Forum und das Selbststudium von guten (!) C++-Büchern gelernt.



  • volkard schrieb:

    Alle Schleifen weggemacht, wie vor ein paar Jahren echt in Büchern empfohlen doch tatsächlich wurde.

    Das wird immer noch von vielen empfohlen. Also nicht *alle*, aber alle wo es einfach geht. Und es geht bei vielen der Schleifen die normalerweise drinnen gelassen werden recht einfach.

    Combum schrieb:

    Ethon hat applaudiert, weil ioccs Code so lustig unleserlich ist und technisch so ausgefuchst.

    Ich finde ioccs Code gar nicht so unleserlich. Alles nur Gewohnheitssache, aber selbst wenn man es nicht gewohnt ist ist der Code für jmd. der halbwegs C++ kann nicht so schwer zu entziffern.



  • Combum schrieb:

    Dein Code ist in der Tat sehr simpel, ich verstehe ihn!

    Danke. Das ehrt mich.

    Combum schrieb:

    Deine while schleife vergleicht den wert von ch mit den werten der ascii Tabelle, richtig?

    Ich würde es nicht so vereinfacht ausdrücken.
    Zunächst mal wird in C++ gar nicht zwischen einem Zeichen und dessen ASCII-Wert unterschieden werden. Das Zeichen IST bereits eine Zahl (zwischen -128 und +127 oder zwischen 0 und 255, je nach Compiler).

    Falls Dir per Schreibtischtest gelingt, vorherzusagen, was die nächsten beiden Programme ausgeben, dann ist gänzlich jeder Zweifel beseitigt, wie das eigentliche Programm von mir funktioniert.

    #include <iostream>
    
    int main() {
    	for(char ch='a';ch<='z';ch+=2)
    		std::cout<<ch;
    }
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
    	string wort="annabella";
    	for(auto ch:wort)
    			cout<<ch-'a'<<' ';
    }
    


  • Bumbum schrieb:

    Da es noch nicht explizit erwähnt wurde: Sobald du alle Buchstaben einzeln in den Code schreibst, und sogar noch Gross-/Kleinschreibung und 2 nacheinander als Varianten, hast du etwas Grundlegendes im Programmieren nicht verstanden. Nämlich Codeduplikation zu vermeiden, indem man ähnlich aussehende Codestücke durch Abstraktion (Funktionen, Schleifen, ...) vereinheitlicht.

    Harte Worte. 😃

    Also ich bin mir da nicht so sicher, wen ich gerne im Team haben würde.

    char alphabet[52] = {
    	'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    };
    
    char alphabet[2*('z'-'a'+1)];
    boost::copy(boost::join(boost::irange('a', static_cast<char>('z'+1)),
    	boost::irange('A', static_cast<char>('Z'+1))), from.begin());
    
    char alphabet['z' - 'a' + 'Z' - 'A' + 2];
    for(std::size_t i {}; i < alphabet.size(); ++i)
    	alphabet[ i ] = (i > 'z' - 'a' ? 'A' : 'a') + i % ('z' - 'a' + 1);
    

    🤡


Anmelden zum Antworten