ALGORITHMEN - Teil XX: Zwischen Fersuch und Irrdumm

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Lösung zu EaR 14: STRG+D
      --------------------------
      Die Tabelle im Spoiler enthält Tastenkombinationen für die Arbeit mit WordPad.
      Spoiler anzeigen

      WordPad Tastaturkürzel
      ======================
      Strg+N ... Ein neues Dokument erstellen
      Strg+O ... Öffnen eines vorhandenen Dokuments
      Strg+S ... Änderungen an einem Dokument speichern
      F12 ...... Speichern Sie das Dokument als neue Datei.
      Strg+P ... Ein Dokument drucken
      Alt+F4 ... WordPad schließen
      Strg+Z ... Eine Änderung rückgängig machen
      Strg+Y ... Eine Änderung wiederholen
      Strg+A ... Das gesamte Dokument auswählen
      Strg+X ... Eine Auswahl ausschneiden
      Strg+C ... Kopieren einer Auswahl in die Zwischenablage
      Strg+V ... Eine Auswahl aus der Zwischenablage einfügen
      Strg+B ... Markierten Text fett setzen
      Strg+I ... Ausgewählten Text kursiv darstellen
      Strg+U ... Markierten Text unterstreichen
      Strg+=== . Markierten Text tiefgestellt machen
      Strg+Umschalt+== Markierten Text hochstellen
      Strg+L ... Text links ausrichten
      Strg+E ... Textmitte ausrichten
      Strg+R ... Text rechtsbündig ausrichten
      Strg+J ... Text ausrichten
      Strg+1 ... Einzelzeilenabstand einstellen
      Strg+2 ... Doppelten Zeilenabstand einstellen
      Strg+5 ... Zeilenabstand auf 1,5 einstellen
      Strg+Umschalt+> .Schriftgröße vergrößern
      Strg+Umschalt+< .Verkleinern der Schriftgröße
      Strg+Shift+A ... Ändernt die Zeichen alle Großbuchstaben.
      Strg+Shift+L ... Ändern des Aufzählungszeichens
      Strg+D ... Einfügen einer Microsoft Paint Zeichnung
      Strg+F ... Text in einem Dokument suchen
      F3 ....... Suchen Sie die nächste Instanz des Textes im Dialogfenster Suchen.
      Strg+H ... Text in einem Dokument ersetzen
      Strg+Linkspfeil ....... Bewegen Sie den Cursor ein Wort nach links.
      Strg+Rechtspfeil ...... Bewegen Sie den Cursor ein Wort nach rechts.
      Strg+Pfeil_nach_oben .. Bewegen Sie den Cursor auf die Zeile über der Zeile.
      Strg+Pfeil_nach_unten . Bewegen Sie den Cursor auf die folgende Zeile
      Strg+Home ... An den Anfang des Dokuments springen
      Strg+Ende ... An das Ende des Dokuments springen
      Strg+Seite_nach_oben ... Eine Seite nach oben blättern
      Strg+Seite_nach_unten .. Eine Seite nach unten blättern
      Strg+Löschen ... Das nächste Wort löschen
      F10 ............ Keytips anzeigen
      Umschalt+F10 ... Zeigt das aktuelle Kontextmenü an.
      F1 .............. WordPad-Hilfe öffnen
    • Abt. Verlegenheitslösung
      ==================
      Nachdem die PTB Braunschweig die Atomzeitserver offenbar etwas umgestellt hat, funktionieren einige Programme nicht mehr. Da es aber Branchenservices und Fachgeschäfte mit Atomzeitangaben gibt, ist die folgende Verlegenheitslösung entstanden - Achtung, in nachstehender Form vor allem für Österreich gültig! Aber auf Google kann man sicher Dienste finden, die auf das jeweilige Land Bezug nehmen.
      Gruss

      Quellcode

      1. WindowTitle "Uhrzeit und Datum":WindowStyle 24:Window 100,100 - 200,100
      2. cls:font 2:declare c$,url$,OnString$,ldl&,lon&,zeit$,datm$,in&,Tag$
      3. url$="https://www.zeitzonen.de/oesterreich.html":print "\n zeitzonen.de ..."
      4. @downloadfile(url$):while %Loading:waitinput 333:endwhile:ldl&=&Bytesread
      5. CLS':print "\n ";ldl&;" Byte\n":OnString$="time clock":lon&=len(OnString$)
      6. in&=instr(OnString$,$Download):if in&<=0:print " Zeit nicht gefunden!"
      7. else :zeit$=mid$($Download,in&+lon&+2,8):endif
      8. OnString$="<span class="+chr$(34)+"weekday"+chr$(34)+">"
      9. lon&=len(OnString$):in&=instr(OnString$,$Download)
      10. if in&<=0:print " Tag nicht gefunden!":else :Tag$=mid$($Download,in&+lon&,2)
      11. endif:in&=instr(chr$(34)+"date"+chr$(34),$Download)
      12. if in&<=0:print "Datum nicht gefunden!"
      13. else :Datm$=mid$($Download,in&+7,10):endif
      14. print "\n ";Tag$;" ";Datm$;" ";Zeit$:waitinput 6000:End
      Alles anzeigen
    • Abt. Parametrierte Figuren
      ====================
      Die sog. Superformel (Youtube, engl.) erzeugt bei geeigneter Wahl der Parameter recht interessante Figuren. Für Bildschirmschoner ist das aber zuwenig - da will man Bewegung. Doch auch diese wird irgendwann langweilig, wie das nachstehende Machwerk als abschreckendes Beispiel zeigt.
      Gruss

      P.S. Ich trauere immer noch dem alten DOS-Bildschirmschoner Dazzle nach. Nun habe ich ihn wenigstens als Youtube-Video wiedergefunden: Nostalgie pur!

      Quellcode

      1. WindowTitle "Figuren mittels Superformel erzeugen"
      2. WindowStyle 24:Cls rgb(0,0,0):ShowMax
      3. var xh&=width(%hwnd)\2:var yh&=height(%hwnd)\2:randomize:font 2
      4. Proc Superformel 'liefert Radius(phi!,...)
      5. parameters phi!,Symmetrie!,Form1!,Form2!,Form3!,xHalbachse!,yHalbachse!
      6. casenot xHalbachse!*yHalbachse!:return 0
      7. var Winkel!=Symmetrie!*phi!*0.25
      8. 'r! = (abs(cos(Winkel!)/xHalbachse!)^Form2!+abs(sin(Winkel!)/yHalbachse!)^Form3!)^(-1/Form1!)
      9. var co!=cos(Winkel!):var si!=sin(Winkel!)
      10. var r!=0:case co!<>0:r!=abs(co!/xHalbachse!)^Form2!
      11. case si!<>0:r!=r!+abs(sin(Winkel!)/yHalbachse!)^Form3!
      12. :if r!>0:r! = r!^(-1/Form1!):else r!=0:endif
      13. return r!
      14. EndProc
      15. :Proc To_xy :parameters r!,phi!:x!=r!*cos(phi!):y!=r!*sin(phi!):endproc
      16. :Proc rPhi :parameters x!,y!:r!=sqrt(sqr(x!)+sqr(y!)):phi!=ArcTan4(x!,y!):endproc
      17. Proc ArcTan4 :parameters x!,y!:var pi!=3.1415926535897932:var w!=0
      18. if x!=0:if y!>0:w!=pi!*0.5:elseif y!<0:w!=pi!*1.5:else :w!=0:endif :return w!:elseif x!>0
      19. if y!=0:w!=0:return w!:elseif y!>0:if x!>y!:w!=arctan(y!/x!):else :w!=pi!/2-arctan(x!/y!):endif
      20. return w!:else :if x!<-y!:w!=pi!*1.5+arctan(x!/-y!):else :w!=2*pi!-arctan(-y!/x!):endif :return w!
      21. endif :else :if y!>0:if x!>-y!:w!=pi!/2+arctan(-x!/y!):return w!:else :w!=pi!-arctan(y!/-x!)
      22. return w!:endif :elseif y!<0:if x!<y!:w!=pi!+arctan(-y!/-x!):else :w!=pi!*1.5-arctan(-x!/-y!)
      23. endif :return w!:else :w!=pi!:return w!:endif :endif :Print " ArcTan4 ERROR":waitinput 1e5
      24. endproc
      25. MAIN:
      26. var s!=100 ' Size
      27. var f!=pi()/180
      28. Declare x!,y!,r!,phi!,w!,n&,\
      29. \
      30. Symmetrie!,Form1!,Form2!,Form3!,xHalbachse!,yHalbachse! :var Data$=\
      31. "3 5 18 18 1 1 "+"6 20 7 18 1 1 "+"4 2 4 13 1 1 "+"7 2 4 17 1 1 " +\
      32. "7 3 6 6 1 1 "+"3 3 14 2 1 1 "+"19 9 14 11 1 1 "+"12 15 20 3 1 1 "+\
      33. "8 1 1 8 1 1 "+"8 1 5 8 1 1 "+"8 3 4 3 1 1 "+"8 7 8 2 1 1 "+\
      34. "5 2 6 6 1 1 "+"6 1 1 6 1 1 "+"6 1 7 8 1 1 "+"7 2 8 4 1 1 "+\
      35. "3 2 8 3 1 1 "+"3 6 6 6 1 1 "+"4 1 7 8 1 1 "+"4 4 7 7 1 1 "+\
      36. "2 2 2 2 1 1 "+"2 1 1 1 1 1 "+"2 1 4 8 1 1 "+"3 2 5 7 1 1"
      37. Declare LSymmetrie!,LForm1!,LForm2!,LForm3!,LxHalbachse!,LyHalbachse!
      38. Declare p!,q!, p1!,p2!,p3!,p4!,p5!,p6!
      39. Nochmal:
      40. Whileloop 0,23:n&=&Loop
      41. Symmetrie!=val(substr$(Data$,6*n&+1," "))
      42. Form1!=val(substr$(Data$,6*n&+2," "))
      43. Form2!=val(substr$(Data$,6*n&+3," "))
      44. Form3!=val(substr$(Data$,6*n&+4," "))
      45. xHalbachse!=val(substr$(Data$,6*n&+5," "))
      46. yHalbachse!=val(substr$(Data$,6*n&+6," "))
      47. Whileloop 200,0,-2
      48. p!=&Loop/200:q!=1-p!
      49. p1!=LSymmetrie!*p!+Symmetrie!*q!
      50. p2!=LForm1!*p!+Form1!*q!
      51. p3!=LForm2!*p!+Form2!*q!
      52. p4!=LForm3!*p!+Form3!*q!
      53. p5!=LxHalbachse!*p!+xHalbachse!*q!
      54. p6!=LyHalbachse!*p!+yHalbachse!*q!
      55. phi!=0
      56. r!=Superformel(phi!,p1!,p2!,p3!,p4!,p5!,p6!)
      57. To_xy(r!,phi!)
      58. 'cls 0:locate 1,1:print " ";n&;" - ";&Loop;" "
      59. MCLS %maxx, %maxy, 0'$FFFFFF
      60. StartPaint -1
      61. Usepen 0,12,rgb(0,255,0)
      62. moveto xh&+s!*x!,yh&-s!*y!
      63. whileloop 0,360,3 :phi!=f!*&Loop
      64. r!=Superformel(phi!,p1!,p2!,p3!,p4!,p5!,p6!)
      65. To_xy(r!,phi!):Lineto xh&+s!*x!,yh&-s!*y!
      66. endwhile
      67. EndPaint
      68. MCopyBMP 0, 0 - %maxx,%maxy > 0, 0; 0
      69. ' waitinput 42
      70. Endwhile
      71. LSymmetrie!=Symmetrie!
      72. LForm1!=Form1!
      73. LForm2!=Form2!
      74. LForm3!=Form3!
      75. LxHalbachse!=xHalbachse!
      76. LyHalbachse!=yHalbachse!
      77. waitinput 1000
      78. 'cls 0
      79. Endwhile
      80. beep
      81. n&=0
      82. goto "Nochmal"
      Alles anzeigen
    • Abt. Zeitbedarf für Message-abholendes Waitinput stark reduzieren
      ================================================
      Jens-Arne Reumschüssel fand dazu kürzlich eine Lösung, die ohne API-Fummelei auskommt und eine deutliche Beschleunigung sowohl im Interpreter als auch Compiler bringt. Dazu im Anhang ein kleiner Benchmark.
      Gruss

      Quellcode

      1. WindowTitle "Messageabholendes Waitinput beschleunigt:"+\
      2. " Lösung von Jens-Arne Reumschüssel testen"
      3. '(CL) CopyLEFT 2019-01 by P.Specht, Vienna/AT/EU
      4. CLS:Randomize:font 2
      5. declare n&,tm&,i&,x&,y&,txt$,ungueltig&
      6. $IFNDEF COMPILER
      7. txt$="INTERPRETER"
      8. n&=2500
      9. $ELSE
      10. txt$="COMPILER"
      11. n&=4000
      12. $ENDIF
      13. AppendMenuBar 100," "+txt$+" zählt bis "+str$(n&)+\
      14. ". ESC-Taste soll erkannt werden und zerstört den laufenden Test!"
      15. print "\n OHNE Beschleunigung:",:x&=%pos:y&=%csrlin
      16. waitinput 3:sound 200,20:ungueltig&=0
      17. tm&=&GetTickCount
      18. Whileloop n&:locate 20,20:print &Loop;" ";
      19. i&=&Loop
      20. waitinput 3
      21. :if %Key="27":ungueltig&=1:break:endif
      22. Endwhile
      23. tm&=&GetTickCount-tm&
      24. locate y&,x&
      25. ifnot ungueltig&: print tm&,"ms"
      26. else :print "<abgebrochen>":clear ungueltig&
      27. Endif
      28. print "\n NUR Fastmode:",:x&=%pos:y&=%csrlin
      29. waitinput 3:sound 200,20:ungueltig&=0
      30. tm&=&GetTickCount
      31. set("Fastmode",1)
      32. Whileloop n&:locate 20,20:print &Loop;" ";
      33. waitinput 3
      34. :if %Key="27":ungueltig&=1:break:endif
      35. Endwhile
      36. set("Fastmode",0)
      37. tm&=&GetTickCount-tm&
      38. locate y&,x&
      39. ifnot ungueltig&: print tm&,"ms"
      40. else :print "<abgebrochen>":clear ungueltig&
      41. Endif
      42. print "\n NUR MIT rnd()-Chance:",:x&=%pos:y&=%csrlin
      43. waitinput 3::sound 200,20:ungueltig&=0
      44. tm&=&GetTickCount
      45. Whileloop n&:locate 20,20:print &Loop;" ";
      46. if rnd()>0.95
      47. waitinput 3
      48. :if %Key="27":ungueltig&=1:break:endif
      49. endif
      50. Endwhile
      51. tm&=&GetTickCount-tm&
      52. locate y&,x&
      53. ifnot ungueltig&: print tm&,"ms"
      54. else :print "<abgebrochen>":clear ungueltig&
      55. Endif
      56. print "\n LÖSUNG von Jens-Arne R.: Fastmode mit %PeekMessage:",:x&=%pos:y&=%csrlin
      57. waitinput 3:sound 200,20:ungueltig&=0
      58. tm&=&GetTickCount
      59. set("Fastmode",1)
      60. Whileloop n&:locate 20,20:print &Loop;" ";
      61. if %PeekMessage
      62. waitinput 3
      63. :if %Key="27":ungueltig&=1:break:endif
      64. Endif
      65. Endwhile
      66. set("Fastmode",0)
      67. tm&=&GetTickCount-tm&
      68. locate y&,x&
      69. ifnot ungueltig&: print tm&,"ms"
      70. else :print "<abgebrochen>":clear ungueltig&
      71. Endif
      72. print "\n OHNE JEDE ABFRAGE:",:x&=%pos:y&=%csrlin
      73. waitinput 3:sound 200,20:ungueltig&=0
      74. tm&=&GetTickCount
      75. Whileloop n&:locate 20,20:print &Loop;" ";
      76. :
      77. Endwhile
      78. tm&=&GetTickCount-tm&
      79. locate y&,x&
      80. ifnot ungueltig&: print tm&,"ms"
      81. else :print "<abgebrochen>":clear ungueltig&
      82. Endif
      83. hold:
      84. sound 2000,60
      85. Waitinput 7000:casenot %wmTimer:goto "hold"
      86. END
      Alles anzeigen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht () aus folgendem Grund: Tastenpreller

    • Neu

      Abt. Wie schnell bewegen sich Programmierer?
      ==================================
      Die tägliche Erddrehung verleiht einem Punkt am Äquator eine Geschwindigkeit von etwa 464 m/s = 1670 km/h,
      einem sitzenden Münchner auf 48.1351° Nördl. Breite immer noch 1115 km/h.

      Bezogen auf die jährliche Umkreisung der Sonne hat die Erde eine Geschwindigkeit von fast 30 Kilometern pro Sekunde,
      das sind rund 107.600 km/h. Das Sonnenesysstem selbst ist etwa 25.000 Lichtjahre vom Zentrum der Milchstraße entfernt und braucht für einen Umlauf grob 240 Millionen Jahre. Daraus folgt, daß sich das Sonnensystem mit rund 220 Kilometern pro Sekunde, das sind 782.000 km/h, in der Galaxie um das Zentrum bewegt.

      Die aus Messungen gegenüber der Hintergrundstrahlung des Universums abgeleitete Summe der verschiedenen Geschwindigkeitskomponenten unseres Sonnensystems beträgt etwa 370 Kilometer pro Sekunde bzw. 1.332.000 km/h.
      Die Milchstraße und ihre benachbarten Galaxien bilden nämlich die so genannte Lokale Gruppe, die sich auf das Sternbild Jungfrau (den Virgo-Haufen) zubewegt. Die Geschwindigkeit dieses Galaxienhaufens wurde zu etwa 630 Kilometer pro Sekunde = 2.268.000 km/h errechnet.

      Frage: Sind das nicht bereits relativistische Geschwindigkeiten?

      Kontrollrechnung :
      Lichgeschwindigkeit 299792,458 km/s = 17.987.547,48 km/min = 1.079.252.849 km/h

      2.268.000 km/h / 1.079.252.848,8 km/h = 0.002101454
      Antwort: Programmierer bewegen sich mit 0.21 % der Lichtgeschwindigkeit.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Neu

      Fortsetzung: ... und das gilt auch für die ggw. 28.504 angemeldeten Mitglieder von Paules PC-Forum, + 1 Info-Bot, minus einige Doubletten, Karteileichen und tatsächlich Verstorbene. Mit anderen Worten: Hier bewegen sich rund 28.400 Mitglieder mit 0.21 % der Lichtgeschwindigkeit weiter! :P
    • Neu

      Abt. Paralellogramm-Gleichung
      ====================
      Die Paralellogramm-Gleichung macht eine Aussage über die Quadrate der beiden Parallelogrammseiten im Verhältnis zu den Quadraten über der beiden Diagonalen dieses Parallelogramms (In der Schule war mir das offenbar vollkommen entgangen, deshalb hat es mich heute so erstaunt!).

      In Vektorform lautet diese Gleichung: ||a+b||^2 + ||a-b||^2 = 2*(||a||^2 + ||b||^2),
      wobei ||..|| ´Länge von x´ bzw. Abstand bedeutet (Mathematiker nennen das ´Norm´).

      In Komponentenschreibweise - für Computer ohne Vektor-Mathematikpaket - kann man das so schreiben:
      (ax+bx)^2+(ay+by)^2 + (ax-bx)^2+(ay-by)^2 = 2 * (ax^2+ay^2 + bx^2+by^2)

      bzw. in XProfan:
      sqr(ax+bx)+sqr(ay+by) + sqr(ax-bx)+sqr(ay-by) = 2 * (sqr(ax)+sqr(ay) + sqr(bx)+sqr(by))

      Probieren wir doch mal mit verschiedenen Werten, ob das stimmt:

      Quellcode

      1. WindowTitle "Parallelogrammgleichung überprüfen"
      2. CLS:font 2:randomize
      3. AppendMenuBar 100," Zufallswert 1 "+\
      4. "Zufallswert 2 Abs. u. Relativer Fehler"
      5. Declare ax!,ay!,bx!,by! 'Zufallwerte in weitem Bereich
      6. Declare z1!,z2! 'Linke und rechte Gleichungsseite
      7. Declare z3! 'Relativer Fehler, Alarm falls > 10^-15
      8. Nochmal:
      9. ax!=(1-2*rnd(2))*rnd()*10^(rnd(200)-100)
      10. ay!=(1-2*rnd(2))*rnd()*10^(rnd(200)-100)
      11. bx!=(1-2*rnd(2))*rnd()*10^(rnd(200)-100)
      12. by!=(1-2*rnd(2))*rnd()*10^(rnd(200)-100)
      13. z1!= sqr(ax!+bx!)+sqr(ay!+by!) + sqr(ax!-bx!)+sqr(ay!-by!)
      14. z2!= 2*(sqr(ax!)+sqr(ay!) + sqr(bx!)+sqr(by!))
      15. print tab(2);format$("%g",z1!);tab(26);format$("%g",z2!),
      16. print tab(50);format$("%g",z1!-z2!)
      17. if (z1!-z2!)<>0
      18. z3!=abs((z1!-z2!)/z1!)
      19. print tab(39);"Rel.Error: ";format$("%g",z3!)
      20. waitinput 1200
      21. if z3!>val("1e-15")
      22. sound 2000,200
      23. Print "\n F E H L E R A L A R M bei folgenden Komponenten:"
      24. print ax!
      25. print ay!
      26. print bx!
      27. print by!
      28. waitinput
      29. waitinput
      30. endif
      31. endif
      32. 'waitinput 10'000
      33. goto "Nochmal"
      Alles anzeigen
      Bei mir sieht es so aus als ob es stimmt - Beweis ist das im strengen Sinne natürlich keiner.
      Gruss

      P.S.: Wer die einleuchtende geometrische Deutung dieser Sache wissen will, kann sich in diesem informativen Youtube-Video von Prof. Weitz schlau machen.

      PPS.: Den echten Beweis gibt´s nachstehend im Spoiler!
      Spoiler anzeigen

      Die Parallelogrammgleichung:

      (ax+bx)^2+(ay+by)^2 + (ax-bx)^2+(ay-by)^2 = 2 * (ax^2+ay^2 + bx^2+by^2)

      ergibt mit ausgerechneten Quadraten:

      (ax^2+bx^2+2*ax*bx) +(ay^2+by^2+2*ay*by) + (ax^2+bx^2-2*ax*bx)+(ay^2+by^2-2*ay*by) =
      = 2 * (ax^2+ay^2 + bx^2+by^2)

      bzw. ohne die unnötigen Klammern:

      ax^2+bx^2+2*ax*bx + ay^2+by^2+2*ay*by + ax^2+bx^2-2*ax*bx + ay^2+by^2-2*ay*by =
      = 2 * ax^2+2 * ay^2 + 2 * bx^2+2 * by^2

      und etwas georndeter:

      ax^2+ ax^2 + ay^2+ ay^2 + bx^2+bx^2 + by^2+by^2 + 2*ax*bx +2*ay*by -2*ax*bx -2*ay*by =
      = 2 * ax^2+2 * ay^2 + 2 * bx^2+2 * by^2 ,

      somit:

      2*ax^2+2*ay^2+2*bx^2+2*by^2 + 2*ax*bx +2*ay*by -2*ax*bx -2*ay*by =
      2*ax^2+2*ay^2+2*bx^2+2*by^2 ,

      was soviel bedeutet wie

      2*ax*bx-2*ax*bx + 2*ay*by -2*ay*by = 0,

      daher 0 = 0, und das stimmt ja wohl auch!

      q.e.d.
      ------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()