Anzahl der unterschiedlichen Zahlenwerte bestimmen



  • Hi, ich hähge jetzt so lange an dieser aufgabe und komme einfach nicht weiter. Es sollen Zahlen 1-9 zwischen 1-6 eingegeben werden. Anschließend soll ausgegeben werden, wie oft die Zahlen 1-6 vorkommen (erledigt) nun soll aber auch noch angegeben werden, wie viele unterschiedliche Zahlen es gibt.
    Das Problem ist, dass die Variable tmp_anz (welche immer eins hochzählen soll, wenn die Anzahl größer 0 ist) auf Null bleibt, obwohl die anzahl steigt. Was habe ich da falsch gemacht? Ab Zeile 37 läuft etwas flasch

    int main()
    {
    int eingabe[9] = { 0 };
    int i = 0;

    // zahleneingabe prüfen
    for (; i < 9; i++)
    {
    	do
    	{
    		cout << "Bitte geben Sie die " << i + 1 << ". Zahl ein: " << endl;
    		cin >> eingabe[i];
    
    	} while (eingabe[i] < 1 || eingabe[i]>6);
    }
    //zahlen ausgeben
    int h = 0;
    for (; h < 9; h++)
    {
    	cout << h + 1 << ". Zahl lautet: " << eingabe[h] << endl;
    }
    
    //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 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
    			for (; z < 6; z++)
    			{
    				if (zaehle_vorkommen[tmp_anz] != 0)
    				{
    					zaehle_unterschiedliche_zahlen++;
    				}
    			}
    		}
    	}
    	
    
    
    	cout << wert[x] << " kommt : " << anz << " Mal vor. " << endl;
    
    	anz = 0;
    }
    
    cout << " Es gibt: " << zaehle_unterschiedliche_zahlen << " unterschiedliche Zahlen. " << endl;
    
    
    system("PAUSE");
    return 0;
    

    }



  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

       if (anz > 0) // beginne mit der prüfung, wie viele unterschiedliche Zahlen vorkommen 
       {
           int tmp_anz = 0; //  1 
           tmp_anz++; // PROBLEM: wird zwar um eins erhöht, aber der wert wird nicht gespeichert==> dadurch ist tmp_anz immer 0
           for (; z < 6; z++)
           {
               if (zaehle_vorkommen[tmp_anz] != 0)
               {
                   zaehle_unterschiedliche_zahlen++;
               }
           }
       } // 2 
    

    tmp_anz wird in der ersten markierten Zeile erzeugt (und dabei mit 0 initialisiert), und beim Verlassen des Scopes (2. markierte Zeile) wieder zerstört. Und das nächste mal wenn er wieder diesen Scope betritt wird tmp_anz wieder neu erzeugt, wieder mit 0 initialisiert etc.



  • Dieser Beitrag wurde gelöscht!


  • @mmm_1482_ sagte in Anzahl der unterschiedlichen Zahlenwerte bestimmen:

    @hustbaer
    ja die variable hab ich schon so oft umgesetzt... selbst wenn ich sie außerhalb der schleifen definiere, kommt immernoch 0 dabei raus.

    Dann machst du noch was anderes falsch.

    Wo sollte ich sie am besten setzen?

    z.B. in Zeile 23



  • @hustbaer hab ich auch schon gemacht.. leider kommt immernoch 0 raus 😞
    ich denke er nimmt dann die unveränderte Variable tmp_anzahl, die ich in zeile 23 zb auf 0 setze.. ander kann ich es mir nicht erklären



  • @hustbaer kann es sein, dass der Fehler in der if-Bedingung Zeile 41 liegt?



  • Nein. Der Fehler ist dass der ganze Code ab Zeile 17 Quatsch ist.



  • @hustbaer
    ab 17 hab ich sozusagen zwei aufgaben kompremiert.. wenn ich das durch meinen kopf laufen lasse sehe ich da keinen fehler 😃 aber was weiß mein kopf schon 😃



  • 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.


Anmelden zum Antworten