Zum Inhalt springen

[C#] Buchstaben-Häufigkeit


FI-SI 08

Empfohlene Beiträge

Hallo zusammen,

ich habe mal eine Frage. Im Fach AWEW sollen wir ein Programm schreiben zu der Aufgabenstellung "Buchstaben-Häufigkeit".

Wir bekommen ein Blatt und dürfen programmieren toll :rolleyes:

Ich bin nicht gerade der Bringen in C#, von daher wollte ich euch mal fragen, wie ich an die Sache rangehen muss.

Die Aufgabenstellung ist recht verständlich: Man soll eine Eingabe tätigen z.B. "Das ist ein kleiner Beispieltext". Die Anzahl der vorkommenden Buchstaben wird von dem Programm gezählt und das Ergebnis folgendermassen ausgegeben:

Zeichen: E, Anzahl: 6

Zeichen: I, Anzahl: 5

...

..

.

Dabei soll das Programm nicht zwischen Groß- und Kleinbuchstaben unterscheiden, sondern Kleinbuchstaben wie Großbuchstaben behandeln.

Außerdem soll die Ausgabe wie oben beschrieben nach Häufigkeit sortiert erfolgen, d.h. die am häufigsten auftretenden Buchstaben sollen zuerst ausgegeben werden.

Mein Problem ist, wie ich das umsetzen soll. Wo fange ich an, wie komme ich zu einem gescheiten Ergebnis, ohne es in der Gruppe zu realisieren. Ich habe selten ein Programm das mal fertig ist, und wo ich sagen kann: "Das habe ich alleine programmiert." :(

Das frustriert ein wenig, da ich es unbedingt können will, es mir aber am Wissen fehlt, was wir im Unterricht nicht sonderlich beigebracht bekommen. Gut für diejenigen, die im Betrieb Sonderunterricht bekommen und das Programm so runterschreiben können.

Ich hoffe ihr könnt mir Tips oder Hilfestellungen zu meinem Problem geben.

Danke schonmal :rolleyes:

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

aufgabe auseinandernehmen!

erst einmal nur buchstaben zählen, nachher erst nach häufigkeit soriteren.

1.) den text erst einaml in kleinbuchstaben umwandeln (.toLower() von string auafrufen.)

2.) eine schleife über die einezelnen buchstaben von dem string machen.

3.) mit dem buchstaben eine funktion aufrufen, die eine map in sich hat, die die zählerei übernimmt. map anlegen mit key: a - z und value jeweils 0.

dann einfach mit map.getAt('a')++;

bigredeyes

p.s. sorry, sehr grob aber ich glaube das sollte etwas helfen. hab auf arbeit leider kein c#.

tip: http://www.galileocomputing.de/openbook/csharp/kap28.htm#Xxx442573

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gut zu wissen ist auch das jeder buchstabe ein byte ist also auch als zahl ansprechbar.

strName[index] giebt ein char zurück den kannst du auf ein byte casten und erhältst den byte wert dadurch

als bsp:

string strBuchstabe = "hallo";

foreach(byte by in strBuchstabe.toCharArray())

{

Console.WriteLine(by.toString());

}

Ausgabe sollte irgendwie so sein:

104

97

108

108

111

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab damals für ne Huffman-Codierung auch die Häufigkeit von Buchstaben bestimmen müssen. (Da allerdings noch in C++)

Die Version mit ner Liste oder ner Map für die verscheidenen Buchstaben war vergleichsweise langsam.

Eine recht fixe Methode war es, einfach nen Integer-Array mit 256 Feldern zu nehmen. (Für große Texte dann Long)

int[] buchstaben = new int[256];

Bevor man mit dem Array dann noch was macht sollte man erstmal die Werte auf 0 setzen.

Im folgenden geht man dann auch den Text Buchstabenweise durch und erhöht den Zahlwert für den jeweilgen Buchstaben.

Ein 'A' wäre Dezimal 65, also würde man am entsprenden Index ( z.B.buchstaben[65]) den Wert um eins erhöhen.

foreach(char c in text)

{

buchstaben[(int)c]++;

}

Danach kann man dann einmal das Array durchgehen und sich die entspechenden Werte (also wahrscheinlich alle die größer 0 sind) ausgeben lassen.

Und dann kannst Du natürlich auch noch sortieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke soweit schonmal :rolleyes:

Jetzt muss ich das nur noch in ein gescheites Programm bringen. Wir haben erst neulich mit Arrays angefangen, da muss ich mich mal einarbeiten wie der Syntax lautet.

Wie ist die Vorgehensweise, wenn ich die Zeichen einzeln durchgehe? Wie spreche ich z.B. das 1. Zeichen des Strings an, das 2. ... n-te Zeichen?

Und bitte kein C++-Code ;) das verwirrt mich ein wenig. Problem ist das vieles was hier in der Aufgabe benötigt wird, wir im Unterricht noch gar nicht besprochen haben :-/

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es gibt verschiedene Möglichkeiten die Buchstaben im Text durchzugehen.


String text = "Das hier ist mein toller langer Text";


//Möglichkeit 1

foreach (char zeichen1 in text)

{

    //hier kannst Du nun irgendwas mit dem Buchstaben machen

    //Du könntest es ausgeben

    Console.Write(zeichen1);

}


//Möglichkeit 2

char zeichen2;

for (int i = 0; i < text.Length; i++)

{

    zeichen2 = text[i];


    //hier kannst Du nun irgendwas mit dem Buchstaben machen

    //Du könntest es ausgeben

    Console.Write(zeichen2);

}


Es gibt sicher noch andere Lösungen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, soweit bin ich jetzt schonmal, das ich die Eingabe tätigen kann :rolleyes:

{

string eingabe;

Console.WriteLine("Eingabetext eingeben: ");

eingabe = Console.ReadLine();

// Da kommt jetzt alles rein

Console.ReadLine();

}

Ich muss doch jetzt erstmal ein Array anlegen, wo die 256 Zeichen gespeichert werden können. Dann folgt Schritt für Schritt die Überprüfung der Zeichen, die dann in das Feld gespeichert werden. Am Ende sollen die Ausgaben der Wertigkeit nach sortiert werden.

Was ich nicht verstehe ist foldendes:

- Wie hängt in der Aufgabe char mit array zusammen?

- Wie speichert man ein Zeichen in das Feld?

- Wie geht man per Syntax mit dem "ToUpper" um, wenn ich den String eingegeben habe?

Mir sind so einige Sachen noch nicht ganz schlüssig. Ich habe Code-Fetzen, wo ich nicht weiss, wie man die kombinieren muss damit das Programm lauffähig ist. Oder mir fehlt an Begabung :(

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

- Wie hängt in der Aufgabe char mit array zusammen?

- Wie speichert man ein Zeichen in das Feld?

- Wie geht man per Syntax mit dem "ToUpper" um, wenn ich den String eingegeben habe?

Laut Deiner Aufgabenstellung hängt das garnicht zusammen.

Ein Feld bietet Dir lediglich eine "übersichtliche" Speicherung Deiner Daten.

Stell Dir vor es gäbe keine Felder oder ähnliche Strukturen. Dann würde Dein Code vielleicht so ausehen:


//Variablen für das zählen der verscheidenen Buchstaben, unter Vernachlässigung von Zahlen und Satzzeichen

long a = 0;

long b = 0;

long c = 0;

long d = 0;

...

long z = 0;

Da hättest Du dann 26 verschiedene Variablen die Du hochzählen würdest und die Du irgendwie ansprechen müsstest. Vielleicht in etwa so:


...

char buchstabe = text[i]; //gibt Dir der Reihe nach alle Buchstaben zurück

switch(buchstabe)

{

[INDENT]case 'a': {a = a + 1; break; }[/INDENT]


[INDENT]case 'b': {b = b + 1; break; }[/INDENT]


[INDENT]case 'c': {c = c + 1; break; }[/INDENT]



[INDENT]...[/INDENT]


[INDENT]case 'z': {z = z + 1; break; }[/INDENT]


[INDENT]case default: { break;} //ungültiges Zeichen[/INDENT]


}

...

Die Ausgabe der gezählten Buchstaben sieht dann auch wieder ähnlich umständlich aus. Und vom Sortieren will ich hier garnicht erst anfangen :-) Deshalb bietet es sich an Felder zu verwenden. (oder wie von bigredeyes erwähnt, ne List oder ne Map). Ich würde für diesen Fall das einfache Feld bevorzugen da es bei sehr großen Texten performanter sein dürfte. (kannste ja mal mit der Bibel als eBook versuchen) Das Feld kann man auf verschiedene Weisen erstellen. Auch wenn man nicht den kompletten Zeichensatz verwendet würde ich der Einfachheit halber erstmal ein Feld der größe 256 erstellen.

int[] zeichenhäufigkeit = new int[256];

Die Buchstaben (und Zahlen, ...) wie Du sie kennst haben in der Asciitabelle auch eine Dezimaldarstellung. A = 65, B = 66, ..., Z = 90 bzw. a = 97, b = 98, ..., z = 122 Diese Umwandlung lässt sich in C# folgenderweise machen

int dez = (int)zeichen;

Diesen Wert kann man nun innerhalb des Feldes als Index verwenden, und somit z.B. für ein 'A' an der Stelle 65 im Feld den "Zähler" erhöhen:

zeichenhäufigkeit[dez] += 1;

// bzw.

zeichenhäufigkeit[dez] = zeichenhäufigkeit[dez] + 1;

Das ganze tust Du dann für alle Zeichen. Wenn Du nun nur kleine oder große Zeichen verwenden willst verwendest Du wie schon erwähnt die Methode "toUpper()" oder "toLower()". Diese Funktion liefert auch wieder einen String zurück. Daher (mindestens) 2 Möglichkeiten. Entweder Du überschreibst die "alte" Variable oder legst den Text dann auf eine neue.

string eingabe;

...


//Variante 1

eingabe = eingabe.ToLower();


//Variante 2

String kleinerText = eingabe.ToLower();

So, ich hoffe das hilft Dir erstmal weiter. Ansonsten gibts viele Quellen im Netz wo man so die Grundlagen gut erklärt bekommt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...