Anzahl der unterschiedlichen Zahlenwerte bestimmen



  • Dein größtes Problem ist, dass der der Code viel zu tief zu verschachtelt ist. Je tiefer du verschachtelst, desto komplizierter wird der Code zu schreiben, zu lesen und zu verstehen.

    Du hast: for -> for -> if -> for -> if. Das sind 5 Verschachtelungen. Das ist zu tief.

    Mach es dir einfacher. Nach der Eingabe:

    // Zähle, wie oft welche Zahl vorkommt
    int zaehle_vorkommen[6] = { 0 };
    for (const auto &zahl: eingabe)
        ++zaehle_vorkommen[zahl-1];
    
    // Nun einfach schauen, welche Zahlen mehr als 0x vorkommen
    int anzahl_verschiedene_zahlen = 0;
    for (const auto &vorkommen: zaehle_vorkommen)
        if (vorkommen > 0) ++anzahl_verschiedene_zahlen;
    
    // fertig.
    std::cout << anzahl_verschiedene_zahlen << " verschiedene Zahlen.\n";
    

    Bemerkung: es ist sehr unschön, im Code so viele Zahlen (wie die 6, die 9) stehen zu haben. Nimm besser Konstanten.



  • @wob
    ja mit der verschachtelun hast du defintiv recht 😃 ich hab es auch schon versucht beide aufgaben getrennt zu machen, aber hatte dasselbe ergebnis..
    leider darf ich schlüsselwörte wie auto, oder pointer.. bzw du hast da glaube ich ne referenz nicht verwenden -.-.....
    ich muss mit dem arbeiten, was bei uns zugelassen ist und das sind nur schleife, if, arrays...
    aber trotzdem danke 😃



  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    auto

    kannst du durch den passenden Datentyp ersetzen.



  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    pointer

    ist kein Schlüsselwort



  • @manni66 habs schlecht formulierte.. also wir dürfen keine pointer wie auto verwenden und auch keine Pointer 😃



  • @wob wenn ich zb ausmiste kommt als ergebnis immer 6 verschiedene Zahlen

    int wert[6] = { 1, 2, 3, 4, 5, 6 };
    int zaehle_vorkommen[6] = { 0 }; // array um tmp_anz zu speichern
    int anz = 0;
    int zaehle_unterschiedliche_zahlen = 0;
    int z = 0;
    int tmp_anz = 1;

    for (int x=0; x < 6; x++)
    {
    	
    	for (int y = 0; y < 9; y++)
    	{
    		
    		if (eingabe[y] == wert[x]) // prüfe, wie oft eine Zahl vorkommt
    		{
    			anz++;
    		}
    		if (anz > 0) // beginne mit der prüfung, wie viele unterschiedliche Zahlen vorkommen 
    		{
    			tmp_anz++; // PROBLEM: wird zwar um eins erhöht, aber der wert wird nicht gespeichert==> dadurch ist tmp_anz immer 0
    		}
    	}
    	cout << wert[x] << " kommt : " << anz << " Mal vor. " << endl;
    	anz = 0;
    }
    
    
    for (; z < 6; z++)
    {
    	if (zaehle_vorkommen
    		[tmp_anz] != 0)
    	{
    		zaehle_unterschiedliche_zahlen++;
    	}
    }
    cout << " Es gibt: " << zaehle_unterschiedliche_zahlen << " unterschiedliche Zahlen. " << endl;


  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    keine pointer wie auto

    Auto ist kein Pointer! Auto ist ein Platzhalter für einen konkreten Datentyp. Den kan man immer einsetzten:

    const int a = 1;
    auto b = a;
    int b = a; // int statt auto; 
    


  • @manni66 ich weiß, dass es sich um zwei verschiedene Dinge handelt.. ich habe nur aufgezählt, was ich nicht verwenden darf 🙂



  • a) du hast immer noch 2 verschachtelte Schleifen. Das brauchst du nicht, siehe mein Beispiel.
    b) ersetze in meinem Beispiel einfach "auto" durch "int". Meinetwegen kannst du auch "const auto &" durch "int" ersetzen. Dann hast du weder Referenzen noch auto.



  • @wob ich verstehe deinen code leider gar nicht.. was beduetet das : ? und schleifen haben, so wie ich es gelernt haben immer eine bedingung, die ich bei dir leider nicht sehen kann..
    ich glaube dir, dass dein weg richtig ist, aber so zu formulieren kenn ich überhaupt nicht 😃 aber ich versuch mal weiter auf meine art zu entschachteln



  • @wob ich hab jetzt endlich den fehler gefunden 😃 so klappt es
    Beim debuggen ist mir aufgefallen, dass ja tmp_anz bereits die korrekte anzahl darstellt also brauche ich gar keine neue schleife

    besten danke an alle 🙂

    //anzahl der eingaben
    int wert[6] = { 1, 2, 3, 4, 5, 6 }; 
    int zaehle_vorkommen[6] = { 0 }; // array um tmp_anz zu speichern
    int anz = 0;
    int zaehle_unterschiedliche_zahlen = 0;
    int tmp_anz = 0;
    
    for (int x=0; x < 6; x++)
    {
    	
    	for (int y = 0; y < 9; y++)
    	{
    		
    		if (eingabe[y] == wert[x]) // prüfe, wie oft eine Zahl vorkommt
    		{
    			anz++;
    		}
    	}
    
    	if (anz > 0) // beginne mit der prüfung, wie viele unterschiedliche Zahlen vorkommen 
    	{
    		tmp_anz++; // PROBLEM: wird zwar um eins erhöht, aber der wert wird nicht gespeichert==> dadurch ist tmp_anz immer 0
    	}
    
    	cout << wert[x] << " kommt : " << anz << " Mal vor. " << endl;
    	anz = 0;
    }
    
    
    cout << " Es gibt: " << tmp_anz << " unterschiedliche Zahlen. " << endl;
    
    
    system("PAUSE");
    return 0;
    

    }


  • Mod

    @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    so klappt es

    Da habe ich doch erhebliche Zweifel. Du solltest deine Testfälle überdenken.



  • @SeppJ ich hab jetzt einige durchgänge gemacht.. also es funktioniert.
    was genau meinst du denn?


  • Mod

    Ahh, du schließt schon bei deiner Eingabe aus, dass überhaupt Zahlen außerhalb von 1-6 vorkommen. Das sieht man natürlich nicht, wenn man nur deine neue Lösung sieht, da das nur aus einem Beitrag 6 Bildschirmseiten weiter oben hervor geht. Unter dieser Voraussetzung passt es. Ist aber etwas ungewöhnlich, solche starken Annahmen über einen ganz anderen Teil eines Programms zu machen. Das macht ein Programm schwer zu lesen und zu verändern, wenn alles so eng verzahnt ist.



  • @SeppJ ja musste einiges immer wieder berichtigen XD

    ja ich weiß, dass es bestimmt nicht die beste lösung ist, aber mir ist es wichtig, dass es ein lösungsweg ist, den ich selbst gut nachvollziehen kann 😃 mein prof muss damit leben XD

    vielen danke nochmal an all 🙂



  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    @wob ich verstehe deinen code leider gar nicht.. was beduetet das : ? und schleifen haben, so wie ich es gelernt haben immer eine bedingung, die ich bei dir leider nicht sehen kann..

    Die häufigste Schleife ist die über ALLE Elemente eines Containers. Nichts anderes macht der :. Die Schleife loopt automatisch von begin(container) bis end(container).

    for (int wert : array) { verarbeite(wert); } bedeutet also: für jeden Wert aus dem Array mach was ...

    Das ist eben viel einfacher zu lesen als
    for (size_t index = 0; index < std::size(array); ++index) { int wert = array[index]; verarbeite(wert); }

    Siehe z.B. hier: https://en.cppreference.com/w/cpp/language/range-for



  • @wob danke für die erklärung 🙂
    leider muss ich mich an denen in der vorlesungen besprochenen methoden halten 😞

    ich denke es gibt sehr viele einfachere arten, aber bin leider dazu gezwungen mich daran zu halten 😕


  • Mod

    @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    ich denke es gibt sehr viele einfachere arten, aber bin leider dazu gezwungen mich daran zu halten 😕

    Bist du Zwangsarbeiter in einem Gulag? Du bist zu gar nichts gezwungen, und ganz bestimmt nicht dazu, dir nicht besseres Wissen im Eigengang anzueignen.


Anmelden zum Antworten