indexieren:



  • brak schrieb:

    int SZ=12; //Spiegelzahl
    int DZ=1; //Durchlaufzahl
    int FZ=2; //Faktorzahl
    int ZZ=0; //Zählerzahl
    int TS=0;
    vector<int>Container(0);//vector<int>NTTS(0); //NichttrivialeTeilersumme
    

    Wenn du schon solche Kommentare schreibst, warum nicht gleich

    int Spiegelzahl=12;
    int Durchlaufzahl=1;
    int Faktorzahl=2;
    int Zaehlerzahl=0;
    int Teilerzahl=0;
    vector<int> NichttrivialeTeilersumme(0);
    

    ?



  • out schrieb:

    #include <iostream>
    #include <algorithm>
    #include <map>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	vector<int> container;
    	map<int,unsigned> wie_oft_doppelt; // Versuch mal deine Typen an die menschliche Logik anzupassen. Wenn ich was zähle, lande ich mal nie unter 0.
    	
    	for(int zahl; cin>>zahl;) // Geben wir mal 5 6 8 3 2 7 9 65 3 67 84 3 65 ein
    	{
    		if( find(container.begin(),container.end(),zahl)==container.end() ) // Zahl gibts noch nicht im Container.
    		{
    			container.push_back( zahl ); // Zahl im Container abspeichern
    			continue; // Sprung an Schleifenende
    		}
    		// ansonsten...
    		++wie_oft_doppelt[zahl]; // In der Klammer [] gibst du den Key an. Der zurückgegebene Wert ist dann dein Wert.
    		                        // Wenn du etwas erhöhen willst um 1, nimmst du ++. Der zurückgegebene Wert wird also um 1 erhöht.
    		                        
    		// Ausgabe mal ignoriert
    	}
    }
    

    Schau dir das mal an.

    Warum O(n^2) statt O(n)?

    for(int zahl; cin>>zahl;) {
      if (wie_oft_doppelt[zahl]++ == 0)
        container.push_back(zahl);
      // wie_of_doppelt[zahl]-1 gibt die Anzahl Duplikate, es wäre besser, die Variable
      // umzubenennen. 
    
      // Ausgabe mal ignoriert
    }
    


  • Danke, Danke, das muß ich erst mal durcharbeiten .... melde mich wieder ....

    Du spielst mit dem Kommentar

    // Versuch mal deine Typen an die menschliche Logik anzupassen. Wenn ich was zähle, lande ich mal nie unter 0.

    offenbar darauf an

    vector<int>Container(0);/
    

    Offen gestanden, ich weiss auch nicht, was die 0 da soll.
    Vector meint den Containertyp
    int meint den Variablentyp, hier integer
    Container ist der Name des Teils, bei dem es gerufen wird.

    Was aber meint die Null? Was gehört an diese Stelle?

    Ich vermute, die Zahl zeigt an, wieviel Elemente im Container vom Typ Vector sind, oder?



  • Ne. Meine Kommentare stehen schon in der richtigen Zeile, ich meine also

    map<int,unsigned> wie_oft_doppelt;
    

    Du hattest aber

    map<int,int> wie_oft_doppelt;
    

    Aber man zählt ja von 0 bis ultimo und nicht von -3467 bis ultimo. unsigned ist übrigens dasselbe wie unsigned int , nur eben eine kürzere Schreibweise.

    Die Zahl gibt an, mit wie vielen Elementen dein vector vorbelegt sein soll. 0 ist natürlich sinnlos. Allgemein geb ich da nie eine Zahl an. Also einfach nur vector<int>Container; machen



  • Es endet jetzt mit Status 9 und läuft nicht in den von Dir gepusteten Teil ein, wofür ich Dir aber nicht die Schuld gebe, denn sicherlich habe ich was falsch adaptiert. Das Problem: Bei der Übernahme von so viel auf mal, komm ich mit dem Kapieren nicht hinterher ... Er macht Zählerzahl übrigens nicht durchgängig farbig, sondern nur den Anfangsbuchstaben. Was hat das zu bedeuten?

    Das Cin im for ist mir auch neu (Wunder,Wunder)

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <map>
    using namespace std;
    
    int Spiegelzahl=12;
    int Durchlaufzahl=1;
    int Faktor=2;
    int Zählerzahl=0;
    
    vector<int>Container;//vector<int>NTTS(0); //NichttrivialeTeilersumme
    //map<int,int>Zahlenindex; //erhält jede Zahl einen Zähler
    
    int main(int argc, const char * argv[])
    {
       std::map<int,int>Zahlenindex;
        std::map<int,int>::iterator it;
        map<int,unsigned> wie_oft_doppelt;
    
            for (Zählerzahl=1;Zählerzahl<=10;Zählerzahl++)
            {
                Durchlaufzahl=Durchlaufzahl*Faktor;
                cout<<"for  ZZ="<<Zählerzahl<<" DZ="<<Durchlaufzahl<<" ZI="<<Zahlenindex.find(Durchlaufzahl)->first<<" \n";
    
               if (Durchlaufzahl<=Spiegelzahl)
                {
                Durchlaufzahl=Spiegelzahl-Durchlaufzahl;
                std::cout<<"if   ZZ="<<Zählerzahl<<" DZ="<<Durchlaufzahl<<"\n";
                }
               else
                {
                Durchlaufzahl=Durchlaufzahl-Spiegelzahl;
                cout<<"else ZZ="<<Zählerzahl<<" DZ="<<Durchlaufzahl<<"\n";
                }
                std::cout<<" = "<<Durchlaufzahl<<" ist Durchlaufzahl Runde="<<Zählerzahl<<".\n";
    
                for(int Durchlaufzahl; cin>>Durchlaufzahl;)
                {
                    if( find(Container.begin(),Container.end(),Durchlaufzahl)==Container.end() )
                    {
                        Container.push_back(Durchlaufzahl);
                        continue; // Sprung an Schleifenende
                    }
                    else
                    ++wie_oft_doppelt[Durchlaufzahl]; // In der Klammer [] gibst du den Key an. Der zurückgegebene Wert ist dann dein Wert.
    
                    for(map<int,unsigned>::iterator it=wie_oft_doppelt.begin(); it!=wie_oft_doppelt.end(); ++it)
                    {
                        // Ein map-Eintrag besteht ja aus Key + Value. Weil das zusammengehört werden die beiden in ein std::pair gesteckt. Ein map-Eintrag ist also immer ein std::pair. pair.first = key, pair.second = value
                        cout << it->first << " ist " << it->second << "x zu viel." << '\n';
                    }
                    cout << '\n';
                }
            }   
        for(auto it=Container.begin();it!=Container.end();it++)
        {
            cout<<*it;
            if( it!=Container.end()-1 )
                cout<<" + ";
        }
        std::cout<<"\n";
        return (0);
    }
    


  • out schrieb:

    Die Zahl gibt an, mit wie vielen Elementen dein vector vorbelegt sein soll. 0 ist natürlich sinnlos. Allgemein geb ich da nie eine Zahl an. Also einfach nur vector<int>Container; machen

    ... und die Null bei return? Macht in dem Sinne keinen Sinn ...

    Mich interessiert auch, warum er in Zeile 36 Durchlaufzahl einfärbt, in Zeile 39 aber nicht. Es ist doch jedesmahl eine Variable.



  • Ne, hast ja eh ne Endlosschleife gebaut. Bei mir kompiliert das aber eh nicht, bei dir etwa schon? Da kommt ein ä drin vor. Vielleicht musst du dein Programm mal nochmal von vorne angehen. Jetzt sieht alles zusammengewürfelt aus.



  • Es läuft im Prinzip richtig auch wenn der Browser spinnt

    for(int Durchlaufzahl; cin>>Durchlaufzahl;)
    

    Er sagt dazu: /Users/FOR/Desktop/Xcode/Lassoschleife/Lassoschleife/main.cpp:47:13: Type name requires a specifier or qualifier

    Die Zeile kann ich nicht deuten. Es fehlt mir das 3. Element für den For-Befehl. Der Ausdruck sieht so aus:

    for ZZ=1 DZ=2 ZI=0
    if ZZ=1 DZ=10
    = 10 ist Durchlaufzahl Runde=1.
    I'm not herefor ZZ=2 DZ=20 ZI=0
    else ZZ=2 DZ=8
    = 8 ist Durchlaufzahl Runde=2.
    I'm not herefor ZZ=3 DZ=16 ZI=0
    else ZZ=3 DZ=4
    = 4 ist Durchlaufzahl Runde=3.
    I'm not herefor ZZ=4 DZ=8 ZI=0
    if ZZ=4 DZ=4
    = 4 ist Durchlaufzahl Runde=4.
    I'm not here4 ist 1x zu viel.

    Program ended with exit code: 9


  • Mod

    Häh, welcher Browser? Wovon redest du? Bei Fehlern vollständige Minimalbeispiele liefern.

    Es fehlt mir das 3. Element für den For-Befehl.

    Aber auch nur dir. Man muss nicht alle Elemente der for-Schleife ausfüllen. Wenn man an der Stelle nichts zu tun hat, lässt man es eben weg. Das ist hier so, weil cin >> Durchlaufzahl Aktion und Abbruchbedingung in einem ist. Daher hat man keine sinnvolle Besetzung des dritten for-Elements. Das ist so ähnlich als würde man

    for (int i = 0; ++i < 10; )
    

    schreiben statt

    for (int i = 1; i < 10; ++i)
    

    . Macht beides das gleiche (man beachte die unterschiedlichen Initialisierungswerte!), das Letztere ist aber lesbarer, daher macht man es so, wenn man die Wahl hat. Beim cin >> Durchlaufzahl hat man jedoch keine Wahl, da man sonst den Initialwert von Durchlaufzahl nicht sinnvoll hinbekommt.

    Man kann natürlich auch alle anderen Elemente eines for weglassen. Beispielsweise oft in C gesehen (im alten C kann man Variablen nicht innerhalb eines for definieren!):

    int i = 0;
    for(; i < 10; ++i)
    

    Oder die klassische Endlosschleife:

    for (;;)
    

    (alter Scherz:

    #define ever (;;)
    
    for ever
    {
      // do something
    }
    

    )

    Es läuft im Prinzip richtig

    Ich übersetze mal: Es ist falsch.



  • Warum erhält Durchlaufzahl im For in Zeile 39 nochmal ein int, obwohl es in Zeile 8 schon mit einem int initialisiert ist?

    Browser Xcode 5.1.1.


  • Mod

    Was meint "unterschiedliche Initialisierungswerte" hier?

    i wird einmal mit 0 und einmal mit 1 initialisiert.

    Warum erhält Durchlaufzahl im For in Zeile 47 nochmal ein int, obwohl es in Zeile 16 schon mit einem int initialisiert ist?

    Von welchem Code sprichst du?



  • Arcoth schrieb:

    Von welchem Code sprichst du?

    Danke und Entschuldigung, habe die Zahlen richtiggestellt, ich mein den Code oben ...


  • Mod

    Warum erhält Durchlaufzahl im For in Zeile 39 nochmal ein int, obwohl es in Zeile 8 schon mit einem int initialisiert ist?

    Es wird eine neue Variable mit demselben Namen definiert - Sie verdeckt die globale Variable. Du kannst die globale Variable immer noch durch ::Durchlaufzahl ansprechen.



  • Aha, und warum stecke ich in einer Schleife?


  • Mod

    Aha, und warum stecke ich in einer Schleife?

    Was meinst du? 😕



  • Schleife meint, er steckt in einer Schleife, ohne Ausdruck und rennt und rennt ...

    Das Teil endet mit Exit Code 9, aber nur wenn ich auf Stopp klicke, ansonsten zeigt es running an.

    for ZZ=1 DZ=2 ZI=0
    if ZZ=1 DZ=10
    = 10 ist Durchlaufzahl Runde=1.
    Program ended with exit code: 9

    Das ist der Ausdruck ....



  • for(int Durchlaufzahl; cin>>Durchlaufzahl;)
                { // ...
    

    Du kannst hier Zahlen eingeben bis zur Unendlichkeit. Die Schleife bricht nur ab, wenn du keine Zahl eingibst.



  • out schrieb:

    for(int Durchlaufzahl; cin>>Durchlaufzahl;)
                { // ...
    

    Du kannst hier Zahlen eingeben bis zur Unendlichkeit. Die Schleife bricht nur ab, wenn du keine Zahl eingibst.

    kann da nicht eine Externe Bedingung hin? Die Schleife sollte Abbrechen, wenn die Erste Zahl von Durchlaufzahl, aber von der alten oben, sagen wir 3 x vorkommt ...dazu muß er auf den Map-Befehl zugreifen, denn dort ist abgelegt, wie oft eine jede Zahl aus der Variablen Durchlaufzahl vorkommt.



  • Ich glaube, du willst da gar keine Schleife? Ich weiß gar nicht was das Programm überhaupt machen soll, hab mir das net angeschaut, zu viele komische Variablennamen. Vielleicht schreibst du mal eine detaillierte Aufgabenstellung.



  • out schrieb:

    Ich glaube, du willst da gar keine Schleife? Ich weiß gar nicht was das Programm überhaupt machen soll, hab mir das net angeschaut, zu viele komische Variablennamen. Vielleicht schreibst du mal eine detaillierte Aufgabenstellung.

    Doch, doch, da kommt ne Schleife hin. Was macht das Teil? Es nimmt eine Zahl, multipliziert die mit der Faktorzahl und berechnet den Abstand zur Spiegelzahl, dann dasselbe mit dem Abstand u. s. w. u. s. f. Dabei entstehen jewels x-gliedlange Ketten von Zahlen. Deshalb soll er beim ersten dreimaligen Vorkommen einer Zahl aussteigen.

    Wieso sind meine Variablennamen komisch?


Anmelden zum Antworten