Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 02.06.2014, 09:31 Titel: Alphabet "hoch zählen" |
|
|
Hola.
stehe mal wieder vor einem, wahrscheinlich simplen, Problem.
Nachdem eine Zahl abgefragt wurde soll diese auf das Alphabet umgesetzt werden.
Bedeutet a=1, b=2, usw. und sollte die Zahl größer sein als das Alphabet Buchstaben hat soll einfach wieder von vorne begonnen werden.
Dachte an eine for next Schleife.
Die Frage ist, wo bekomme ich das Alphabet her, bzw. wie kann ich bei jedem Schleifendurchlauf einen Buchstaben weiter kommen ?
Gruessle
Momo |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 02.06.2014, 11:39 Titel: |
|
|
Hallo momohk!
Dazu brauchst du keine Schleife, der Buchstabe lässt sich direkt berechnen.
Du teilst dazu die Zahl durch die Anzahl der Buchstaben des Alphabets (26) und addierst zum Divisionsrest den Ascii-Wert des ersten Buchstaben: Code: | Dim As Integer x
Do
x += 1
Print x;" ";Chr(((x-1) Mod 26) + Asc("a"))
Sleep 100
Loop | Ich hoffe, dieses kleine Sniplet hilft dir weiter.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 02.06.2014, 13:07 Titel: |
|
|
N bissi optimiert:
Code: | Dim As Integer x
Do
Print x;" ";Chr((x Mod 26) + 97)
x += 1
Sleep 100
Loop |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 02.06.2014, 13:51 Titel: |
|
|
Das mit dem ASC("a") zu dem statischen Wert 97 ändern kannst und sollst du dir sparen; das machts nur unleserlicher und der Compiler ersetzt das automatisch mit dem statischen Wert 97 (ohne Berechnung o.ä.).
Wenns einen Performance Nachteil gibt, dann höchstens ein paar Nanosekunden während dem Compile-Vorgang. Es entsteht aber genau das gleiche Programm; sprich das Verhalten zur Laufzeit ist gleich (schnell/langsam). _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 02.06.2014, 15:59 Titel: |
|
|
Hi.
Danke für eure Antworten.
Das hilft mir schon mal weiter.
Wobei das mit dem "Dim" muss ich mir nochmal anschauen.
Gruessle
Momo
Zuletzt bearbeitet von momohk am 02.06.2014, 16:04, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 02.06.2014, 16:05 Titel: |
|
|
Danke, habe es auch gerade gefunden  |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 03.06.2014, 09:16 Titel: |
|
|
@ ThePuppetMaster:
St_W hat Folgendes geschrieben: | Das mit dem ASC("a") zu dem statischen Wert 97 ändern kannst und sollst du dir sparen; das machts nur unleserlicher und der Compiler ersetzt das automatisch mit dem statischen Wert 97 (ohne Berechnung o.ä.).
| Tatsächlich hatte ich dort beim ersten Entwurf 97 hingeschrieben (man hat solche Schlüsselwerte halt inzwischen im Kopf ), aber erstens hätte das bei einem Programmierneuling wohl ein "Hää..?" hervorgerufen, und zweitens siehe oben. Der Compiler soll ja sogar Verzögerungsschleifen der Art Code: | For x = 1 to 100000 : Next | wegoptimieren und x direkt auf 100001 setzen.
Außerdem hast du noch einen Fehler hineinoptimiert, dein Programm beginnt mit a=0 statt a=1 wie in der Aufgabenstellung gefordert.
Im Hinblick auf den didaktischen Zweck des Progrämmchens könnte man es vielleicht besser so schreiben: Code: | Dim As Integer zahl = 0
Dim As String buchstabe
Do
zahl += 1
buchstabe = Chr(((zahl - 1) Mod 26) + Asc("a"))
Print zahl;" ";buchstabe
Sleep 500
Loop |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 03.06.2014, 12:17 Titel: |
|
|
@grindstone ... das hatte einfach den sinn, das eine Rechenoperation (-1) wegfällt.
Code: | Dim As Integer zahl = 0
Dim As String buchstabe
Do
zahl += 1
buchstabe = Chr(((zahl - 1) Mod 26) + Asc("a"))
Print zahl;" ";buchstabe
Sleep 500
Loop |
bzw.
Code: | Dim As Integer zahl = 0
Dim As String buchstabe
Do
buchstabe = Chr((zahl Mod 26) + Asc("a"))
zahl += 1
Print zahl;" ";buchstabe
Sleep 500
Loop |
Ist dadurch Identisch, spart aber eine Operation
PS: asc() ... joar ... statisch: das is richtig. Ich hab mir das aber mitlerweile auch so angewöhnt, da die viele ascii's bereits im kopf hab .. ich "denke" da warscheinlich nicht mehr richtig.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 03.06.2014, 19:14 Titel: |
|
|
Zitat: | Ist dadurch Identisch, spart aber eine Operation |
Nö, einmal addierst du vor der Buchstabenberechnung, einmal danach. Du machst sie auf jeden Fall einmal pro Schleifendurchlauf. Um die Rechenoperation zu sparen, müsstest du die Schleife dann schon vor dem Erhöhen verlassen.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 04.06.2014, 00:00 Titel: |
|
|
@nemored .. doch .. eigentlich spaare ich eine operation pro durchlauf .. siehe:
Code: | buchstabe = Chr(((zahl - 1) Mod 26) + Asc("a")) |
vs.
Code: | buchstabe = Chr((zahl Mod 26) + Asc("a")) |
Alles andere ist quasi ablauftechnisch identisch.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.06.2014, 01:08 Titel: |
|
|
Wenn ihr schon so low-level optimiert, optimiert lieber mal den teuren Print-Befehl weg  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 04.06.2014, 08:29 Titel: |
|
|
Hola.
Da scheine ich ja ein Thema angeschoben zu haben
Ich danke euch auf jeden Fall für eure Hilfe und werde der Diskussion freudig folgen
Gruessle |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 04.06.2014, 08:56 Titel: |
|
|
@ ThePuppetMaster: Die Zeilen Code: | buchstabe = Chr(((zahl - 1) Mod 26) + Asc("a")) | und Code: | buchstabe = Chr((zahl Mod 26) + Asc("a")) | liefern für dieselbe Zahl unterschiedliche Ergebnisse. Es ging bei der Anfrage von momohk ja nicht darum, das Alphabet aufzulisten, sondern jeder 26er-Gruppe von ganzen Zahlen periodisch die Buchstaben a - z zuzuordnen, beginnend mit a für 1.
Jojo hat Folgendes geschrieben: | ...optimiert lieber mal den teuren Print-Befehl weg | Es geht ja eigentlich nur um die Zeile, die die Zahl in einen Buchstaben umwandelt. Alles darum herum habe ich nur dazugeschrieben, um die Arbeit dieser Zeile zu demonstrieren. Laut momohk stammen die umzuwandelnden Zahlen ja aus einer anderen Quelle und werden vermutlich auch anders weiterverarbeitet.
Die Aufgabenstellung hört sich an wie eine Hausaufgabe für einen Programmierkurs (@momohk: habe ich recht? ), die ganz einfach aussieht, aber ihre Tücken hat.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 04.06.2014, 10:09 Titel: |
|
|
Hiho.
Nee, ist kein Programmierkurs. Die Aufgabe habe ich mir selber gestellt.
Ich wollte ein wenig mit Verschlüsselung rum spielen und die einfachste Art ist ja jeden Buchstaben gegen einen anderen zu tauschen.
Daher würde mich auch der umgekehrte Weg interessieren.
Also aus Passwort "abcde" jeweils eine Zahl zu machen. Dazu müsste man aber erst einmal die eingegebenen Buchstaben einzeln aus dem Inputbefehl auslesen und dann in Zahlen umzurechnen.
Gruessle
Momohk |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 04.06.2014, 10:33 Titel: |
|
|
@grindstone .. du hast es geschaft mich davon zu überzeugen, nicht weiter dagegen zu argumentieren
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Affemitwaffel
Anmeldungsdatum: 02.06.2011 Beiträge: 39
|
Verfasst am: 04.06.2014, 12:22 Titel: |
|
|
Code: | buchstabe = Chr((x Mod 26) + 96) |
Was spricht dagegen?  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 05.06.2014, 09:16 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | du hast es geschaft mich davon zu überzeugen, nicht weiter dagegen zu argumentieren | Den Tag streich ich mir im Kalender rot an!
Und ich setze noch einen drauf: Code: | Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
Do
zahl += 1
buchstabe[0] = alphabet[zahl Mod 26]
Print zahl;" ";buchstabe
Sleep 300
Loop | Diese Konversionsmethode dürfte in punkto Geschwindigkeit wohl kaum noch zu übertreffen sein. Oder weiß jemand noch was schnelleres? Dann her damit!
@Affemitwaffel: Zitat: | buchstabe = Chr((x Mod 26) + 96)
Was spricht dagegen? | Das Resultat entspricht nicht der Aufgabenstellung. Der Buchstabe wird aus dem Divisionsrest generiert, und der geht von 0 bis 25, nicht von 1 bis 26. Da die Zuordnung aber bei 1 beginnen soll, müssen alle Zahlen um diese eine Stelle verschoben werden. Das ist im Grunde das gleiche Problem wie im Vergleich zu
@momohk:
Die oben gezeigte Methode dürfte auch für dich interessant sein, als "Schlüssel" könntest du die Buchstaben umsortieren. Du solltest allerdings erst dann mit Pointerindizierung arbeiten, wenn du weißt, wie sie funktioniert. Wenn du
Code: | buchstabe[0] = alphabet[zahl Mod 26] | durch Code: | buchstabe = Mid(alphabet,(zahl Mod 26) + 1, 1) | ersetzt, macht das Programm das gleiche, wenn auch um etwa den Faktor 8 - 10 langsamer, aber dafür kann es keine Programmabstürze produzieren. Viel Spaß beim Experimentieren!
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.06.2014, 14:00 Titel: |
|
|
@grindstone ... doch, das geht speedtechnisch durchaus noch etwas schneller
Mod ist vergleichsweise zu If langsamer .. daher:
Code: | For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
If zahl = 27 then zahl = 1
buchstabe[0] = alphabet[zahl]
Next
|
lief das bei mit in 17,6sec's und deiner variante in 23,1sec's durch
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|