Prüfen, ob Zahlen in der Eingabe mehrfach vorkommen
-
Irisppp_) schrieb:
ich gehe die Zahlenfolge für jede Zahl einmal durch und schreibe danach auf wie oft sie drin vorkam.
Woher weißt du, ob du eine Zahl schon einmal hattest?
-
indem ich sie vergleiche mit den anderen Zahlen?
-
Ein Such-Stichwort, was dich weiter bringen sollte, wäre: "Histogram(m)".
-
SeppJ schrieb:
Irisppp_) schrieb:
ich gehe die Zahlenfolge für jede Zahl einmal durch und schreibe danach auf wie oft sie drin vorkam.
Woher weißt du, ob du eine Zahl schon einmal hattest?
Ich würde mir die Zahl notieren und bei erneutem Vorkommen einen kleinen Strich dahinter machen...
-
temitemp schrieb:
SeppJ schrieb:
Irisppp_) schrieb:
ich gehe die Zahlenfolge für jede Zahl einmal durch und schreibe danach auf wie oft sie drin vorkam.
Woher weißt du, ob du eine Zahl schon einmal hattest?
Ich würde mir die Zahl notieren und bei erneutem Vorkommen einen kleinen Strich dahinter machen...
Und jetzt als Computerprogramm...
-
Also ich würde ja mal die std::map vorschlagen. Als Schlüssel die eingegebene Zahl, als Wert die Häufigkeit.
Ich überlege gerade, was SeppJ für eine Idee hat. erase-remove der Zahl vielleicht? (Irisppp_: such mal nach "erase-remove idiom").
-
hm diese ganzen Begriffe sagen mir noch nichts.
Aber ich hab jetzt mal versucht das ganze mit einem struct zu lösen. Es funktioniert soweit aber ich weiß nicht, ob das die einfachste Lösung ist.#include <iostream> using namespace std; struct feld { int wert[10]={0}; int anz[10]={0}; }; int main() { int a[10]; feld felder; for(int i=0; i<10; i++) { cout<<"Bitte Zahl eingeben"<<endl; cin>> a[i]; } for(int i=0; i<10;i++) { int k=0; for(int j=0; j<i;j++) { if(felder.wert[j]==a[i]) { felder.anz[j]++; k=1; break; } } if (k==0) { felder.wert[i]=a[i]; felder.anz[i]=1; } } for(int i=0; i<10; i++) { if(felder.anz[i]!=0) { cout<<felder.wert[i]<<" kommt "<<felder.anz[i]<<" vor."<<endl; } } return 0; }
-
wob schrieb:
Ich überlege gerade, was SeppJ für eine Idee hat.
Alle
Hauptsache er kommt darauf, dass man sich auch Zwischenergebnisse merken kann, in welcher Form sei mir egal.
-
Also, schon mal schön, dass du ein funktionierendes Programm hinbekommen hast. Es gibt einige Dinge, die nicht schön sind:
Du hast an sehr vielen Stellen im Programm sogenannte "magische Zahlen" stehen, also irgendwelche konstanten Werte, wo man nicht sofort sieht, wo sie herkommen. In deinem Falle die 10. Wenn du nun mal 11 oder nur 9 Zahlen eingeben möchtest, musst du an aktuell 6 Stellen Änderungen vornehmen. Gut, im Editor geht suchen+ersetzen, aber stell dir vor, dass du auch noch eine 10 in anderem Zusammenhang nutzt. Dann wird es aufwendig, die richtigen 10en zu finden. Daher: nimm eine Variable, in der du die 10 speicherst. Dann musst du bei Änderungen nur an einer Stelle was ändern.
Dann ist mir nicht ganz klar, wozu du ein struct hier hast. Was tun all deine Variablen? Der Code ist auch merkwürdig eingerückt. Insbesondere das
if (k==0)
nebst Block ist zu weit rechts. Und ich persönlich finde den Stil, die Klammern halb einzurücken, schwer lesbar.Meine Alternative wäre:
#include <iostream> #include <map> int main() { std::map<int, int> counts; std::cout << "Bitte beliebig viele Zahlen eingeben, mit einem Buchstaben " "oder dem Streamende-Zeichen beenden\n"; int val; while (std::cin >> val) ++counts[val]; for (const auto &p : counts) { std::cout << "Zahl " << p.first << " wurde " << p.second << " mal eingegeben.\n"; } }
-
Inwiefern ist eine std::map zu benutzen jetzt besser als einfach das Array zu sortieren?
-