QuickC - Schnellkurs in C Allgemeines C ist eine kurze, aber sehr mächtige Programmiersprache. Sie wurde ursprünglich dafür entwickelt, UNIX zu schreiben. Sie ist sehr hardware-nah und wird deshalb heute noch häufig dazu benutzt Steuergeräte und Mikroprozessoren zu programmieren. Nur etwa 30 Schlüsselworte sind fest in C implementiert. Diese Schlüsselworte umfassen grundlegende Dinge wie Datentypen und Operatoren für Schleifen, Verzweigungen und Kontrollanweisungen. Schlüsselworte: 1. automatic, extern, static, register 2. char, short, int, long, float, double, unsigned 3. if, else, switch, case, break, continue, default, for, do, while, return, goto 4. enum, struct, union 5. void, typedef, sizeof Hinzu kommen noch Operatoren, die einzelne Elemente miteinander verknüpfen. Dazu gehören: Operator Beschreibung + - * / Mathematische Operatoren für die Grundrechenarten % Modulo (Restfunktion bei Ganzzahldivisionen) * & Adress- und Verweisoperator für Zeiger = Zuweisung && == Logische Verknüpfungen (Boolesche Algebra)!=! & >> Bit-Operatoren Ein Programm in C besteht aus Funktionen. Die wichtigste davon ist die Funktion main(). Mit ihr startet und endet jedes C-Programm. Sogenannte Bibliotheksfunktionen, die bei Bedarf aus Bibliotheken geladen werden, erweitern den Funktionsumfang. Diese werden über Header-Dateien (Datei-Endung.h) eingebunden. Zusätzlich kann man dann auch noch eigene Funktionen deklarieren. Grundsätzlich gilt das Prinzip des "Declare before use", das heißt alle Dinge, die man in C verwenden möchte (Variablen, Funktionen, etc.) müssen zuerst deklariert werden, bevor sie benutzt werden können. Jede Anweisung wird mit einem Semikolon ; abgeschlossen. QuickC - Schnellkurs in C 1 Dieter Hägele
Ein typisches Programm in C sieht so aus: #include <stdio.h> #include <stdlib.h> Header-Dateien einbinden double fkt (double x); int main(int argc, char *argv[]) double a, d; d = 5.56; a = fkt(d); printf("die Variable a ist = %f\n", a); Funktionsprototypen deklarieren Hauptfunktion main() Definitionsteil Befehle (Statements) system("pause"); return 0; Programmende double fkt(double x) double rst; Unterprogramme (Subroutines) rst = 3.14159 * x; return rst ; In diesem Programm gibt es 4 Funktionen: fkt() main() Eigene Funktion Funktion wird durch seinen Funktionsprototyp in der 3. Zeile deklariert und später im Quellcode genau definiert Standard-Funktion Beginn und Ende jedes C-Programmes printf() Bibliotheksfunktion Formatierte Ausgabefunktion Wird durch stdio.h eingebunden system() Bibliotheksfunktion Aufruf des Betriebssystems Wird durch stdlib.h eingebunden QuickC - Schnellkurs in C 2 Dieter Hägele
Funktionen Deklaration von Funktionen Mit dem Funktionsprototyp wird jede Funktion deklariert. Für fkt() steht sie im Quellcode, für alle anderen in den Header-Dateien. Der Funktionsprototyp hat folgende Form double fkt (double x); Übergabeparameter Funktionsname Datentyp Rückgabeparameter Aus der Mathematik kennt man die Schreibweise y = f(x). Sie gehen von einem Wert x aus, dieser wird gemäß der Funktion verändert z. B. (x²). Das Ergebnis der Berechnung wird dann y zugewiesen. Nichts anderes machen Funktionen in C. Eine oder mehrere Variablen werden an die Funktion übergeben Übergabeparameter), dort gemäß den Anweisung verändert und dann der Ergebniswert einer anderen Variablen zugewiesen. Im Unterschied zur Mathematik können in C nicht nur Zahlen verarbeitet werden, sondern auch andere Objekte. Deshalb ist es wichtig, den Datentyp der Übergabe- und Rückgabeparameter genau zu definieren. Definition von Funktionen Erst nach der Deklaration kann die Funktion definiert werden. Dazu werden die Anweisungen, die beim Aufruf dieser Funktion ausgeführt werden sollen, eingegeben. Diese Anweisungen werden durch geschweifte Klammern (Blockklammern) zusammengefasst. Am Ende bestimmt die Anweisung return, welcher Wert dann wieder zurückgegeben wird. QuickC - Schnellkurs in C 3 Dieter Hägele
Allgemein hat eine Funktion folgende Form: Speicherklasse Datentyp Funktionsname (Parameterliste) Definition der formalen Parameter Deklarationen der lokalen Variablen Anweisungen Funktionskopf Funktionskörper Oder konkret in unserem Beispiel: double fkt (double x) double rst; rst = 3.14159 * x; return rst ; Funktionskopf Funktionskörper QuickC - Schnellkurs in C 4 Dieter Hägele
Variablen Deklaration von Variablen 2 Dinge müssen von einer Variablen bekannt sein: der Datentyp und der Name. In C werden Variablen dadurch deklariert, dass einfach der Datentyp und anschließend gleich der Variablenname eingegeben wird. Haben mehrere Variablen den selben Datentyp, können sie einfach als Liste mit einem trennenden Komma geschrieben werden (hier: double a, d;). Bei der Deklarierung selbst werden noch keine Werte zugewiesen, es ist also nicht klar, welchen Wert die Variable zu diesem Zeitpunkt enthält. Es gibt in C 6 verschiedene sogenannte skalare oder fundamentale Datentypen. Sie werden unterteilt in Ganzzahltypen und Gleitkommatypen. Ganzzahltypen Bei den Ganzzahltypen kann der Vorsatz unsigned (ohne Vorzeichen) verwendet werden. Dadurch verschiebt sich der Wertebereich. Name Größe Wertebereich (signed) Wertebereich (unsigned) char 1 Byte (8 Bit) -128... +127 0... 255 short 2 Byte (16 Bit) -32768... +32767 0... 65535 int WortIänge d. Systems z.b. 4 Byte, 32 Bit -2147483648... +2147483647 0... 4294967295 long 4Byte (32 Bit) -2147483648... +2147483647 0... 4294967295 Gleitkommatypen Name Größe Wertebereiche -3,402823466 10 38... -1,175494351 10-38 float 4 Byte (32 Bit) 0 +1,175494351 10-38... +3,402823466 10 38-1,7976931348623157 10 308... -2,2250738585072014 10-308 double 8 Byte (64 Bit) 0 +2,2250738585072014 10-308... +1,7976931348623157 10 308 Bereits bei der Deklarierung einer Variablen kann ein Wert zugewiesen werden. Dies nennt man Initialisierung. Beispiel: int zahl = 33; Hier bekommt die Variable zahl also sofort den Anfangswert 33, sie ist also sofort definiert. QuickC - Schnellkurs in C 5 Dieter Hägele
Aus den Grundtypen kann man auch eigene zusammengesetzte Datentypen bilden. Die einfachste Variante ist, wenn alle Elemente vom gleichen Datentyp sind. Diese nennt man dann Vektor, Feld oder Array. Beispiel: double zahlfeld[10]; Hiermit wird ein Feld mit 10 Elementen deklariert, die alle vom Datentyp double sind. Der Index läuft dabei von 0 bis 9 (nicht 1-10!). zahlfeld[0] ist also das erste Element dieses Feldes. Man kann diese einzelnen Elemente eines Feldes wie jede andere Variable auch verwenden (Zuweisung, Berechnungen, etc.). Da es in C keinen fundamentalen Datentyp für Zeichenketten oder Strings gibt, wird in diesem Fall ein Feld vom Typ char verwendet. Beispiel: double zeichenkette[80] = "Dies ist eine Zeichenkette"; Man kann aber auch eigene Datentypen definieren, die unterschiedliche Datentypen enthalten. Hierzu wird das Schlüsselwort struct benötigt. QuickC - Schnellkurs in C 6 Dieter Hägele
Die Strukturbausteine von C Verschiedene Grundelemente kann man in C verwenden, um einen Programmablauf zu steuern: Verzweigung (zweiseitige Auswahl), mehrseitige Auswahl, Zählschleife, kopfgesteuerte Schleife und fußgesteuerte Schleife. if - die Verzweigung Die if-anweisung sieht folgendermaßen aus: if (x < 0) printf("x ist negativ.\n"); else printf("x ist positiv oder Null.\n"); Der else-teil ist optional und kann weggelassen werden. Obwohl sie eigentlich nicht notwendig wären, empfehle ich grundsätzlich den Gebrauch von Blockklammern. switch - die mehrseitige Auswahl Sind bei einer Auswahl mehrere Ergebnisse möglich, so kann man dies mit switch auswerten. Dabei können allerdings nur Zahlenwerte als Auswahlkriterium benutzt werden. switch ( x ) case 1: printf("x ist 1.\n"); break ; /* Verlassen switch */ case 2: printf("x ist 2.\n"); break ; case 3: printf("x ist 3.\n"); break; default: printf("x ist alles andere.\n"); break; Der default-teil kann entfernt werden. QuickC - Schnellkurs in C 7 Dieter Hägele
for - die Zählschleife Die for-schleife wird benutzt, wenn schon vorher fest steht, wie oft bestimmte Anweisungen durchgeführt werden sollen. for ( i = 1; i <= 100 ; i++ ) printf("mein Lehrer hat gesagt, ich soll das 100 mal schreiben.\n"); printf("das ist das %d. Mal. Jetzt muss ich noch %d mal.\n", i, 100-i); Diese Schleife wird 100 mal durchlaufen. Dabei wird die Zähl- oder Laufvariable i von 1 bis 100 hochgezählt. for ( i = 1; i <= 100 ; i++) Inkrement Laufbedingung Anfangswert Bitte beachten! Im Gegensatz zu vielen anderen Programmiersprachen wird in C eine Laufbedingung angegeben, nicht die Abbruchbedingung. Solange diese Laufbedingung WAHR ist, wird die Schleife weiter ausgeführt. while - die kopfgesteuerte Schleife double x, y, z = 0;... while ( z < 1024) x = 3 * y + 42; z = x * x + 7 * y + 18; printf("\nfertig!"); /* Schleife ist beendet */ In diesem Fall wird die Schleife so lange ausgeführt bis z den Wert 1024 oder höher annimmt. Erst dann wird die Schleife beendet. Ist z bereits zu Beginn 1024 oder größer, wird der Schleifenkörper gar nicht erst ausgeführt. z sollte in diesem Fall aber schon zu Beginn definiert sein. QuickC - Schnellkurs in C 8 Dieter Hägele
do/while - die fußgesteuerte Schleife do x = 3 * y + 42; z = x * x + 7 * y + 18; while ( z < 1024 ); Die Schleife wird in jedem Fall ausgeführt. Erst danach wird z mit 1024 verglichen. z muss also zu Beginn der Schleife nicht definiert sein. break - Schleifen beenden Sollte eine Schleife unter bestimmten Bedingungen beendet werden müssen, gibt es mit break die Möglichkeit, eine Schleife sofort abzubrechen, auch wenn die eigentliche Abbruchbedingung noch nicht erfüllt ist. QuickC - Schnellkurs in C 9 Dieter Hägele
Ein- und Ausgabe printf() Mit printf() werden Texte formatiert auf dem Bildschirm ausgegeben. Dabei können auch Variablen und Textformatierungen mit eingefügt werden. Es besteht normalerweise aus den folgenden Teilen: printf ( "x = %d\n", x ); Variablen-Liste Formatstring Beispiel: double x_double = 3.5789; int y_int = 1; char z_string = "Dies ist ein Text.";... printf("es gelten folgende Werte:\n\n"); printf("x_double = %f\ty_int = %d\tz_string = %s\n", x_double, y_int, z_string); Der Formatstring beinhaltet einfachen Text, Platzhalter für Variablen und Textformatierungen. Platzhalter für Variablen beginnen mit einem %-Zeichen. Danach erscheint ein Symbol für den Datentyp. Symbol Datentyp Beschreibung d,i Dezimalzahl des Typs signed u Dezimalzahl des Typs unsigned o Oktal-Ganzzahl des Typs unsigned x,x Hexadezimal-Ganzzahl des Typs unsigned f Gleitkommazahl mit Festkomma e,e Exponentialdarstellung g,g %e oder %f; das kürzere davon c einzelnes Zeichen s Zeichenfolge p Adresse auf den ein Zeiger verweist QuickC - Schnellkurs in C 10 Dieter Hägele
Alle Textformatierungen beginnen mit einem " \ ". Man nennt sie auch Escape-Sequenzen. Sequenz Funktion \n Neue Zeile, Zeilenumbruch \t Nächsten Tabulator anspringen \\ Backslash ausgeben \" Anführungszeichen ausgeben \' Apostroph scanf() Im Prinzip ähnelt scanf() von der Funktion her printf(). Nur, dass dieses Mal etwas eingegeben werden kann. Ich empfehle mit einem scanf()-befehl jeweils nur eine Variable zuzuweisen. Beispiel: int x; double y; char textzeile[80]; scanf("%d", &x); scanf("%lf", &y); /* Platzhalter fuer double ist lf */ scanf("%s", textzeile); Es ist nicht möglich, mit scanf() gleich einen Text auszugeben ("Bitte geben Sie eine Zahl ein:"). Dies muss immer separat mit einer printf()-anweisung gemacht werden. Bei scanf() muss die Variable immer als Adresse übergeben werden. Deshalb steht vor dem Variablennamen immer ein "&". Einzige Ausnahme sind hier die Zeichenketten. Hier genügt der Name ohne Klammer, da dies bereits ein Zeigerwert ist. QuickC - Schnellkurs in C 11 Dieter Hägele
Dateizugriff Mit C sind natürlich auch Zugriffe auf die Laufwerke möglich. Dazu wird in der Regel ein Zeiger auf den Datentyp FILE deklariert. Dieser Dateizeiger (File Pointer) ermöglicht dann alle Zugriffe auf die Datei (Öffnen, Schließen, Lesen, Schreiben). Dafür können die folgenden Anweisungen verwendet werden: Anweisung fopen() fclose() fprintf() fscanf() fgets() Beschreibung Öffnet eine Datei Definiert den Dateizeiger Schließt eine Datei Gibt die Datei für das Betriebssystem wieder frei Schreibt Daten in eine Datei Liest Daten wie scanf() aus einer Datei Achtung! Leerzeichen sind Trennzeichen! Liest Zeichenketten aus einer Datei Leerzeichen werden mitgelesen Dabei gilt folgender Syntax: FILE *fopen(name, mode) char *name; /* Name der Datei */ char *mode; /* Öffnungsmodus */ Als Öffnungsmodus gibt es Öffnungsmodus Beschreibung a Append-Modus Daten werden an die bestehende Datei angehängt r w Read-Modus Daten werden vom Anfang eingelesen Write-Modus Schreibt Daten in eine Datei; Datei wird angelegt falls nicht vorhanden QuickC - Schnellkurs in C 12 Dieter Hägele
int fclose(fp) FILE *fp; /* Dateizeiger */ Jede Datei, die geöffnet wurde, sollte auch wieder geschlossen werden. Beim Beenden eines Programmes werden aber auch alle von diesem Programm geöffneten Dateien automatisch geschlossen und freigegeben. int fprintf(fp, format, arg1, arg2,... ) FILE *fp ; /* Dateizeiger */ char *format ; /* Formatierung */ Diese Funktion entspricht printf(). int fscanf(fp, format, adr1, adr2,...) FILE *fp; /* Dateizeiger */ char *format; /* Formatierung */ Diese Funktion entspricht scanf(). Leerzeichen werden als Trennzeichen interpretiert und nicht eingelesen. char *fgets(str, len, fp) char *str; /* Name der Zeichenkette */ int len; /* Laenge der Zeichenkette */ FILE *p; /* Dateizeiger */ Hier werden alle Zeichen (auch Leerzeichen) einer Zeichenkette eingelesen. QuickC - Schnellkurs in C 13 Dieter Hägele
Öffnen einer Datei zum Lesen #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) FILE *fp; fp = fopen("c:\\datx.txt", "r" ); if (fp == (FILE *)NULL ) printf("keine Datei C:\\datx.txt vorhanden\n"); system("pause"); exit(1); /* Alle Zeilen auslesen */ while (fgets( textzeile, 80, fp)!= NULL) printf("zeile: %s", textzeile); /* Steht in der Datei ein \n, wird es auch mit fgets() übernommen */ printf("\n\n"); fclose(fp); system("pause"); return 0; In diesem Beispiel öffnet fopen() die Datei C:\DATX.TXT zum Lesen und weist den Dateizeiger der Variablen fp zu. Ist die Datei nicht vorhanden oder nicht verfügbar, wird eine Fehlermeldung ausgegeben. Danach werden mit fgets() alle Zeilen der Datei ausgelesen. Dabei ist es egal, wie viele Zeilen die Datei enthält. Diese Kombination aus while-schleife und Lesebefehl wird sehr häufig verwendet. QuickC - Schnellkurs in C 14 Dieter Hägele
Öffnen einer Datei zum Schreiben #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) FILE *fp; fp = fopen("c:\\dat_out.txt", "w" ); if (fp == (FILE *)NULL ) printf("auf C:\\dat_out.txt kann nicht zugegriffen werden\n"); system("pause"); exit(1); fprintf(fp, "Zeile mit Zahlen: x = %f\n", 3.14279); fprintf(fp, "Zeile nur mit Text!\n"); fclose(fp); system("pause"); return 0; Ist das Laufwerk nicht erreichbar oder ist es schreibgeschützt, erscheint eine Fehlermeldung und das Programm wrid beendet. QuickC - Schnellkurs in C 15 Dieter Hägele