 |
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 |
Sven49
Anmeldungsdatum: 23.04.2015 Beiträge: 8
|
Verfasst am: 23.04.2015, 15:15 Titel: Frage zu Anfängerkurs Teil 4 - Unterprogramme |
|
|
Hallo,
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.
Gruß!
Sven |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 23.04.2015, 16:05 Titel: |
|
|
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 |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 23.04.2015, 16:16 Titel: |
|
|
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 |
|
 |
Sven49
Anmeldungsdatum: 23.04.2015 Beiträge: 8
|
Verfasst am: 23.04.2015, 17:32 Titel: |
|
|
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! ).
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 :
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!
Gruß!
Sven |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 23.04.2015, 18:05 Titel: |
|
|
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.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
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.
|
|