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 Zurück  1, 2
 
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
nemored



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

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

Code:
   zahl += 1
   If zahl = 27 then zahl = 1

Was ist damit?
Code:
   zahl = iif(zahl = 26, 1, zahl +1)

So, und jetzt ist die Lesbarkeit für einen ungeübten Programmierer völlig im Eimer. grinsen
_________________
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: 05.06.2014, 14:48    Titel: Antworten mit Zitat

@nemored ... 20.6 sec's durchgeknallt

entweder is das IIF als funktion hinterlegt, oder durch das else wird ein zweiter sprung gemacht, der zu na operation mehr führt, und dadurch langsamer wird.


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


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 05.06.2014, 17:10    Titel: Antworten mit Zitat

momohk hat Folgendes geschrieben:
Ich wollte ein wenig mit Verschlüsselung rum spielen und die einfachste Art ist ja jeden Buchstaben gegen einen anderen zu tauschen.


Wikipedia: ROT13 (und auch ROT47)

Einfache Umsetzung davon:

http://beilagen.dreael.ch/QB/Rot13_Rot47.bas

Generell: Ich würde eine FUNCTION erstellen wie im Beispiel, um die Aufgabe des "Verschlüsseln" einkapseln zu können, um das Ganze wiederverwendbar zu machen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1280
Wohnort: Ruhrpott

BeitragVerfasst am: 06.06.2014, 08:13    Titel: Antworten mit Zitat

@ThePuppetMaster:
Erstaunlich, bei mir ist der Zeitunterschied deutlich größer (20,9 : 98,4 Sekunden).

Aber der Vergleich hinkt ein wenig. Deine Variante imit dem "If" funktioniert nur, wenn "zahl" kontinuierlich hochgezählt wird, während nach der Aufgabenstellung von momohk jede beliebige Integerzahl verarbeitet werden soll. Das ist etwa so, als wenn du die Geradengleichung mit dem Bresenham-Algorithmus vergleichst.

Das Testprogramm sollte also etwa so aussehen:
Code:
Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
Dim As Double zeitmerken = Timer

For X as UInteger = 0 to &HFFFFFFFE
   zahl = Int(Rnd * 2^30)
   buchstabe[0] = alphabet[zahl Mod 26]
Next
Print Timer - zeitmerken
Sleep
Dabei scheint mir eine kleinere Obergrenze für x empfehlenswert, der Testlauf bei mir (zugegeben: mein Rechenknecht ist schon etwas betagt) hat 439,6 Sekunden gedauert. lächeln

@nemored:
Zitat:
So, und jetzt ist die Lesbarkeit für einen ungeübten Programmierer völlig im Eimer.
Ein ungeübter Programmierer dürfte der ganzen Diskussion hier mit einer gewissen Verständnislosigkeit folgen... grinsen

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: 06.06.2014, 10:10    Titel: Antworten mit Zitat

Code:
Dim TZeit3 as Double
TT = Timer()
Dim zahl3 As Integer = 0
Dim Zahltemp3 as Integer
Dim alphabet3 As String = "zabcdefghijklmnopqrstuvwxy"
Dim buchstabe3 as String = " "
For X as UInteger = 0 to &HFFFFFFFE
   zahl3 += 1
   If zahl3 > 26 then zahl3 = zahl3 Mod 26
   buchstabe3[0] = alphabet3[zahl3]
Next
TZeit3 += Timer() - TT
Print TZeit3


mit 18,2secs nur etwas langsamer als meine erste variante. Zunge rausstrecken


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



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 07.06.2014, 01:51    Titel: Antworten mit Zitat

so ihr geschwindigkeitsfanatiker grinsen

ich hab da mal alles zusammgetragen und selber noch was
dazu erfunden was bei mir zZ alle rekorde schlaegt.

Code:

'grinstones random zahlen
Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
'haubitze fixed stringlengt
Dim alphabet1 As String*26 = "zabcdefghijklmnopqrstuvwxy"
Dim As Double zeitmerken = Timer

For X as UInteger = 0 to &HFFFFFFFE
   zahl += 1
   buchstabe[0] = alphabet[zahl Mod 26]
Next
Print "grindstone count mod ptr: " & Timer - zeitmerken

zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl = iif(zahl = 26, 1, zahl +1)
   buchstabe[0] = alphabet[zahl]
Next
Print "nemored count iif ptr: " & Timer - zeitmerken

'ThePuppetMaster count if zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl += 1
   If zahl = 26 then zahl = 1
   buchstabe[0] = alphabet[zahl]
Next
Print "ThePuppetMaster count if ptr: " & Timer - zeitmerken

'ThePuppetMaster count zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl += 1
   If zahl > 26 then zahl = zahl Mod 26
   buchstabe[0] = alphabet[zahl]
Next
Print "ThePuppetMaster count if ptr 2: " & Timer - zeitmerken

'haubitze count zahlen
Dim buchstabe4 as String*1
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl += 1
   buchstabe4[0] = alphabet[zahl And 27]
Next
Print "Haubitze count and ptr: " & Timer()  - zeitmerken

zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl +=1
   buchstabe4[0] = alphabet1[zahl And 27]
Next
Print "Haubitze count and ptr fixed alphabet: " & Timer()  - zeitmerken

zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl = Int(Rnd * 2^30)
   buchstabe[0] = alphabet[zahl Mod 26]
Next
Print "grindstone rnd mod ptr: " & Timer - zeitmerken

'absturz happy
'zeitmerken=Timer
'For X as UInteger = 0 to &HFFFFFFFE
'   zahl = Int(Rnd * 2^30)
'   If zahl = 27 then zahl = 1
'   buchstabe[0] = alphabet[zahl]
'Next
'Print "ThePuppetMaster rnd if ptr: " & Timer - zeitmerken

'haubitze rnd zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl = Int(Rnd*2^30)
   buchstabe4[0] = alphabet[zahl And 27]
Next
Print "Haubitze rnd and ptr: " & Timer()  - zeitmerken

zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl = Int(Rnd*2^30)
   buchstabe4[0] = alphabet1[zahl And 27]
Next
Print "Haubitze rnd and ptr fixed alphabet: " & Timer()  - zeitmerken

Sleep


'compiler flags: fbc -s console
'
'ergebnisse:
'grindstone count mod ptr:                18.10492339080611
'nemored count iif ptr:                   16.36316170717009
'ThePuppetMaster count if ptr:            10.14280300711766
'ThePuppetMaster count if ptr 2:          11.26934865970065
'Haubitze count and ptr:                   9.477473192258117
'Haubitze count and ptr fixed alphabet:    9.465687843810883
'grindstone rnd mod ptr:                 193.9896897939169
'Haubitze rnd and ptr:                   161.1050244443348
'Haubitze rnd and ptr fixed alphabet:    160.7653548807987


naja die stringlaenge zu begrenzen hatt nun nich wirklich was gebracht :/

erstaunlich finde ich aber mal wie langsam die sache wirklich wird
wenn man zufaellige zahlen nimmt.

salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 07.06.2014, 09:24    Titel: Antworten mit Zitat

Zitat:
erstaunlich finde ich aber mal wie langsam die sache wirklich wird
wenn man zufaellige zahlen nimmt.

Nun ja, die tatsächlich aufwendigen Rechenoperationen wie das *2^30 finden ja nur dort statt. Mit SHL 30 ist es schon schneller. Und wie schnell oder langsam RND ist, habe ich jetzt nicht getestet, aber hinter RND stecken auch ein paar Funktionsschritte.

Für so Varianten wie
Code:
   zahl = iif(zahl = 26, 1, zahl +1)

oder auch die folgende IF-Version sollte man bitte vor der Schleife sicher stellen, dass zahl auf einen Wert < 26 zurückgestellt wird. Zunge rausstrecken
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1280
Wohnort: Ruhrpott

BeitragVerfasst am: 07.06.2014, 10:01    Titel: Antworten mit Zitat

@ ThePuppetMaster:
Da hast du leider wieder haarscharf an der Aufgabenstellung vorbeiprogrammiert. traurig Auch wenn es hier etwas verklausulierter ist als bei deinem letzten Beispiel: Du machst nichts anderes, als eine Variable immer wieder von 1 bis 26 heraufzuzählen und dann wieder auf 1 zu setzen. Laut Aufgabenstellung wird die umzuwandelnde Zahl aber von außen vorgegeben und kann jede beliebige Integerzahl sein.

Außerdem ist die Umwandlung nicht korrekt, wie du sehen kannst, wenn du die Ausgabe einmal ausdruckst:
Code:
Dim TZeit3 as Double
Dim TT As Double = Timer()
Dim zahl3 As Integer = 0
Dim Zahltemp3 as Integer
Dim alphabet3 As String = "zabcdefghijklmnopqrstuvwxy"
Dim buchstabe3 as String = " "
For X as UInteger = 0 to &HFFFFFFFE
   zahl3 += 1
   If zahl3 > 26 then zahl3 = zahl3 Mod 26
   buchstabe3[0] = alphabet3[zahl3]
   Print zahl3;" ";buchstabe3;" ";buchstabe3[0]
   Sleep 1000
Next
TZeit3 += Timer() - TT
Print TZeit3
Statt "z" wird hier ein Chr(0) ausgegeben.

@ Haubitze:
Das ist ja wirklich eine beeindruckende Fleißarbeit! lächeln

Leider muß ich auch bei deiner Idee sagen: Schnell, aber falsch! traurig Wenn du die Berechnungen deines Programms ausdruckst, wirst du sehen, daß es ziemlichen Unsinn macht.
Code:
Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy"
Dim As Double zeitmerken = Timer

'haubitze count zahlen
Dim buchstabe4 as String*1
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
   zahl += 1
   buchstabe4[0] = alphabet[zahl And 27]
   Print zahl;" ";buchstabe4;" ";buchstabe4[0]
   Sleep 1000
Next
Und bei deiner Sektion "absturz" kann man sehr schön sehen, was passiert, wenn man beim Hantieren mit Pointern nicht aufpasst: Der dort berechnete Index liegt mit fast 100%iger Wahrscheinlichkeit weit außerhalb des erlaubten Bereichs, so daß das Betriebssystem das Programm beendet, damit es keinen Schaden anrichten kann.
Haubitze hat Folgendes geschrieben:
erstaunlich finde ich aber mal wie langsam die sache wirklich wird wenn man zufaellige zahlen nimmt.
Das stimmt, die Berechnung der Zufallszahlen ist ziemlich zeitaufwendig.

Die Idee dahinter war, von außen vorgegebene beliebige Integerzahlen zu simulieren, aber das ist eigentlich unnötig. Wenn man stattdessen das "x" aus der Zählschleife verwendet, rechnet man (fast) alle Zahlen um, die jemals vorkommen können, und das in wesentlich kürzerer Zeit:
Code:
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
Dim As Double zeitmerken = Timer

For X as UInteger = 1 to &HFFFFFFFE
   buchstabe[0] = alphabet[x Mod 26]
   'Print x;" ";buchstabe;" ";buchstabe[0]
   'Sleep 1000
Next
Print Timer - zeitmerken
Sleep
Bei mir läuft dieses Programm in 64,9 Sekunden durch (gegenüber 439,6 Sekunden mit Zufallszahlen).

Und jetzt seid ihr wieder dran. zwinkern

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
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 07.06.2014, 11:06    Titel: Antworten mit Zitat

hm du hast recht, aber irendwo hatte ich mal gelesen
das man a MOD b durch a AND b+1 ersezen kann.
oder gabs da eine bestimte klausel wann man das einsetzen
kann?

naja auf jedenfall funzt dat nit... :/
danke fuer den hinweis.

salute

edit: ja man kann and einsetzen aber NUR wenn
der zu berechnende modulo ein vielvaches von 2
bzw 2^n ist. dann kann man statt a MOD b
auch a AND b-1 schreiben.
Code:

For X as UInteger = 0 to 100'&HFFFFFFFE
    Print X Mod 4, X And 3
Next

funzt supergut

NUR: da unser alphabet aber nicht 2^n buchstaben lang ist funzt
das is diesem falle nich :/

Edit2:
auf jeden fall sit das ein super beispiel fuer momohk wo er/sie
sehen kann wie man durch eine einfache "geschwindigkeitsteigerung"
sein ganzes program mal unfaehig machen kann. daher momohk
ueben ueben ueben zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 07.06.2014, 14:11    Titel: Antworten mit Zitat

Haubitze hat Folgendes geschrieben:
hm du hast recht, aber irendwo hatte ich mal gelesen
das man a MOD b durch a AND b+1 ersezen kann.

Wenn das Allgemeingültig wäre, gäbe es ja keinen Grund, den langsamen Modulo-Operator überhaupt zu implementieren. Zunge rausstrecken Die allermeisten Bit-Schubsereien funktionieren nur mit Zahlen, die eine Zweierpotenz sind, also z.B. a MOD 4 ist äquivalent zu a AND 3. Als ich das letzte mal nachgeschaut habe, war 26 keine Zweierpotenz. happy

Allgemein sei hier noch angemerkt: In jedem Schleifendurchlauf die Modulo-Eigenschaft zu prüfen ist vergeudete Rechenzeit. Wenn einmal Modulo gerechnet wurde, kann man sich für die nächsten 25 durchläufe relativ sicher sein, dass der Wert kleiner 26 bleibt.
_________________
» 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
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 07.06.2014, 19:42    Titel: Antworten mit Zitat

hi jojo,

das gild aber nur dann wenn die uebergebenen werte gleichmaessig steigend oder fallend sind.
kommen zufaellige werte rein so muss man schon bei jedem schleifen-
durchlauf den modulo berechen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 07.06.2014, 20:50    Titel: Antworten mit Zitat

Nicht notgedrungen - TPM macht das ja mit einer vorhergehenden IF-Abfrage.
_________________
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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1280
Wohnort: Ruhrpott

BeitragVerfasst am: 08.06.2014, 14:33    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
TPM macht das ja mit einer vorhergehenden IF-Abfrage.

Korrigiert mich, wenn ich etwas falsches sage, aber meiner Meinung nach müsste die Mod-Funktion ziemlich schnell sein, da die Division mit Rest im Prozessor fest verdrahtet ist (Assemblerbefehl DIV bzw. IDIV), auf jeden Fall schneller als ein If..Then.

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
nemored



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

BeitragVerfasst am: 08.06.2014, 15:38    Titel: Antworten mit Zitat

Offenbar ist sie es nicht, jedenfalls was die ausgegebenen Zeitdauern schließen lassen. Mit der dahinter stehenden Technik kenne ich mich leider nicht aus. Müsste "man" sich mal an der Assembler-Datei anschauen, was FreeBASIC daraus macht.

Ich hätte auch gedacht, dass ein zuweisung=IIF() schneller sein müsste als eine Zuweisung gefolgt von einem IF. Letztendlich bestärkt mich das in meiner Philosophie, bzgl. Minimaloptimierung nicht so viel zu denken, sondern zur Not ein paar Nanosekunden Zeitverlust hinzunehmen. lachen
_________________
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
Jojo
alter Rang


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

BeitragVerfasst am: 08.06.2014, 16:13    Titel: Antworten mit Zitat

Division ist so ziemlich die langsamste Arithmetische Operation (einige dutzende Clocks), die du auf deinem Prozessor ausführen kannst. Ein Vergleich/Sprung ist wesentlich schneller, kann aber auf modernen Prozessoren (alles was in den letzten 20 Jahren an x86-Prozessoren so hergestellt wurde) natürlich zu einem Pipeline-Stall führen, was auch teuer ist, gerade wenn das Ergebnis der Abfrage nicht vorhersehbar ist.
Wenn dich die Sache interessiert, lohnt es sich, mal in die software optimization manuals von Agner Fog zu schauen, speziell "The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers" in diesem Fall.
_________________
» 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
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1280
Wohnort: Ruhrpott

BeitragVerfasst am: 17.06.2014, 10:07    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Letztendlich bestärkt mich das in meiner Philosophie, bzgl. Minimaloptimierung nicht so viel zu denken, sondern zur Not ein paar Nanosekunden Zeitverlust hinzunehmen.
Das sehe ich auch so. Bei einem Programm, das auf Tastatureingaben wartet, ist eine Geschwindigkeitsoptimierung so sinnvoll wie Schlittschuhe in der Sahara. zwinkern

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
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 Zurück  1, 2
Seite 2 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