Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Alphabet "hoch zählen"
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 02.06.2014, 09:31    Titel: Alphabet "hoch zählen" Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 02.06.2014, 11:39    Titel: Antworten mit Zitat

Hallo momohk!

Dazu brauchst du keine Schleife, der Buchstabe lässt sich direkt berechnen. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 02.06.2014, 13:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 02.06.2014, 13:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 02.06.2014, 15:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 02.06.2014, 16:03    Titel: Antworten mit Zitat

Code:
PRINT 4^12

Siehe auch http://www.freebasic-portal.de/befehlsreferenz/mathematik-565.html
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 02.06.2014, 16:05    Titel: Antworten mit Zitat

Danke, habe es auch gerade gefunden lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 03.06.2014, 09:16    Titel: Antworten mit Zitat

@ 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 lächeln ), 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, grinsen 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 03.06.2014, 12:17    Titel: Antworten mit Zitat

@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 zwinkern

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 Zunge rausstrecken .. ich "denke" da warscheinlich nicht mehr richtig.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 03.06.2014, 19:14    Titel: Antworten mit Zitat

Zitat:
Ist dadurch Identisch, spart aber eine Operation zwinkern

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. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 04.06.2014, 00:00    Titel: Antworten mit Zitat

@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"))

zwinkern

Alles andere ist quasi ablauftechnisch identisch.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.06.2014, 01:08    Titel: Antworten mit Zitat

Wenn ihr schon so low-level optimiert, optimiert lieber mal den teuren Print-Befehl weg Zunge rausstrecken
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 04.06.2014, 08:29    Titel: Antworten mit Zitat

Hola.

Da scheine ich ja ein Thema angeschoben zu haben zwinkern

Ich danke euch auf jeden Fall für eure Hilfe und werde der Diskussion freudig folgen lächeln

Gruessle
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 04.06.2014, 08:56    Titel: Antworten mit Zitat

@ 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? lächeln ), 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 04.06.2014, 10:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 04.06.2014, 10:33    Titel: Antworten mit Zitat

@grindstone .. du hast es geschaft mich davon zu überzeugen, nicht weiter dagegen zu argumentieren grinsen


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Affemitwaffel



Anmeldungsdatum: 02.06.2011
Beiträge: 39

BeitragVerfasst am: 04.06.2014, 12:22    Titel: Antworten mit Zitat

Code:
buchstabe = Chr((x Mod 26) + 96)

Was spricht dagegen? grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 04.06.2014, 12:23    Titel: Antworten mit Zitat

nichts. aber: http://forum.qbasic.at/viewtopic.php?p=105306#105306


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 05.06.2014, 09:16    Titel: Antworten mit Zitat

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! grinsen

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. lächeln Oder weiß jemand noch was schnelleres? Dann her damit! lächeln

@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
Code:
text[x]
im Vergleich zu
Code:
Mid(text,x,1)


@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! lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 05.06.2014, 14:00    Titel: Antworten mit Zitat

@grindstone ... doch, das geht speedtechnisch durchaus noch etwas schneller grinsen

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 Zunge rausstrecken


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz