Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Frage Menü Aufbau
Gehe zu Seite 1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 28.07.2015, 21:25    Titel: Frage Menü Aufbau Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 28.07.2015, 21:56    Titel: Antworten mit Zitat

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. happy 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 29.07.2015, 01:09    Titel: Antworten mit Zitat

Hallo Matze83 und willkommen im Forum! lächeln

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 grinsen ). 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 31.07.2015, 08:16    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 31.07.2015, 18:51    Titel: Antworten mit Zitat

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 traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 31.07.2015, 19:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2459
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 31.07.2015, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 31.07.2015, 19:41    Titel: Antworten mit Zitat

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 traurig




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
Benutzer-Profile anzeigen Private Nachricht senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 31.07.2015, 19:49    Titel: Antworten mit Zitat

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 mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen mit dem Kopf durch die Mauer wollen durchgeknallt
mit den Augen rollen happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 31.07.2015, 20:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 31.07.2015, 22:43    Titel: Antworten mit Zitat

So so

musste jetzt erstmal noch Sport machen um mein Kopf frei zu bekommen... lächeln

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 lächeln



ZU Case 1 nochmal... Ich glaub da muss ich dir jetzt aber wiedersprechen bzw nicht wiedersprechen lächeln

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 lächeln Aber du hast mir sehr geholfen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4209
Wohnort: ~/

BeitragVerfasst am: 31.07.2015, 23:12    Titel: Antworten mit Zitat

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 lächeln

Mir ist leider nicht klar geworden, in welchem Punkt du mir jetzt widersprechen oder nicht widersprechen willst. lächeln
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. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2015, 00:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 93

BeitragVerfasst am: 01.08.2015, 05:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2015, 09:22    Titel: Antworten mit Zitat

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. zwinkern

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 93

BeitragVerfasst am: 01.08.2015, 09:59    Titel: Antworten mit Zitat

oh okay dann hab ich deine intension falsch verstanden zwinkern

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 lächeln

salute
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2015, 10:38    Titel: Antworten mit Zitat

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? grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 93

BeitragVerfasst am: 01.08.2015, 10:41    Titel: Antworten mit Zitat

ja hab das auch gesehn daher auch nochmal nacheditiert zwinkern

aber der TE soll aj auch noch bissl nachdenken duerfen ne grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 849
Wohnort: Ruhrpott

BeitragVerfasst am: 01.08.2015, 11:02    Titel: Antworten mit Zitat

Haubitze hat Folgendes geschrieben:
aber der TE soll aj auch noch bissl nachdenken duerfen ne
Ja ja, red' dich nur raus! grinsen
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Matze83



Anmeldungsdatum: 27.07.2015
Beiträge: 29

BeitragVerfasst am: 01.08.2015, 18:25    Titel: Antworten mit Zitat

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, ....,...., .... zwinkern
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 zwinkern Es ist neu und manchmal versteh ich leider Dinge nur wenn ich alle Infos erhalten habe lächeln 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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3, 4  Weiter
Seite 1 von 4

 
Gehe zu:  
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.

 Impressum :: Datenschutz