Laden...

Den häufigsten Wert ermitteln

Erstellt von Pommel vor 15 Jahren Letzter Beitrag vor 15 Jahren 9.347 Views
P
Pommel Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren
Den häufigsten Wert ermitteln

Hey Leute ich habe ein kleines Problem,
unzwar muss ich ein Programm schreiben, wo man in 5 Textboxen Zahlen reinschreibt.

Dann weise ich diese Zahlen z.B. den Variablen a,b,c,d,e zu.
Jetzt soll ausgegeben werden, welche Zahl am häufigsten eingegeben wurde.

Bsp.: a = 4 | b = 5 | c = 4 | d = 4 | e = 9
Die Zahl 4 kommt am häufigsten vor (3x)

Wenn jetzt z.B. a und b = 5 und c und d = 6 sind müsste natürlich ausgegeben werden, das 5 und 6 am häufigsten vorkommen.

Ich habe mich da länger mit beschäftigt, aber habe nichts sinnvolles rausgefunden und es geht doch bestimmt einfacher als mit 100ten von IF-Abfragen für jede denkbare Kombination der 5 Werte, oder???

Danke schonmal im Vorraus 😃

3.971 Beiträge seit 2006
vor 15 Jahren

Verwende ein Array, wo du die Anzahl entsprechend hochzählst. Anschließend das ganze mit Array.Sort sortieren und fertig.

wenn es mal mehr als 5 Elemente werden oder die Anzahl erst zur Laufzeit feststeht, verwende statt Array List<T>.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Gelöschter Account
vor 15 Jahren

ich würde ein dictionary nehmen und als key den wert und als value den count benutzen.

3.003 Beiträge seit 2006
vor 15 Jahren

Ich würde Linq nehmen.


List<int> zahlen = GetZahlen(); //fülle dein Array
var check = from zahl in zahlen 
                  group zahl by zahl into zahlengruppe
                  select new { Count = zahlengruppe.Count(), Value = zahlengruppe.Key };

int result = check.OrderByDescending(p => p.Count).FirstOrDefault();

Fertig.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
574 Beiträge seit 2008
vor 15 Jahren

ich würd anfangen selbst zu denken, oder die mitschüler zu fragen, schließlich kann sichs da nur um eine Übungsaufgabe der Schule handeln

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo tkrasinger,

die Formulierung der Frage zeigt doch, dass Pommel sehr wohl selber darüber nachgedacht hat. Davon abgesehen ist es doch seine Entscheidung, ob er seine Mitschüler oder uns fragt.

Du hast zwar recht, dass es nicht darum gehen kann, anderer Leute Hausaufgaben zu machen, aber so wie die Frage gestellt ist, geht es hier nur darum Anhaltspunkt für eine eigene Lösung zu bekommen. Das ist vollkommen ok.

Hallo Pommel,

mit einem Dictionary geht es sicher am einfachsten und gleichzeitig übersichtlichsten. Siehe dazu auch die Worthäufigkeitszählung in [Artikel] Grundlegendes zu Hashtable/Dictionary.

herbivore

T
574 Beiträge seit 2008
vor 15 Jahren

... geht es hier nur darum Anhaltspunkt für eine eigene Lösung zu bekommen

ich würde ein dictionary nehmen und als key den wert und als value den count benutzen.

@Herbivore: Naja, wie mans sieht. Und bei der Antwort von Jack ist die Lösung praktisch vorgegeben

Gelöschter Account
vor 15 Jahren

nein ^^ bei latino´s lösung ist die antwort vorgegeben 😃

auch wenn es generell nicht erwünscht ist, das hier hausaufgaben gemacht werden, so steht es dennoch den leuten frei, eine geneuere oder auch eine ungenauere lösung zu posten.

zudem ist hier kein konkreter anhaltspunkt für eine hausaufgabe zu finden , sondern nur ein indiz.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo tkrasinger,

erstmal sehe ich das nicht so wie du. Bis zu einer Lösung ist der Weg für einen Anfänger noch weit, zumal ja JAck30lena noch überhaupt nichts dazu gesagt hat, wie man aus den Informationen im Dictionary zur Lösung kommt. Er hat überhaupt nur was zu der Datenstruktur, aber nichts zum Algorithmus gesagt. Aber selbst wenn die Antwort zu konkret wäre, also konkreter als gefragt, kannst du das ja nicht dem Fragesteller vorwerfen, so wie du es getan hast.

herbivore

T
574 Beiträge seit 2008
vor 15 Jahren

Ok, ich gebs auf. Eigentlich meinte ich nur, das man für eine so einfache Aufgabe normalerweise keine Hilfe in Anspruch nehmen sollte. Schließlich ist das Ziel einer solchen Aufgabe ja den Lösungsweg zu finden.
Bei verzwickten Problem kann man nachfragen, aber das wär in dem Beispiel wohl nur der Fall, wenn er keine Arrays und den Namespace System.Collection (und darunterliegende) nicht verwenden darf. Dann würde man wohl länger für ne Lösung brauchen.

Und wenn das keine Hausaufgabe ist, möcht ich das reale Programm sehen, in dem man sowas braucht.

Edit: Ich hätte es wenigsten so formuliert: Wie bekomm ich aus einer Reihe von Werten heraus, welcher Wert am häufigsten verwendet wurde?

Dann hätte auch ich eine Lösung angeboten, weil ich nicht davon ausgegangen wäre, dass es sich um eine Aufgabe handelt.

0
767 Beiträge seit 2005
vor 15 Jahren

Amazon: Welches Buch wurde am häufigsten verkauft?

Werte dabei sind die Ids der Bücher (ob das Int, Guid, ISBN oder sonst was) ist, spielt für das beispiel keine Rolle.

loop:
btst #6,$bfe001
bne.s loop
rts

C
401 Beiträge seit 2007
vor 15 Jahren

Amazon: Welches Buch wurde am häufigsten verkauft?

Werte dabei sind die Ids der Bücher (ob das Int, Guid, ISBN oder sonst was) ist, spielt für das beispiel keine Rolle.){gray}

Naja... dafür würde man in so einem Fall wohl eher SQL benutzen. Bei Amazon werden die Verkaufszahlen sicher nicht in Textboxen gespeichert.^^

49.485 Beiträge seit 2005
vor 15 Jahren

Bitte lasst es jetzt mal gut sein.

P
Pommel Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren

Ok für alle die hier geschrieben haben, dass ich mich selber damit beschäftigen soll, glaubt mir ich habe mir mehr als genug Gedanken gemacht und gegoogelt und sonst was. Ich komme einfach nicht weiter also bitte ich hier um Hilfe und dumme Kommentare, dass ich selber nachdenken soll, kann man sich wirklich sparen!!!

Außerdem muss ich noch dazu sagen, dass ich noch nicht allzu viel Ahnung von C# habe.

So, vielleicht hilft euch das weiter, meine bisherige Vorgehensweise nachzuvollziehen.

Einer meiner ersten Lösungsansätze war folgender:


            int[] zahlen = new int[4];
            int[] Werte = new int[4];

            Werte[0] = Convert.ToInt32(txtWert1.Text);
            Werte[1] = Convert.ToInt32(txtWert2.Text);
            Werte[2] = Convert.ToInt32(txtWert3.Text);
            Werte[3] = Convert.ToInt32(txtWert4.Text);
      

            for (int i = 0; i <= 3; i++)
            {
                if (Werte[0] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }
                if (Werte[1] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }
                if (Werte[2] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }
                if (Werte[3] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }

Gibt man jetzt z.B. die Zahlen 2,3,3,2 ein, dann bekomme ich ja nur raus:

2: 2x
3: 2x
3: 2x
2: 2x

und das ist der Punkt wo ich eine Denkblockade habe um weiter zu machen.

Wie schaffe ich es jetzt auszugeben, dass der Wert 2 und 3 am häufigsten vorkommt?

Oder sollte ich ganz anders vorgehen?

Achja und nochwas zu dem Code von LaTino (Danke übrigens an dieser Stelle für die schnelle Hilfe) ich komme damit nicht wirklich klar...

List<int> zahlen = GetZahlen(); //fülle dein Array
var check = from zahl in zahlen
                  group zahl by zahl into zahlengruppe
                  select new { Count = zahlengruppe.Count(), Value = zahlengruppe.Key };

int result = check.OrderByDescending(p => p.Count).FirstOrDefault();

Wenn ich "List<int> zahlen = GetZahlen();" schreibe bekomme ich nur die fehlermeldung "Der Name "GetZahlen" ist im aktuellen Kontext nicht vorhanden."
Also habe ich da garnicht erst weiter gemacht....

Gelöschter Account
vor 15 Jahren

Wenn ich "List<int> zahlen = GetZahlen();" schreibe bekomme ich nur die fehlermeldung "Der Name "GetZahlen" ist im aktuellen Kontext nicht vorhanden."
Also habe ich da garnicht erst weiter gemacht....

das war ja auch nur pseudocode....

dir fehlen noch viele grundlagen.
schau dir doch mal diese 2 onlinbücher an: 🛈 📗

95 Beiträge seit 2008
vor 15 Jahren

Hallo Pommel

Ich sehe dein Problem nicht ganz...
Wenn du die Eingaben mit dem Text_Changed Event abfängst und dann mit einer If- Abfrage nach den 5 Zahlen durchläufst und den Zähler der eingegeben Zahl dann um eins erhöhst. Das sollte doch kein Problem sein, oder habe ich die Frage falsch verstanden?

Gruss Thomas

Gespräch zweier Informatiker:
"Wie ist denn das Wetter bei euch?"
"Caps Lock."
"Hä?"
"Na ja, Shift ohne Ende!"

T
574 Beiträge seit 2008
vor 15 Jahren

Also Pommel um bei einer Lösung zu bleiben, die deinen derzeitigen Wissensstand abdeckt (offensichtlich hast du Listen noch nicht gelernt):
Du könntest diese Arrays die du jetzt hast 2 mal durchgehen:

  1. von 2. Element bis zum letzten und immer schauen, ob das element wo du gerade bist, eine höhere Anzahl gespeichert hat, als das vorher, wenn ja, kannst du das lassen, wenn nicht, setzt du's auf -1. Den letzten gültigen Wert speicherst du dir, und gehst zum nächsten Element. Dann hast du mal bis zum Ende den höchsten Wert gefunden. Jetzt musst du
  2. deine Arrays rückwärts durchgehen und praktisch wieder das selbe machen also schauen ob der Wert eins weiter hinten im array größer ist als der wo du gerade bist, wenn er kleiner ist, wieder auf -1 setzen, sonst lassen (was eigentlich nicht mehr sein kann).

Zum Schluss hast du immer noch deine Arrays aber nur mehr dort wo nicht -1 drinnen steht hast du dein Ergebnis. Wenn du kein Ergebnis hast, weil alle auf -1 sind, ist das ergebnis der erste Wert und die Anzahl ist die Anzahl der Textboxen.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Pommel,

Ich komme einfach nicht weiter also bitte ich hier um Hilfe

die hast du bereits weiter oben erhalten.

Außerdem muss ich noch dazu sagen, dass ich noch nicht allzu viel Ahnung von C# habe.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Du weißt ja, dass ich oben für dich eingetreten bin. Nun muss ich aber leider auch dich rügen. Die Hilfestellung von oben, war durchaus geeignet, deine Denkblockade zu lösen. Deine Nachfrage zeigt jedoch, dass es nicht die Denkblockade, sondern wohl doch das Fehlen von hier vorausgesetzten Grundlagen ist, das dein Vorankommen behindert. Diese musst du dir bitte jedoch selbst aneignen. Wir können es nicht leisten, dass zu kompensieren.

herbivore

P
Pommel Themenstarter:in
3 Beiträge seit 2009
vor 15 Jahren

So ich bin nach Stunden auf eine Lösung gekommen! Ich habe 2 Arrays mit 2 FOR Schleifen benutzt:



        //Die Variablen werden mit den übergebenen Werten des Hauptprogramms gefüllt
        public static int HW(int a, int b, int c, int d, int f)
        {
            //Es werden 2 Arrays erzeugt
            int[] zahlen = new int[5];
            int[] Werte = new int[5];

            //Die Felder des Arrays "Werte" werden mit den übergebenen Werten des Hauptprogramms gefüllt
            Werte[0] = a;
            Werte[1] = b;
            Werte[2] = c;
            Werte[3] = d;
            Werte[4] = f;

            //Die FOR-Schleife läuft 5 mal durch
            for (int i = 0; i <= 4; i++)
            {
                //Wenn das erste Feld des Arrays = "i"ten Feld des Arrays ist...
                if (Werte[0] == Werte[i])
                {
                    //Wird das "i"te Feld des Arrays "zahlen" um 1 erhöht. 
                    zahlen[i] = zahlen[i] + 1;
                }

                //Wenn das zweite Feld des Arrays = "i"ten Feld des Arrays ist...
                if (Werte[1] == Werte[i])
                {
                    //Wird das "i"te Feld des Arrays "zahlen" um 1 erhöht. 
                    zahlen[i] = zahlen[i] + 1;
                }

                //...
                if (Werte[2] == Werte[i])
                {
                    //...
                    zahlen[i] = zahlen[i] + 1;
                }

                if (Werte[3] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }

                if (Werte[4] == Werte[i])
                {
                    zahlen[i] = zahlen[i] + 1;
                }
            }
            //y wird als Variable deklariert,in der immer der aktuell höchste Wert gespeichert wird
            int y = 0;

            //Die FOR-Schleife läuft 5 mal durch
            for (int i = 0; i <= 4; i++)
            {
                //Wenn das erste Feld des Arrays zahlen größer als das "i"te Feld des selben Arrays ist...
                if (zahlen[0] > zahlen[i])
                {
                    //Ist dies der momentan höchste Wert, und somit wird der Wert des ersten Feldes
                    //aus dem Array "Werte" in "y" gespeichert.
                    y = Werte[0];
                }
                //...
                if (zahlen[1] > zahlen[i])
                {
                    //...
                    y = Werte[1];
                }

                if (zahlen[2] > zahlen[i])
                {
                    y = Werte[2];
                }

                if (zahlen[3] > zahlen[i])
                {
                    y = Werte[3];
                }

                if (zahlen[4] > zahlen[i])
                {
                    y = Werte[4];
                }

                //Wenn alle Werte die gleich häufige Anzahl haben...
                if (zahlen[0] == zahlen[1] && zahlen[1] == zahlen[2] && zahlen[2] == zahlen[3] && zahlen[3] == zahlen[4])
                {
                    //...und alle nur einmal vorkommen...
                    if (zahlen[0] == 1 && zahlen[1] == 1 && zahlen[2] == 1 && zahlen[3] == 1)
                    {
                        //...kommt keine der Zahlen mehrfach vor.
                        //(Die Zahl 912378347 signalisiert dann im Hauptprogramm, dass alle Zahlen unterschiedlich sind)
                        y = 912378347;
                    }

                    //...und alle mehr als einmal vorkommen...
                    else
                    {
                        //...ist Wert[0-4] der Häufigste Wert (alle gleich)
                        y = Werte[1];
                    }
                }


Gäbe es jetzt noch eine elegantere Methode die Aufgabe zu Lösen? Weil ich meine ein bisschen umständlich ist es ja schon.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Pommel,

Gäbe es jetzt noch eine elegantere Methode die Aufgabe zu Lösen?

ja, mit einem Dictionary, aber das wurde ja schon oben gesagt.

herbivore