Prüfen, ob Zahlen in der Eingabe mehrfach vorkommen



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



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


  • Mod

    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;
      }
    

  • Mod

    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.


Anmelden zum Antworten