BPS #1: Buchstaben zählen - Auswertung
Übersicht

![]() |
hamZtaAdministratorBetreff: BPS #1: Buchstaben zählen - Auswertung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nachdem das Ende der ersten BPS etwas ungünstig auf die Feiertag gefallen ist, kommt nun verspätet aber doch der Auswertungsthread für die erste Aufgabe.
Aufgabenstellung Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern. Diskussion Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen. Nächste Aufgabe Ihr habt eine Woche Zeit, eure erste Aufgabe zu verbessern bzw. zu besprechen, dann kommt die nächste Aufgabe. Viel Spaß! |
||
Blog. |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax: [AUSKLAPPEN] Function Read_in:Int[](Datei$) Oh die Erklärungen hätte ich fast vergessen und auch noch ins falsche Forum, naja was soll ich sagen ich war so aufgeregt ![]() Also hier die BB alternative BlitzBasic: [AUSKLAPPEN] Const Array_length = 26 Also erstmal hab ich das Ganze in 2 Functionen unterteilt, die eine um die Buchstaben einzulesen und in einem Array ihre Anzahl zurückzugeben, die andere um ein Array auszugeben. Die erste Funktion erwartet als übergabe die datei und liest dann solange bis sie das Ende der Datei erreicht hat Zeile für Zeile ein, und wandelt sie in Großbuchstaben um, damit kein Unterschied zwischen klein und großbuchstaben gemacht wird beim Zählen. Als nächstes wird die Länge des Strings gespeichert, man könnte sich die Zeile sparen und in die For Schleife tun, allerdings müsste dann für jeden durchlauf die function Len erneut angewendet werden, spart also rechenzeit, wenn man es so macht. (Und kostet halt 32bit speicher...) Die For Schleife geht nun jeden Buchstaben ab mit Hilfe von dem Mid befehl, der immer eine Stringsequenz der größe eins an jedem einzelnen Punkt zurück gibt. Der Asc Befehl wandelt es von eine Buchstaben in seinen Unicode(?) Wert um. Die Buchstaben fangen beim Wert 65 an und gehen 26 Werte weiter also müssen sie zwischen 65 + 0 und 65 + 25 liegen. Die überprüfung ist dafür da, damit sonderzeichen oder z.B. das ä was irgendwo bei 196 rumfliegt nicht die Grenzen des Arrays überschreiten. Die Position im Alphabet ist nun in b gespeichert und wird im array erhöht wenn es denn ein Buchstabe ist. Anschließend wird das Array zurückgegeben. Die zweite gibt einfach das erhaltene Array aus, und für jedes weitere Feld wird vorher noch das jeweilig Unicode Zeichen geschrieben, also in unserem fall das Alphabet. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
- Zuletzt bearbeitet von Ana am Mi, Jan 05, 2011 14:38, insgesamt 4-mal bearbeitet
![]() |
hamZtaAdministrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht liest du dir den Punkt "Diskussion" nochmal durch, Ana, und bearbeitest deinen Beitrag entsprechend.
hamZta |
||
Blog. |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie könnte ich dir was abschlagen ![]() ohje und es ist auch noch in der BB und nicht in der Bmax spalte gelandet ... na gut bis auf das array macht es nicht so den unterschied. |
||
Don't only practice your art,
but force your way into its secrets, for it and knowledge can raise human to divine |
![]() |
The Shark |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Dim chars(25) Per Commandozeile wird die Datei übergeben und Byteweise ausgelesen. Liegt das Byte in dem Bereich der Groß- oder Kleinbuchstaben, so wird das Array char an dem entsprechenden Index erhöht. Schlussendlich wird in einer Schleife das Ergebnis ausgegeben. Diese Lösung hat den Vorteil, dass sie kurz, einfach und durch den verzicht auf Stringfunktionen schnell ist. |
||
Toasty |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Code:
BlitzBasic: [AUSKLAPPEN] Dim Buchstaben( 26 ) ;Array mit 26 Feldern für jeden Buchstaben anlegen Wieso habe ich die Aufgabe auf diese Art gelöst? Ich habe diese Aufgabe so gelöst, weil ich es am einfachsten finde, als erstes die Datei einzulesen, die einzelnen Buchstaben als ASCII Code in dem Array zu speichern und anschließend den Array Stück für Stück auszulesen, den ASCII Code in den Buchstaben zurück zu "verwandeln" und in der Datei mit der Anzahl zu speichern. In den Arrays sind (von A-Z) die Anzahl der Buchstaben gesammelt. Ich hoffe das gilt als Beschreibung und/oder als Erklärung ![]() Gruß Toasty |
||
@AMD Phenom BE X4 2,5Ghz(Overclocked 2,61Ghz); 4GB DDR2; 512MB nVidia GeForce 8400gs; Win7 Home Premium 64bit
Lua for President! |
FireStorm |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BlitzBasic: [AUSKLAPPEN]
Ich habe die Aufgabe so gelöst wie ich es am einfachsten fand. Die Datei wird eingelesen, dann jede Zeile einzeln auf Buchstaben überprüft. Bei Kleinbuchstaben wird 32 vom ASCII-Code abgezogen um zu den Großbuchstaben dazugezählt zu werden. Der ASCII wird wieder in Zeichen umgewandelt und ausgegben. Ich hoffe das war verständlich ![]() an Ana: Du hast 27 Buchstaben überprüft, die eckige Klammer war auch dabei ![]() statt For i = 0 To Array_length sollte es heißen For i = 0 To Array_length-1 ASCII code für [ ist 91 (26+65) |
||
![]() |
InFaIN |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] ;Einstellungen BlitzBasic: [AUSKLAPPEN] ;Einstellungen Ich habe das ganze zuerst wie in der Aufgabenstellung zeilenweise gelöst. Ich fasse klein und Großbuchstaben zusammen, da es nicht anders verlangt wurde. Danach habe ich mich gefragt warum eigentlich kompliziert Zeilenweise auslesen? Also habe ich das ganze Byteweise umgeschrieben und noch einen Gewschwindigkeitstest durchgeführt. Bytweise ist deutlich shcneller und kürzer vom Code. Wenn Fragen zum Code sind, einfach fragen..... |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm.. zuerst dachte ich, ich warte ein wenige bis da ein paar Beiträge zusammen gekommen sind... aber wenn ich das richtig sehe, hat sich hier nich kein "Beginner" gemeldet sondern nur Leute die handfeste Lösungen präsentiert haben... von der Idee her genauso wie meine.
BlitzBasic: [AUSKLAPPEN] ;Array, in welchem der "Zählerstand" für jeden Buchstaben gespeichert wird Auch ich habe es einmal Zeilenweise und einmal Byteweise probiert. Dabei immer "in Großbuchstaben umgedacht" und Sonderzeichen einfach nicht berücksichtigt. Das "besondere" an meiner Lösung ist, dass es "2 in 1" ist - in einer Funktion, man wählt die Arbeitsweise durch den letzten Parameter "mode" aus. Finde ich praktischer, aber ist wohl Geschmackssache. (Da meine Variante theoretisch langsamer ist, als eine 2. "komplette" Funktion.) Wie dem auch sei, ich hab mich bemüht, den Code schön zu kommentieren und es hat mir Spass gemacht! mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Lösung:
BlitzBasic: [AUSKLAPPEN] ; ###### Buchstaben zählen für den BPS #1 Im Nachhinein finde ich es nicht sonderlich intelligent gelößt den gesammten Text in einem Dim zwischenzuspeichern, das hat mir aber eine sehr schöne Strukturierung über die 3 Funktionen ermöglicht. Der Code funktioniert bis auf eine kleine Ausnahme mit jedem BlitzBasic Compiler: Nicht-BlitzPlus-User müssen folgende Zeile in der Funktion "LoadText()" noch umschreiben: Code: [AUSKLAPPEN] file$= RequestFile$ ("Datei mit Text auswählen","*",0,"")
Entweder setzt man file$ konstant oder arbeitet mit Input(). LG Hazumu. |
||
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann -> nicht omnipotent |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Toasty:
BlitzBasic: [AUSKLAPPEN] Dim Buchstaben( 26 ) ;Array mit 26 Feldern für jeden Buchstaben anlegenDas Array hat 27 Felder - nicht vergessen, dass Feld 0 auch existiert! Beim Beispieltext ist "ä" mit "ae" umschrieben, daher hätte ich mit Replace entsprechend verfahren, anstatt die Zeichen komplett zu löschen. @ hazumu-kun: Ich finde die Strukturierung in Funktionen gut gelöst. Manchmal ist Übersicht wichtiger als kleiner Code. Und er lässt sich in dieser Form fix erweitern; ein fertiges Array lässt sich durch die Funktionale Trennung schnell mit andere Analysen erweitern. Schön, dass die Veranstaltung offenbar auf Interesse stößt ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eine andere Möglichkeit wäre mit ReadBytes die Datei in eine Bank zu verfrachten und diese dann durchzugehen. Entspricht natürlich nicht ganz der Anforderung mit dem zeilenweisen Einlesen könnte insgesamt aber sogar noch einen Tick schneller als mit ReadByte sein... | ||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
exastion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BlitzBasic: [AUSKLAPPEN] ;Aufloesung<<<<<<<<<<<<< Hallo, ich habe es am Anfang mit Zeilenweiser Einlesung probiert, bin aber daran gescheitert. Deshalb habe ich das ganze mit Bytes gemacht. Ich habe den ganzen Code kommentiert. |
||
MfG exastion
Bitte verbessert mich, wenn ich was falsches schreibe. |
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Xeres
Die Idee mit der Erweiterbarkeit war mir auchschon gekommen. Man könnte nicht nur den Text noch analysieren, sondern über die Zähler der Buchstaben eine Cäsar Verschlüsselung knacken. |
||
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann -> nicht omnipotent |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der THread soll ja auch zum Diskutieren und Vorschläge machen genutzt werden, daher:
@exastion: Mir gefällt, dass du glaub ich der einzige bist, der die Ausgabe mit Text macht. Außerdem hast du all deine Variablen am Anfang deklariert (das gefällt mir, siehe mein Code ![]() Aber der "Hauptteil" der die eigentliche Arbeit macht gefällt mir ehrlich gesagt weniger, er kommt mir zu umständlich vor. BlitzBasic: [AUSKLAPPEN] For i=0 To 25 ;For-Schleife für alle Buchstaben des Alphabetes Also wenn man eh nur auf etwas bestimmtes Abfragen möchte, würde ich if ![]() Das ist relativ viel Arbeit. BlitzBasic: [AUSKLAPPEN] ASCII(txt-65)=ASCII(txt-65)+1 würde es eigentlich schon tun. Ganz ohne Schleife und dem i. Dann muss man allerdings nochmal eine Überprüfung für Kleinbuchstaben machen. Viele Wege führen nach Rom und ich bin froh, auch mal einen andere gesehen zu haben. Auch wenn ich ihn wie gesagt für zu umständlich halte. mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
exastion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie gesagt, ich bin noch ein Anfänger, aber Danke für das Lob.
Was den Hauptteil betrifft, habe ich mich nicht mehr sehr lange damit beschäftigt, als ich ihn bis fertig hatte. |
||
MfG exastion
Bitte verbessert mich, wenn ich was falsches schreibe. |
![]() |
JimBobBalou |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Graphics 640, 480, 0, 2 Jede Textzeile wird eingelesen un für jeden Buchstaben wird überprüft, wie oft er in dieser Textzeile vorhanden ist. Am Ende werden die Ergebnisse mit Print ausgegeben. |
||
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
(Ja, ich weiß, dass diese BPS schon lange vorbei ist. Allerdings bin ich persönlich der Meinung, dass man auch nachher noch seinen Code hinzufügen kann. Je mehr desto besser. ![]() Mein Programm funktioniert, indem man einfach die auszulesende Textdatei auf das Programm "raufzieht". Drag&Drop im Explorer, falls das jemandem etwas sagt. ![]() Daher ist es auch nicht so leicht, es direkt im Blitz-Editor zu testen. Um dies zu erreichen, müsst ihr den Pfad eurer Datei unter Program -> Program Command Line... erstmal einfügen. Dann funktioniert es. ![]() Wie bin ich die Sache angegangen? Erst mal die klassischen Überlegungen: Ich brauche für jeden Buchstaben Platz, um zu speichern, wie oft er vorkam. Ein Integer-Array (Ganzzahlen-Feld) mit 26 Einträgen ist da genau das richtige. Um herauszufinden, welchen Buchstaben ich da denn gerade ausgelesen habe, nutze ich die ASCII-Werte. Dazu muss man halt wissen, dass alle Buchstaben in der richtigen Reihenfolge gespeichert werden. Also erst kommt A, dann B, dann C... bis Z am Ende. Um zu wissen, an welchem Punkt denn nun das Alphabet beginnt (ASCII enthält mehr als nur Buchstaben), setzte ich einfach den ASCII-Wert von "A" als Quasi-Konstante. (Dieser ist normalerweise 65). Mit diesem Wert kann man jetzt den Rest machen. So kann man leicht herausfinden, ob das Symbol, dass man gerade eingelesen hat, denn auch ein Buchstabe ist. Sollte sich der ASCII-Wert des Symbols zwischen ("A") und ("A"+26) befinden, dann haben wir einen Buchstaben. ("A"+26 ergibt dabei "Z") Der Rest ist simples Textdatei auslesen und Werte verarbeiten. Die Befehle ReadLine, Left, Right und Len und Eof sind dabei recht hilfreich. ![]() Oh, achja: Es wird nur die Häufigkeit von Buchstaben ausgegeben, die auch vorkommen. Sollte der Text also kein Q enthalten, wird bei der Ausgabe auch kein Q erwähnt. BlitzBasic: [AUSKLAPPEN] ; Buchstaben zählen |
||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group