|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
schnabelhuh
Anmeldungsdatum: 10.05.2015 Beiträge: 2
|
Verfasst am: 10.05.2015, 11:45 Titel: zwei Fensterausgabe und pset zeitversetzt |
|
|
Einen schönen guten Tag liebe Forengemeinde,
ich bin momentan dabei an einer Abendschule mein Abitur nach zu holen, und befinde mich im letzten Jahr, unter anderem habe ich auch Informatik als Unterrichtsfach. Unser Abschlussprojekt ist ein Programm das Funktionen bis zu einem 3. Grad berechnet (also Nullstellen, Extrema, Wendepunkte usw. ) weiterhin soll es auch den Graphen der Funktionin in einem KKoordinatensystem darstellen. Bis dahin alles kein Problem, bin mit dem Prog fertig funktioniert auch alles einwandfrei Menü ect. Würde es aber gerne noch ein wenig "pimpen" :
1. : ist es möglich die Anzeige des Graphen in seperaten Ausgabefenster anzeigen zu lassen? Also ich meine ein zweites fenster vom OS (Win7) Wenn ja wie?
2. : ich würde gerne sehen das der Graph Stück für Stück gezeichnet wird, und nicht einfach nur ins KoSystem "geknallt" wird. Zeichnen lasse ich ihn durch pset, hab es schon mit sleep 1 vesucht komm da aber nicht weiter. Soll heißen ich will das der graph langsam vn links nach rechts aufgebaut wird.
Hoffe ich könnt mir da weiterhelfen? !
Gruß Maik |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 10.05.2015, 13:52 Titel: |
|
|
Hallo schnabelhuh, willkommen im Forum.
Schon wieder 'ne Kurvendiskussion, hier muß irgendwo ein Nest sein .
Das hier dürfte ziemlich genau das sein, was du suchst. Für deine Sonderwünsche sind allerdings einige kleine Änderungen nötig:
Wenn Grafik und Berechnungen in zwei verschiedenen Fenstern ausgegeben werden sollen, mußt du die Zeilen Code: | If Bit(gflag,0) = 0 Then
ScreenRes groesse,zeilen * 8 + groesse,24 'grafikfenster öffnen
EndIf | nach hinten verschieben, am besten direkt hinter die Abfrage Code: | If Bit(gflag,0) = 0 Then 'grafik eingeschaltet |
Und wenn du dem Programm beim Zeichnen zusehen möchtest, sind einige Änderungen in der plotter_mod.bi erforderlich. Dort mußt du die Zeilen Code: | if valueOld > yStart and valueOld <= yEnd then
line img, -(i, xAxis - value*yFactor), gcolor
else
pset img, (i, xAxis - value*yFactor), gcolor
end If | in Code: | if valueOld > yStart and valueOld <= yEnd then
Line -(i, xAxis - value*yFactor), gcolor
else
PSet (i, xAxis - value*yFactor), gcolor
end If
Sleep 1 | abändern.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
schnabelhuh
Anmeldungsdatum: 10.05.2015 Beiträge: 2
|
Verfasst am: 11.05.2015, 17:51 Titel: |
|
|
Hey grindstone vielen Dank für dein schnelle Antwort. Ich bin mir sicher das deine Programmzeilen funktionieren, leider bin ich dann doch noch nicht so ein Spezialist um diese Zeilen auch in mein Quellcode unterzubringen, sehe da auch nicht so richtig durch wenn ich ehrlich bin. Das SUB in meinem Prog für die Zeichnun sieht so aus:
Code: | ma! = 50
SUB zeichnen (g%, a!, b!, c!, d!, a1!, b1!, c1!, a2!, b2!)
gr$ = INKEY$
DO
LOCATE 20, 20
INPUT "Wollen Sie eine linke und rechte Grenze (j/n): ", gr$
CLS
LOOP UNTIL gr$ = "j" OR gr$ = "n"
IF gr$ = "j" THEN
LOCATE 20, 20
INPUT "Linke Grenze: ", x1!
LOCATE 21, 20
INPUT "Rechte Grenze: ", x2!
ELSE
x1! = -300
x2! = 300
END IF
DO
SELECT CASE q$
CASE IS = "+"
ma! = ma! * 2
CASE IS = "-"
ma! = ma! / 2
CASE IS = "j"
LOCATE 24, 5
PRINT " "
LOCATE 24, 5
INPUT "X Stelle der Tangente: ", t!
SELECT CASE g%
CASE IS = 2
m! = a1! * 2 * t! + b1!
n! = (a1! * t! ^ 2 + b1! * t! + c1!) + (-t! * m!)
CASE IS = 3
m! = a! * 3 * t! ^ 2 + b! * 2 * t! + c!
n! = (a! * t! ^ 3 + b! * t! ^ 2 + c! * t! + d!) + (-t! * m!)
END SELECT
END SELECT
CLS
IF q$ = "j" THEN
LOCATE 27, 5
PRINT USING "t(x)= ##.#x +##.#"; m!, n!
FOR x = x1! TO x2! STEP 0.001
PSET (x * ma!, (m! * x + n!) * ma!), 4
NEXT x
END IF
'Koordinatensystem wird erstellt
WINDOW (-300, -250)-(300, 250)
LINE (-300, 0)-(300, 0), 0
LINE (0, -250)-(0, 200), 0
'x Achse Striche
FOR x = -300 TO 300 STEP ma!
LINE (x, -3)-(x, 3)
NEXT x
'y Achse Striche
FOR y = -200 TO 150 STEP ma!
LINE (-3, y)-(3, y)
NEXT y
'Ausdruck der Funktion
SELECT CASE g%
CASE IS = 1
LOCATE 4, 5
PRINT "Funktion 1. Grades:"
LOCATE 5, 5
PRINT USING "f(x)= ###.##x +###.##"; a2!, b2!
CASE IS = 2
LOCATE 4, 5
PRINT "Funktion 2. Grades:"
LOCATE 5, 5
PRINT USING "f(x)= ##.##xý +###.##x +###.##"; a1!, b1!, c1!
CASE IS = 3
LOCATE 4, 5
PRINT "Funktion 3. Grades:"
LOCATE 5, 5
PRINT USING "f(x)= ##.##x^3 +###.##xý +###.##x +###.##"; a!, b!, c!, d!
END SELECT
'Graph wird nun gott sei dank endlich gezeichnet ;-)
SELECT CASE g%
CASE IS = 1
FOR x = x1! TO x2! STEP 0.001
y = (a2! * x + b2!)
PSET (x * ma!, y * ma!), 2
NEXT x
CASE IS = 2
FOR x = x1! TO x2! STEP 0.001
y = (a1! * x ^ 2 + b1! * x + c1!)
PSET (x * ma!, y * ma!), 2
NEXT x
CASE IS = 3
FOR x = x1! TO x2! STEP 0.001
y = (a! * x ^ 3 + b! * x ^ 2 + c! * x + d!)
PSET (x * ma!, y * ma!), 2
NEXT x
END SELECT
LOCATE 24, 5
PRINT "Tangente erzeugen?: (j)"
LOCATE 35, 5
PRINT "(+) vergr"; CHR$(148); CHR$(225); "ern / (-) verkleinern"
LOCATE 36, 5
PRINT "Dr"; CHR$(129); "cken Sie q fr zur"; CHR$(129); "ck"
SLEEP
q$ = INKEY$
LOOP UNTIL q$ = "q"
CLS
END SUB
|
vielleicht kannst du mir da helfen wie ich deine Befehle für die Fensterausgabe umsetzen kann.
Gruß Maik |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 11.05.2015, 22:19 Titel: |
|
|
Hallo schnabelhuh,
testen kann ich deinen Code leider gerade nicht, nur schnell zwei kurze Anmerkungen. Statt "CASE IS = 3" kannst du auch einfach "CASE 3" schreiben; das IS brauchst du nur bei Vergleichen wie <, >= usw. Und du schriebst, du hattest Probleme mit einer Verlangsamung mithilfe von "SLEEP 1". Ich nehme mal an, in diesem Fall läuft es deutlich zu langsam, oder hat dabei was anderes nicht funktioniert?
"SLEEP 1" wartet in QBasic halt immer gleich eine ganze Sekunde. Man kann sich auch eine eigene Warteschleife mit TIMER bauen. Das sieht etwa so aus:
Code: | zeit# = TIMER
DO : LOOP UNTIL TIMER > zeit# + wartezeit# |
Statt "wartezeit#" musst du dann den gewünschten Wert eingeben. Sollte in etwa funktionieren, ist aber ungetestet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 12.05.2015, 13:47 Titel: |
|
|
Hallo schnabelhuh,
zunächst einmal muß ich mich entschuldigen, ich habe (wieder einmal) übersehen, daß das hier das QBasic- und nicht das FreeBasic - Forum ist. Das Programm, das ich dir als Lösung all deiner Probleme empfohlen habe, läuft leider nur unter FB. Wenn du es trotzdem einmal ausprobieren möchtest (z.B. um zu kontrollieren, ob dein Programm richtig rechnet), findest du hier eine compilierte, lauffähige Version für das DOS-Fenster.
Nun zu deiner Sub. Ich habe zwar einige Übung im Aufdröseln fremder Programme, aber ein paar Erläuterungen wären doch ganz hilfreich gewesen, z.B. zur Bedeutung der einzelnen Parameter oder über den verwendeten SCREEN - Modus.
Schließlich habe ich sie dann aber doch zum Laufen gekriegt, und muß sagen: Nicht schlecht für den Anfang. Trotzdem gibt es -du wirst es schon geahnt haben- einige Verbesserungsmöglichkeiten.
Zunächst einmal: Wenn man bei jedem Programmdurchlauf gefragt wird, ob man irgendwelche Werte eingeben möchte, dann NERVT DAS! Überhaupt sollte man solche Eingaben innerhalb einer Sub vermeiden, wenn man das auch außerhalb machen kann. Eine Sub sollte alle benötigten Werte in der Parameterliste mitkriegen, ihre Aufgabe erfüllen und dann wieder zum Hauptprogramm zurückkehren. Von diesem Grundprinzip sollte man nur abweichen, wenn es dafür einen plausiblen Grund gibt. Auch die Abfrageschleife für größer/kleiner/Tangente solltest du ins Hauptprogramm verlagern und für das Zeichnen der Tangente eine eigene Sub schreiben. Je klarer umrissen die Aufgabe einer solchen Sub (oder auch Function) ist, um so übersichtlicher ist später das Programm.
Desweiteren solltest du für die Variablen der Parameterliste entweder "sprechende" Namen verwenden, oder ihre Bedeutung im Kopf der Sub kurz erklären. Und sag nicht, "Das weiß ich doch, ich habe es doch selber geschrieben". Du glaubst gar nicht, was man in 3 Wochen alles vergessen kann!
In diesem Sinne habe ich die Sub ein wenig umgestaltet. Zunächst einmal die Parameterliste: Die Koeffizienten übergibt man am besten in einem dynamischen Array. Das ist nicht nur übersichtlicher, sondern hat auch den Vorteil, daß die Anzahl der Koeffizienten und damit der Grad des Polynoms flexibel ist (von 1 bis 32767). Außerdem kann die Sub den Grad des Polynoms aus der Größe des Arrays selbst ermitteln. Ferner bekommt die Sub noch die Intervallgrenzen und den Maßstab mitgegeben. Damit hat sie alle Informationen, die sie zum Zeichnen des Graphen braucht.
Durch die variable Anzahl der Koeffizienten war es auch erforderlich, die SELECT CASE - Abfragen durch allgemeine Berechnungsalgorithmen zu ersetzen. Das erfordert -zugegeben- etwas Gehirnschmalz, auch beim Nachvollziehen, aber es ist ein schönes Beispiel dafür, wie man aus mehreren Formeln eine allgemeine Berechnungsvorschrift formuliert. Nur das Umschreiben der PRINT USING - Anweisungen überlasse ich dir, dazu habe ich keine Lust mehr . Falls du dazu eine Anregung brauchst, sieh dir hier die Function PolynomFormat an.
Code: | DECLARE SUB zeichnen (k!(), x1!, x2!, ma!)
SCREEN 11
WIDTH 80, 60
REDIM k!(4)
k!(1) = -1 'x^3
k!(2) = 2 'x^2
k!(3) = 3 'x
k!(4) = 4 'k
zeichnen k!(), -30, 30, 20
SCREEN 0
WIDTH 80, 25
END
SUB zeichnen (k!(), x1!, x2!, ma!)
' | | | |__ massstab
' | | |_______ obere grenze
' | |____________ untere grenze
' |__________________ array mit koeffizienten
g% = UBOUND(k!) - 1 'grad der funktion
DO
SELECT CASE q$
CASE "+"
ma! = ma! * 2
CASE "-"
ma! = ma! / 2
CASE "j"
LOCATE 24, 5
PRINT " "
LOCATE 24, 5
INPUT "X Stelle der Tangente: ", t!
m! = 0
FOR i% = 1 TO g%
m! = m! + k!(i%) * (g% - i% + 1) * t! ^ (g% - i%)
NEXT
n! = -t! * m!
FOR i% = 1 TO g% + 1
n! = n! + k!(i%) * t! ^ (g% - i% + 1)
NEXT
END SELECT
CLS
IF q$ = "j" THEN
LOCATE 27, 5
PRINT USING "t(x)= ##.#x +##.#"; m!; n!
FOR x = x1! TO x2! STEP .001
PSET (x * ma!, (m! * x + n!) * ma!), 4
NEXT x
END IF
'Koordinatensystem wird erstellt
WINDOW (-300, -250)-(300, 250)
LINE (-300, 0)-(300, 0), 1
LINE (0, -250)-(0, 200), 1
'x Achse Striche
FOR x = -300 TO 300 STEP ma!
LINE (x, -3)-(x, 3), 1
NEXT x
'y Achse Striche
FOR y = -200 TO 150 STEP ma!
LINE (-3, y)-(3, y)
NEXT y
'Ausdruck der Funktion
LOCATE 4, 5
PRINT "Funktion"; g%; ". Grades:"
LOCATE 5, 5
SELECT CASE g%
CASE 1
PRINT USING "f(x)= ###.##x +###.##"; k!(1); k!(2)
CASE 2
PRINT USING "f(x)= ##.##xý +###.##x +###.##"; k!(1); k!(2); k!(3)
CASE 3
PRINT USING "f(x)= ##.##x^3 +###.##xý +###.##x +###.##"; k!(1); k!(2); k!(3); k!(4)
END SELECT
'Graph wird nun gott sei dank endlich gezeichnet ;-)
FOR x = x1! TO x2! STEP .001
y = 0
FOR i% = 1 TO g% + 1
y = y + (k!(i%) * x ^ (g% - i% + 1))
NEXT
PSET (x * ma!, y * ma!), 2
NEXT x
LOCATE 24, 5
PRINT "Tangente erzeugen?: (j)"
LOCATE 35, 5
PRINT "(+) vergr"; CHR$(148); CHR$(225); "ern / (-) verkleinern"
LOCATE 36, 5
PRINT "Dr"; CHR$(129); "cken Sie q fr zur"; CHR$(129); "ck"
SLEEP
q$ = INKEY$
LOOP UNTIL q$ = "q"
CLS
END SUB
|
Gruß
grindstone
EDIT: Um den Graphen langsamer zu zeichenen, kannst du den Wert für STEP in der Berechnungsschleife verkleinern.
EDIT 2: Das ganze in zwei Fenstern darzustellen, dürfte in QB nicht möglich sein, da SCREEN 11 (zumindest bei mir) nur im Vollbildmodus läuft. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 12.05.2015, 20:33 Titel: |
|
|
Das Problem bei einer Geschwindigkeitsdrosselung durch mehr Iterationsschritte der FOR-Schleife ist, dass die letztliche Geschwindigkeit dann hardware-abhängig ist; d. h. ein schnellerer Computer zeichnet dann vermutlich wieder zu schnell (oder ein langsamerer zu langsam).
Zu den zwei Fenstern: QBasic ist auf DOS ausgelegt, daher ist das gleichzeitige Ausführen zweier Programm(fenster)n nach meinem Kenntnisstand nicht möglich. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 12.05.2015, 22:30 Titel: |
|
|
Wie meine nemored und grindstone schon sagten ist das darstellen eines zweiten Fensters aus QBasic heraus nicht direkt möglich. Was allerdings möglich wäre ist ein zweites Programm zu starten, das den Graphen anzeigt. Die Daten müsstest du zur Übergabe in eine Textdatei oder ähnliches zwischenspeichern.
Das ist natürlich eine ziemlich unelegante und umständliche Lösung, aber sollte möglich sein, wenns unbedingt notwendig ist.
Das starten eines eigenständig laufenden Programms kannst du mit einem aufruf des "START" Befehls der Windows Kommandozeile ausführen. Unter Windows 95 hab ich das einmal gemacht (lang ists her ...) da gabs noch eine eigenständige "start.exe", unter meinem Windows 8.1 (und vermutlich auch in anderen aktuelleren Windows Versionen) ist die Funktionalität in die Eingabeaufforderung (cmd.exe) integriert und daher wohl über "cmd.exe /c start" zu erreichen. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.05.2015, 01:50 Titel: |
|
|
Die Anzeige mehrerer Fenster ist schon deshalb nicht möglich, weil mit Ausnahme von SCREEN 0 alle Anzeigen im Vollbildmodus laufen (ich habe alle durchprobiert).
Und der Versuch, aus QB heraus eine zweite Instanz des Interpreters zu starten, führt zu einer Fehlermeldung "zu wenig Speicher". Ein Workaround wäre (theoretisch), per QB eine Batchdatei zu erstellen und aufzurufen, die dann ihrerseits eine zweite Instanz von QB startet. Dazu müsste sie aber ein zweites Konsolenfenster öffnen, d.h. cmd in einem neuen Prozess starten. Das ist mir bisher noch nicht gelungen, und ich habe meine Zweifel, ob das überhaupt möglich ist. Und selbst wenn: siehe oben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.05.2015, 09:26 Titel: |
|
|
Hat tatsächlich noch niemand erwähnt, dass es wesentlich weniger Verrenkungen benötigt, um zwei Fenster mit FreeBASIC statt QBasic zu erzeugen?
Der Code sollte mehr oder weniger direkt im QB-Modus kompilieren, alternativ ist er auch schnell auf "modernes" FreeBASIC umgeschrieben. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 13.05.2015, 10:20 Titel: |
|
|
Jojo hat Folgendes geschrieben: | Hat tatsächlich noch niemand erwähnt, dass es wesentlich weniger Verrenkungen benötigt, um zwei Fenster mit FreeBASIC statt QBasic zu erzeugen? | Doch. Du. Jetzt gerade! Aber wenn du dieses Forum aufmerksam verfolgst, wirst du auch wissen, daß es so gut wie aussichtslos ist, einen QB - benutzenden Neuling, der damit gerade seine ersten Erfolgserlebnisse hat, zum sofortigen Umstieg auf FB zu bewegen. Da mögen die Argumente noch so plausibel sein.
Aber wer weiß, vielleicht schaffen wir es in diesem Fall ja doch, einen neuen Adepten zu gewinnen. Die Chancen stehen jedenfalls nicht schlecht...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.05.2015, 15:17 Titel: |
|
|
Ich deute die Aussagen "Informatik als Unterrichtsfach" und "Abschlussprojekt" als gewisse äußere Zwänge, die einem sofortigen Umstieg auf FreeBASIC im Wege stehen. Sonst hätte ich natürlich schon längst missionarisch eingegriffen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.05.2015, 21:29 Titel: |
|
|
Wenn es tatsächlich Leute gibt, die in Informatik noch QBasic lehren, muss man diese umso aggressiver überzeugen, dass es sinnvollere Alternativen gibt. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.05.2015, 08:29 Titel: |
|
|
Ich habe eigentlich nicht den Eindruck, daß schnabelhuh der Lehrer ist...
Außerdem: Was heißt hier "noch"? Wahrscheinlich sind die Lehrkräfte erst vor 2 Jahren in der Anwendung solch moderner Software ausgebildet worden und somit jetzt in der Lage, statt der bisher verwendeten Papiermodelle reale Computer einzusetzen. Schließlich müssen ja auch die Schulen mit der technischen Entwicklung schritthalten.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
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.
|
|