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 zu Anfängerkurs Teil 4 - Unterprogramme

 
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
Sven49



Anmeldungsdatum: 23.04.2015
Beiträge: 8

BeitragVerfasst am: 23.04.2015, 15:15    Titel: Frage zu Anfängerkurs Teil 4 - Unterprogramme Antworten mit Zitat

Hallo, lächeln

Das folgende Programm ist mir ein Rätsel...

Zitat:

DECLARE FUNCTION Summe(BYVAL Summand1 AS INTEGER, BYVAL Summand2 AS INTEGER) AS INTEGER
DIM AS INTEGER a, b
INPUT "Summand1=", a
INPUT "Summand2=", b
PRINT "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
PRINT "Summe in d=" &Summe(a+19, b+4) 'Hier wird die Summe mit anderen Werten berechnet..
SLEEP
END

FUNCTION Summe(BYVAL Summand1 AS INTEGER, BYVAL Summand2 AS INTEGER) AS INTEGER
RETURN Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
Summe=Summand1+Summand2 'Summe berechnen und in der Function bleiben..
' Function=Summand1+Summand2 'diese Zeile ist mit der darüber gleichbedeutend..
END FUNCTION 'Ende der Function, jetzt mit der Wert von Summe(oder Function) zurückkehren


Ist Summand1 schon irgendwie ein in Freebasic besetzter Begriff?
Nirgends wird irgendwo gesagt, dass summand1 = a und summand2 = b ist.

PRINT "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
Wie geschieht das? Was bedeutet das & in diesem Fall? Bei einem Ausdruck wie Summe(a, b) würde ich mir eine 2 dimensionale Variable vorstellen, aber hier wird die Summe berechnet?

Irgendwie blicke ich da nicht richtig durch. Der "Function"-Teil erklärt sich vielleicht bei mehr Einsicht meinerseits.

Vielleicht gibt es weitere Beispiele irgendwo, die es nochmal anders veranchaulichen?

Ich bin für (Teil-)Antworten im Vorraus dankbar. lächeln

Gruß!
Sven
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 23.04.2015, 16:05    Titel: Antworten mit Zitat

Hallo Sven 049,


Zur Frage: Was macht eine Funktion?
Da in der ersten Zeile
Code:
FUNCTION Summe(BYVAL Summand1 AS INTEGER, BYVAL Summand2 AS INTEGER) AS INTEGER

die Funktion "Summe" deklariert wurde, weiß FreeBASIC, dass es, wenn es auf "Summe" stößt, die Funktion aufrufen muss. Die Funktion erwartet zwei INTEGER--Parameter (wurde in der DECLARE-Zeile und später im Funktionskopf so festgelegt), die den Namen Summand1 und Summand2 erhalten.
Bei einem Aufruf von "Summe(a, b)" gibt das Programm die Werte von a und b an die Funktion weiter und legt den ersten Wert (also a) in die (funktionsinterne) Variable Summand1 und den zweite Wert (b) in die Variable Summand2. Die Funktion kann die Werte dann zum Rechnen verwenden. Sie gibt hier den Wert des Ausdrucks Summand1+Summand2 zurück.

Zitat:
PRINT "Summe in c=" &Summe(a, b) 'Hier wird die Summe berechnet..
Wie geschieht das? Was bedeutet das & in diesem Fall? Bei einem Ausdruck wie Summe(a, b) würde ich mir eine 2 dimensionale Variable vorstellen, aber hier wird die Summe berechnet?

Das & ist eine String-Konkatenation (schönes Wort) - kurz gesagt, zwei Zeichenketten werden zusammengehängt. "c" & "d" ist "cd", "Hallo" & "Welt" ergibt "HalloWelt" usw. In diesem Fall wird erst der Funktionswert berechnet und dann der Wert an den vorigen String angehängt.
Dass Summe(a, b) nicht als zweidimensionale Variable behandelt wird, liegt ganz einfach an der DECLARE-Zeile ganz am Anfang, durch die das Programm weiß, dass es sich um eine Funktion handelt.

Ich hoffe, der Zusammenhang ist jetzt ein wenig klarer geworden.
_________________
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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 23.04.2015, 16:16    Titel: Antworten mit Zitat

Summand ist natürlich kein vordefinierter Begriff. Du siehst bei der Funktionsdeklaration bzw dessen Implementierung die Definition der benannten Parameter.

Also wenn du z.b. eine Funktion "func" mit 2 Parametern a und b hättest, dann hast du einerseits eine Implementierung dieser funktion,, z.b.
Function func(a as integer, b as integer) as integer
Return a+b
End function

Innerhalb der Funktionsimplementierung vrwendest du also die benannten Parameter.

Um die Funktion zu vwerwenden muss sie irgendwo aufgerufen werden, z.b.
Func(1, 2) - in diesem Fall hat dann innerhhalb dr funktion a den wert 1 und b den wert 2. Aber es geht natürlich, wie in deinem code auch mit variablen. Z.b.
dim variable as integer = 1
Func(variable, 2)
Das macht dasselbe wie zuvor, nur das jetzt der Parameter a der Variable "variable" entspricht, also 1.

------

Das & kommt durch das zusammenhängen von 2 Strings. Zb.
Print "hallo" & "welt"
ein teil is bei dir das funktionsresultat.



Ich bitte tippfehler Und die unschöne formatierung zu entschuldigen, bin gerade nur mit dem smartphone online.

//edit: da war nemored schneller
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sven49



Anmeldungsdatum: 23.04.2015
Beiträge: 8

BeitragVerfasst am: 23.04.2015, 17:32    Titel: Antworten mit Zitat

Vielen Dank, Nemored und St_W,

mir ist das jetzt um einiges klarer, wenn auch noch etwas seltsam (Ich habe auf dem C64 mit Basic rumgespielt und der Goto-Befehl war beliebt! happy).
Aber generell verstehe ich es jetzt, denke ich.

Zwei Fragen stellen sich mir noch:
Zitat:

FUNCTION Summe(BYVAL Summand1 AS INTEGER, BYVAL Summand2 AS INTEGER) AS INTEGER
RETURN Summand1+Summand2 'Summe berechnen und mit dem Ergebnis zurückkehren
Summe=Summand1+Summand2 'Summe berechnen und in der Function bleiben..
' Function=Summand1+Summand2 'diese Zeile ist mit der darüber gleichbedeutend..
END FUNCTION 'Ende der Function, jetzt mit der Wert von Summe(oder Function) zurückkehren


Welche Funktion erfüllt hier die Zeile:
"Summe=Summand1+Summand2" ?

Ich habe die Zeile entfernt, das Programm läuft trotzdem. Der Zusatz 'Summe berechnen und in der Funktion bleiben' hilft mir nicht wirklich.

Meine zweite Frage bezeiht sich darauf, ob ich es wirklich verstanden habe zwinkern :

Function func(a as integer, b as integer) as single
Return a/b
End function

wäre es so richtig, wenn ich aus zwei ganzen Zahlen einen Bruch haben möchte? Deshalb Func (...) as SINGLE, da es eine dezimalzahl wird?

Nochmal Danke! lächeln

Gruß!
Sven
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 23.04.2015, 18:05    Titel: Antworten mit Zitat

Zitat:
Welche Funktion erfüllt hier die Zeile:
"Summe=Summand1+Summand2" ?

Hier erfüllt diese Zeile tatsächlich überhaupt keinen Zweck ...
Es gibt mehrere Möglichkeiten, um den Rückgabewert festzulegen. Früher war eine Zeile wie "Summe=Summand1+Summand2" oder "FUNCTION=Summand1+Summand2" beliebt, wobei "FUNCTION=" ein feststehender Ausdruck ist und "Summe=" ggf. an den Namen der Funktion angepasst werden muss. Bei beiden Versionen bleibt das Programm erst noch in der Funktion und läuft bis zum "END FUNCTION" weiter, erst dann erfolgt die Rückgabe.

Mit "RETURN Summand1+Summand2" wird ebenfalls der gewünschte Wert zurückgegeben, allerdings wird die Funktion auch sofort verlassen und man kehrt ins Hauptprogramm zurück (d. h. die folgende Zeile "Summe=Summand1+Summand2" wird gar nicht mehr ausgeführt). Ich bevorzuge diese RETURN-Version.

Zitat:
Function func(a as integer, b as integer) as single
Return a/b
End function

wäre es so richtig, wenn ich aus zwei ganzen Zahlen einen Bruch haben möchte? Deshalb Func (...) as SINGLE, da es eine dezimalzahl wird?

Genau richtig. lächeln
_________________
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
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
Seite 1 von 1

 
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