Prüfen, ob Zahlen in der Eingabe mehrfach vorkommen



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



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




Anmelden zum Antworten