faecher:nwt:arduino:lernbaustein2:funktionen2:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
faecher:nwt:arduino:lernbaustein2:funktionen2:start [11.02.2025 20:21] – [Lokale und globale Variablen] sbelfaecher:nwt:arduino:lernbaustein2:funktionen2:start [11.02.2025 21:07] (aktuell) sbel
Zeile 141: Zeile 141:
  
   * Erkläre, warum sich das Programm so verhält.    * Erkläre, warum sich das Programm so verhält. 
 +  * Übernehme die Änderungen in deinen Sketch und teste.
 +  * Ändere den Wert von ''start'' im Setup auf 3. 
   * Kommentiere die beiden Variablendeklarationen am Beginn des Sketsches aus und teste, was jetzt passiert.   * Kommentiere die beiden Variablendeklarationen am Beginn des Sketsches aus und teste, was jetzt passiert.
  
Zeile 151: Zeile 153:
 Man sollte die Verwendung von globalen Variablen darum auf wenige Zwecke einschränken, z.B. um den PINs des Arduino "sprechende Namen" zu geben. Man sollte die Verwendung von globalen Variablen darum auf wenige Zwecke einschränken, z.B. um den PINs des Arduino "sprechende Namen" zu geben.
 </callout> </callout>
 +
 +Man kann den Sketch wie folgt abändern, um lokale Variablen zu erhalten:
 +
 +<code c>
 +void setup() {
 +  delay(1000);
 +  Serial.begin(9600);
 +  delay(1000);
 +  Serial.println("--- Programmstart -------");
 +  quadratzahlen();
 +  Serial.println("--- Zwischenmeldung -----");
 +  quadratzahlen();
 +  Serial.println("--- Programmende --------");
 +}
 +
 +void quadratzahlen() {
 +// Lokale Variablen
 +int start=1;
 +int ende=5;
 +  Serial.print("- Start: quadratzahlen - ");
 +  for(int i=start; i<ende; i++) {
 +    int q=i*i;
 +    Serial.print(q);
 +    Serial.print(" ");
 +  }
 +  Serial.println("- Ende: quadratzahlen -");
 +  return; //Optional, weil kein Wert zurückgegeben wird.
 +}
 +</code>
 +
 +<callout type="info">
 +Variablen, die innerhalb eines Codeblocks mit geschweiften Klammern deklariert werden, gelten nur **lokal** innerhalb dieses Klammerblocks. Außerhalb des Klammerblocks kann nicht auf sie zugegriffen werden.
 +
 +  * Parameter einer Funktion sind immer lokale Variablen in der betreffenden Funktion.
 +  * Laufvariablen von for-Schleifen sind lokal innerhalb des Schleifenblocks
 +</callout>
 +
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A5) === 
 +
 +Ändere deinen Sketch so ab, dass lokale Variablen verwendet werden. Versuche die Variable ''start'' im Setup-Block auf den Wert 3 zu setzen.
 +
 +==== Was ist, wenn es globale und lokale Variablen mit gleichem Namen gibt? ====
 +
 +Betrachte den folgenden Sketch: 
 +
 +<code c>
 +int start=2;
 +void setup() {
 +  delay(1000);
 +  Serial.begin(9600);
 +  delay(1000);
 +  Serial.println("--- Programmstart -------");
 +  quadratzahlen();
 +  Serial.println("--- Zwischenmeldung -----");
 +  quadratzahlen();
 +  Serial.println("--- Programmende --------");
 +}
 +
 +void quadratzahlen() {
 +// Lokale Variablen
 +int start=1;
 +int ende=5;
 +  Serial.print("- Start: quadratzahlen - ");
 +  for(int i=start; i<ende; i++) {
 +    int q=i*i;
 +    Serial.print(q);
 +    Serial.print(" ");
 +  }
 +  Serial.println("- Ende: quadratzahlen -");
 +  return; //Optional, weil kein Wert zurückgegeben wird.
 +}
 +
 +</code>
 +
 +Hier gibt es sowohl eine globale als auch eine lokale Variable mit dem Namen ''start''. Welche wird jetzt in der for-Schleife verwendet?
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A6) === 
 +
 +  * Teste den Sketch. Welche Variable wird in der for-Schleife verwendet?
 +  * Gib den Wert von ''start'' irgendwo im setup mit einem Serial.printl Befehl aus - welcher Wert wird hier ausgegeben?
 +
 +
 +===== Funktionen mit Rückgabewert =====
 +Funktionen können, wenn sie zu der Stelle zurückkehren, an der sie aufgerufen wurden auch noch Ergebnisse zurückgeben. 
 +
 +{{ :faecher:nwt:arduino:lernbaustein2:funktionen2:fkt-signatur3.png |}}
 +
 +{{ :faecher:nwt:arduino:lernbaustein2:funktionen2:fkt-rw.drawio.png |}}
 +
 +<code c>
 +void setup() {
 +  delay(1000);
 +  Serial.begin(9600);
 +  delay(1000);
 +  Serial.println("--- Programmstart -------");
 +  double n = nullstelle(-2,4);
 +  Serial.print("Nullstelle bei x=");
 +  Serial.println(n);
 +  Serial.println("--- Programmende --------");
 +}
 +
 +double nullstelle(double steigung, double yachsabsch) {
 +  double nullst = -1 * yachsabsch / steigung;
 +  return nullst;
 +}
 +
 +void loop() {
 +// Leer - der Loop hat hier keine Funktion
 +}
 +</code>
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A7) === 
 +
 +   * Was berechnet der abgebildete Sketch? Teste mit verschiedenen Parameterwerten.
 +   * Erweitere den Aufruf der Funktion im Setup so, dass alle Nullstellen aller Geraden mit Steigungen zwischen -2.0 und -1.0 mit der Schrittweite 0.1 berechnet werden: {{ :faecher:nwt:arduino:lernbaustein2:funktionen2:bildschirmfoto_20250211_205809.png |}}
 +
 +++++ Hilfestellung 1: For Schleife mit 0.1er Schritten |
 +
 +Die for-Schleife sieht hier z.B. so aus:
 +<code c>
 +for (double i = -2; i <= -0.99; i = i + 0.1) {
 +    // Rechnen und ausgeben
 +  }
 +</code>
 +++++
 +
 +++++ Lösungsvorschlag |
 +<code c>
 + for (double i = -2; i <= -0.99; i = i + 0.1) {
 +    double n = nullstelle(i, 4);
 +    Serial.print("Steigung m=");
 +    Serial.print(i);
 +    Serial.print(" Nullstelle bei x=");
 +    Serial.println(n);
 +  }
 +</code>
 +
 +++++
  • faecher/nwt/arduino/lernbaustein2/funktionen2/start.1739301710.txt.gz
  • Zuletzt geändert: 11.02.2025 20:21
  • von sbel