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:16] – [Lokale und globale Variablen] sbelfaecher:nwt:arduino:lernbaustein2:funktionen2:start [11.02.2025 21:07] (aktuell) sbel
Zeile 138: Zeile 138:
 ---- ----
 {{:aufgabe.png?nolink  |}} {{:aufgabe.png?nolink  |}}
-=== (A1) === +=== (A4) ===  
 + 
 +  * 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. 
 + 
 + 
 +<callout type="info"> 
 +Variablen, die am Beginn eines Arduino Sketches deklariert werden, sind **global** gültig: Man kann in allen Funktionen auf sie zugreifen. 
 + 
 +Allerdings kann man sie auch überall verändern. Bei längeren Programmen ist es darum oft nicht immer einfach zu wissen, was für einen Wert eine globale Variable gerade hat. 
 + 
 +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> 
 + 
 +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.1739301360.txt.gz
  • Zuletzt geändert: 11.02.2025 20:16
  • von sbel