Alternativen zur replace Funktion



  • Combum schrieb:

    beim zweiten weiß ich nicht was "auto ch:wort" macht.

    Dann möchte ich das zweite ändern zu

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string wort="annabella";
        for(string::iterator i=begin(wort);i!=end(wort);++i){
    		char ch=*i;
    		int x=ch-'a';
    		cout<<x<<' ';
    	}
    }
    

    oder

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string wort="annabella";
        for(size_t i=0;i!=wort.size();++i){
    		char ch=wort[i];
    		int x=ch-'a';
    		cout<<x<<' ';
    	}
    }
    

    Combum schrieb:

    P.S. Ich habe nicht geschummelt, kannst ja mal vorbeikommen, mein IDE ist geschlossen! 😃

    Fein. Ich denke, es könnte ganz lehrreich sein, mal ein wenig vom Ausprobieren anzukommen. Durch Selber-Durchdenken kriegt man ein viel besseres Gefühl dafür, wie der Computer geht und das wirste brauchen, um Dir Lösungen für kompliziertere Probleme einfallen zu lassen. Der Schreibtischtest wird Dein bester Freund werden. 🙂



  • [quote="volkard"][quote="Combum"]

    volkard schrieb:

    Nee. 'a'==95 und 97=='c', das weißte ja.

    😕

    Auf meiner ascii tabelle ist a=97 und b=98 und c=99. Meine Tabelle: http://www.torsten-horn.de/techdocs/ascii.htm
    (gehört nicht mir, ich benutze sie nur)

    Als ich gestern den Pc ausgemacht hab, ist mir eingefallen, dass die antwort nicht c sein kann, weil es ja ne schleife war. 😡
    Dann berichtige ich jetzt:

    1. cegikmopsuwy{ jedesmal wenn die schleife durchläuft wird geprüft, ob ch noch unter oder gleich z ist, dann wird eine zahl addiert welche ausgegeben dann ein Zeichen ergibt.

    2. Ich ignoriere mal size_t i=0;i!=wort.size();

    char ch=wort[i]; Verstehe ich auch nicht, denn wort war nicht als array definiert, nur als String.

    Aber ich habe eine Vermutung:

    Ausgabe: " ^M ^M ^A ^D ^K ^K " die leerzeichen gehen verloren wegen dem forum und dem spam schutz.

    Wenn man wort aufteilt und dann in verschiedene chars "reinlegt"
    die dann minus a rechnet und dann ausgibt sollte das herauskommen.



  • Combum schrieb:

    volkard schrieb:

    Nee. 'a'==95 und 97=='c', das weißte ja.

    😕
    Auf meiner ascii tabelle ist a=97 und b=98 und c=99. Meine Tabelle: http://www.torsten-horn.de/techdocs/ascii.htm
    (gehört nicht mir, ich benutze sie nur)

    Ups, ja, das meine ich.

    Combum schrieb:

    1. cegikmopsuwy{ jedesmal wenn die schleife durchläuft wird geprüft, ob ch noch unter oder gleich z ist, dann wird eine zahl addiert welche ausgegeben dann ein Zeichen ergibt.

    Ganz genau. Aber 'a' ist noch drin und '{' nicht mehr. Also acegikmopsuwy

    Combum schrieb:

    2. Ich ignoriere mal size_t i=0;i!=wort.size();
    char ch=wort[i]; Verstehe ich auch nicht, denn wort war nicht als array definiert, nur als String.

    Klappt aber auch. Die netten Leute haben den operator[] für strings so überladen, daß sie sich dahingehend wie Arrays anfühlen.

    Combum schrieb:

    Aber ich habe eine Vermutung:
    Ausgabe: " ^M ^M ^A ^D ^K ^K " die leerzeichen gehen verloren wegen dem forum und dem spam schutz.
    Wenn man wort aufteilt und dann in verschiedene chars "reinlegt"
    die dann minus a rechnet und dann ausgibt sollte das herauskommen.

    ^M sieht aber nicht wie ein int aus.

    Die Ausgabe sollte sein
    0 13 13 0 1 4 11 11 0

    Also a wird zu 0, b zu 1, c zu 2, e zu 4, l zu 11, n zu 13
    "anabella" -> 0 13 13 0 1 4 11 11 0



  • Oh Stimmt, ich habe nicht darauf geachtet, dass int ausgegeben wird. aber wenn x ein char wäre dann wäre ich richtig.

    Kannst du mir erklären wieso man überlädt und wie das geht?



  • Combum schrieb:

    Oh Stimmt, ich habe nicht darauf geachtet, dass int ausgegeben wird. aber wenn x ein char wäre dann wäre ich richtig.
    Kannst du mir erklären wieso man überlädt und wie das geht?

    Beispiel:

    int main() {
    	int arr[10];
    	for(int i=0;i<=10;++i){
    		arr[i]=0;
    		cout<<arr[i]<<' ';
    	}
    }
    

    Uups, das sind ja 11 Zahlen. Und das dumme dran ist, daß das Programm zufällig nicht abstürzt. Aber es könnte beim Kunden Blödsinn bauen. Ich will mich dagegen schützen. Also baue ich eine eigene Array-Klasse:

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    template<typename Data,int Size>
    class Array{
    	Data data[Size];
    public:
    	Data get(int i){
    		assert(0<=i and i<Size);
    		return data[i];
    	}
    	void set(int i,Data d){
    		assert(0<=i and i<Size);
    		data[i]=d;
    	}
    };
    
    int main() {
    	Array<int,10> arr;
    	for(int i=0;i<=10;++i){
    		arr.set(i,0);
    		cout<<arr.get(i)<<' ';
    	}
    }
    

    Ausgabe

    Combum: /home/volkard/.../main.cpp:14: void Array<Data, Size>::set(int, Data) [with Data = int; int Size = 10]: Assertion `0<=i and i<Size' failed.
    0 0 0 0 0 0 0 0 0 0 
    Process returned -1 (0xFFFFFFFF)   execution time : 0.002 s
    Press ENTER to continue.
    

    Perfekt, diesen Programmierfehler liefere ich nie wieder dem Kunden aus.

    Aber so ist das Array doof zu benutzen. Also aufrüsen, zuerstmal benutze ich als Rückgabe eine Referenz auf das Array-Element.

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    template<typename Data,int Size>
    class Array{
    	Data data[Size];
    public:
    	Data& at(int i){
    		assert(0<=i and i<Size);
    		return data[i];
    	}
    };
    
    int main() {
    	Array<int,10> arr;
    	for(int i=0;i<10;++i){
    		arr.at(i)=i*i;
    	}
    	for(int i=0;i<10;++i){
    		cout<<arr.at(i)<<' ';
    	}
    }
    

    deulich angenehmer.

    Und jetzt überlade ich den Operator[]:

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    template<typename Data,int Size>
    class Array{
    	Data data[Size];
    public:
    	Data& operator[](int i){
    		assert(0<=i and i<Size);
    		return data[i];
    	}
    };
    
    int main() {
    	Array<int,10> arr;
    	for(int i=0;i<10;++i){
    		arr.operator[](i)=i*i;
    	}
    	for(int i=0;i<10;++i){
    		cout<<arr.operator[](i)<<' ';
    	}
    }
    

    Wunderschön, oder? 🤡 🤡

    Nee, in der main will ich natürlich die Aufrufweise auch als Operator stehen habe.

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    template<typename Data,int Size>
    class Array{
    	Data data[Size];
    public:
    	Data& operator[](int i){
    		assert(0<=i and i<Size);
    		return data[i];
    	}
    };
    
    int main() {
    	Array<int,10> arr;
    	for(int i=0;i<10;++i){
    		arr[i]=i*i;
    	}
    	for(int i=0;i<10;++i){
    		cout<<arr[i]<<' ';
    	}
    }
    

    Jupp, ab jetzt muss ich keinen Programmierfehler mit Indexgrenzenüberschreitung mehr ausliefern und es fühlt sich trotzdem wie ein Array an.

    Wollte schon immer mal wissen, was die Hälfte von drei siebentel ist.

    #include <iostream>
    #include <cassert>
    using namespace std;
    
    class Bruchzahl{
    public://sollte später private werden
    	int z;
    	int n;
    public:
    	Bruchzahl(int zaehler,int nenner){
    		z=zaehler;
    		n=nenner;
    	}
    };
    Bruchzahl operator*(Bruchzahl x,Bruchzahl y){
    	Bruchzahl z(x.z*y.z,x.n*y.n);
    	return z;
    }
    void operator<<(ostream& out,Bruchzahl b){
    	out<<b.z<<'/'<<b.n;
    }
    
    int main() {
    	Bruchzahl a(1,2);
    	Bruchzahl b(3,7);
    	Bruchzahl c=a*b;//Bruchzahl c=operator*(a,b);
    	cout<<c;//operator<<(cout,b)
    }
    

    UUps!

    cout<<c<<'\n';
    

    klappt nicht! Hab wiedermal kacke programmiert. Richtig geht es so:

    ostream& operator<<(ostream& out,Bruchzahl b){
    	out<<b.z<<'/'<<b.n;
    	return out;
    }
    …
    	cout<<c<<'\n';//(cout<<c)<<'\n';//operator<<(operator<<(cout,c),'\n');
    //die Rückgabe vom (cout<<c) ist ja genau wieder das cout, und kann dann in den <<'\n' gesteckt werden.
    


  • Du hast dir ja viel Mühe gegeben! Danke dafür 😃 👍
    Man baut sich also seine eigenen Operatoren, welche weniger Fehler produzieren, weil sie anpassbar sind und mehr leserlich? Sollte so richtig sein.

    Btw, möchte jemand mein Pseudo- MatrixBildschirm -Programm haben? 🕶


Anmelden zum Antworten