Programmier-Kurs "C" Teil 1

Die Umfragen der ATARI-Inside zeigen das Interesse an einem Programmierkurs in der Sprache C. Über diese Sprache gibt es zwar bereits viel Literatur, doch in unserem Fall wollen wir längerfristig auch auf Fragen bezüglich der speziellen ATARI-Programmierung eingehen.

Waum aber ist das Interesse an einem Programmier-Kurs in dieser Sprache so groß?
Ein Grund wird sicher sein, dass der eine oder andere immer mal wieder einen Versuch gestartet hatte und dann doch resignieren musste, weil in den Kursen so schön vielfältig aufgetragen wird, was C alles kann. Auch hier paßt der Slogan "Weniger wäre mehr gewesen" und hätte den Interessierten nicht verunsichert und vor allem nicht das Selbstgeständnis gegeben "Was bin ich blöd, dass ich das nicht kapiere".

Sie können mir glauben, auch C ist begreifbar!
So werde ich diesen Kurs anders aufbauen, als ich es bei den Kursen, die ich kenne, gesehen habe. Das heißt, dass rigoros alles weggelassen wird, was nicht unbedingt zum Verständnis des gerade Beschriebenen beiträgt. So werden beispielsweise nicht alle Datentypen und deren Wertigkeit aufgeführt und erklärt, sondern nur die, die wirklich in den Beispielprogrammen gebraucht werden. Wer den Inhalt des Kurses verstanden hat, kann dann Weiteres in den vielen Büchern nachschlagen und wird es dann sicher auch verstehen.
Außerdem werde ich langsam aufeinander aufbauend, Schritt für Schritt vorangehen, so dass jeder leicht mitkommen kann. Zum Abschluß eines jeden Teiles gebe ich Ihnen noch ein paar Aufgaben. Sie sollten diese ohne große Schwierigkeiten lösen können.

Ich arbeite mit Pure C, aber alles Beschriebene müßte auch mit anderen Compilern laufen.
Das größte Hindernis, C zu lernen, liegt in der Unübersichtlichkeit der C-Syntax, denn C ist formatfrei. Das heißt, jeder kann beliebig viele Leerzeichen und Absätze zwischen den Anweisungen oder zwischen den Variablen setzen, wie er möchte. Deshalb sehen die Quellen oft sehr unterschiedlich aus.
Damit wir ein weitestgehend gemeinsames Erscheinungsbild haben, setzen Sie bitte unter Option\Shell die Tabsize auf 3.

Nun sehen Sie sicherheitshalber nach, ob unter Project\Run "default.prj" eingetragen ist. Ist das nicht der Fall, müssen Sie mit Projekt\Select nach dieser Datei suchen.

Nun geht es aber wirklich los

Die ab jetzt wichtigsten Zeichen sind /* und die Umkehrung davon */. Sie schließen Kommentare ein. Sie sollten sich von Anfang an auf das Kommentieren von wichtigen Zeilen einstellen.
Das kleinste Programm, das nichts tut:

[Listing 1]

Mit Project\Run der Menüzeile oder einfach Tastenkombination AltR könnt Ihr das Programm starten.
In C gibt es keine Befehle; sie werden als Schlüsselwörter bezeichnet und von diesen hat C relativ wenig. Prozeduren, wie sie in anderen Sprachen bekannt sind, gibt es auch nicht. Alles beruht auf Funktionen. So ist selbst main eine solche. Erkennen könnt Ihr das an den zwei Klammern ( ), die jede Funktion aufweisen muss. Die geschweiften Klammern dahinter dienen dazu, den Anfang und das Ende zu kennzeichnen. Dazwischen stehen die auszuführenden Anweisungen, die jeweils mit einem Semikolon abgeschlossen sein müssen.

[Listing 2]

Mit einer #include Anweisung wird ein externer Quelltext vorangesetzt. Sie können einmal einen Blick auf so eine Header-Datei werfen. Unter File\Open.H können Sie im Ordner INCLUDE auch die stdio.h finden. Hier drin stehen auch printf() und getchar(). Sie sind also definiert, so dass der Compiler diese Ausdrücke kennt und sie als Funktion anwendet. Über alles, was der Compiler noch nicht einzuordnen weiß (was ihm also unbekannt ist) gibt er eine Fehlermeldung aus.

printf() gibt eine Zeichenkette auf den Bildschirm aus. Zeichenketten müssen in Hochkommata eingeschlossen sein. Getchar() wartet auf die Eingabe einer belibigen Taste.

[Listing 3]

Hier fangen die ersten Unübersichtlichkeiten an. Escape-Sequenzen stehen in einer Zeichenkette, so dass diese schlecht zu lesen ist. \n (der Backslash ist zu erreichen über: Shift,Alt und ü) gibt ein Return aus, es beginnt also eine neue Zeile. \a gibt einen Piepton aus.

[LISTING 4]

Der printf-Befehl kann natürlich auch Inhalte von Variablen ausgeben. In diesem kleinen Rechenprogramm werden zuerst die Variablen bekannt gemacht. Integer sind Ganzzahlen (sie können also kein Komma enthalten) und dürfen Werte zwischen -32768 bis 32767 enthalten. Danach werden die Variablen mit einem Wert gefüllt; im Fachjargon heißt das einen Wert zuweisen.

In der Rechnung fällt auf, dass das Ergebnis vor der eigentlichen Aufgabe steht. Das ist einem Computer leider nicht anders begreiflich zu machen.
In einer Zeichenkette würden die Variablen als Namen und nicht deren Inhalt ausgegeben werden, deshalb gibt es neben den Escape-Sequenzen noch die Platzhalter, die mit einem %-Zeichen eingeleitet werden. In unserem Fall soll an diese Stelle ein Integerwert (deshalb das i) ausgegeben werden. Der Compiler sucht sich beim Übersetzen den entsprechenden Wert hinter den Kommas. Prägen Sie sich diese Zeichensetzung gut ein. So können Sie von Anfang an Fehler vermeiden.

[LISTING 5]

Dieses Programm lässt nun auch Eingaben zu. Die Funktion scanf() sieht der Funktion printf() ähnlich; es muss aber auf eine wichtige Besonderheit geachtet werden - das &-Zeichen. Bei Eingaben von Zahlen muss es vor der jeweiligen Variablen stehen, nicht aber vor Zeichenketten. Das &-Zeichen gibt die Adresse einer Variablen und nicht deren Inhalt an. Doch das vergessen Sie das schnell wieder, denn das zu erklären verschiebe ich besser auf ein späteres Kapitel.

Falls getchar() nicht funktioniert, so liegt das nicht an einem Fehler, sondern daran, dass noch ein Signal im Tastaturpuffer abgefangen wird. Sie können mit der Esc-Taste auf den Ausgabebildschirm und auch wieder zurück schalten. So können Sie sich alles noch einmal in Ruhe betrachten.

[Listing 6]

Hier haben wir den Fall, der oben schon beschrieben wurde. Wir haben eine Zeichenkette (oder auch String) angemeldet. Die Definition char steht für ein Zeichen, das in die Variable name paßt. Da aber ein Name bekanntlich mehrere Buchstaben hat, geben wir in den eckigen Klammern (Alt-ö und Alt-ä) die maximale Anzahl der Zeichen an. Die beiden Zeilen mit scanf() zeigen die unterschiedliche Behandlung einer Variablen als String und als Zahl. Das müsen Sie leider unbedingt beachten.

Wenn Sie bis jetzt alles verstanden habt, dann können Sie sich wirklich auf die Schulter klopfen.
Versuchen Sie nun, die Aufgaben zu lösen. Sie können daran sehen, was Sie noch einmal nachlesen sollten. Wenn ein Fehler angezeigt wird, kommen Sie mit einem Doppelklick auf diese Angabe direkt in die fehlerhafte Zeile Ihres Quellcodes.

  1. Aufgabe:
    Schreiben Sie ein Subtraktions-Programm, ähnlich dem oben beschriebenen kleinen Additionsprogramm. Definieren Sie dazu die Variablen: Minuend, Subtrahend und Differenz.

2.Aufgabe:
Schreibe ein Multiplikations-Programm. Für die Berechnung benutzen Sie einfach das Sternchen *. Definiert die Variablen: Multiplikand, Multiplikator und Produkt.

3.Aufgabe:
Was wird das wohl sein? Ein Divisions-Programm natürlich. Benutzen Sie den Slash / für die Rechnung. Die Variablen heißen: Dividend, Divisor und das Ergebnis Quotient.

4.Aufgabe:
Erweitern Sie die jeweiligen Programme um einen Subtrahenden, Multiplikator oder Divisor. Achten Sie bei der Eingabe der Werte aber darauf, dass die Integer ihren oben beschriebenen Wertebereich nicht überschreiten. Es kommt sonst zu falschen Ergebnissen.

5.Aufgabe:
Ein Programm, das nacheinander abfragt. Danach sollte ein Text ausgegeben werden. [Abschnitt 7]

6.Aufgabe:
Ein Programm, das nacheinander abfragt. Danach sollte ein Text ausgegeben werden.
[Abschnitt 8]

In der nächsten "ATARI inside" sind die Auflösungen zu finden. Bis dahin können Sie fleißig experimentieren.


Klaus Sommer
Aus: Atari Inside 04 / 1996, Seite 48

Links

Copyright-Bestimmungen: siehe Über diese Seite