Prüfen, ob Zahlen in der Eingabe mehrfach vorkommen



  • Hallo:)
    Ich sitzte vor einer Aufgabe und komme nicht weiter. Ich bin absoluter Anfänger in Informtik.
    Ich soll in einem array mit 10 Einträgen überprüfen, wie oft die Zahlen drin vorkommen.Bsp: Eingabe:5567594227 Ausgabe: 3mal 5, 2mal 7, 2mal 2

    Mein Code sieht bisher so aus aber so funktioniert das nicht. Vor allem weiß ich nicht, wie ich es hinbekomme, dass er nicht Zahlen doppelt Zählt (also a[3]==a[3] zum beispiel)

    Vielen Dank für die Hilfe!

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a[10];
    
        for(int i=0; i<10; i++)
        {
            cout<<"Bitte ganze Zahl eingeben"<<endl;
            cin>> a[i];
        }
    
        int anz=0;
    
        for(int i=0; i<10; i++)
        {
            for(int j=1; i<9; i++)
            {
                if(a[i]==a[j]) anz++;
            }
    
            cout<<"Die Zahl "<< a[i]<<" kommt "<< anz<<" mal im array vor."<<endl;
            anz=0;
    
        }
    
        return 0;
    
    }
    


  • Warum läuft j von 1 bis 9?
    Geht es tatsächlich um ganze Zahlen oder um die Ziffern 0-9?



  • ich dachte, damit er nicht den ersten eintrag mit dem ersten eintrag vergleicht. deswegen soll er schon bei 1 anfangen.
    Es geht um ganze Zahlen.


  • Mod

    Irisppp_) schrieb:

    ich dachte, damit er nicht den ersten eintrag mit dem ersten eintrag vergleicht. deswegen soll er schon bei 1 anfangen.

    Und wenn im nächsten Durchgang i = 1 ist? Vielleicht gibt es ein besseres Kriterium, wie man sicher stellen kann, dass j ungleich i ist...
    Aber: Wieso sollte man überhaupt? Die Zahl a[i] kommt schließlich mindestens einmal vor und sollte daher auch gezählt werden.

    Dein anz sollte vielleicht auch für jede neue Zahl wieder bei 0 anfangen.
    edit: Ok, du setzt es doch auf 0 zurück. Aber ungewöhnlicherweise nachdem du fertig bist, nicht bevor du anfängst, daher habe ich es nicht gesehen. Normalerweise schreibt man es andersrum, so dass man den Code einfach von oben nach unten lesen kann und dabei an jeder Stelle weiß, welchen Wert etwas hat.

    Bevor du dich aber zu sehr in deinen Ansatz vertiefst, noch ein Hinweis auf etwas, dass du bisher nicht bedacht hast und eventuell einen anderen Ansatz erfordert: Angenommen, a enthielte die Zahlen [0,1,1,0,0], dann erhieltest du als Ausgabe so etwas wie:

    Die Zahl 0 kommt 3x vor.
    Die Zahl 1 kommt 2x vor.
    Die Zahl 1 kommt 2x vor.
    Die Zahl 0 kommt 3x vor.
    Die Zahl 0 kommt 3x vor.
    

    Vermutlich gewünscht wäre doch wohl eher so etwas wie:

    Die Zahl 0 kommt 3x vor.
    Die Zahl 1 kommt 2x vor.
    

    Also jede Zahl nur einmal.



  • ja das ist eben mein Problem... Man müsste dem Programm irgendwie sagen, dass er das dann nicht vergleichen darf
    Muss ich vor dem if dann nochmal ein if(i!=j) hinschreiben?


  • Mod

    Irisppp_) schrieb:

    ja das ist eben mein Problem... Man müsste dem Programm irgendwie sagen, dass er das dann nicht vergleichen darf
    Muss ich vor dem if dann nochmal ein if(i!=j) hinschreiben?

    Ich wiederhole die Gegenfrage: Wieso möchtest du die Zahl selbst nicht zählen?



  • Stimmt, du hast Recht. Da habe ich wohl einen Denkfehler gehabt.



  • Vielleicht gibt es ja eine Eigenschaft einer Zahlensequenz, die es einem leicht macht zu wissen, ob man eine Zahl schon gesehen hat.

    Vielleicht gibt es ja eine Datenstruktur, mit der man sich Informationen über Zahlen geschickt merken kann.



  • Hallo Irisppp_),

    du musst garnicht jedes Element mit anderen Elementen im Array vergleichen. In deinem Fall reicht es aus, zu zählen wie oft [i] in a vorkommt.

    for(int i = 0; i < 10; i++)
        {
        	for(int ii = 0; ii < 10; ii++)
        	{
        		if(a[ii] == i)
        		  anz++;
        	}
        	if(anz > 0)
        		cout << "Die Zahl " << i << " kommt " << anz << "x vor." << endl;
        	anz = 0;
        }
    

    Siehe ideone


  • Mod

    Das funktioniert aber nur für Zahlen zwischen 0 und 9.
    http://ideone.com/MXonrP



  • Das ist richtig, aber auf Basis der Aufgabenstellung gehe ich davon aus, das auch nur die berücksichtigt werden sollen.



  • Ne, leider sollen schon alle Zahlen berücksichtigt werden. Aber sonst wäre das natürlich eine schöne Lösung:)



  • Eine lösung wäre doch, das Feld auf -1 zu setzten, nachdem es untersucht wurde. Aber das setzt wiederum voraus, dass ich nur positive Zahlen einsetzten darf.



  • Achte auf mannis ersten Tipp. Was kannst du mit der Zahlensequenz vorher machen, um Mehrfachauszählungen gleicher Zahlen zu vermeiden?


  • Mod

    Es gibt einfache Lösungen, die mit allen Arten von Zahlen (und sogar mit so ziemlich allen Arten von Werten überhaupt) in beliebiger Anzahl zurecht kommen, ganz ohne einen hohen Aufwand zu betreiben. Du hast in deinem Informatikstudium doch sicherlich ein paar Algorithmen und Datenstrukturen kennen gelernt. Da sind sicherlich einige Ansätze dabei, die hier weiter helfen könnten.

    Oft sehr hilfreich ist, wenn du das Problem einfach mal selber löst mit Stift und Papier: Wie gehst du vor? Wie zählst du die Werte? Wie vermeidest du doppelte Aussagen?



  • ok, ich vermute jetzt, dass ich die Zeichen(Zahlen) erstmal sortieren muss und kann dann nachher sozusagen ausgeben, nach wie vielen Einträgen ein neues Zeichen kommt.
    Ist das der richtige Ansatz?


  • Mod

    Es ist ein möglicher Ansatz und wird zum Ziel führen, aber Sortieren ist selten eine gute Idee, außer wenn man wirklich etwas sortiert haben möchte. Würdest du mit Zettel und Stift die Daten erst sortieren? Doch wohl eher nicht, denn das ist ziemlich viel Arbeit, die gar nicht nötig ist; das gilt sowohl für dich, als auch für einen Computer. Wie machst du es stattdessen?



  • ich gehe die Zahlenfolge für jede Zahl einmal durch und schreibe danach auf wie oft sie drin vorkam.


  • Mod

    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?


Anmelden zum Antworten