Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Werte über ein Terminal einlesen

Wir wissen jetzt, wie man die Adresse einer Variablen bestimmen kann und diese Information mit Hilfe einer neuen Funktion weiter verarbeiten. Wir experimentieren in diesem Tutorial mit der Funktion scan, die einen Wert, der über das SimpleIDE-Terminal eingegeben wird, an das Programm übergibt. Die Funktion scan wandelt eine eingegebene Textzahl in einen für den Rechner lesbaren Zahlenwert um. Im folgenden Beispiel wird das näher erläutert.
Mit Hilfe der Funktion print wird der Text Anzahl Wiederholungen  im Terminal ausgegeben und über die Funktion scan wird der eingegebene Zahlenwert, der in der Variablen reps abgelegt ist, ermittelt.

 

 

Übung 1

 

  • Gib das folgende Programm im SimpleIDE Editor ein und speicher das Programm unter dem Namen A12_01 ab.
  • Starte das Programm über Run with Terminal .
  • Gib eine Zahl ein, sobald der Text Anzahl Wiederholungen auf dem Terminal erscheint. Bestätige die Eingabe mit der Rücklauf-Taste.
  • Überprüfe, ob auf dem SimpleIDE Terminal alle Zahlen von 1 bis zur eingegebenen Zahl untereinander ausgegeben werden.

 

 

Programm A12_01

Programm A12_01

 

 

Wie arbeitet das Programm A12_01?

 

Zeile 7
Die Variable reps vom Typ int wird deklariert; sie nimmt den Wert für die Anzahl Wiederholungen auf.

 

Zeile 11
Textausgabe im Terminal: Anzahl Wiederholungen:  

 

Zeile 12
Die Funktion scan erwartet eine Tastatureingabe im SimpleIDE Terminal und legt einen oder mehrere Werte in einer oder mehreren Variablen ab. Die mit der scan-Funktion verknüpfte Formatanweisung %d gibt an, dass der eingegebene Character als Dezimalzahl abgespeichert werden soll. Das zweite Argument im Funktionsaufruf &reps teilt der Funktion scan die Adresse mit, an der das Ergebnis abgelegt werden soll. Anstelle eines Variablenwertes wird eine Adresse der Variable benötigt, um die Formatierung durchführen zu können.

 

Zeile 13
Die folgende print-Anweisung soll rückmelden, ob die scan-Funktion korrekt arbeitet.

 

Zeile 15 und 17
FOR-Schleife, in der von 1 bis zur Anzahl der eingegebenen Wiederholungen hochgezählt und das Zahlenergebnis auf dem Terminal ausgegeben wird.

 

Was du wissen solltest!

Nachdem scan den Wert in einer Variablenadresse abgelegt hat – wie zum Beispiel &reps – ist dieser Wert über die Variable reps abrufbar. Das Programm kann deshalb auch folgende Anweisungen abarbeiten:


  • print("reps = %d\n", reps) zeigt den Zahlenwert von reps an und
    
    
  • for(int n = 1; n <= reps; n++),
    
    
nutzt den Zahlenwert von reps als obere Begrenzung in der Zählschleife.

Die scan-Funktion ist enthalten in der simpletext-Bibliothek, die die simpletools- Bibliothek automatisch enthält. Sie ähnelt in ihrem Verhalten der scanf-Funktion in der stdio-Bibliothek der Sprache C. Wir nutzen simpletext mit dem Propeller, da sie weniger Speichercode bei Fließkommazahlen benötigt.


Die print-Funktion ist ebenfalls in simpletext enthalten und entspricht in ihrer Wirkung der printf-Funktion aus der stdio-Bibliothek.
Übrigens – ein immer wieder gern gemachter Fehler ist das Voranstellen des &-Operators bei Nutzung der scan-Funktion.
Scan kann als inverse print-Anweisung aufgefasst werden. Die Anweisung

print("%d\n", reps)

gibt zum Beispiel den Dezimalwert von reps auf dem Terminal aus und das Steuerzeichen \n sorgt für einen Zeilenvorschub. In der Anweisung

scan("%d\n", &reps)

informiert das Steuerzeichen %d den Propeller, dass er den Dezimalwert einer Zeicheneingabe über das SimpleIDE Terminal erhält; dazu wird die eingegebene Zeichenkette in eine int-Zahl umgewandelt und an der Adresse &reps im Speicher abgelegt. Der wichtige Unterschied ist, dass eine print-Anweisung den Wert von reps benötigt, während scan die Speicheradresse &reps kennen muss, die Adresse der Variablen reps.

Die Formatierungsanweisungen der scan-Funktion ähneln denen der print-Anweisung:

●    %d – ganze Dezimalzahl
●    %f – Fließkommazahl
●    %c – Zeichen
●    %s – Zeichenkette


scan(„%d%d“, &startVal, &endVal)

Liest zwei Werte, die mindestens durch ein nichtnumerisches Zeichen getrennt sein müssen, ein und der scan-Aufruf selbst wird abgeschlossen mit einem \n. Es kann also 123 - Leertaste - und 127 eingegeben und mit der Eingabetaste abgeschlossen werden. Zugelassen ist aber auch die Möglichkeit abcdef123ghijklm127opq einzugeben und mit der Eingabetaste abzuschließen. Das Ergebnis ist mit der ersten Eingabe identisch. In beiden Fällen enthält die Variable startVal die Zahl 123 und endVal die Zahl 127.

Übung 2

 

  • Gib das untenstehende Programm ein und speicher es unter A12_02 ab.
  • Starte das Programm.
  • Sobald sich das Terminalfenster öffnet, gib zwei durch Leertaste getrennte Zahlen ein und schließe die Eingabe mit der Eingabetaste ab.
  • Überzeuge dich, dass die Ausgabe im Terminalfenster wie oben gezeigt erfolgt.
  • Starte das Programm erneut und gib diesmal Buchstaben statt Zahlen ein. Läuft das Programm dann auch noch?

 

 

Programm A12_02.c

Programm A12_01.c

 

 

Jetzt kommst du!

 

Die hinterlegten Anwendungsregeln für die Funktion scan sind manchmal ziemlich trickreich, deshalb kann es sinnvoll sein, auf einfachere Funktionen zurückzugreifen, die das gleiche wie scan bewirken und ebenfalls in der Bibliothek simpletext enthalten sind.

 

Die Funktion getDec() benötigt keine Pointer und wird ausgeführt, sobald die Eingabe-Taste gedrückt wird (d.h., dass bei mehreren Zahleneingaben statt der Leertaste jedes Mal die Eingabetaste gedrückt wird).

 

Ersetze in Zeile 15 im Programm A12_02 die scan-Funktion durch die Funktion getDec(), passe den Inhalt der Zeilen 12 und 13 an und speicher das neue Programm unter A12_03 ab. Überprüfe, ob die Terminalaus- gabe mit der des Programms A12_02 identisch ist.

 

Programm A12_03.c

Wie print und scan ist auch getDec() eine Funktion aus der Bibliothek simpletext, die die simpletools-Bibliothek mit umfasst. Eine komplette Liste aller Funktionen der simpletext-Bibliothek findet man unter SimpleIDE – Help - > Simple Library Reference

 

  • Funktionen, die Daten im SimpleIDE Terminal ausgeben, tragen in ihrem Namen die Silbe put;
  • Daten, die über das Terminal eingegeben werden, enthalten die Silbe get.

 

Übung 2a

 

Tausche im Programm A12_03.c die folgende Zeile aus:

 

  • print("\nZähle von %d bis %d.\n", startVal, endVal)


durch die folgenden simpletext-Funktionen aus:

 

  • putStr("\nZähle von ");
  • putDec(startVal);
  • putStr(" bis ");
  • putDec(endVal);
  • putStr(“.\N”);

Speicher das veränderte Programm unter A12_04 ab und teste anschließend, ob es sich so verhält wie seine Vorgängerprogramme.

 

Die Anweisungen print und scan sind uns bereits sehr vertraut und dennoch ist ihr Gebrauch nachteilig, weil diese Anweisungen viel Speicherplatz benötigen.

Ersetzt man alle print und scan-Anweisungen in einem Programm durch die entsprechenden put und get Aufrufe, kann dies signifikant die Programmgröße reduzieren und damit Speicherplatz einsparen. Das werden wir jetzt überprüfen.

 

 

Übung 2b

 

  • Lade noch einmal das Programm A12_02.c und starte es über Program -> Built Project
  • Lies unten links im Fenster von SimpleIDE den Speicherbedarf für das Programm ab und notiere ihn in der Liste.
  • Lade das Programm A12_04.c, starte es wie das vorherige Programm und vergleiche den Speicherbedarf mit dem des Vorgängerprogramms. Notiere auch hier den angezeigten Wert.

Ermittelter Speicherplatzbedarf

 

  • Speicherbedarf des Programms A12_02.c in Bytes total:   __________________

 

  • Speicherbedarf des Programms A12_04.c in Bytes total:   __________________

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf