to beende_hilfe ;schließt das Hilfefenster windowdelete "fhilfe end to beende_info ;schließt das Infofenster windowdelete "finfo end to beende_prog ;Beendet Programm windowdelete "hf unicon [MswLogo screen] unicon "Commander end to eingabe_test :n ;Prädikat, prüft die Gültigkeit der Eingabe der Teilungsnummer op and (:n < 21) (:n > -1) end to eingabe_test_2 :n ;Prädikat, prüft die Gültigkeit der Eingabe der Teilungszahl op and (:n < 1025) (:n > 1) end to fktx :x ;ruft Ausgangsfunktion mit den globalen Koeffizienten auf op fx :a3 :a2 :a1 :a0 :x end to fx :a3 :a2 :a1 :a0 :x ; Berechnet Funktionswert einer ganzen rationalen Funktion bis zum 3. Grad op :a3 * (potx :x 3) + :a2 * (potx :x 2) + :a1 * (potx :x 1) + :a0 end to hilfe ;Prozedur zeigt Hilfebildschirm an windowcreate "hf "fhilfe [Hilfe] 50 20 300 330 [] staticcreate "fhilfe "lhz1 [* Hinweise zur Bedienung des Programms] 10 8 250 8 staticcreate "fhilfe "lhz1a [++ Das Programm berechnet mit Hilfe verschiedener] 10 16 250 8 staticcreate "fhilfe "lhz1b [.....Methoden das bestimmte Integral einer Funktion.] 10 24 250 8 staticcreate "fhilfe "lhz1c [++ Dazu werden benötigt:] 10 32 250 8 staticcreate "fhilfe "lhz1d [--- die Daten der ganzen rationalen Funktion dritten Grades] 10 40 250 8 staticcreate "fhilfe "lhz1e [--- sowie die Integrationsgrenzen] 10 48 250 8 staticcreate "fhilfe "lhz1f [++ Dafür stehen 6 Eingabefelder zur Verfügung.] 10 56 250 8 staticcreate "fhilfe "lhz1f2 [++ Die eingegeben Werte müssen mit dem Button Werte-einlesen] 10 64 250 8 staticcreate "fhilfe "lhz1f3 [.....gespeichert werden.] 10 72 250 8 staticcreate "fhilfe "lhz1g [++ Über die entsprechenden Buttons kann die Methode ausgewählt werden.] 10 80 250 8 staticcreate "fhilfe "lhz1h [++ Die Rechteckregel (RER) basiert auf dem Intervallhalbierungverfahren.] 10 88 250 8 staticcreate "fhilfe "lhz1i [++ Hierfür sind Teilungsnummern einzugeben:] 10 96 250 8 staticcreate "fhilfe "lhz1j [--- Teilungsnummer 0 bedeutet: keine Teilung des Intervalls] 10 104 250 8 staticcreate "fhilfe "lhz1k [--- Teilungsnummer 1 bedeutet: 1.Teilung (2 Teilintervalle)] 10 112 250 8 staticcreate "fhilfe "lhz1l [--- Teilungsnummer 2 bedeutet: 2.Teilung (4 Teilintervalle) usw.] 10 120 250 8 staticcreate "fhilfe "lhz1m [++ Für alle anderen Methoden gilt:] 10 128 250 8 staticcreate "fhilfe "lhz1n [--- Die einzugebende Teilungszahl entspricht der Anzahl der Teilintervalle] 10 136 250 8 staticcreate "fhilfe "lhz1o [--- Um eine Vergleichsmöglichkeit zu bekommen,] 10 144 250 8 staticcreate "fhilfe "lhz1p [--- beträgt der maximale Wert der Teilungszahl 1024 = 2^10] 10 152 250 8 staticcreate "fhilfe "lhz1q [--- und entspricht somit der Teilintervallzahl der 10. Teilung der RER] 10 160 250 8 staticcreate "fhilfe "lhz1r [++ Die größte Teilungsnummer der RER beträgt 20] 10 168 250 8 staticcreate "fhilfe "lhz1s [++ Diese Grenze ist nur deswegen gesetzt, da selbst mein 3GHz-PC] 10 176 250 8 staticcreate "fhilfe "lhz1t [..... zur Berechnung der 20. Teilung ca. 9 Minuten braucht.] 10 184 250 8 staticcreate "fhilfe "lhz1u [++ Die über den Listboxen liegenden Buttons berechnen das Integral] 10 192 250 8 staticcreate "fhilfe "lhz1v [.....für die jeweilige Teilung.] 10 200 250 8 staticcreate "fhilfe "lhz1w [++ Die unteren Buttons erzeugen eine Liste aller Integrale für] 10 208 250 8 staticcreate "fhilfe "lhz1x [.....die Teilungen von 0 bis n (RER) bzw. von 2 bis i (STR, TTR, SIR)] 10 216 250 8 staticcreate "fhilfe "lhz2 [* Informationen zur numerischen Integration] 10 232 250 8 staticcreate "fhilfe "lhz2a [++ Das Programm untersucht das Verhalten von fünf numerischen Verfahren] 10 240 250 8 staticcreate "fhilfe "lhz2b [..... zur näherungsweisen Berechnung von Integralen:] 10 248 250 8 staticcreate "fhilfe "lhz2c [--- Rechteckregel (RER), Sehnentrapezregel (STR)] 10 256 250 8 staticcreate "fhilfe "lhz2d [--- Tangententrapezregel (TTR), Simpsonregel (SIR)] 10 264 250 8 staticcreate "fhilfe "lhz2e [--- und die Keplersche Faßregel (KFR)] 10 272 250 8 staticcreate "fhilfe "lhz2f [++ Nähere Informationen sind im beiliegenden Handbuch dargelegt] 10 280 250 8 buttoncreate "fhilfe "bhende "Schließen 200 290 80 10 [beende_hilfe] end to info ;Prozedur zeigt Informationsbildschirm an windowcreate "hf "finfo [Info] 90 90 175 130 [] staticcreate "finfo "liz1 [Dieses Programm entstand als Belegarbeit] 15 10 150 8 staticcreate "finfo "liz2 [zur Lehrveranstaltung] 50 20 150 8 staticcreate "finfo "liz3 [Algorithmierung/Programmierung I] 30 30 150 8 staticcreate "finfo "liz4 [Funktionale Programmierung] 40 40 150 8 staticcreate "finfo "liz5 [an der TU Dresden, Fakultät Informatik] 20 50 150 8 staticcreate "finfo "liz6 [unter Leitung von Frau Dr. B. Timmermann] 15 60 150 8 staticcreate "finfo "liz7 [Programm: (C) Frank Kaden 2006 / Matr.3208362] 5 70 200 8 buttoncreate "finfo "biende "Schließen 75 90 80 10 [beende_info] end to kfr ;Prozedur zum Funktionsaufruf Keplersche Fassregel ;zur Ausgabe des Funktionswertes listboxaddstring "lbkfr kfr_komplett 2 :a :b end to kfr_komplett :n :a :b ;kfr_summe berechnen op ((2 * str_komplett :n :a :b) + ttr_komplett :n :a :b) / 3 end to lb_loeschen ;Prozedur nur Listboxen listboxdelete "lbreru listboxcreate "hf "lbreru 5 200 75 100 listboxdelete "lbrero listboxcreate "hf "lbrero 85 200 75 100 listboxdelete "lbstr listboxcreate "hf "lbstr 165 200 75 100 listboxdelete "lbttr listboxcreate "hf "lbttr 245 200 75 100 listboxdelete "lbsir listboxcreate "hf "lbsir 325 200 75 100 listboxdelete "lbkfr listboxcreate "hf "lbkfr 405 200 75 100 end to liste_rer ;Prozedur erzeugt Liste von Partialsummen für die Rechteckregel make "tnr2 first comboboxgettext "ctnr ifelse eingabe_test :tnr2 [for [i 0 :tnr2 1] [listboxaddstring "lbreru rer_u_komplett :i :a :b]]~ [listboxaddstring "lbreru "falsche_Eingabe] ifelse eingabe_test :tnr2 [for [i 0 :tnr2 1] [listboxaddstring "lbrero rer_o_komplett :i :a :b]]~ [listboxaddstring "lbrero "falsche_Eingabe] end to liste_sir ;Prozedur erzeugt Liste von Partialsummen für die Tangententrapezregel make "tnz4 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz4 [for [m 1 :tnz4 1] [ifelse (remainder :m 2) = 0 [listboxaddstring "lbsir sir_komplett :m :a :b]~ [listboxaddstring "lbsir "i_ungerade]]]~ [listboxaddstring "lbsir "falsche_Eingabe] end to liste_str ;Prozedur erzeugt Liste von Partialsummen für die Sehnentrapezregel make "tnz2 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz2 [for [j 1 :tnz2 1] [listboxaddstring "lbstr str_komplett :j :a :b]]~ [listboxaddstring "lbstr "falsche_Eingabe] end to liste_ttr ;Prozedur erzeugt Liste von Partialsummen für die Tangententrapezregel make "tnz3 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz3 [for [k 1 :tnz3 1] [ifelse (remainder :k 2) = 0 [listboxaddstring "lbttr ttr_komplett :k :a :b]~ [listboxaddstring "lbttr "i_ungerade]]]~ [listboxaddstring "lbttr "falsche_Eingabe] end to loesche_tnr0 ;Prozedur löscht Eingabefeld Teilungsnummer ;setzt globale Variable tnr auf 0 messagebox "Fehler_Teilungsnummer "Außerhalb_des_zugelassenen_Bereiches__Teilungsnummer_wird_auf_0_gesetzt comboboxsettext "ctnr 0 make "tnr 0 end to loesche_tnz0 ;Prozedur löscht Eingabefeld Teilungszahl ;setzt globale Variable tnz auf 2 messagebox "Fehler_Teilungszahl "Außerhalb_des_zugelassenen_Bereiches__Teilungszahl_wird_auf_2_gesetzt comboboxsettext "ctnz 2 make "tnz 2 end to loeschen ;Prozedur löscht alle Eingabefelder und Listboxen comboboxsettext "ca3 0 comboboxsettext "ca2 0 comboboxsettext "ca1 0 comboboxsettext "ca0 0 comboboxsettext "ca 0 comboboxsettext "cb 0 comboboxsettext "ctnr 0 comboboxsettext "ctnz 0 listboxdelete "lbreru listboxcreate "hf "lbreru 5 200 75 100 listboxdelete "lbrero listboxcreate "hf "lbrero 85 200 75 100 listboxdelete "lbstr listboxcreate "hf "lbstr 165 200 75 100 listboxdelete "lbttr listboxcreate "hf "lbttr 245 200 75 100 listboxdelete "lbsir listboxcreate "hf "lbsir 325 200 75 100 listboxdelete "lbkfr listboxcreate "hf "lbkfr 405 200 75 100 end to potx :x :n ; Berechnet n-te Potenz von x ifelse :n = 0 [op 1]~ [op :x * potx :x :n - 1] end to rer ;Prozedur zum Funktionsaufruf Rechteckregel ;zum Einlesen des Wertes Teilungsnummer tnr ;zur Ausgabe des Funktionswertes make "tnr0 first comboboxgettext "ctnr ifelse eingabe_test :tnr0 [make "tnr :tnr0]~ [loesche_tnr0] listboxaddstring "lbreru rer_u_komplett :tnr :a :b listboxaddstring "lbrero rer_o_komplett :tnr :a :b end to rer_o_komplett :n :a :b ;rer_o_summe berechnen op (:b - :a)/(potx 2 :n) * rer_o_summe :n 0 end to rer_o_summe :n :summe ;Rahmenfunktion für rer_o_summe_h op rer_o_summe_h :n potx 2 :n :summe end to rer_o_summe_h :n :i :s ;ermittelt endrekursiv Summe der Funktionswerte in Abhängigkeit von der Teilungsnummer n ifelse :i = 0 [op :s]~ [op rer_o_summe_h :n :i-1 :s + fktx (:a + :i * (:b - :a)/(potx 2 :n))] end to rer_u_komplett :n :a :b ;rer_u_summe berechnen op (:b - :a)/(potx 2 :n) * rer_u_summe :n 0 end to rer_u_summe :n :summe ;Rahmenfunktion für rer_u_summe_h op rer_u_summe_h :n potx 2 :n :summe end to rer_u_summe_h :n :i :s ;ermittelt endrekursiv Summe der Funktionswerte in Abhängigkeit von der Teilungsnummer n ifelse :i = 0 [op :s]~ [op rer_u_summe_h :n :i-1 :s + fktx (:a + (:i - 1) * (:b - :a)/(potx 2 :n))] end to sir ;Prozedur zum Funktionsaufruf Simpsonregel ;zur Ausgabe des Funktionswertes make "tnz0 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz0 [make "tnz :tnz0]~ [loesche_tnz0] listboxaddstring "lbsir sir_komplett :tnz :a :b end to sir_komplett :n :a :b ;sir_summe berechnen ifelse and (:n > 0)((remainder :n 2) = 0) [op ((2 * str_komplett :n :a :b) + ttr_komplett :n :a :b) / 3]~ [listboxaddstring "lbsir "falsche_Eingabe] end to start ;Startprozedur die das Hauptfenster "hf erzeugt icon "Commander icon [MSWLogo Screen] windowcreate "main "hf [Näherungsweise Berechnung von Integralen] 10 10 490 350 [] staticcreate "hf "lthema1 [Berechnung an ganzen rationalen Funktionen bis max. 3. Grades] 20 40 215 10 staticcreate "hf "lthema2 [der Form ax³ + bx² + cx + d] 235 40 300 10 staticcreate "hf "lkoeff [Koeffizienten der Funktion (a, b, c, d) eingeben:] 20 55 200 10 staticcreate "hf "lhoehe [Integrationsintervall (linke Grenze,rechte Grenze) eingeben:] 20 70 215 10 staticcreate "hf "lhinweis[Nach der Eingabe Button "Werte_einlesen" drücken] 20 85 200 10 staticcreate "hf "ltnr [Teilungsnummer n (0..20) eingeben:] 5 140 200 10 staticcreate "hf "ltnz [Anzahl der Teilintervalle i (2..1024) eingeben:] 165 140 200 10 staticcreate "hf "lrer [Rechteckregel:] 55 110 100 10 staticcreate "hf "lstr [Sehnentrapezregel:] 165 110 100 10 staticcreate "hf "lttr [Tangententrapezregel:] 245 110 100 10 staticcreate "hf "lsir [Simpsonregel:] 325 110 100 10 staticcreate "hf "lkfr [Kepleresche Fassregel:] 405 110 100 10 staticcreate "hf "ltxtrer [Verfahren der Intervallhalbierung] 25 120 200 10 staticcreate "hf "ltxtu [Annäherung von unten] 5 160 200 10 staticcreate "hf "ltxto [Annäherung von oben] 85 160 200 10 staticcreate "hf "ltxtstr [Anz. Teilint. beliebig] 165 160 200 10 staticcreate "hf "ltxtttr [Anz. Teilint. geradzlg.] 245 160 200 10 staticcreate "hf "ltxtsir [Gewicht.Mittel STR-TTR] 325 160 200 10 staticcreate "hf "ltxtkfr [SIR für 2 Teilintervalle] 405 160 200 10 staticcreate "hf "lhoriz1 [_________________________________________________] 5 95 200 10 staticcreate "hf "lhoriz2 [_________________________________________________] 200 95 200 10 staticcreate "hf "lhoriz3 [_____________________] 395 95 100 10 comboboxcreate "hf "ca3 240 55 20 10 comboboxcreate "hf "ca2 260 55 20 10 comboboxcreate "hf "ca1 280 55 20 10 comboboxcreate "hf "ca0 300 55 20 10 comboboxcreate "hf "ca 240 70 20 10 comboboxcreate "hf "cb 260 70 20 10 comboboxcreate "hf "ctnr 135 140 20 10 comboboxcreate "hf "ctnz 325 140 20 10 buttoncreate "hf "brechteck_regel "Rechteckregel 45 180 75 10 [rer] buttoncreate "hf "bsehnen_regel "Sehnentrapezregel 165 180 75 10 [str] buttoncreate "hf "btangenten_regel "Tangententrapezregel 245 180 75 10 [ttr] buttoncreate "hf "bsimpson_regel "Simpsonregel 325 180 75 10 [sir] buttoncreate "hf "bkepler_regel "Keplersche_Fassregel 405 180 75 10 [kfr] buttoncreate "hf "bwerte "Werte_einlesen 20 5 70 20 [werte] buttoncreate "hf "bloeschen "Alles_Löschen 95 5 70 20 [loeschen] buttoncreate "hf "blb_loeschen "Listboxen_Löschen 170 5 70 20 [lb_loeschen] buttoncreate "hf "bhilfe "Hilfe 245 5 70 20 [hilfe] buttoncreate "hf "binfo "Info 320 5 70 20 [info] buttoncreate "hf "bbeenden "Beenden 395 5 70 20 [beende_prog] buttoncreate "hf "bliste_rer "Liste_0_bis_n 45 310 75 10 [liste_rer] buttoncreate "hf "bliste_str "Liste_1_bis_i 165 310 75 10 [liste_str] buttoncreate "hf "bliste_ttr "Liste_2_bis_i 245 310 75 10 [liste_ttr] buttoncreate "hf "bliste_sir "Liste_2_bis_i 325 310 75 10 [liste_sir] listboxcreate "hf "lbreru 5 200 75 100 listboxcreate "hf "lbrero 85 200 75 100 listboxcreate "hf "lbstr 165 200 75 100 listboxcreate "hf "lbttr 245 200 75 100 listboxcreate "hf "lbsir 325 200 75 100 listboxcreate "hf "lbkfr 405 200 75 100 ;listboxcreate "hf "lblinie 5 100 475 1 loeschen end to str ;Prozedur zum Funktionsaufruf Sehnentrapezregel ;zum Einlesen des Wertes Teilungszahl tnz ;zur Ausgabe des Funktionswertes make "tnz0 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz0 [make "tnz :tnz0]~ [loesche_tnz0] listboxaddstring "lbstr str_komplett :tnz :a :b end to str_komplett :n :a :b ;str_summe berechnen ifelse :n > 0 [op (:b - :a) / (2 * :n) * str_summe :n 0]~ [listboxaddstring "lbstr "falsche_Eingabe] end to str_summe :n :summe ;Rahmenfunktion für str_summe_h und addiert die Funktionswerte y0 und yn op (fktx :a) + (fktx :b) + (str_summe_h :n :n :summe) end to str_summe_h :n :i :s ;ermittelt endrekursiv Summe der Funktionswerte y1 bis yn-1 in Abhängigkeit von Teilungzahl n ifelse :i = 1 [op :s]~ [op str_summe_h :n :i - 1 :s + 2 * fktx (:a + (:i - 1) * (:b - :a) / :n)] end to ttr ;Prozedur zum Funktionsaufruf Tangententrapezregel ;zum Einlesen des Wertes Teilungszahl tnz ;zur Ausgabe des Funktionswertes make "tnz0 first comboboxgettext "ctnz ifelse eingabe_test_2 :tnz0 [make "tnz :tnz0]~ [loesche_tnz0] listboxaddstring "lbttr ttr_komplett :tnz :a :b end to ttr_komplett :n :a :b ;ttr_summe berechnen ifelse and (:n > 0)((remainder :n 2) = 0) [op 2 * ((:b - :a) / :n) * ttr_summe :n 0]~ [listboxaddstring "lbttr "falsche_Eingabe] end to ttr_summe :n :summe ;Rahmenfunktion für ttr_summe_h op ttr_summe_h :n :n :summe end to ttr_summe_h :n :i :s ;ermittelt endrekursiv Summe der Funktionswerte y1 bis yn-1 in Abhängigkeit von Teilungzahl n ifelse :i = 1 [op :s]~ [ifelse ((remainder :i 2) =0) [op ttr_summe_h :n :i - 1 :s + fktx (:a + (:i - 1) * (:b - :a) / :n)]~ [op ttr_summe_h :n :i - 2 :s + fktx (:a + (:i - 2) * (:b - :a) / :n)]] end to werte ;Prozedur zum Einlesen von globalen Werten für alle Regeln ;make "tnr first comboboxgettext "ctnr ;make "tnz first comboboxgettext "ctnz make "a3 first comboboxgettext "ca3 make "a2 first comboboxgettext "ca2 make "a1 first comboboxgettext "ca1 make "a0 first comboboxgettext "ca0 make "a first comboboxgettext "ca make "b first comboboxgettext "cb end Make "a 0 Make "a0 1 Make "a1 0 Make "a2 1 Make "a3 0 Make "aus 1.5625 Make "b 1 Make "daten [sn th] Make "e1_n "Hauptstadt Make "e1_w "Dresden Make "e2_n "Name Make "id 2 Make "ltnr 0 Make "summe 0 Make "tnr 0 Make "tnr0 0 Make "tnr2 0 Make "tnz 2 Make "tnz0 1 Make "tnz2 1 Make "tnz3 1 Make "tnz4 1 Make "tz 4 Make "x 4 Pprop "sn "Name "Sachsen Pprop "sn "Hauptstadt "Dresden Pprop "sn "Flaeche 18414 Pprop "sn "Einwohner 4500000 Pprop "th "Name "Thueringen Pprop "th "Hauptstadt "Erfurt Pprop "th "Flaeche "?? Pprop "th "Einwohner "??