Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Häufigkeitsdiagram
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

Häufigkeitsdiagram

beantworten | zitieren | melden

Hallo zusammen,

Bin neu hier. Vielleicht könnt ihr mir helfen.
Ich versuche in WinForms ein Häufigkeitsdiagramm zu implementieren.
Und Zwar:
Auf der Benutzeroberfläche: Textbox und Chart (Balkendiagramm)
In die Textbox gebe ich Zahlen ein (1 - 5) und das Diagramm soll zeigen wie oft die Zahlen von 1- 5 eigegeben wurden und zwar in Echtzeit.

Zum Beispiel:
ich gebe 5 ein -> bestätige mit Enter -> Im Diagramm Balken Nr. 5 geht auf 1.
Gebe ich wieder 5 ein -> Enter -> Balken Nr. 5 geht auf 2 (erhöht sich um 1)
Gebe ich 2 ein -> Enter -> Balken Nr. 2 geht auf 1.
Usw…
Wenn Enter gedrückt wird, soll die Zahl im Textbox gelöscht werden.

Wie kann man das machen?

Viel Grüsse
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Hallo und willkommen,

womit hast du denn konkret Probleme (denn die einzelnen Teilaufgaben lassen sich jeweils mit wenigen Codezeilen umsetzen)?
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Wenn ich ehrlich bin, weis ich nicht wie ich an die Sache rangehen soll.
Ich denke das Problem liegt beim Verstehen und Implementieren des Algorithmus.
Ich weiss wie man auf Inhalt der Textbox zugreift und wie die ins Diagramm übertragen werden.
Aber bei der Aufgabe muss man vermutlich Iterationen anwenden....?
Ich überlege mir grade, ob die eingegebenen Zahlen zuerst in ein dynamisches Array oder List reinkopiert werden sollen, dann durchsuchen, sortieren nach Häufigkeit und das alles dann ins Diagramm...
Wahrscheinlich denke ich zu kompliziert...
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Ich gebe dir einfach mal ein paar Stichworte für die Teilaufgaben:
- TextBox: im KeyPress- oder KeyDown-Ereignis auf Enter/Return-Taste (Key.Enter bzw. '\r') abfragen
- Chart: Series anlegen und Werte dort initial (d.h. mit 0) eintragen, danach die Werte an entsprechender Position (1-5) erhöhen (bessere Lösung mittels DataBinding: DataSource). Vllt. hilft dir auch folgender Code dazu: Chart Control in Windows Forms Application ?

Edit: Das Löschen der TextBox nach der Eingabe findest du sicherlich alleine raus...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für die Tipps!
das alles kenne ich schon. Inhalt der Textbox kann ich auch löschen.
Ich hab irgendwie trotzdem keine Ahnung wie ich programmiertechnisch die Werte erhöhen kann.
Das Diagramm muss man doch nach jeder Eingabe updaten und die alten Werte zwischenspeichern...
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Wie hast du denn die Series angelegt (oder benutzt du DataBinding)?
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Also, ich habe DataSet als eine manuelle Lösung ausprobiert, nur um das Diagramm zu testen. Das funktioniert aber das ist nicht das was ich wollte. So vorgegangen
- DataSet hinzufügen und eine Tabelle erstellen: eine Spalte mit 2 Zellen ( Range, RangeValue)
- Auf die Benutzeroberfläche DataGridView einfügen
- über DataGridView-Aufgaben Menü DataSet als Datenquelle zugewiesen
- DataMember-Eigenschaft der automatischerzeugten BindingSource geändert (Name der DataSet-Tabelle)
- chart einfügen
- Series - Samlmlung
Name -> Range; XValueMember ->Range; YValueMambers -> RangeValue
Zum Chart Aktualisieren:

Private void dataSet1BindingSource_ListChanged(object sender, ListChangedEventArgs e)
{
	chart1.DataBind();
}


In die erste Spalte Range kann ich Zahlen 1 -5 eintragen, in die zweite RangeValue beliebige Werte.
Das funktioniert, aber wie gesagt ich will alles über eine TextBox realisieren. Das Programm soll selber ermitteln welche Zahlen und wie oft eingeben wurden.
Ins DataGridView so reingeschrieben:
dataGridView1.Rows[0].Cells[0].Value = textBox.Tex;
Werte werden zwar reingeschrieben aber das Diagramm wird nicht Aktualisiert. Man muss dafür manuell ins DataGridView klicken.


Ich habe auch Folgendes versucht aber ohne Erfolg:

chart1.Series[0].Points.AddXY(range, counter);


Also..., ich stehe grad echt auf dem Schlauch....
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Carl17 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Ein DataSet mußt du ja nicht von einem DataGridView aus füllen, sondern kannst die Werte auch programmatisch dort eintragen.

Ebenso beim manuellen Hinzufügen mittels der Series-Eigenschaft.
Füge einfach einmalig die 5 Werte hinzu:


for (int index = 0; index < 5; index++)
  chart1.Series[0].Points.AddXY(index,  0);
Und im TextBox-Ereignis dann den index ermitteln (also den Text in eine Zahl umwandeln) und per

chart1.Series[0].Points[index].YValues[0]++;
den Wert erhöhen (schau einfach in die Doku, um die Eigenschaften zu verstehen).
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hi Th69,
ich danke dir für die Tipps und Hinweise, aber das hilft mir nicht weiter. Ich kann dass ganze nicht zusammensetzen...
Dachte, dass hier ein erfahrener Programmierer so ein einfaches Programm in ein paar Minuten erklären könnte.... schein dann doch nicht so einfach zu sein...
Und weil ich schon damit einige Stunden verbracht habe und immer noch kein Erfolg, will ich nicht mehr Zeit verschwenden. Ist echt frustrierend...
Aber danke trotzdem.
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 135
Herkunft: Radeberg

beantworten | zitieren | melden

Hallo,
meinst du sowas?:


var input = "112345564736643954836255";
var output = input.GroupBy(x => x).OrderBy(c=> c.Key).Select(g=> new {zeichen = g.Key, count = g.Count()});

Du nimmst den String, gruppierst die Zeichen, sortierst die Zeichen und gibst die Zeichen mit der Anzahl zurück.
Das übergibst du dem Diagramm (Balken). X-Achse sind die Zeichen und Y-Achse die Anzahl.
- Wer lesen kann, ist klar im Vorteil
- Meistens sitzt der Fehler vorm Monitor
- "Geht nicht" ist keine Fehlermeldung!
- "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 656

beantworten | zitieren | melden

Hallo Carl17
Zitat von Carl17
Dachte, dass hier ein erfahrener Programmierer so ein einfaches Programm in ein paar Minuten erklären könnte.... schein dann doch nicht so einfach zu sein...

Doch, dass ist einfach, aber wir sind hier keine Code-Generatoren und etwas Eigeninitiative ist gefragt. Th69 hat dir bereits alle Hinweise gegeben, die du brauchst.

Les als erstes mal das hier https://mycsharp.de/forum/threads/26594/wie-poste-ich-richtig durch und setzte das um, dann kommst du auch zum Ziel.

Viele Grüße
Alf
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,

Weil ich dann einfach nicht glauben wollte, dass so ein kleines Programm solche schwer sein kann, konnte ich nicht aufgeben.
Ich hab das Programm endlich fertig programmiert. Das passende Algorithmus in einem US-Forum gefunden. Ich hab das an meine Aufgabenstellung
angepasst und auch erweitert. Man kann jetzt nicht nur 5 Zahlen eingeben sondern sehr viele. Ob ich das elegant und technisch korrekt gemacht habe,
weiss ich nicht. Aber das Program tut was es tun soll. Den Code werde ich später posten,
Und nicht nur weil das in den Forumsregeln steht (danke an Alf ) sondern damit andere Leute was davon haben. Das soll nicht heissen,
dass ich die Forumsregeln nicht Respektire oder so…
Und natürlich würde ich mich auf eure Kommentare Verbesserungsvorschläge freuen.


@Wilfried:
Vielen Dank! Ja, vermutlich geht das in die richtige Richtung. Sieht interessant aus. Aber ob das so funktionieren würde? Und das ist für mich wieder nur ein Hinweis mit dem ich
Leider nicht viel anfangen kann. Kannst du vielleicht genauer sagen, wie die XY-Werte dem Diagramm übergeben werden können? Und zwar alles in Echtzeit.
Ich gebe Zahlen ein und das Diagramm zeigt in Echtzeit welche Zahlen und wie oft eingeben wurden.

@Alf:
Für die Hinweise bin ich dankbar. Aber ich sag mal so, ich habe nicht nach Links gefragt damit ich mich selber schlau machen kann. Ich habe schon davor ziemlich lange recherchiert.
Ich wollte von einem
erfahrenen Entwickler wissen wie man an die Sache rangehen soll. Mit welchem Algorithmus kann man das realisieren. Es ist mir klar, dass man keine fertige Lösung
erwarten soll und dass Leute keine Lust haben hier lange Codes zu generieren. Aber bei kleinen Programmen/Aufgabestellungen kann man doch etwas genauer
auf den Code eingehen. Es ist nicht das Erste Mal, dass ich ein paar Codezeilen und ein paar Links bekommen habe, die mein Problem nicht lösten.
Weil…, Forumsregeln, es wird niemandem was geschenkt, Eigeninitiative, keine Lust zu schreiben und zu Coden aber hier paar links , ich habe die Lösung aber ich geb sie dir nicht usw… (nicht böse gemeint)
Das finde ich irgendwie schade. Wir haben in Deutschland so viele Ingenieure, starke Wirtschaft Industrie… da kann man doch etwas mehr Action erwarten
Die anderen rennen nach vorne und wir sitzen gemütlich und hängen an unseren didaktischen Prinzipien. So empfinde ich das zumindest Aber nichts gegen die Forumsregeln,
Regeln sind Regeln…
@TH69:
Ich kann mir immer noch mit dem besten Willen nicht vorstellen wie du mit deinen Vorschlägen, die du gepostet hast, das Programm zum Laufen bringen kannst.
Wenn du mal Lust und Zeit hast, wäre es cool wenn du deine Lösung mal zeigen würdest. Vielleicht nicht so spannend für dich aber trotzdem..
Das würde mich interessieren.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Carl17 am .
private Nachricht | Beiträge des Benutzers
Carl17
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hier das Programm:

Zahlen in TextBox eingeben, mit Enter bestätigen und das Diagramm zeigt in Echtzeit welche Zahlen und wie oft sie eingegeben wurden.

über TextBox werden Zahlen in Listen geschrieben. Nacheinander.
Dann kommt das eigentliche Algorithmus (nicht von mir. Rest ist von mir) ins Spiel. Es ermittelt, ob die eingegebene Zahl schon eingegeben wurde, wenn ja wie oft.




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace Diagramm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       
        List<double> zahlenList = new List<double>();
        private void textBoxEingabeZahlen_KeyUp(object sender, KeyEventArgs e)
        {        
            if ((e.KeyCode == Keys.Enter) & (textBoxEingabeZahlen.Text != String.Empty))
           {
                chart1.Series[0].Points.Clear();
                zahlenList.Add(Convert.ToDouble(textBoxEingabeZahlen.Text));
                double[] haufigkeit = new double[zahlenList.Count];
                textBoxEingabeZahlen.Text = String.Empty;

                for (int i = 0; i < zahlenList.Count; i++)
                {
                    haufigkeit[i] = -1;
                }

                for (int s = 0; s < zahlenList.Count; s++)
                {
                    int zaehler = 1;
                    for (int m = s + 1; m < zahlenList.Count; m++)
                    {
                        if (zahlenList[s] == zahlenList[m])
                        {
                            zaehler++;
                            haufigkeit[m] = 0;
                        }
                    }

                    if (haufigkeit[s] != 0)
                    {
                        haufigkeit[s] = zaehler;
                    }
                }
                for (int x = 0; x < zahlenList.Count; x++)
                {
                    if (haufigkeit[x] != 0)
                    {
                        chart1.Series[0].Points.AddXY(Convert.ToString(zahlenList[x]), Convert.ToString(haufigkeit[x]));
                    }
                }
            }
        }
    }
}

private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 135
Herkunft: Radeberg

beantworten | zitieren | melden

Ich verstehe jetzt dein Problem nicht. Hast du überhaupt verstanden, was mein Code macht? Außerdem widersprichst du dir in deinen Anforderungen. Mal schreibst du von Echtzeit und mal reagieren auf den ok-Button. Was denn nun? Ist aber egal, bei Echtzeit reagierst du auf des Changed-Event und bei ok auf das Click-Event. In beiden Fällen übergibst du den Text meiner Methode und erhältst eine List. In dieser steht, welches Zeichen wie häufig in dem Text gefunden wurde. Damit kannst du die Punkte in deinem Diagramm erzeugen. Das könnte in einen flotten 3-Zeiler passen.
- Wer lesen kann, ist klar im Vorteil
- Meistens sitzt der Fehler vorm Monitor
- "Geht nicht" ist keine Fehlermeldung!
- "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 135
Herkunft: Radeberg

beantworten | zitieren | melden

Übrigens, programmieren heißt nicht, Code von anderen einzusammeln
Zitat
Das passende Algorithmus in einem US-Forum gefunden.
sondern sich selber Gedanken zu machen. Und dein Problem sollte man auch als Anfänger problemlos selber hinbekommen. Du hast auch nie klar formuliert, wo dein Problem liegt. Immer nur die angebotene Hilfe als nicht hilfreich abgelehnt. So bekommst du nie selbstständig ein Programm hin.
- Wer lesen kann, ist klar im Vorteil
- Meistens sitzt der Fehler vorm Monitor
- "Geht nicht" ist keine Fehlermeldung!
- "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 135
Herkunft: Radeberg

beantworten | zitieren | melden

Wenn man LINQ nicht möchte, dann kann man es auch in der klassischen Schreibweise machen:


var input = "112345564736643954836255";

Dictionary<char,int> result = new Dictionary<char, int>();
foreach (var c in input.ToCharArray())
{
    if (result.ContainsKey(c))
    {
        result[c] = result[c] + 1;
    }
    else
    {
        result.Add(c, 1);
    }
}

foreach (var r in result)
{
    Console.WriteLine($"Zeichen: '{r.Key}' Anzahl: {r.Value}");
}

- Wer lesen kann, ist klar im Vorteil
- Meistens sitzt der Fehler vorm Monitor
- "Geht nicht" ist keine Fehlermeldung!
- "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF
private Nachricht | Beiträge des Benutzers