|
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 |
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 28.07.2015, 21:25 Titel: Frage Menü Aufbau |
|
|
Hallo Hallo...
Bin neu in eurem Forum und hab mal spontan eine Frage...
Ich muss ein Projekt erarbeiten und ich tue mich leider noch etwas schwer mit qbasic zu arbeiten.
Ich möchte gerne ein Menü erarbeiten mit 9 Untermenüs. Aber leider hat unsere Lehrer nicht gezeigt wie wie so etwas aufbauen sollen.
Habe mir ein Buch dazu gekauft und es durchgelesen und zum gröten Teil auch verstanden. Aber sowas wie SUB Funktionen, oder Menü´s usw. wurde uns nicht gezeigt und da tue ich mich ehrlich gesagt sehr schwer.
Ich habe bereits angefangen.. Vll kann mich da jemand weiterhelfen.
Die Programmaufgabe sind erstmal nur 4. Möchte ich auf 9 erweitern. Aber sobald man ein Menüpunkt ausgewählt hat, möchte ich ein Programm durchlaufen lassen, bzw sollen ergebnisse dargestellt werden.
Dabei geht es um Matheaufgaben.... Die Unterprogramme die dann ablaufen sollen, weiss ich. Nur mit den Menü an sich, komm ich nicht zu recht. Auch die Fensteranzeige läuft nicht wie sie soll... Vll kann mir da jemand weiterhelfen ... Vielen vielen Dank
Declare sub Fenster (lox%, loy%, rux%, ruy%
Declare SUB prog (x, y, txt$)
'
DIM mentxt$(4)
DIM i%, auswahl%, a$
'
'Menuetexte laden
mentxt$(1) = "1 Programmaufgabe A"
mentxt$(2) = "2 Programmaufgabe B"
mentxt$(3) = "3 Programmaufgabe C"
mentxt$(4) = "4 Programmende"
CLS
DO
CALL fenster(10, 8, 20, 72)
LOCATE 11, 36
PRINT " M E N U E "
FOR i% = 1 TO 4
LOCATE 11 + i%, 11
PRINT mentxt$(i%)
NEXT i%
'Eingabe abfragen nur anzeigen
LOCATE 19, 11
PRINT " Auswahl eingeben:_"
DO
auswahl% = VAL(INKEY$)
LOOP UNTIL auswahl% > 0 AND auswahl% < 5
CLS
CALL fenster(6, 8, 40, 72)
SELECT CASE auswahl%
CASE 1
CALL Prog(5, 11, "A")
CASE 2
CALL Prog(5, 11, "B")
CASE 3
CALL Prog(5, 11, "C")
CASE ELSE
END SELECT
CLS
LOOP UNTIL auswahl% = 4
CLS
SUB Prog (x, y, txt$)
DIM a$
LOCATE x, y
PRINT txt$; " : Beliebige Taste betaetigen"
a$ = INKEY$
WHILE a$ = ""
a$ = INKEY$
WEND
END SUB
SUB fenster (lox%, loy%, rux%, ruy%)
DIM i%
DIM fuell$
fuell$ = CHR$(186)
FOR i% = 1 TO ruy% - loy - 1
fuell$ = fuell$ + " "
NEXT i%
fuell$ = fuell$ + CHR$(186)
LOCATE lox%, loy%
PRINT CHR$(201);
FOR i% = loy% + 1 TO ruy% - 1
PRINT CHR$(205)
NEXT i%
PRINT CHR$(187);
FOR i% = 1 TO rux - lox% - 1
LOCATE lox + i%, loy%
PRINT fuell$
NEXT i%
LOCATE rux%, loy%
PRINT CHR$(200);
FOR i% = loy% + 1 TO ruy% - 1
PRINT CHR$(205)
NEXT i%
PRINT CHR$(188);
END SUB |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4637 Wohnort: ~/
|
Verfasst am: 28.07.2015, 21:56 Titel: |
|
|
Zur Fensterdarstellung kann ich dir aktuell leider nicht helfen. Ich habe das nie auf diese Art und Weise gemacht (weiß auch nicht, ob sich meine FB-Linux-Kombination identisch verhält ... das angezeigte undefinierte Zeichen legt anderes nahe) und bräuchte einige Einlesezeit.
Die Grundstruktur sieht doch schon ganz gut aus. In der Praxis wird das Menü vermutlich, abhängig von der Auswahl, ein anderes Unterprogramm aufrufen.
Code: | ' ***schnipp
SELECT CASE auswahl%
CASE 1
CALL Hilfe
CASE 2
CALL Eingabe
CASE 3
CALL SonstWas
END SELECT
CLS
' *** schnapp
SUB Hilfe
' ...
END SUB
SUB Eingabe
' ...
END SUB
SUB Sonstwas
' ...
END SUB |
Ich habe mal einfach mal ein paar Unterprogramme genommen, die mir so eingefallen ist.
Jetzt weiß ich aber nicht, ob das die Frage war bzw. ob dir das weiterhilft. Auf jeden Fall scheint mir dein Menü-Aufbau bisher schon sehr sinnvoll zu sein. _________________ 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: 1230 Wohnort: Ruhrpott
|
Verfasst am: 29.07.2015, 01:09 Titel: |
|
|
Hallo Matze83 und willkommen im Forum!
Dein Programm ist soweit schon ganz ordentlich.
Die Probleme mit der Fensteranzeige dürften daher kommen, daß du dir nicht richtig im Klaren darüber bist, was oben und unten, bzw. rechts und links ist: x ist die Spalte (also rechts <-> links) und y die Zeile (also oben <-> unten). So gesehen wird bei Locate erst y und dann x angegeben. Ich habe mir erlaubt, die Sub entsprechend umzuschreiben und zu kommentieren und hoffe, daß das dadurch klarer wird.
Im Gegensatz zu nemored kann ich das Programm direkt ausprobieren und habe daher ein wenig damit herumgespielt (es macht riesigen Spaß, besonders, wenn man es nicht tun MUSS ). Das Beispielprogramm zur Primzahlenberechnung habe ich von hier heruntergeladen und entsprechend angepasst. Code: | Declare Sub fenster (oben%, links%, unten%, rechts%)
Declare Sub Prog (y, x, txt$)
Declare Sub Prog2
Declare Sub prog3
'
Dim mentxt$(4)
Dim i%, auswahl%, a$
'
'Menuetexte laden
mentxt$(1) = "1 Programmaufgabe A"
mentxt$(2) = "2 Neueste Meldung"
mentxt$(3) = "3 Primzahlen"
mentxt$(4) = "4 Programmende"
Cls
Do
Call fenster(10, 8, 20, 72)
'oben________| | | |
'links___________| | |
'unten______________| |
'rechts_________________|
Locate 11, 36, 0
Print " M E N U E "
For i% = 1 To 4
Locate 11 + i%, 11
Print mentxt$(i%)
Next i%
'Eingabe abfragen nur anzeigen
Locate 19, 11
Print " Auswahl eingeben:_"
Do
auswahl% = Val(Inkey$)
Loop Until auswahl% > 0 And auswahl% < 5
Cls
Call fenster(6, 8, 20, 72)
Select Case auswahl%
Case 1
Call Prog(5, 11, "A")
'zeile____| |
'spalte______|
Case 2
Call Prog2()
Case 3
Call Prog3()
Case Else
End Select
Cls
Loop Until auswahl% = 4
Cls
Sub Prog (y, x, txt$)
Dim a$
Locate y, x
Print txt$; " : Beliebige Taste betaetigen"
a$ = Inkey$
While a$ = ""
a$ = Inkey$
Wend
End Sub
Sub Prog2
Dim text$
Dim a$
Dim x%
Dim y%
text$ = " "
text$ = text$ + "+++ Unter impulsivem Einsatz immanenter, jedoch bis zum Zeitpunkt der "
text$ = text$ + "Effektuierung latenter Energien loeste sich die amphibielle Kreatur von "
text$ = text$ + "ihrem habituellen Standort und verschwand, eine von den Wurfgesetzen "
text$ = text$ + "diktierte Parabellinie beschreibend, in den mehr oder minder transparenten "
text$ = text$ + "Raeumen ihrer Existenz. +++ "
Do
For x% = 1 To Len(text$)
Locate 18, 10
Print Mid$(text$,x%,60)
For y% = 1 To 7000 'diesen wert an die geschwindigkeit des computers anpassen
a$ = Inkey$
If a$ <> "" Then
Exit Do
EndIf
Next
Next
Loop
End Sub
Sub prog3()
'************************************************************
' PRIMTEST.BAS = Testet, ob eine Zahl eine Primzahl ist
' ============
' Dieses QBasic-Programm prueft ab, ob sich die Zahl a
' durch 2 oder durch eine der ungeraden Zahlen im Bereich
' (3...Wurzel aus a) ohne Rest teilen laesst. Ist das nicht
' der Fall, so ist a eine Primzahl.
'
' Warum braucht nur die Teilbarkeit durch Zahlen bis (Wurzel
' aus a) zu betrachten? Das zeigt folgendes Beispiel:
' Will man von 1303 feststellen, ob es sich um eine Primzahl
' handelt, braucht man nur zu pruefen, ob 1302 durch 2, 3,
' 5, 7,..., 37 teilbar ist, denn 38^2 ist bereits 1444, und
' 1303 ist daher durch alle Zahlen über 37 sowieso nicht
' mehr ohne Rest teilbar.
'
' (c) Thomas Antoni, 1.2.2004 - 2.2.2004
'************************************************************
Dim a&
Dim i&
Dim prim%
Dim t$
Locate 10,30
Print "PRIMZAHLENBERECHNUNG"
Do
a& = a& + 1
prim% = 1 'Vorbesetzung: a& ist eine Primzahl
'
Select Case a&
Case 1: prim% = 0 '1 ist keine Primzahl
Case 2: prim% = 1 '2 ist eine Primzahl
Case Else
If a& Mod 2 = 0 Then 'ist a eine gerade Zahl?
prim% = 0 'a ist keine Primzahl
Else 'a ist eine ungerade Zahl
For i& = 3 To Sqr(a&) Step 2 'nur ungerade Teiler
If (a& Mod i&) = 0 Then 'a/i ohne Rest teilbar
prim% = 0 'keine Primzahl!
Exit For 'fertig -> Schleife abbrechen
End If
Next
End If
End Select
'
If prim% Then
Locate 15,35
Print a&
End If
t$ = InKey$
If t$ <> "" Then
Exit Do
EndIf
Loop
End Sub
Sub fenster (oben%, links%, unten%, rechts%)
' | | | |
'obere zeile__| | | |
'linke spalte________| | |
'untere zeile________________| |
'rechte spalte_______________________|
Dim i%
'rahmen oben mit ecken
Locate oben%,links%
Print Chr$(201);
Print String$(rechts% - links% - 1,205);
Print Chr$(187);
'rahmen links und rechts
For i% = oben% + 1 To unten% - 1
Locate i%,links%
Print Chr$(186);
Locate i%,rechts%
Print Chr$(186);
Next
'rahmen unten mit ecken
Locate unten%,links%
Print Chr$(200);
Print String$(rechts% - links% - 1,205);
Print Chr$(188);
End Sub | Ich denke, daß du daraus ersehen kannst, wie die weiteren Funktionen eingebunden werden.
Viel Spass damit.
Gruß
grindstone
PS: Die Tickermeldung heißt in normalem Deutsch übrigens soviel wie: "Der Frosch sprang ins Wasser" _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 31.07.2015, 08:16 Titel: |
|
|
@Matze83:
Hier eine etwas komfortablere Methode, ein Menü zu implementieren:
Code: | Declare Function menu%(text$,taste$,zeile%,spalte%)
Do
Select Case 1 'wurde ein menüpunkt ausgewählt, liefert er eine 1 zurück, sonst eine 0
Case menu%("1 = eins","1",3,30)
Cls 'diese aktionen
Print "EINS" ' werden bei
Sleep 1 ' auswahl des
Cls ' menüpunktes ausgeführt
Case menu%("2 = zwei","2",-2,0)
Cls
Print "ZWEI"
Sleep 1
Cls
Case menu%("3 = drei","3",-2,0)
Cls
Print "DREI"
Sleep 1
Cls
Case menu%("4 = vier","4",-2,0)
Cls
Print "VIER"
Sleep 1
Cls
Case menu%("5 = fuenf","5",-2,0)
Cls
Print "FUENF"
Sleep 1
Cls
Case menu%("Esc = Ende",Chr$(27),-2,0)
End
Case menu%("RETURN = Farbe aendern (aktuell:" + Str$(farbe%) + ") ",Chr$(13),-2,0)
farbe% = farbe% + 1
If farbe% > 15 Then
farbe% = 1
EndIf
Color farbe%,0
End Select
Loop
Function menu%(text$,taste$,zeile%,spalte%)
Static t$ 'werte für nächsten aufruf merken
Static z%, s% '
If zeile% > 0 Then
z% = zeile% 'positiver wert --> direkt übernehmen
Else
z% = z% - zeile% 'wert 0 oder negativ --> zur vorherigen zeile addieren (!)
EndIf
If spalte% > 0 Then
s% = spalte% 'positiver wert --> direkt übernehmen
Else
s% = s% - spalte% 'wert 0 oder negativ --> zur vorherigen spalte addieren (!)
EndIf
Locate z%,s% - InStr(text$,"="),0 'text am gleichheitszeichen ausrichten
Print text$
If t$ = "" Then t$ = InKey$ 'tastaturabfrage
If t$ = taste$ Then 'menüpunkt wurde ausgewählt
t$ = "" 'taste löschen
menu% = 1 'rückgabewert '1'
Else 'dieser menüpunkt wurde nicht ausgewählt
menu% = 0 'rückgabewert '0'
EndIf
End Function
|
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 31.07.2015, 18:51 Titel: |
|
|
Super danke... Werde ich auch mal testen aber deine erste Übersicht habe ich soweit eingebaut. Läuft auch Auch das mit dem Rahmen funktioniert so wie ich es benötige... Allerdings hänge ich noch an den "SUB" fest...
das will so gar nicht in mein Schädel
Habe mal getestet aber wahrscheinlich ist mein Gedanke total falsch... Hier ein persönlicher test von mir :/
DECLARE SUB Addition
DIM a!, b!, c!
CLS
INPUT "gib die erste zahl an", a!
INPUT " Gib die zweite zahl an", b!
CALL Addition
PRINT c!
SUB Addition
c! = a! + b!
END SUB
So habe ich mir das vorgestellt ... aber laufen will es gar nicht |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4637 Wohnort: ~/
|
Verfasst am: 31.07.2015, 19:02 Titel: |
|
|
Dein Problem ist, dass innerhalb der SUB die Variablen eigens verwaltet werden. Das c! innerhalb der SUB ist nicht identisch mit dem c! im Hauptprogramm - es handelt sich um eine neue Variable, die nur denselben Namen besitzt.
Das, was du da gerade vorhast, würde sich besser über eine Funktion regeln lassen.
Code: | PRINT Addition(a!, b!)
FUNCTION Addition(a!, b!)
Addition = a! + b!
END FUNCTION |
Edit: Wahrscheinlich wird das ohne eine DECLARE-Zeile nicht funktionieren, kann ich aber nicht unter QB testen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2514 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 31.07.2015, 19:16 Titel: |
|
|
Artikel aus meiner berühmten Sammlung:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BildschirmMasken.html
Ausserdem ein QB-Beispiel aus der Vergangenheit:
http://beilagen.dreael.ch/QB/MENUE.BAS
Lässt sich in FreeBasic prinzipiell 1:1 übernehmen, aber es lohnt sich dort evtl. zusätzlich noch die GUI-Bibliotheken anzuschauen, um eine Windows-Oberfläche mit Mausbedienung zu erhalten.
Ob es solche Sachen wie Tkinter aus Python auch in FB gibt, mit welcher sich GUI-Oberflächen sehr einfach zusammenstricken lassen, sollen hier die Profis Dir mitteilen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 31.07.2015, 19:41 Titel: |
|
|
okay... mmh dann ist mein Gedanke wohl der falsche....
Dachte da es übersichtlicher sein soll, wollte ich in Zukunft solche Subs oder Funktionen für die Jeweilige Case1 bis case4 einfügen...
Aber ein anderes Problem was mich eher nervt, Ich habe unter CASE1 und Case2 zwei Additionsprogramme laufen.. Beide wollen patu nicht laufen..
Case eins zeigt mir das richtiige Fenster an. aber die Aufgabe wird nicht gelöst..
Denke mal das Call Prog verhindert es...
Darum würde ich gerne Case2 als ehste Variante (aufbauen)
Case 2 wird zwar die Aufgabe gelöst ( nicht am richtigen Platz trotz locate ) aber nicht in der Ansicht wie ich es gerne haben / wollen würde
Auch CLS gleich am anfang ....
Acuh die Anzeige vom Fenster spinnt...
Ich bin bissel am testen um es zu verstehen aber langsam verzweifle ich
Declare Sub fenster (oben%, links%, unten%, rechts%)
Declare Sub Prog (y, x, txt$)
DIM menuetxt$(4)
DIM i%, auswahl%, a!, b!, c!
CLS
'
'Menuetexte laden
mentxt$(1) = "1 Addition"
mentxt$(2) = "2 Addition Test 2 "
mentxt$(3) = "3 naechste Aufgabe"
mentxt$(4) = "4 Pragrammende"
'
CLS
INPUT "Geben sie den ersten Wert ein ", a!
INPUT "Geben sie den zweiten Wert ein ", b!
CLS
DO
CALL fenster(10, 8, 20, 72)
'oben________| | | |
'links___________| | |
'unten______________| |
'rechts_________________|
'Menue ausgeben
LOCATE 5, 36
PRINT " M E N U E "
'
FOR i% = 1 TO 4
LOCATE 11 + i%, 11
PRINT mentxt$(i%)
NEXT i%
'Eingabe abfragen nur anzeigen
LOCATE 19, 11
PRINT " Auswahl eingeben:_"
DO
auswahl% = VAL(INKEY$)
LOOP UNTIL auswahl% > 0 AND auswahl% < 5
CLS
'Menuewahl auswerten
SELECT CASE auswahl%
CASE 1
CALL fenster(6, 8, 20, 72)
CALL Prog(3, 9, " Additionsmenue ")
LOCATE 10, 11
c! = a! + b!
PRINT " Das Ergebnis fuer diese Additionsaufgabe betraegt:"; c!
CASE 2
CLS
CALL fenster(6, 8, 20, 72)
c! = a! + b!
LOCATE 7, 9
PRINT " Das Ergebnis fuer diese Additionsaufgabe betraegt:", c!
CASE 3
LOCATE 30, 11
PRINT "Programmaufgabe C"
CASE 4
LOCATE 30, 11
PRINT "Programmaufgabe D"
END SELECT
LOOP UNTIL auswahl% = 4
CLS
SUB Prog (y, x, txt$)
DIM a$, a!, b!, c!
c! = a! + b!
LOCATE y, x
PRINT txt$; " Beliebige Taste betaetigen um ins Hauptmenue zurueckzukehren"
a$ = INKEY$
WHILE a$ = ""
a$ = INKEY$
WEND
END SUB
SUB fenster (oben%, links%, unten%, rechts%)
' | | | |
'obere zeile__| | | |
'linke spalte________| | |
'untere zeile________________| |
'rechte spalte_______________________|
DIM i%
'rahmen oben mit ecken
LOCATE oben%, links%
PRINT CHR$(201);
PRINT STRING$(rechts% - links% - 1, 205);
PRINT CHR$(187);
'rahmen links und rechts
FOR i% = oben% + 1 TO unten% - 1
LOCATE i%, links%
PRINT CHR$(186);
LOCATE i%, rechts%
PRINT CHR$(186);
NEXT
'rahmen unten mit ecken
LOCATE unten%, links%
PRINT CHR$(200);
PRINT STRING$(rechts% - links% - 1, 205);
PRINT CHR$(188);
END SUB |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 31.07.2015, 19:49 Titel: |
|
|
Denn selbst CLS.... nachdem ich ein Menüpunkt ausgewählt habe, hat keine Wirkung... Das ist der Knackpunkt bei mir.. Ich möchte wenn ich ein Menüpunkt ausgwählt habe, das ein Programm / Aufgabe aubläuft und dann das Ergebnis angezeigt wird... und dann möchte ich wieder ins Hauptmenü gelangen
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4637 Wohnort: ~/
|
Verfasst am: 31.07.2015, 20:56 Titel: |
|
|
Lass mich mal kurz erklären, was beim Aufruf deiner SUB passiert.
Code: | SUB Prog (y, x, txt$)
' Der Aufruf lautete: CALL Prog(3, 9, " Additionsmenue ")
' Also hast du jetzt die Variablenbelegung:
' y = 3 : x = 9 : txt$ = " Additionsmenue "
' Das passt ja soweit.
DIM a$, a!, b!, c!
' vier neue Variablen mit den Standardwerten:
' a$ = "" : a! = 0 : b! = 0 : c! = 0
c! = a! + b!
' Jetzt ist also c! = 0 + 0 = 0
LOCATE y, x
PRINT txt$; " Beliebige Taste betaetigen um ins Hauptmenue zurueckzukehren"
a$ = INKEY$
WHILE a$ = ""
a$ = INKEY$
WEND
END SUB
' Nach Beendigung der SUB gehen die Variablenwerte von a$, a!, b! und c! wieder verloren.
|
Zitat: | Denn selbst CLS.... nachdem ich ein Menüpunkt ausgewählt habe, hat keine Wirkung... |
Welches CLS meinst du? Dieses hier?
Code: | DO
auswahl% = VAL(INKEY$)
LOOP UNTIL auswahl% > 0 AND auswahl% < 5
CLS |
Das hat sehr wohl eine Auswirkung, nur wird kurz darauf gleich wieder was geschrieben. Der leere Bildschirm wird also viel zu kurz angezeigt, um ihn wahrzunehmen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 31.07.2015, 22:43 Titel: |
|
|
So so
musste jetzt erstmal noch Sport machen um mein Kopf frei zu bekommen...
Jetzt bin ich frisch und etwas kopfklarer...
Jetzt habe ich von " Nemored " Funktion ausprobiert..
FUNCTION Addition (a!, b!)
INPUT " gib a ein", a!
INPUT " Gib b ein", b!
Addition = a! + b!
END FUNCTION
Jetzt hat das so geklappt wie ich das wollte ABER, ( nur in diesem kurzen Beispiel )....JETZT hast du geschrieben das im in einer Sub Variante die Variablen, welche ich ganz oben schreibe (DIM) nicht die sind die ich benötige für die Berechnung im SUB Prog , sondern es sind andere Variable...
Wie ist das jetzt bei der Funktion? Sind das jetzt a! b! aus meiner DIM welche ich zu beginn bestimme ?
Zu deinem letzten Statement
Ja stimmt,
Jetzt habe ich in Case 2 das geschrieben :
CASE 2
CLS
CALL fenster(6, 8, 20, 72)
c! = a! + b!
LOCATE 7, 9
PRINT " Das Ergebnis betraegt:", c!
SLEEP 3
CLS
Und das passt... jedenfalls für 3 sekunden wird das ergebniss angezeigt und dann wird das Hauptmenü angezeigt.. Passt soweit halbwegs
ZU Case 1 nochmal... Ich glaub da muss ich dir jetzt aber wiedersprechen bzw nicht wiedersprechen
SUB Prog (y, x, txt$)
Jetzt bin ich davon ausgegangen, das es IMMER die Stelle ist wo das Wort "Additionsaufgabe" ist dort hinschreibt. Aber das tut er ja auch an der Stelle, denn unten im SUB Programm steht ja Locate x,y
Oder irre ich mich da? 3, 9 ist x bzw. y aber die Stelle wo er das Wort hinschreibt. a$ = ist belibige Taste
Und a! b! c! hier bin ich von ausgegangen, das er a! und b! nimmt welche im Hauptprogramm Unter DIM deklariert habe... Aber du hast ja oben gesagt, das im SUB nicht diese sind , sondern ganz andere Variablen..... es sind Neue Variablen. Deshalb ist a! b! c! = 0, Da ich sie im SUB Programm auch nicht abrufe.. bzw keine neuen Varible gebe...
Sorry bin noch fertig vom Sport... Hoffe es kommt einigermaßen klar rüber Aber du hast mir sehr geholfen... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4637 Wohnort: ~/
|
Verfasst am: 31.07.2015, 23:12 Titel: |
|
|
Zitat: | Wie ist das jetzt bei der Funktion? Sind das jetzt a! b! aus meiner DIM welche ich zu beginn bestimme ? |
Wenn du Werte als Parameter übergibst, werden diese SUB- (oder FUNCTION-)Variablen mit diesen Werten belegt. Das sind also nicht notwendigerweise die Variablen a! und b! aus dem Hauptprogramm, sondern die Werte, die du übergibst. Du kannst ja auch so etwas machen:
Code: | a = 1
b = 2
c = 3
d = 4
print summe(c, d)
function summe(a, b)
summe = a + b
end function |
In der Funktion stehen jetzt in a und b die Werte 3 und 4; diese wurden ja übergeben.
Zitat: | ZU Case 1 nochmal... Ich glaub da muss ich dir jetzt aber wiedersprechen bzw nicht wiedersprechen |
Mir ist leider nicht klar geworden, in welchem Punkt du mir jetzt widersprechen oder nicht widersprechen willst.
Du übergibst 3, 9, " Additionsmenue ", damit landet 3 in y, 9 in x und 3, 9, " Additionsmenue " in txt$. Ein LOCATE y, x (so herum hast du es oben stehen) positioniert dann in die neunte Spalte der 3. Zeile.
Zitat: | Jetzt bin ich davon ausgegangen, das es IMMER die Stelle ist wo das Wort "Additionsaufgabe" ist dort hinschreibt. |
Wenn du dasselbe meinst wie ich, habe ich nie etwas gegenteiliges behauptet. _________________ 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: 1230 Wohnort: Ruhrpott
|
Verfasst am: 01.08.2015, 00:26 Titel: |
|
|
Hallo Matze83
Hier dein Programm mit zwei unterschiedlichen Lösungsansätzen für die Addition. Bei Addition 1 wird die komplette Aufgabe innerhalb der Sub erledigt, bei Addition 2 übernimmt eine Funktion nur das Allernotwendigste, alles andere wird im Hauptprogramm erledigt. Welcher Ansatz jeweils der günstigere ist, hängt davon ab, was das Programm insgesamt machen soll. Das ist deine Entscheidung als Programmierer.
Code: | Declare Sub fenster (oben%, links%, unten%, rechts%)
Declare Sub Addition1 (y%, x%, txt$)
Declare Function Addition2! (a!, b!)
Dim mentxt$(4)
Dim i%, auswahl%, a!, b!, c!
Cls
'
'Menuetexte laden
mentxt$(1) = "1 Addition 1"
mentxt$(2) = "2 Addition Test 2 "
mentxt$(3) = "3 naechste Aufgabe"
mentxt$(4) = "4 Pragrammende"
'
Cls
Do
fenster(10, 8, 20, 72)
'oben________| | | |
'links___________| | |
'unten______________| |
'rechts_________________|
'Menue ausgeben
Locate 5, 36
Print " M E N U E "
'
For i% = 1 To 4
Locate 11 + i%, 11
Print mentxt$(i%)
Next i%
'Eingabe abfragen nur anzeigen
Locate 19, 11
Print " Auswahl eingeben:_"
Do
auswahl% = Val(InKey$)
Loop Until auswahl% > 0 And auswahl% < 5
Cls
'Menuewahl auswerten
Select Case auswahl%
Case 1
fenster(6, 8, 20, 72)
Addition1(8, 9, " Additionsmenue ")
Cls
Case 2
Cls
fenster(6, 8, 20, 72)
Locate 8,9
Print " Additionsmenue 2 "
Locate CsrLin + 3,9
Input " Erster Wert ",a!
Locate CsrLin,9
Input "Zweiter Wert ",b!
Locate CsrLin + 1,9
Print " Das Ergebnis fuer diese Additionsaufgabe betraegt:"; Addition2!(a!,b!)
Locate CsrLin + 2, 11
Print "weiter mit beliebiger Taste"
Sleep
Cls
Case 3
Locate 30, 11
Print "Programmaufgabe C"
Case 4
Locate 30, 11
Print "Programmaufgabe D"
End Select
Loop Until auswahl% = 4
Cls
Sub Addition1 (y%, x%, txt$)
Dim a!, b!, c!
Locate y%,x%
Print txt$
Locate y% + 3,x%
Input " Erster Wert ",a!
Locate y% + 4,x%
Input "Zweiter Wert ",b!
c! = a! + b!
Locate y% + 6,x%
Print " Das Ergebnis fuer diese Additionsaufgabe betraegt:"; c!
Locate y% + 8,x%
Print "weiter mit beliebiger Taste"
Sleep
End Sub
Function Addition2! (a!, b!)
Addition2! = a! + b!
End Function
Sub fenster (oben%, links%, unten%, rechts%)
' | | | |
'obere zeile__| | | |
'linke spalte________| | |
'untere zeile________________| |
'rechte spalte_______________________|
Dim i%
'rahmen oben mit ecken
Locate oben%, links%
Print Chr$(201);
Print String$(rechts% - links% - 1, 205);
Print Chr$(187);
'rahmen links und rechts
For i% = oben% + 1 To unten% - 1
Locate i%, links%
Print Chr$(186);
Locate i%, rechts%
Print Chr$(186);
Next
'rahmen unten mit ecken
Locate unten%, links%
Print Chr$(200);
Print String$(rechts% - links% - 1, 205);
Print Chr$(188);
End Sub |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 01.08.2015, 05:51 Titel: |
|
|
grindstone, all deine muehen in ehren. aber, bitte lass den TE auch
mal selber nachdenken.
salute
PS: ich weis das war kein produktiver beitrag, aber der musste sein. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 01.08.2015, 09:22 Titel: |
|
|
Um erfolgreich nachdenken zu können, muß man erst einmal über das notwendige Grundwissen verfügen, z.B über Sinn, Funktionsweise und Anwendung von SUBs und FUNCTIONs. Genau das versuche ich mit dem o.g. Beispiel zu vermitteln.
Ob der Versuch erfolgreich war, wird sich zeigen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 01.08.2015, 09:59 Titel: |
|
|
oh okay dann hab ich deine intension falsch verstanden
dazu aber auch noch mal ein Bsp.:
Code: |
'hier wird eine function erstellt die einen uinteger zurueckgiebt
function add_func(a as uinteger, b as uinteger) as uinteger
dim c as uinteger = a + b
'c ist hier nur innerhalb der function bekannt (lokal)
'daher wird c verworfen wenn die function verlassen wird, aber es wird "vorher" als ergebniss der function zurueckgegeben.
return c
end function
'hier wird eine sub erstellt
sub add_sub(a as uinteger, b as uinteger)
dim c as uinteger = a + b
'c ist auch hier nur innerhalb der sub bekannt (lokal)
'da subs keinen rueckgabewert besitzen
'wird c gnadenlos verworfen wenn die sub verlassen wird.
end sub
'hier sind a,b und c "global" bekannt
dim as uinteger a,b,c
a=4:b=3
'deswegen geht das hier wunderbar
c=a+b
print c
'aber das hier wird nicht funzen
a=3:b=8
add_sub(a,b)
print c
'dagegen aber das hier wieder wunderbar
a=1:b=3
print add_func(a,b)
|
ich hoffe ich konnte etwas dazu beitragen die "grundlagen", wie grindstone es so schoen sagte, etwas zu erleuchten
salute |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 01.08.2015, 10:38 Titel: |
|
|
Haubitze hat Folgendes geschrieben: | Code: | 'hier sind a,b und c "global" bekannt
Dim As UInteger a,b,c |
| Na ja, so ganz stimmt das nicht, die Variablen sind lokal für das Hauptprogramm deklariert. Für globale Variablen müsste die Zeile lauten: Code: | Dim Shared As UInteger a,b,c |
Code: | 'aber das hier wird nicht funzen
c=add_sub(a,b)
Print c | Natürlich nicht, die Zuweisung eines SUB - Aufrufs zu einer Variablen gibt einen Syntax error, d.h., das Programm startet erst gar nicht. Es ist klar, was du damit zeigen möchtest, dazu müsste dort stehen: Code: | 'aber das hier wird nicht funzen
add_sub(a,b)
Print c | Aber - man reibt sich die Augen - es wird das korrekte Ergebnis angezeigt. Und jetzt die rhetorische Frage an dich: Warum?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 01.08.2015, 10:41 Titel: |
|
|
ja hab das auch gesehn daher auch nochmal nacheditiert
aber der TE soll aj auch noch bissl nachdenken duerfen ne |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1230 Wohnort: Ruhrpott
|
Verfasst am: 01.08.2015, 11:02 Titel: |
|
|
Haubitze hat Folgendes geschrieben: | aber der TE soll aj auch noch bissl nachdenken duerfen ne | Ja ja, red' dich nur raus! _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Matze83
Anmeldungsdatum: 27.07.2015 Beiträge: 29
|
Verfasst am: 01.08.2015, 18:25 Titel: |
|
|
Hey grindstone So wie in deinem Beispiel Case 1 werde ich mein Programmierung auch durchlaufen lassen... Hätte halt gedacht, das die Variablen im SUb / Function die ich im Hauptprogramm nutze, genommen werden. Und hier auch nochmal dank an euch.. Wahrscheinlich schüttelt ihr oft den Kopf und denkt, ....,...., ....
Aber mir wurde bis Thema " Schleifen " alles gezeigt... Aber das wars dann auch wieder... Kein SUB, Menüaufbau oder die Themen die wir jetzt hier behandeln..
Aber wie gesagt, ich werde mein Programm jetzt wie in Case 1 beschrieben umbauen...Schade aber das das nicht klappt.
Und dabei handelt es sich nicht um Additionsaufgaben ... Das ist nur ein Simples Bespiel gewesen, wie ich meine Aufgaben in ein Menü unterbringen kann.. Darum Haubitze bissel Nachsicht Es ist neu und manchmal versteh ich leider Dinge nur wenn ich alle Infos erhalten habe Danke für dein Beispiel Haubitze ... mit global meinst du die Variablen die ich im Hauptprogramm declariert habe ?
Local innerhalb des SUB bzw Function... Dann habe ich es auch gerafft |
|
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.
|
|