 |
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 |
rudeboy

Anmeldungsdatum: 13.02.2005 Beiträge: 15 Wohnort: berlin
|
Verfasst am: 13.02.2005, 02:55 Titel: ein programm das programiert |
|
|
hallo zusammen,
bin neu dabei, und beim lernen(Qb4.5) kam ich auf die idee,
das der komputer das auch lernen könnte.
so schrieb ich ein prog. das es mir einfacher macht, also es fragt mich
ein paar fragen und ich beantworte sie, dann schreibt es mir den richtigen
code als .bas datei raus
momentan kann es nur mit 2 bis 3 zahlen rechnen (+-*/)
mein problem: wie bekomme ich das neue programm in das erste?
also nach dem ich das prog. rausschreiben lasse,
möcht ich es aus dem ersten prog. starten,
so das ich gar net merke das es zwei sind.
momentan muß ich das erste verlassen, das zweite starten, is aber net
mein ziel.
hilfe!!!!!!
oder geht das überhaupt nicht? |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.02.2005, 05:00 Titel: |
|
|
Hallo
Sieh dir dazu mal die Befehle CHAIN und RUN an. Mit denen kannst du zwischen Programmen wechseln.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 13.02.2005, 16:28 Titel: Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt |
|
|
Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt:
--------------------------------------------------------------------------------
Frage deutsch
~~~~~~~~~~~~~~
Wie berechne ich einen als String vorliegenden Formelausdruck?
((Ergänzung der bestehenden Frage "Formelparser" oder "Formellöser"))
Question English
~~~~~~~~~~~~~~
How to ?
Antwort 1
~~~~~~~~~
[ von Thomas Antoni und Olaf Deters, 26.1.2004 - 27.1.2004 ]
Beim Programmieren des einfachen Taschenrechners für die MonsterFAQ ist mir
(Thomas Antoni) die folgende Idee gekommen: Mann müsste doch den Eingabestring
für eine beliebige Formel. z.B.
"(25^3) * sin(0.45)"
per Programm als QB-Quellsprache in eine externe BAS-Datei schreiben und diese
dann per CHAIN aufrufen, abarbeiten und das Ergebnis anzeigen lassen können.
Beim obigen Beispiel würden die für die Eingabe der Formal und die
Anzeige des Ergebnisses zuständigen Befehle ganz einfach so lauten:
INPUT "y = "; Formel$ 'Formel eingeben
PRINT "y = "; (25^3) * sin(0.45) 'Formel berechnen und anzeigen
Der letztere Befehl würde in die externe Datei geschrieben werden. Dann hätte
man auf einfachste Art einen sehr leistungsfähigen wissenschaftlichen
Taschenrechner realisiert.
Eine Schwierigkeit liegt darin, dass die meisten Anwender Winkel wohl im Gradmaß
und nicht in dem bei QBasic üblichen Bogenmaß eingeben möchten.
Dazu kann man im Formelstring ein "zahl°" durch "(Zahl * 6.28/360)" ersetzen.
Das folgende Programm von Olaf Deters und mir setzt diese Idee um:
'*****************************************************************
' FORMEL.BAS = Formel-Loeser in QBasic
' ==========
' ACHTUNG: Dieses Programm muss im Verzeichnis "C:\TEMP\" stehen.
' Bei einem anderen Verzeichnis muss man die Pfadvorgabe
' in der 2. Befehlszeile anpassen!
'
' FORMEL.BAS ist quasi ein wissenschaftlicher Taschenrechner.
' Es nimmt vom Anwender einen beliebigen Formelausdruck entgegen,
' berechnet dessen Ergebnis und zeigt es an.
'
' Der Formelausdruck muss der QBasic-Syntax entsprechen, mit einer
' Ausnahme: Die Eingabe von Winkeln kann auch in Grad statt im
' Bogenmass erfolgen. Dazu muss der Anwender hinter dem Winkel ein
' Gradzeichen "ø" eingeben.
'
' Das Programm funktioniert nur als BAS-Datei und nicht als
' kompilierte EXE-Datei. Programmtechnisch ist das ganze so
' realisiert, dass das Programm den Formelstring in eine zweite
' externe BAS-Datei "Test.bas" schreibt. Ansschliessend wird
' die Kontrolle per CHAIN an Test.bas uebergeben. Test.bas
' berechnet die Formel, zeigt sie an und springt wiederum per
' CHAIN zurueck zum Beginn des Hauptprogramms.
'
' Der vom Windows-ANSI-Code abweichende DOS-ASCII-Zeichencode fuer
' das Grad-Symbol ist zu beachten.(ANSI: "°", ASCII: "ø")
'
' (c) Olaf Deters u. Thomas Antoni, 26.1.2004 - 27.1.2004
'*****************************************************************
DECLARE FUNCTION Ersetze$ (F$)
COLOR 0, 7 'Schwarze Schrift auf hellgrauem Grund
WIDTH 80, 50 'VGA-Aufloesung mit 80 Spalten und 50 Zeilen
CLS
'
'---- Bedienungshinweise anzeigen -------------------------
'
PRINT
PRINT " ------======== F O R M E L - L O E S E R =======--------"
PRINT
PRINT " ________________Unterstuetzte Funktionen________________"
PRINT " a + b ..... Addition"
PRINT " a - b ..... Subtraktion"
PRINT " a * b ..... Multiplikation"
PRINT " a / b ..... Division"
PRINT " sqr(a) .... Quadratwurzel von a"
PRINT " a^b ....... Exponentialfunktion a hoch b"
PRINT " a^(1/b) ... allgemeine Wurzelfunktion b-te Wurzel aus a"
PRINT " log(a) .... Natuerlicher Logarithmus von a (zur Basis e)"
PRINT " sin(a) .... Sinus (a im Bogenmass)"
PRINT " cos(x) .... Cosinus (a im Bogenmass)"
PRINT " tan(a) .... Tangens (a im Bogenmass)"
PRINT " atn(x) .... Arcus Tangens (Winkel im Bogenmass)"
PRINT " aø ........ Winkel im Gradmass"
PRINT " hex$(a) ... Dezimal/Hexadezimal-Wandlung fuer a"
PRINT " val("; CHR$(34); "&ha"; CHR$(34); ")";
PRINT " Hexadezimal/Dezimalwandlung fuer a"
PRINT " MOD ....... Modulo-Division (liefert d.ganzzahligen Rest)"
PRINT " ========================================================="
PRINT " Beispielformel : (log(sin(30ø))^2 + 1.4"
PRINT " ========================================================="
'
'---- Formel eingeben -------------------------------------
PRINT
PRINT
PRINT "Gib die gewuenschte Formel ein: "
PRINT
INPUT "y = ", F$
F1$ = Ersetze$(F$) 'Winkelangaben mit Gradzeichen ins Bogenmass
'umrechnen
'
'---- Formel in Datei Test.bas schreiben ------------------
'Es wird der folgende Quellcode geschrieben:
' PRINT "y = "; Fa$
' PRINT
' PRINT "[belieb.Taste]=Wiederholen";
' PRINT ".....[Esc]=Beenden"
' t$ = INPUT$(1)
' IF t$ = CHR$(27) THEN END
' CHAIN "c:\temp\formel.bas"
'Ausrufezeichen muessen als CHR$(34) geschrieben werden
'
OPEN "c:\temp\Test.bas" FOR OUTPUT AS #1
PRINT #1, "PRINT "; CHR$(34); "y = "; CHR$(34); ";"; F1$
PRINT #1, "PRINT"
PRINT #1, "PRINT "; CHR$(34); "[belieb.Taste]=Wiederholen"; CHR$(34); ";"
PRINT #1, "PRINT "; CHR$(34); ".....[Esc]=Beenden"; CHR$(34)
PRINT #1, "t$=input$(1)" ' Warten auf beliebige Taste
PRINT #1, "IF t$ = CHR$(27) THEN END"
PRINT #1, "CHAIN "; CHR$(34); "c:\temp\formel.bas"; CHR$(34)
'Ruecksprung zum Hauptmodul
CLOSE #1
'
'----- Test.bas aufrufen ----------------------------------
CHAIN "c:\temp\test.bas"
'
FUNCTION Ersetze$ (F$)
'----- Umrechnung Grad- in Bogenmass ----------------------
'----- ("Zahlø") -> ("Zahl * 2 * Pi / 360")
'Es wird im Formelstring nach einem Gradzeichen "ø" gesucht.
'Steht davor eine Zahl, so wird das Gradzeichen durch
'den Teilstring "* 3.1415962# / 180" ersetzt.
FOR X = 1 TO LEN(F$)
IF MID$(F$, X, 1) = "ø" THEN
Y = X
DO UNTIL MID$(F$, Y, 1) = "(" OR MID$(F$, Y, 1) = ")": Y = Y - 1
LOOP
L$ = LEFT$(F$, Y)
SELECT CASE VAL(MID$(F$, Y + 1, X - Y - 1))
CASE IS <> 0
M$ = STR$(VAL(MID$(F$, Y + 1, X - Y - 1)) * 3.1415962# / 180)
CASE IS = 0
M$ = " * 3.1415962# / 180"
END SELECT
R$ = RIGHT$(F$, LEN(F$) - X)
F$ = L$ + M$ + R$
F$ = Ersetze(F$)
END IF
NEXT X
Ersetze$ = F$
END FUNCTION
((FORMEL.BAS bereits in progs/neu/ ))
Dieses Programm könnte man natürlich noch beliebig verbessern. Sinnvoll wäre es
z.B., alle auftretenden Fehler mit ON ERROR GOTO abzufangen. Dann werden
sämtliche Fehler wie nicht geschlossene Klammern, Division durch Null und die
Verwendung fascher Schlüsselwörter abgefangen, und das Programm könnte dann eine
ausagekräftige Fehlermeldung mit Neueingabemöglichkeit realisieren statt sich
sang- und klanglos zu beenden.
-------------------------------------------------------------------------------- _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
rudeboy

Anmeldungsdatum: 13.02.2005 Beiträge: 15 Wohnort: berlin
|
Verfasst am: 18.02.2005, 03:46 Titel: thanks |
|
|
hi,
danke für die kleine aber coole hilfe,
so sieht das kleine program aus, das voll automatisch programiert is:
mit zwie befehlen: addiren & 2 zahlen
das selbe geht mit : (+,-,*,/,) & 2 oder 3 zahlen
PRINT "-----addiere zwei zahlen------ "
PRINT " "
INPUT "A ";a
INPUT "B ";b
PRINT " "
ab = a + b
PRINT " Ergebnis: ";ab
chain "d:\MASCHINA.BAS"
hab da noch ne kleine frage:
seid dem ich den chain befehl eingebaut hab
zeigt er mir nicht mehr den letzten print befehl(Ergebnis) an. wie leg ich ein günstigen stop ein? |
|
Nach oben |
|
 |
r3001
Anmeldungsdatum: 05.11.2004 Beiträge: 137 Wohnort: Wien
|
Verfasst am: 18.02.2005, 12:19 Titel: |
|
|
Du könntest folgendes zwischen "PRINT " Ergebnis: ";ab" und "chain "d:\MASCHINA.BAS"" einfügen:
Code: | t! = TIMER + 1.5
WHILE TIMER < t!: WEND |
Das ganze sieht fertig so aus:
Code: | PRINT "-----addiere zwei zahlen------ "
PRINT " "
INPUT "A ";a
INPUT "B ";b
PRINT " "
ab = a + b
PRINT " Ergebnis: ";ab
t! = TIMER + 1.5
WHILE TIMER < t!: WEND
chain "d:\MASCHINA.BAS" |
Bei "TIMER + 1.5" kannst du einen beliebigen Wert eingeben, in meinem Beispiel wird eine 1,5 Sekunden Pause gemacht. So hälst du dein Programm an für einen gewissen Zeitraum, sogar für Millesekunden
Optional kannst du eine SUB erstellen, wo man immer nur eine Zeile (Call Pause(Wert)) eingeben muss, aber nur wenn du mehrmals im Programm eine Pause haben willst.
R |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 18.02.2005, 16:30 Titel: |
|
|
Oder mit
auf eine beliebige Tasteneingabe warten. Wem das nicht gefällt, der kann auch
oder
Code: |
WHILE NOT LEN(INKEY$): WEND
|
nehmen.
Als alternative Wartezeit könnte man auch mit
Code: |
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
|
arbeiten, da wird auf den Bildschirmstrahlrücklauf gewartet.
Das hängt aber von der Bildwiederholfrequenz des verwendeten Monitors ab (bei einem Flachbildschirm wird dieser Effekt natürlich nur nachgeahmt, da es dort ja keinen Bildschirmstrahrücklauf gibt).
Wenn diese 70Hz beträgt, wartet man also 1/70 s.
jb |
|
Nach oben |
|
 |
rudeboy

Anmeldungsdatum: 13.02.2005 Beiträge: 15 Wohnort: berlin
|
Verfasst am: 18.02.2005, 18:17 Titel: thanks |
|
|
hi
hab den sleep befehl genaommen,
der is kurtz und erfült sein zweck. danke
ich meld mich wieder wenn mein prog."Maschina" was neues kann
hab leider momentan wenig zeid dafür, mach grad prüfungen.
wenn sich jemand mit der thematik auch bescheftigt, dan meldet euch einfach
ciao |
|
Nach oben |
|
 |
rudeboy

Anmeldungsdatum: 13.02.2005 Beiträge: 15 Wohnort: berlin
|
Verfasst am: 03.07.2006, 16:51 Titel: @Maschina |
|
|
hallo,
hab das Prog so weit, das es nun fast alles kann, was auch ich kann (die Befehle in qbasic).
hab es weil es zu groß wurde, in diei größere Teile geteilt. so kann man sich auf einen Bereich konzentrieren, verbessern.
1.Teil soll der Kopf des Programmes sein
- -M3_Brain
2. Unterprogramm
- - M3_PROG
- - M3_Drucker
Da es recht komplex wurde, hab ich ein eigenes Forum dafür eingerichtet.
wenn jemand Interesse hat, was intelligents in qbasic zu proggen, kann gerne bei dem Projekt mitmachen, ich freue mich über jede Unterstützung.
(MASCHINA Projekt, mfg sajuss*)
kleine änderung noch
http://www.ar-base.tk |
|
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.
|
|