Anzahl der unterschiedlichen Zahlenwerte bestimmen
-
@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 fehleraber 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 rechtich 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 nichtaber 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 schleifebesten 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;
}
-
@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?
-
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