HSG |
|
task main() { TextOut(20,30,"Hallo Welt!"); Wait(3000); }
Jedes NXC-Programm muss einen task main enthalten. Dieser task (engl. Aufgabe) ist der erste, der in einem Programm ausgeführt wird. Die beiden Klammern hinter dem task-Namen sind notwendig. Alle, was der task machen soll, steht in dem folgenden sogenannten Block, der durch die geschweiften Klammern { } gebildet wird. Übrigens, zusammengehörende geschweifte Klammern sollten genau untereinander stehen. Der Block enthält im Beispiel genau zwei Anweisungen, die jeweils mit einem Strichpunkt ; abgeschlossen werden. Die Anweisungen 'TextOut' und 'Wait' sind beide Funktionen, die in NXC bereits vordefiniert sind. Funktionen erkennt man an den Klammern ( ), die die Parameter enthalten. Parameter sind zusätzliche Werte, die die Ausführung der Funktionen beeinflussen. Im Beispiel 'wartet' die Anweisung Wait(3000) 3000 Millisekunden also genau 3 Sekunden. Die Anweisung 'TextOut' erwartet genau drei Parameter, zwei ganze Zahlen (in NXC int (engl. integer = ganze Zahl) genannt) und eine Zeichenkette (in NXC string (engl: string = hier: Folge, Reihung) genannt). Eine Zeichenkette ist in Anführungszeichen " " einzuschließen. 123 und "123" sind unterschiedlich, 123 ist vom Typ int und "123" vom Typ string. NXC ist casesensitiv, dh. Schlüsselwörter wie task oder Funktionennamen wie 'TextOut' müssen was Groß- und Kleinschreibung angeht genauso geschrieben werden. 'wait(3000)' würde nicht funktionieren. Anweisungen in einem Block wollen wir genau zwei Leerzeichen einrücken.
Schreibe und teste ein Programm a1.nxc, das 5 s lang deinen Namen links unten auf dem Display anzeigt.
task main() { LineOut(0,0,100,0); Wait(1000); LineOut(99,0,99,63); Wait(1000); LineOut(99,63,0,63); Wait(1000); LineOut(0,63,0,0); Wait(5000); }
Wie hängt die Anweisung LineOut(x1,y1,x2,y2) mit den zwei Punkten P1(x1|y1) und P2(x2|y2) zusammen? Welche Pixel umfasst das Koordinatensystem des NXT-Displays? Erweitere das Programm um die beiden Diagonalen.
task main() { int n = 5000; TextOut(0,50,"p3 laeuft ..."); Wait(n); }
In diesem Programm wird eine Variable vom Typ int vereinbart und mit 5000 belegt. Eine Variable vom Typ int kann man sich als einen Behälter für ganze Zahlen vorstellen, der mit dem Variablennamen beschriftet ist. Der Anweisung 'Wait' wird die Variable n übergeben. Sie ersetzt dann den Namen n durch den Wert 5000. Wer will kann mal probieren, was passiert, wenn man 'läuft' mit 'ä' schreibt.
Mit der Funktion 'TextOut' kann man grundsätzlich nur Strings ausgeben. Soll der Wert einer Zahl ausgeben werden, so muss die Zahl (hier: 135) in einen String (hier: "135") verwandelt werden. Das kann die Funktion 'NumToStr'.
task main() { int n = 135; string s; s = NumToStr(n); TextOut(0,32,s); Wait(5000); }
Statt explizit einen String s zu vereinbaren und den Rückgabewert der Funktion 'NumToStr' der Variablen s zuzuordnen, kann man auch direkt NumToStr(n) in TextOut einsetzen. Ausprobieren!
task main() { int n = 135; TextOut(0,32,NumToStr(n)); Wait(5000); }
task main() { int n; n = 10; TextOut(30,32,NumToStr(n)); Wait(1000); n = n - 1; TextOut(30,32,NumToStr(n)); TextOut(35,32," "); // was bewirkt diese Anweisung? Wait(1000); n = n - 1; TextOut(30,32,NumToStr(n)); Wait(5000); }
In diesem Programm wird zunächst eine Variable n vom Typ int vereinbart. Dann wird die Variable n mit dem Wert 10 belegt. Der Zuweisungsoperator '=' wird nicht 'ist gleich', sondern 'ergibt sich aus' gelesen. Er darf nicht mit dem mathematischen '='-Zeichen verwechselt werden, das in NXC mit '==' ausgedrückt wird. Vom Sinn her wäre 'n ← 10' günstiger als 'n = 10'. Der Pfeil '←' ist aber kein über die Tastatur direkt eingebbares Zeichen. Nach der Ausgabe des in einen String umgewandelten Zahlenwerts wird eine Sekunde gewartet. Die Zuweisung n = n - 1 ist typisch von rechts nach links zu lesen. Zuerst wird die rechte Seite ausgewertet. Dabei wird der Wert von n gelesen und dann 1 abgezogen. Das Ergebnis wird dann n zugewiesen. In Zeile 9 sieht man einen durch '//' eingeleiteten Kommentar. Kommentare werden vom Compiler überlesen.
task main() { int n; n = 9; while (n >= 0) { TextOut(30,32,NumToStr(n)); Wait(1000); n = n - 1; }; Wait(5000); }
In der while-Schleife wird der in geschweiften Klammern eingeschlossene Schleifenkörper solange wiederholt, wie die Schleifenbedingung (n >= 0) true ist.
Welchen Wert hat n am Ende des Programm? Stelle eine Vermutung auf und überprüfe sie durch eine zusätzliche Ausgabeanweisung.
task main() { SetSensorTouch(IN_1); while (true) { if (SENSOR_1 == 1) TextOut(50,30,"1"); else TextOut(50,30,"0"); }; }
Die Anweisung 'SetSensorTouch(IN_1);' legt fest, dass an Eingang 1 ein Berührungssensor angeschlossen wird. Die folgende while-Schleife ist eine Endlosschleife, denn die Schleifenbedingung ist immer true. Das Programm muss also durch Drücken der grauen Break-Taste abgebrochen werden. Im Schleifenkörper wird immer wieder der Wert von Sensor_1 abgefragt. Wenn (if) die Bedingung erfüllt ist, so wird die erste Alternative ausgeführt, sonst (else) wird die zweite Alternative ausgeführt.
task main() { int n; while (true) { n = getchar(); TextOut(50,30,NumToStr(n)); }; }
Die Compilierung klappt nur mit der Option -EF für 'enhanced firmware'. Leider meldet der Brick 'file error!'.