Home

pdf öffnen

image

Contents

1. Die eigentlichen Anweisungen werden zwischen den geschwungenen Klammern geschrie ben Sie k nnen praktisch jedes Struktogrammsymbol in einen entsprechenden C Befehl umsetzen Am Beginn werden Informationen f r das gesamte Programm eingef gt wie z B include lt gt Am Ende k nnen weitere Funktionen angeh ngt werden include lt stdio h gt void main char zeichen zeichen getchar if zeichen A printf Es ist ein A n else printf nein kein A n char zeichen In diesem Beispiel gibt es eine Variable namens zeichen vom Typ char Objektart Zeichen zeichen getchar In diese Variable wird mit dem Befehl getchar ein Zeichen z B ein Buchstabe von der Tastatur eingelesen Ein bei Wertzuweisungen if zeichen A Auswahl if mit Bedingung in der Auswahl Ein beim Vergleich Struktogramm Schleifenbeispiel Variable index index 0 while index lt 6 schreibe Das 1 B m CRLF index index 1 der Kopfteil dieses C Programms das eigentliche Programm C Skriptum Prei l 1 6 Beispielprogramm Kommentar zwischen Schr gstrich Stern include lt stdlib h gt Preprocessor Anweisungen include lt stdio h gt kopieren Sourcecode ins Programm define SCHLEIFENZAHL 6 ersetzt im restlichen Programm SCHLEIFENZAHL durch 6 void main Funktion main keine Parameter Beginn Prog
2. case a case A autolist autodat break case bi case B autogrupp autodat break case c case C autosort autodat break case p case P autorewrite autodat break case d case D autoinsert autodat break case e case E taste E break default gotoxy 5 24 printf falsche Taste bitte Men punkt w hlen delay 2000 2 Sekunden warten Zeit zum lesen fclose autodat clrscr printf Bye n n neue Autos eingeben und in Datei speichern void autoinsert FILE autodat struct automobil autol sehr einfache Version der int taste 0 Datensatzeingabe fseek autodat OL SEEK_END ans Dateiende stellen um elrscr neue S tze hinten anzuf gen do printf Marke eingeben n fgets autol marke sizeof autol marke stdin entfernen des n am Ende des eingegebenen Textes autol marke strlen autol marke 1 0 printf Type eingeben n fgets autol type sizeof autol type stdin autol type strlen autol type 1 0 printf Baujahr eingeben n scanf d amp autol baujahr fflush stdin printf Kilometer eingeben n scanf ld amp autol kilometer fflush stdin printf Preis eingeben n scanf 1lf amp autol preis fflush stdin schreiben des Datensatzes fwrite amp autol sizeof autol 1 autodat printf n Noch ein Auto erfassen j n
3. lese zahl Bei diesem Beispiel ist es noch notwendig als Abschlu aller eingegebenen Zah schreibe summe len eine 0 zu tippen damit die Bedingung der while Schleife unwahr wird und das Programm somit nach der Schleife weitermacht Alle Eingabebefehle bieten C Skriptum Prei l 3 3 aber auch die M glichkeit das Ende einer Eingabe selbst zu erkennen weil das sp ter beim Lesen aus Dateien unbedingt n tig ist Will man auf der Tastatur ein Ende der Eingabe simulieren dann mu man Ctrl Z Strg Z auf deutschen Tastaturen tippen Dieser letzte Tastendruck signalisiert EOF End of File Ende der Datei Ende Eingabe Der jeweili ge Lesebefehl liest dann keine Werte in die Variable sondern signalisiert nur Ende Will man bei den verschiedenen Lesebefehlen das Ende der Eingabe feststellen dann mu man folgenderma en vorgehen int zahl rueck f r scanf int zeichen f r getchar verwendet obwohl zahl Mi char c character Typ char text 80 String char array Mi rueck scanf d amp zahl liest Zahlenwerte ein und stellt sie in die Variable zahl Der Wert der Variablen rueck zeigt nachher ob das Einlesen erfolgreich war rueck 1 gt das Einlesen war erfolgreich in der Variablen zahl steht der gelesenen Wert 0 gt es wurden keine Ziffern sondern andere Zeichen eingegeben Die Variable zahl wurde nicht ver ndert und hat noch den fr heren Wert rueck 1
4. while y gt 1 ergebnis ergebnis x y y l1 printf d hoch d gt 0f n n x yausgabe ergebnis printf x hoch y Bitte X Leerzeichen und Y eingeben n printf return Taste dr cken Ende mit Nullen Kat x y 0 damit wird Schleifenende erreicht scanf d amp x auch wenn scanf nichts einliest Mi scanf d amp y printf Bye n n Ein beliebtes Beispiel ist das Z hlen von Worten Zeilen Zeichen in einem beliebigen eingegebenem Text include lt stdio h gt z hlen von Zeichen Worten Zeilen Mi define IMWORT 1 sprechende symbolische Konstante define OUTWORT 0 void main int zeich nworte 0 nzeichen 0 nzeilen 0 status OUTWORT printf nGeben Sie einen beliebigen Text ein Ende STRG Z n while zeich getchar EOF nzeichen if zeich n nzeilen if zeich zeich n zeich t status OUTWORT else if status OUTWORT vom Wort zum Trennzeichen status IMWORT tnworte printf nZeichen d Worte d Zeilen d n nzeichen nworte nzeilen C Skriptum Prei l 40 6 4 do while die until Schleife in C Die Bedingung wird am do Aktion while Bedingung Schleifenende gepr ft v Zuerst wird die Aktion ausgef hrt dann wird die while KE E D Bedingung gepr ft Ist diese TRUE dann wird die Wichtig Aktion erneut ausgef hrt usw
5. ist R ckgabewert true oder false int isspace int c pr ft c auf Whitespaces blank CR FF HT NL VT R ckgabe true oder false int isupper int c pr ft c ob es ein Gro buchstabe ist R ckgabewert true oder false int isxdigit int c pr ft c auf 0 9 a z A Z R ckgabewert true oder false int toupper int c wenn c ein Kleinbuchstabe ist dann wird dieser in den entsprechenden Gro buchstaben umgesetzt R ckgabewert ist c int tolower int c wenn c ein Gro buchstabe ist dann wird dieser in den entsprechenden Kleinbuchstaben umgesetzt R ckgabewert ist c C Skriptum Prei l 1 00 11 1 2 math h double acos double x Arcuscosinus double asin double x Arcussinus double atan double x Arcustangens es gibt auch noch atan2 double ceil double x gibt die kleinste Ganzzahl gt x zur ck double cos double x Cosinus double cosh double x Cosinus hyperbolicus double exp double x Expotentialfunktion e double fabs double x Absolutbetrag von x x double floor double x gibt die gr te Ganzzahl lt x zur ck double fmod double x double y gibt den Rest von x y mit dem Vorzeichen von x zur ck double frexp double x int pexp zerlegt x in eine normalisierte Mantisse R ckgabewert und eine Potenz von 2 die in pexp abgespeichert wird double Idexp double x int exp gibt x 2 P zur ck double log double x nat rlicher Logarithmus von x double log10 double x 10er Logarithmus von x d
6. if datei3 fopen fiobsp 2 r NULL puts bei 2 r open auf gt fiobsp 3 lt open Fehler exit 1 printf die Position in der Datei ist 1d n ftell datei3 if fseek datei3 5L SEEK_SET 0 puts der 1 fseek auf 5 Byte der Datei ging schief exit 1 if i fread buffer sizeof char 3 datei3 3 puts der 1 fread hat nicht 3 Zeichen gelesen boese exit 1 printf nach 1 fread steht 3s im buffer n buffer printf die Position in der Datei ist 1d n ftell datei3 if fseek datei3 4L SEEK_CUR 0 puts der 2 fseek 4 Bytes ab Position ging schief exit 1 if i fread buffer sizeof char 4 datei3 4 puts der 2 fread hat nicht 4 Zeichen gelesen boese exit 1 printf nach 2 fread steht 4s im buffer n buffer printf die Position in der Datei ist 1d n n ftell datei3 vor dem fwrite korrekt positionieren am Ende steht im File ein n dieses ist am PC ein 0d0a im File auf Unix Maschinen ist es nur ein Da if fseek datei3 8L SEEK_END 0 puts der 2 fseek auf 8 Byte vom Ende ging schief exit 1 if i fwrite sizeof char 4 datei3 4 puts der 1 fwrite hat nicht 4 Zeichen geschrieben boese exit 1 printf die Position in der Datei ist 1d n n ftell datei3 if i fclose datei3 0 printf File gt fiobsp 2 lt close Feh
7. taste getch while taste J taste j einfaches Auflisten der gespeicherten Autos C Skriptum Prei l 79 void autolist FILE autodat struct automobil autol int taste 0 fseek autodat OL SEEK_SET an den Dateianfang stellen clrscr printf 20 20s 20 20sBaujahr km Preis n n Marke V Type while fread amp autol sizeof autol 1 autodat printf 20 20s 20 20s 4d 71d 12 21f n autol marke autol type autol baujahr autol kilometer autol preis printf n zur ck zum Men mit Tastendruck taste getch Sortieren der Autos nach Marke und Type es wird ein dynamisches Array angelegt alle Datens tze ins Array sortieren rausschreiben void autosort FILE autodat struct automobil autol struct automobil autotab dient zum Anlegen einer dynamischen Tabelle Speicherplatz zur Laufzeit int anzahl int i sortiert int taste 0 fseek autodat OL SEEK_SET an den Dateianfang stellen clrscr anzahl 0 while fread amp autol sizeof autol 1 autodat anzahl if anzahl lt 2 gotoxy 5 24 printf zuwenig d Datens tze zum sortieren anzahl delay 2000 Zeit zum Lesen return und retour Speicherplatz f r das Array anfordern autotab calloc anzahl sizeof struct automobil if autotab 0 Speicherplatz holen mi lungen gotoxy 5 24 printf konnte keinen Hauptspeiche
8. updruck es gibt keinen Datenaustausch printf Zeile 3 ausgeben zwischen main und updruck updruck printf letzte Zeile ausgeben n In diesem Fall wird eine mehrfach vorkommende Codezeile aus der Funktion main ausge lagert und durch den Unterprogrammaufruf ersetzt Es werden aber keinerlei Daten von nach updruck bergeben Weil diese Form wenig flexibel ist ist es blich zumindest Parameter zu verwenden void quadrate int zahl Unterprogramm das zahl zahl ausgibt printf d n zahl zahl zahl void main printf Quadrate von Zahlen ausgeben n quadrate 3 updruck wird mehrfach aufgerufen quadrate 9 bei jedem Aufruf ist die Zahl Mi quadrate 17 anders das Upro kann wesentlich quadrate 33 flexibler eingesetzt werden Das Unterprogramm quadrate hat einen Parameter der den Eingangswert liefert es werden keine Daten vom Uinterprogramm zur ck an main geliefert Unterprogramme haben h ufig mehrere Parameter damit k nnen Werte vom aufrufenden Programmteil Hauptprogramm zum aufgerufenen Programmteil Unterprogramm bertragen werden Die M glichkeit der Datenr ck bertragung existiert auch aber nicht in allen F llen Bei Funktionen gibt es neben den Parametern den Funktionsr ckgabewert der das eigentli che Wesen einer Funktion darstellt dadurch k nnen Funktionsaufrufe auch mitten in Aus dr cken Berechnungen verwendet werden
9. 3 0 und dieses Mi a 2 0 Statement else sind im Resultat a 10 5 gleich c a gt b a b auch als max c a gt b b a oder min einsetzbar In der C Bibliothek stdlib h ist die Funktion atoi enthalten Damit k nnen Zahlen die lesbar als Zeichen in einem String stehen in eine integer Zahl umgewandelt werden Auch ein scanf mit einer d Formatierung arbeitet mit der selben Logik Welche Vor und Nachteile diese Funktion hat sieht man beim Studium des Codes int myatoi char s einen String nach integer umwandeln der Parameter ein String char Arry endet mit 0 int i n vorzeichen for i 0 s i s i n s i t i berlesen von Zwischenr umen blanks newline Tab vorzeichen 1 if s i s i ermittle Vorzeichen wenn vorzeichen s i 1 1 vorhanden for n 0 s i gt 0 E s i lt 9 i errechnen des n 10 n s i 0 Wertes im integer Feld return vorzeichen n aus den Einzelstellen Mi C Skriptum Prei l 67 9 Dateien in C 9 1 Grundlegendes zu Dateien Daten sind Aussagen ber Persone Gegenst nde Sachverhalte in Form von Zahlen Text oder Bildern die Information ber diese Personen Gegenst nde oder Sachverhalte je mandem dritten liefern k nnen Beispiele Sachverhalt Opel Kadett Aktenzahl U44 95 geb 3 12 68 Bj 8
10. bernommen gt Call by Value Das folgende Programm funktioniert deshalb nicht so wie man es erwarten k nnte include lt stdio h gt void tausch int int main int x 1 y 2 printf vor dem Tausch x d y d n x y tausch x y printf nach dem Tausch x d y d n x y void tausch int a int b soll a und b austauschen int help help a hier wird zwar flei ig getauscht das Haupt a b programm bleibt aber v llig unbeeinflu t b help In C h tte man in solchen F llen noch mit Adressen Pointer hantieren m ssen um h n disch die Adress bergabe der Parameter zu erledigen Bei der scanf Eingabefunktion sieht man das noch denn man mu ein amp vor alle Parameter schreiben sonst k nnten sie nicht ver ndert werden somit k nnte nichts eingelesen werden Wir wollen aber ein Element aus C verwenden die sogenannte Referenz Wir m ssen nur amp bei der Funktionsdefinition von tausch einf gen das ganze als C Programm kom pilieren cpp und schon haben wir Call by Adress hei t hier Referenz bergabe include lt stdio h gt void tausch int amp int amp main int x 1 y 2 printf vor dem Tausch x d y d n x y tausch x y printf nach dem Tausch x d y d n x y void tausch int amp a int amp b tauscht a und b aus d int help help a hier wird flei ig getauscht das Haupt a b programm merkt
11. datei Zeiger auf die Datei der von fopen geliefert wurde Funktionsr ckgabewert Anzahl der korrekt bertragenen Datens tze Bei einem Fehler auch bei EOF wird die Anzahl der noch fehlerfrei bertragenen Elemente zur ckgeliefert Neben dem Lesen und Schreiben von Datens tzen kann auch direkt auf irgendeinen Daten satz pr ziser auf ein beliebiges Byte in der Datei positioniert werden Alle Bytes der Datei sind von 0 beginnend durchnummeriert Will ich auf den 10ten Datensatz in der Datei positionieren das bedeutet das n chste fread nach der Positionierung liest den 10ten Datensatz dann positioniere ich auf das sizeof Datensatz 10 1 te Byte der Datei int fseek FILE datei long abstand int basis Setzt die Position f r nachfolgende Schreib oder Leseaktionen Sie wird berechnet durch basis abstand in BYTES basis SEEK SET 0 Fileanfang vor dem 1 Zeichen SEEK CUR 1 aktuelle Positionierung in der Datei SEEK_END 2 Fileende hinter dem letzten Zeichen EOF Position Funktionsr ckgabewert 0 f r ordnungsm ige Funktion sonst gr er 0 sonst fseek f OL SEEK_SET fseek f 0L 0 rewind f ist am Dateianfang fseek f 8L SEEK_CUR 8 Bytes vorw rts von der aktuellen Position fseek f sizeof Buffer SEEK_END vom Dateiende um nach vor fseek f 0L SEEK_END Dateiende fopen a long ftell FILE datei liefert die aktuelle Positionierung in der Datei vom Anfang
12. f r die Programmiersprache C Skriptum Prei l 2 INHALTSVERZEICHNIS ECH BEE ON unse ieieni nnsssssiilenesiieisnssnisenenswessnassisseiesen 4 1 1 WOZU PROGRAMMIERSPRA CHEN nit Zeie eeh deeg eh east eisen serie 4 1 2 ZUM L SEN VON PROBLEMEN ueeeeeessnnesnsossnnnensnensnnnnnsnonsnnnensossnnnensossnnnessossnsnnssoesssnnnsn 5 1 3 PROBLEML SUNG SPEZIELL AM COMPUTER sssessssssesssesetesesstessresstesstesreesestesseesseessrest 7 1 4 ANALYTISCHES VERFAHREN ZUM PROBLEML SEN LAND 11 1 5 PROGRAMMDOKUMENTATION 11 1 5 1 Wartungsdokumentation CEnnickhungsdokumentation 12 1 5 2 Benutzerdokumentation ooeeeeeneennneneeeseesissesiissrrssssrrsssrirssrrirnsrrrresrrsserrrssre 12 1 6 ALLGEMEINE EIGENSCHAFTEN EINES GUTEN DROOGRAMMES 12 2 ALLGEMEINES ZU C u202s0sinsosseesas pesspsssnessssess es ser snasraep ste Cer erh sone sehen hhes 13 3 ERSTE BEISPIELPROGRAMMEE csssssossonssnnssnnesnnsnnunnnnssnsssnssonssonssonsnnssnnssnnssnnnnne 15 3 1 BEISPIELPROGRAMM AM COMPUTER AUSF HREN sssssssssesseseeesesstesserssrrsseessesereseesses 18 A RICHTLINIEN ZUR VERN NFTIGEN PROGRAMMIERUNG unsessnenseneenennene 20 5 VARIABLE DATENTYPEN UND KONSTANTE IN C usssssssosssssosssonsoonsoossonsenne 22 5 1 DATENTYP GANZZAHL INTERNE DINARZAHLL nn 22 5 2 DATENTYP GLEITKOMMA ENTSPRICHT BIN REM MASCHINENFORMAT ueneesennen 23 5 3 DATENTYP CHARACTER NUR EINE STELLEN 23 5 4 ARRAYS ZUSAMMENFASSEN MEHRERER ELEMENTE GLEI
13. float Gleitkomma_ scanf f amp Variablenname printf f Variablenname char ein Variablenname getchar printf c Variablenname Zeichen scanf c amp Variablenname putchar Variablenname char 80 mehrere fgets Variablenname sizeof printf s Variablenname Zeichen Variablenname stdin puts Variablenname gets Variablenname scanf s amp Variablenname Wenn es mehrere Alternativen gibt dann ist die jeweils erste Zeile zu empfehlen Bei der Ausgabe sieht man da es vollkommen ausreichend ist wenn man printf gut beherrscht deshalb folgt etwas sp ter eine genaue Erl uterung von printf Bei der Eingabe ist scanf f r Zahlen aller Art die erste Wahl f r einzelne Zeichen kann man sowohl scanf als auch getchar verwenden will man eine ganze Zeile einlesen alles was der Benutzer tippt bis er die return Taste bet tigt dann ist fgets oder gets notwendig scanf kann auch mehrere Zeichen einlesen tut dies aber nur bis zum n chsten Leerzeichen include lt stdio h gt void main int summe zahl Zahlensumme summe 0 Variable zahl summe Leseschleife mit scanf lesen einzelne Zahlen summe 0 scanf d amp zahl zeichen mu int sein sonst while zahl 0 lese erste zahl summe summe zahl scanf d amp zahl while zahl ungleich0 summe summe zahl printf Die Summe aller Zahlen ist d n summe
14. int tm_mday day of the month 1 31 int tm_mon months since January 0 11 int tm_year years since 1900 int tm wday days since Sunday 0 6 int tm_yday days since January 1 0 365 int tm isdst daylight savings time flag Obige Definition steht in der Include Datei time h In ihrem Programm schreiben Sie dann include lt time h gt struct tm zeit_privat Damit ist zeit_privat eine sogenannte unvollst ndige Struktur definition weil die Elemente bereits fr her definiert wurden Mi Man sollte immer mit unvollst ndigen Strukturdefinitionen Mi arbeiten weil dadurch gleiche Strukturen vom Typ struct tm garantiert gleich sind main Strukturen k nnen verschachtelt sein Mi verschachtelte Strukturen struct person char name 25 int age char status V verheiratet S single ro struct alldat int grade struct person descrip char lunch 25 hi struct alldat teacher sub Student 53 teacher grade 94 teacher descrip age 34 teacher descrip status V strcpy teacher descrip name Hanil Sabal strcpy teacher lunch D ner Sandwich sub descrip age 87 sub descrip status V strcpy sub descrip name Old Lady Brown sub grade 73 strcpy sub lunch Jogurt und Toast student 1 descrip age 15 student 1 descrip status S strcpy student 1 descrip name Willy Binke
15. 42 43 47 52 66 69 73 76 77 78 82 89 92 95 197 199 neues mittleres Element 1 3 14 122 134 42 43 47 152 66 69 73 76 77 78 82 89 92 95 97 99 neues mittleres jetzt werden nur mehr die Werte 14 und 22 betrachtet Element Der Wert des jetztigen mittleren Elements enth lt 14 gt Treffer gefunden W rde man nicht nach dem Wert 14 sondern nach dem Wert 19 suchen dann ginge die Suche noch weiter 1 3 14 122 134 42 43 47 152 66 69 73 76 77 78 82 89 92 95 97 199 Durch mehrfache Halbierung des betrachteten Arraybereichs bleibt jetzt nur mehr ein Ele ment brig Dieses kann nicht mehr weiter unterteilt werden daher endet der Algorithmus mit nicht gefunden Soll man diesen Algorithmus nun in Code umsetzen so geht man meist den falschen Weg dies ist normal kaum jemand findet nach der Ablaufbeschreibung sogleich den g nstigsten Code Vor Ihnen haben ebenfalls kluge Leute schon Wochen aufgewendet um diesen Code zu perfektionieren include lt stdio h gt define TABDIM 21 void maint int untergrenze obergrenze i suchwert gefunden int tabelle TABDIM 1 3 14 22 34 42 43 47 52 66 69 73 76 77 78 82 89 92 95 97 99 werden alle Elemente initialisiert k nnte man auch int tabelle schreiben die Anzahl der Init Werte bestimmen dann die Dimension printf nWelchen Wert wollen Sie in der Tabelle suchen scanf d amp suchwert u
16. C Skriptum Prei l 50 GOTOXY links_zeile links_spalte printf c chrahmen 2 for i 1 i lt anzahl_spalten i printf c chrahmen 0 printf c chrahmen 4 for i 1 i lt anzahl_zeilen i GOTOXY links_zeile i links_spalte printf c chrahmen 1 GOTOXY links_zeile ti links_spaltetanzahl_spaltent1 printf c chrahmen 1 GOTOXY links_zeiletanzahl_zeilen l links_spalte printf c chrahmen 3 for i 1 i lt anzahl_spalten i printf c chrahmen 0 printf c chrahmen 5 return fehler Es wird Ihnen wohl unangenehm auffallen da die Funktion keine Dokumentation und auch keinen Kommentar enth lt lernen Sie daraus bungen e Schreiben Sie ein Programm welches Textzeilen einliest und mit einer Zeilennumme rierung versehen wieder ausgibt e In vielen Texten sind Tabulatoren enthalten Schreiben Sie ein Programm welches Text einliest und die darin enthaltenen Tabulatoren in Leerzeichen 1 8 Leerzeichen anstelle eines t umwandelt Als Tabulatorenschrittweite wird 8 angenommen e Lesen Sie eines Ihrer C Programme ein Berechnen Sie den Kommentarkoeffizien ten das Verh ltnis Zeichen_im_Programm Zeichen_innerhalb_von_ Kommentar und geben Sie dies m glichst informativ aus C Skriptum Prei l 5 1 7 Der Aufbau eines C Programms 7 1 Funktionen und Unterprogramme allgemein Bislang bestand unser Programm immer aus der Funktion main darin wurden a
17. Das wird etwa 1 Stunde dauern und ich w rde Ihnen raten ine Handl d ie nicht mehr si Il nicht umzur hren h chstens mal den Topf zu r tteln CNE ANUS CATT AWENE SIE MCO a zerlegt werden kann Beispiel Widerstandsberechnung Bei der Berechnung seriell und parallel geschalteter Widerst nde kommt in Ri diesem Fall folgende Vorgangsweise zur Anwendung Seriell hintereinander liegende Widerst nde werden addiert bei parallelen nebeneinander liegen den Widerst nden mu deren Produkt durch deren Summe dividiert werden Viel besser verst ndlich ist hier die Schreibweise als Formel R2 R3 R FR wenn RI1 100Q Ben R2 8Q Reine 2 R2 R3 R3 129 8 12 Auf einem Taschenrechner w rde die getippte Anweisungsfolge so aussehen 10 8x12 8 12 Die nachfolgende Tabelle soll zeigen welche Begriffe in welcher Problemumgebung ver wendet werden Begriffe in einer Zeile haben jeweils eine hnliche Bedeutung beim Pichelsteiner bei der Widerstands als Programmierer bzw Eintopf berechnung Informatiker der Probleml Rezept Formel Algorithmus sungsplan hei t Anweisung gesalzenes Fleisch Formelteile 8 12 Befehle einer Programmier in den Topf geben sprache eines Programms elementare Hand Fleisch salzen Operationen Einzelbefehle X X 1 lungen sind Operationen f r das Objekt Anweisungen Zutat Zahlen 8 10 12 Objekte bei Program
18. OL SEEK_SET an den Dateianfang stellen clrscr anzahl 0 while fread amp autol sizeof autol 1 autodat in der Datei um einen Datensatz zur ckpositionieren fseek autodat anzahl sizeof struct automobil SEEK_SET autol preis autol preis 1 02 den Preis erh hen fwrite amp autol sizeof autol 1 autodat r ckschreiben anzahl vor dem n chsten lesen wieder neu positioniern fseek autodat anzahl sizeof struct automobil SEEK_SET printf n Es wurden d Preise erh ht n anzahl printf n zur ck zum Men mit Tastendruck taste getch bung Obwohl das obige Auto Programm umfangreich ist kann es noch erweitert werden Es sollen wahlweise 2 3 verschiedene Sortiervarianten angeboten werden Die Eingabe soll verbessert werden alle Daten in einer Zeile eingeben Autos sollen auch wieder gel scht werden Autos sollen auch ge ndert werden Das nachfolgende Programm ist bewu t undokumentiert und unkommentiert Sie sollen erforschen was das Programm tut beurteilen wie sinnvoll die L sung ist und letztend lich auch M ngel und m gliche Fehler finden Weil sehr zahlreich von vordefinierten C Funktionen Gebrauch gemacht wird sollten Sie die Funktionsliste im letzten Kapitel oder die Hilfe M glichkeit eines Compilers zu Rate ziehen include lt stdio h gt include lt stdio h gt include lt time h gt void main Die Funktionsaufteilung schei
19. lt stdio h gt include lt conio h gt wegen der getch Funktion define C_CLS 033 2J clear screen Mi define C_GOTOXY 033 d dH positioniere Cursor define CLS define GOTOXY z s printf 033 2J printf 033 d 3dH z s define C_STRICH jabed Rahmen a c l I I b d int rahmen int int int int Prototyp der Funktion void main int i lz ls nz ns CLS printf Geben Sie bitte die notwendigen Koordinaten f r die n printf Erstellung eines Rahmens ein n printf Zeile links oben scanf d amp lz fflush stdin printf Spalte links oben scanf d amp ls fflush stdin printf Anzahl Zeilen e scanf d amp nz fflush stdin printf Anzahl Spalten Ge E scanf d amp ns fflush stdin CLS i rahmen lz 1s nz ns getch diese Funktion liest nur eine Taste auch ohne return int rahmen int links _zeile int links_spalte int anzahl_zeilen int anzahl_spalten int i fehler 0 static char chrahmen 7 C_STRICH if links_zeile gt 22 links_zeile links_zeile 1 fehler 1 lt 0 if links_spalte gt 78 links_spalte lt 0 links_spalte 1 fehler 1 if anzahl_zeilen links_zeile gt 22 anzahl_zeilen lt 0 anzahl_zeilen 0 fehler 1 if anzahl_spalten links_spalte gt 78 anzahl_spalten lt 0 anzahl_spalten 0 fehler 1 CLS
20. printf f 12 5f n f wieder linksb ndig f 3 14159 Mi printf String s n st character arrays String jaja puts st nur 1 char array jaja Die Funktion putchar char schreibt genau einen Character auf den Bildschirm genauer in die Standardausgabe auf die momentane Position Der in Klammer stehende Parameter mu also eine character Variable oder Konstante sein Die Funktion puts char schreibt den Inhalt eines mit 0 abgeschlossenen Strings in die Standardausgabe und h ngt noch ein n Cursor steht somit am Anfang der n chsten Zeile an Als Parameter wird der Name eines char Arrays in dem sich eine bin re Null befinden mu oder eine Stringkonstante verwendet Die Funktion printf ist die formatierte Ausgabem glichkeit der erste Parameter ist eine String Konstante in der Formatierelemente enthalten sein k nnen Je nach Anzahl und Art der Formatierelemente gibt es noch weitere Parameter deren Datentypen zu den Formatierelementen passen m ssen In der Regel gibt es f r jedes format im ersten Para meter jeweils einen weiteren Parameter Die Formatierstrings sind folgenderma en auf gebaut Steuerzeichen min Feldbreite Genauigkeit L ngenangabe Format Steuerzeichen 0 numerische Werte mit f hrenden Nullen linksb ndige Ausrichtung bei numerischen Formaten bei Zahlen Vorzeichen immer ausgeben blank immer Platz f r Vorzeichen blank min Feldbreite minimale Fel
21. vielen Zutaten bei Eint pfen h ufig abgebildet 150 g Ochsenmark 1 Blumenkohl Die Probleml sung selbst ist eine Reihe von knapp 300 g Kartoffeln Zwiebel gehaltenen in S tze gekleideten Anweisungen Jede kl Kopf Wirsing Salz Pfeffer Anweisung besteht aus mehr oder minder elementaren 200 g Mohrr ben 500 g Kalb Hammel und Handlungen bei denen meistens Zutaten verwendet einige Champignons Schweinefleisch gemischt bzw verarbeitet werden 100 g gr ne Bohnen und gut abgehangen Petersilienwurzel 1 3 s 1 Wasser oder Br he Pichelsteiner Topf Jede Zutat geh rt zu einer bestimmten Art Kartoffel Nehmen Sie einen passenden Topf und arrangieren Sie lagen Wirsingkohl oder Mohrr ben sind Gem se Salz und weise Den Boden bedecken Sie mit dem in Scheiben geschnitte Pfeffer sind Gew rze nen Rindermark dann kommt die H lfte des kleingeschnittenen Gem ses und der Kartoffeln darauf das w rfelig geschnittene Wie elementar genau eine bestimmte Handlung gesalzene und gepfefferte Fleisch und zum guten Schlu der Rest formuliert werden mu h ngt ganz wesentlich vom des Gem ses und der Kartoffeln Begie en Sie esmit slBr he Ausf hrenden ab Ein Koch wird mit noch knapperen verschlie en Sie den Topf gut damit der Dampf nicht entweichen Formulierungen auskommen ein K chenlaie wird kann und lassen Sie auf kleiner Flamme alles weichd nsten d i wohl keinen passenden Topf finden Elementar ist
22. 0 etwas m hsam Mi char text2 6 hallo so gehts auch Sonderfall nur char text3 6 hallo am einfachsten f r char Arrays Im normalen Programmablauf gibt es keine M glichkeiten Arrays als Einheit anzuspre chen so wie bei den hier gezeigten Initialisierungen Dort mu jedes Element einzeln z B tab 3 2 text 0 h verwendet werden Bei manchen Befehlen genauer Funktionsaufru fen kann man aber den Arraynamen ohne angeben Texte als Strings char Ar rays mit 0 am Ende y wie C Skriptum Prei l 26 5 4 1 Spezielles zu char Arrays Weil der Typ char nur ein Zeichen speichern kann ist das char Array h ufig in Verwen dung um Strings zu speichern Um mit Strings besser umgehen zu k nnen gibt es String Konstante zwischen Anf hrungszeichen und eine eigene Gruppe von Funktionen die mit Strings arbeiten weil es keine Operatoren f r Strings oder Arrays gibt Diese verlangen aber da ein String immer mit einer bin ren Null abgeschlossen wird Hat ein String kein 0 am Ende so kann das genauso wie das planlose berschreiten von Indexgrenzen eines Arrays zu v llig dubiosen Programmabst rzen f hren include lt string h gt notwendig f r alle str Funktionen include lt stdio h gt void main char namel 12 name2 12 mixed 25 char title 20 strcpy namel Rosalinde kopiert nach von Mi strcpy name2 Schnecke im Zielfeld mu g
23. 222 333 dies setzt z 333 dies setzt z 444 if x y EE x 77 z 33 gesetzt wird z 33 if x gt y Il z gt 12 z 22 gesetzt wird z 22 if x amp amp y amp amp z z 11 gesetzt wird z 11 if x 1 amp amp y 2 amp amp z 3 r 12 00 es wird zugewiesen x 1 y 2 z 3 r 12 00 x 2 amp amp y 3 amp amp z 4 r 14 56 In dieser Zeile wird keine Zuweisung durchgef hrt trotz y 3 Bei den Operatoren amp amp ist n mlich die Abarbeitung von links nach rechts garantiert Bei amp amp und wird der Ausdruck nicht mehr weiter untersucht wenn das Ergebnis feststeht 27 345 z wird immer gesetzt 27 345 nichts tut sich 27 345 dies setzt x 0 z bleibt unver ndert include lt stdio h gt void maint int x 0 y 2 z 1025 float a 0 0 b 3 14159 c 37 234 EE WE Incrementierung Ski t x z y z 2 y 3 z Hy Z z 4 y 4Ax y y 1 Decrementierung Nd y y 3 z y 2 3 y 2 z y z 1 y 1 verk rzte Zuweisungen a a 12 12 zu a addieren a 12 nochmal 12 zu a addieren a 3 2 a mit 3 2 multiplizieren a b b von a abziehen a 10 0 a durch 10 dividieren C Skriptum Prei l 66 bedingte Bewertung a b gt 3 0 2 0 10 5 Dieser Ausdruck Mi if b gt
24. Eine Quadratwurzel wird so verwendet ce sqrt a a b b 7 2 Schnittstelle zwischen Funktionen Funktionsaufruf Verbindung zwischen Modulen Schnittstelle Parameter bergeben Werte vom rufenden Programm zur Funktion und manchmal auch zur ck Zwischen Haupt und Unterprogramm bzw zwischen rufender und augerufener Funktion gibt es die folgenden M glichkeiten Daten auszutauschen 7 2 1 Parameter Parameter k nnen beim Aufruf an Funktionen bzw Unterprogramme bergeben werden Im Gegensatz zu anderen Programmiersprachen wie Cobol oder Fortran wird aber nicht Call by Adress sondern Call by Value verwendet Das hei t die Parameter werden im Hauptprogramm in tempor re Felder in C in den sogenannten Stack gestellt und dann diese Felder deren Adressen ans Upro Funktion bergeben Dort k nnen die formalen Parameter beliebig ver ndert werden es werden aber bei der R ckkehr ins Hauptprogramm die Parameter NICHT mehr zur ck bernommen Es kann also kein aktueller Parameter des Hauptprogramms durch ein Unterprogramm ver ndert werden Ausnahme Arrays nur Name des Array ohne Indexangabe werden immer mit Call by Adress bergeben Auch kann man Adress bergabe durch die aus C stammende Referenzschreibweise erreichen y vice y vice der Funktionsr ckgabewert das Wesen einer Funktion C Skriptum Prei l 54 Parameter werden vom Hauptprogramm ins Unterprogramm bergeben aber NICHT mehr zur ck
25. FILE sn schreibt Puffer auf Platte R ckgabewert 0 wenn ok EOF wenn Fehler int fgetc FILE f liest n chstes Zeichen aus f R ckgabewert ist das Zeichen oder EOF int fgetpos FILE f fpos_t p die Fileposition wird in p gespeichert R ckgabewert 0 wenn ok char fgets char s int n FILE sp liest eine Zeile inklusive n nach s wenn die Zeile aber l nger als n 1 Zeichen dann werden nur n 1 Zeichen gelesen s wird mit 0 abgeschlossen R ckgabewert NULL oder s C Skriptum Prei l 1 0 1 FILE fopen char fnam char art die Datei mit Name fnam wird im Modus art er ffnet Art ist r w a oder r w a read write append erm glicht lesen und schreiben auf fnam F r bin re Files wird noch ein b angeh ngt wodurch keine Newline Konvertierung stattfindet R ckgabe ist der Filpointer oder NULL int fprintf FILE f char format ist ein printf auf einen File int fputc int c FILE ap schreibt das Zeichen c in den File f R ckgabewert Zeichen c oder EOF int fputs char s FILE f schreibt String s nach f kein extra n R ckgabewert true oder EOF size_t fread void p size_t size size_t nelem FILE f liest aus File f size nelem Bytes nach Adresse p R ckgabewert ist gelesene Zeichen size also nelem wenn ok FILE freopen char fnam char art FILE f schlie t fund er ffnet dann die Datei mit Name fnam im Modus art Ist schneller als getrenntes fclose fopen int fscanf FILE f char format ein scanf aus de
26. Ihre Doku sch tzen Auch Lehrer sch tzen gute Dokumentationen 10 Benutzerhandbuch Dokumentation f r den Anwender des Programms fertigstellen Hier wird zu Beginn Sinn und Zweck des Programms beschrieben hnlich zu den Punkten 1 3 Erst dann soll die konkrete Bedienung des Programms geschildert wer den Hinweise auf notwendige Computer Hard und Softwareausstattung komplettieren die Benutzerdokumentation 1 5 Programmdokumentation Gro e Teile der Dokumentation liegen bereits in Form der Entwicklungsdokumentation AVP vor Die volle Programmdokumentation besteht aus zwei Teilen C Skriptum Prei l 1 2 1 5 1 Wartungsdokumentation Entwicklungsdokumentation Sie erm glicht einem nachfolgenden Programmierer das detaillierte Kennenlernen des Programmes wenn Anderungen oder Erg nzungen notwendig werden oder zur Behebung von Fehlern die erst sp ter auftreten Sie enth lt Name des Programmes und des Programmierers Datum dieser Fassung berblick ber das Programm Aufgabenstellung Problemanalyse Beschreibung der Algorithmen Beschreibung der Unterprogramme Aufgabe Parameter R ckgabewert Variablenliste Datentyp Wertebereiche Beschreibung Ausgaben auf Bildschirm und Drucker Masken Druckbilder Eingaben und sinnvolle Werte graphische Programmdarstellung z B Struktogramm Testdaten und Ergebnisse Testlaufprotokoll Schreibtischtest Programmcode mit Kommentaren 1 5 2 Benutzerdokumentation Sie so
27. Weil nur sehr kleine Probleme auf die Schnelle gel st werden k nnen empfiehlt sich ein systematisches Vorgehen Man wird daher nach einem Probleml sungsplan bzw einem Probleml sungsverfahren suchen Wird man nicht f ndig dann mu man selbst einen Probleml sungsplan entwickeln 2 JDatum ndern Vor allem M nner sehen es als ernsthaftes Problem an wenn sie etwas 2 1 Taste W dr cken kochen sollen Normalerweise verwenden sie dann einen Probleml 2 2 Taste of dr cken sungsplan den ein anderer Mensch wahrscheinlich ein Koch niederge Das Datum erscheint schrieben hat sie suchen das passende Rezept in einem Kochbuch 2 3 Tag und Monat mit den Ziffern Tasten 1 0 vierstellig eingeben und mit Taste d r best tigen k k Tag Monat und Jahr werden angezeigt Bevor es ShowView gab war es mitunter ein ernsthaftes Problem den 2 4 Jahreszahl z B 9 und 1 f r 1991 mit den Ziffern Tosten Videorecorder zum Aufnehmen einer bestimmten Sendung zu bewegen 1 0 zweistellig eingeben und mit Taste o best tigen Man mu te den zugeh rigen Probleml sungsplan die Bedienungsanlei tung gr ndlich studieren siehe nebenstehendes Beispiel Weitere Beispiele f r h ufig eingesetzte Probleml sungspl ne sind Montageanleitung f r Selbstbaum bel Strickanleitung f r einen Pullover Noten eines Musikst cks Stadtplan Rechenvorschrift z B Formeln f r Volumen etc Abbildungsvorschrift z B eine Funktion in der Mathem
28. atoi char s wandelt die in s stehende Konstante in einen integer Wert um long atol char s wandelt die in s stehende Konstante in einen long Wert um void bsearch bin res Suchen in einer Tabelle Parameter hier nicht erkl rt void calloc size_t nelem size_t size belegt nelem size Bytes Hauptspeicher f r Arrays ausgerichtet div_t div int dividend int divisor dv ist eine Struktur mit Quotient und Rest void exit int status beendet Programm ordnungsgem Status an das Betriebssystem void free void p gibt einen vorher mit malloc belegeten Hauptspeicher wieder frei char getenv char name gibt den Inhalt der Betriebsystem Umgebungsvariable name zur ck long labs long i Absolutwert von i einer long Variablen Idiv_t Idiv long dividend long divisor wie div aber f r long Variable void malloc size_t size belegt size Bytes Hauptspeicher zur Programmlaufzeit Liefert die Adresse wenn ok sonst NULL void gsort Quick sortieren von Tabellen Parameter hier nicht erkl rt int rand void liefert eine Pseudozufallszahl gt 0 von 0 bis RAND_MAX void realloc void p size_t size ver ndert die Gr e des Bereichs der vorher mit malloc bereitgestellt wurde Der Wert darin bleibt zumindest bei Vergr erung erhalten void srand unsigned int start _Startwert f r die mit rand gelieferte Pseudozufallszahlenkette setzen strtod strtol strtoul konvertieren String Konstante nach double long unsig
29. der Datei oder 1L im Fehlerfall f r Bin rdateien int feof FILE datei liefert TRUE wenn der letzte Lesebefehl schon EOF er reicht hat BSP while feof f Das n chste Beispiel zeigt die M glichkeiten von fread fwrite fseek anschaulich verwen det aber noch keine wirklichen Datens tze es gilt ein Datensatz 1 Byte include lt stdio h gt 3 Beispiel zur Anwendung der C I O Funktionen define BUFLEN 25 Die bisherigen Funktionen sind eher f r normale Ascii Files geeignet Will man aber Datens tze bearbeiten die auch aus Feldern mit ver schiedenen Datentypen bestehen so sind die Funktionen fread fwrite besser geeignet Mit fseek besteht zus tzlich noch die M glichkeit im File zu positionieren und dadurch einen Direktzugriff auf jedes Byte der Datei durchzuf hren 1 2 3 012345678901234567890123456789012345 Spaltenz hler in Datei abcdefghijklmnopqrstuvwxyz0123456789 geplante Daten main FILE datei3 fp C Skriptum Prei l 76 int i j c char buffer BUFLEN char ptr_c if datei3 fopen fiobsp 2 w NULL puts Ausgabefile gt fiobsp 2 lt open Fehler exit 1 fputs abcdefghijklmnopqrstuvwxyz0123456789 n datei3 Testdaten schreiben n erzeugt 0d0a jetzt wird die Datei geschlossen und mit r input output wieder eroeffnet if i fclose datei3 0 printf File gt fiobsp 2 lt 1 close Fehler d n i exit 1
30. der Vergleich wird mit der vorletzten Zahl im Array wiederholt Anschlie end wird weiter so verfahren bis die letzte bereits sortierte Zahl kleiner als die neue Zahl ist Rechts von dieser wird die neue Zahl an die freie Stelle eingef gt C Skriptum Prei l 3 1 Beim Microsoft Compiler ist eine Sortdemo enthalten die sehr anschaulich alle Sortierver fahren vorf hrt auch Quicksort etc In den C Bibliotheken Codest cke die von klugen Leuten schon fr her geschrieben wurden und mit dem Compiler mitgeliefert werden finden sich vordefinierte verwendbare Funktionen f r das bin re Suchen und f r den Quicksort wesentlich besser als die hier vorgestellten Verfahren Allerdings erfodert deren Einsatz noch weitere C Kenntnisse am Ende des Skriptums finden sie aber entsprechende Hinweise auch k nnen Sie die Hilfe des Compilers studieren Fl oder STRG F bungen e Ermitteln Sie die Summe und den Durchschnitt aller Werte eines numerischen Arrays e Entfernen Sie aus einem numerischen Array alle negativen Werte indem Sie die rechts stehenden Elemente nach links schieben und ganz rechts mit Nullen auff llen e Ein char Array abgeschlossen mit 0 enth lt nur Ziffern Ermitteln Sie wie oft jede Ziffer vorkommt e Ein char Array abgeschlossen mit 0 enth lt beliebige Zeichen Ermitteln Sie wie oft jedes einzelne Zeichen vorkommt In der Ausgabe der H ufigkeitsverteilung sollen nur Zeichen aufscheinen die mindestens einma
31. e character Typ float f Gleitkomma Typ double g Gleitkomma doppelte Genauigkeit char st 6 jaja String char array Erkl rung der printf Ausgabe formatierung y vice C Skriptum Prei l 3 5 a 1023 irgenwelche Werte in die Variablen b 2222 c 123 d 1234 e x f 3 14159F g 3 1415926535898 printf a d n a dezimale Ausgabe a 1023 Mi printf a o n a oktale Ausgabe a 1777 Mi printf a x n a hexadezimaler Output a 3ff Mi printf b 31d n b dezimal long Var b 2222 Mi printf c hd n c dezimal short Var c 123 printf d u n d unsigned Variable d 1234 printf e c n e character e X Mi putchar e putchar n schreibt einen char X Mi printf f f n f floating output f 3 141590 printf g f n g double gerundet 1f g 3 141593 printf a d n a einfacher dec output a 1023 Mi printf a 37d n a output auf 7 Stellen a 1023 Mi printf a 307d n a 7 Stellen mit Nullen a 0001023 printf a 7d n a immer mit Vorzeichen a 1023 Mi printf a 7d n a output linksb ndig a 1023 Mi printf f f n f normaler float output f 3 141590 Mi printf f 312f n f output 12 stellig f 3 141590 printf f 12 3f n f 3 Nachkommastellen f 3 142 printf f 12 5f n f 5 Nachkommastellen f 3 14159
32. eg 99 RE EE 100 RE E 100 E E 100 TEIL EE 102 112 02 strins ha Asset a a en n ea a eA 102 E EE 103 11 2 GRAFIKM GLICHKEITEN UNTER DOS MIT BORLAND BOl 104 Wie alle Schriftwerke unterliegt diese Skriptum dem Urheberrechtsschutz beim Vertrieb in den USA ist daf r ein Copyright Vermerk notwendig Sie k nnen daher f r den privaten Gebrauch einige wenige Kopien anfertigen Sie d rfen diese aber keinesfalls verkaufen und es ist ebenfalls nicht zul ssig wenn Sie Teile des Skriptums oder gar das ganze Konvolut als eigene Sch pfung ausgeben IMPRESSUM Herausgeber Mag Prei l Johann Pelargonienweg 70 1220 Wien 1 Allgemeines C Skriptum Prei l 4 1 1 Wozu Programmiersprachen Diese graphische Darstel lungsform nennt man Programmablaufplan Programmieren sollte heute eine geplante ingenieur m ige T tigkeit sein E Wichtig Haben Sie ein Problem vi Sie Gl cklicher Ja Kann ein Computer Ihr Problem l sen helfen Denk positiv und tu was dagegen Ja schreib ein eigenes Programm mit einer Nen gt Programmier sprache Gibt es fertige Programme benutze diese O Vor langer Zeit blo 30 Jahre mu te praktisch jeder programmieren k nnen der einen Computer bedienen wollte Heute gibt es eine Unzahl von fertigen Computerprogrammen und viele normale Anwender verwenden Texverarbeitungen oder Computerspiele ohne daf r ir
33. falsch 3 14 22 2222 33 5 3 Datentyp character nur eine Stelle char nummer der C char Typ ist nur ein Zeichen lang char al text char lastzeichen unsigned char zeichen8 unsigned f r 8 Bit langen Character Mi Eine character kann genau ein Zeichen aus dem Zeichensatz der Maschine aufnehmen 7 oder 8 Bit oder auch wide 16 Bit Code dezimale Codes f r Zeichen Konstante werden zwischen Hochkomma geschrieben Dazwischen steht ein Zeichen wenn dieses nicht druckbar ist kann es auch als c oder nnn oder xnn dargestellt werden BEL a E d a BS Das c steht f r einen speziellen Buchstaben nnn ist der oktale Code des jeweiligen Zei 9 t HT chens bei xnn ist das nn der hexadezimale Code des jeweiligen Zeichens Bei zuk nftig 10 n LF m glichen Wide Character Zeichens tzen steht ein L vor der Konstante 11 v VT 12 f FF P e x p 13 V CR n Neue Zeile t horizontaler Tab v vertikaler Tab b Backspace f Seitenvorschub r Carr return a Klingel Backslash Wi bin re Null V immer das Zeichen selbst richtig ai 0 ai 014 b x2f falsch OW 876 oi a statt 0 soll korrekt 0 geschrieben werden C Skriptum Prei l 24 Zum Arbeiten mit mehreren charakters diese werden Strings genannt ein normaler Text werden char Arrays siehe unten verwendet Weil es keine Operatoren gibt die mit den char Arrays direkt arbeiten k nnten gibt es eine Menge Funktionen und
34. h gt void maint char strg 40 there one two int pt list 100 index strcpy strg Das ist ein character String one strg 0 zwei gleichwertige Zuweisungen two strg printf Die erste Ausgabe ist Sc c n one two one strg 8 noch zwei gleichwertige Zuweisungen two strg 8 printf Die zweite Ausgabe ist c c n one two there strg 10 strg 10 ist gleichwertig zu strg 10 printf Es folgt Ausgabe 3 c n strg 10 printf Die 4 Ausgabe ist c n there for index O index lt 100 index t list index index 100 pt list 27 printf Ausgabe 5 d n 1list 27 printf Ausgabe 6 d n pt size_t strlen char p_a Variante 1 size ti size_t entspricht einem unsigned int for i 0 p_a 0 p at i return i size_t strlen char p_a Variante 2 size_t i 0 while p_a i return i char strcpy char sl cgar s2 Variante 1 mit Pointern char ptr_ret sl Pointer auf Strukturen C Skriptum Prei l 90 while sl s2 M i sl s2 return ptr_ret char strcpy char sl char s2 Variante 2 mit Pointern char ptr_ret sl while sl s2 return ptr_ret Wenn also das folgende Array definiert ist int array 5 dann gilt die Adresse ermitteln den Inhalt ansprechen sst Les Jess Jee sst Les sst lest Be
35. hten Wert als Ergebnis weiter Daher kann i auch verwendet werden ohne eine Zuweisung zu t tigen kann praktisch nur auf Variable und nicht auf Ausdr cke angewandt werden Beispiele y Wichtig int i x 2 y 3 z 4 C Skriptum Prei l 63 i x Wert danach x 3 i 2 s Vtt Is y 4 i z E 1 5 z 5 printf d i i 6 gedruckt wird 6 x 3 y 4 i x y i 4 4 TH x 4 y 5 Ki i X i X X X Syntaxfehler wird auf den Ausdruck x angewendet und d rfen aber nur auf sogenannte L Werte ange wendet werden Das sind solche die links von einer Zuweisung stehen d rfen Sollten vermieden werden das Ergebnis ist nicht eindeutig es gibt Compiler Unterschiede Es bleibt dem Compiler berlassen zuerst den Teil x auszurechnen oder rechts zu beginnen und vorher x x zu ermitteln Auch Statements wie ali i sollte man tunlichst unterlassen Wenn in einem Ausdruck ganze Zuweiseung etc eine Variable zweimal vorkommt so darf man auf sie nicht oder anwenden Dekrementierung Wert um 1 vermindern quivalent zu einsetzbar sizeof Wenn man dynamisch w hrend der Laufzeit Hauptspeicherplatz anfordert dann will man in gt gt lt lt gt lt lt z gt t der Regel Platz f r bestimmte Variablen Es ist dann sehr g nstig sizeof einzusetzen weil damit der ben tigte Speicherplatz f r bestimmte Datentyp
36. int x1 x2 xl int vl x2 int v2 void pointer werden zu int Pointer if x1 lt x2 return 1 else if x1 gt x2 return 1 else return 0 int tab 232 qsort tab 232 sizeof int numcmp sortiert die Tabelle tab in qsort wird folgendes stehen if cmp ptrl ptr2 lt 0 10 3 Konvertierungen zwischen Datentypen Konvertierungen bei In C werden viele Konvertierungen auch automatisch durchgef hrt Reicht das nicht oder will man automatische Konvertierungen generell vermeiden so ist mit Hilfe des cast Ope rators jede programmgesteuerte Konvertierung m glich Berechnung von Ausdr cken Zuweisungen Funktionsaufrufe C Skriptum Prei l 9 8 W hrend der Berechnung von Ausdr cken bei der Abarbeitung der bin ren Operatoren werden folgende Konvertierungen vorgenommen im allgemeinen ist das Ergebnis vom Typ des h herwertigen Operanden jedoch mindestens vom Typ int keine Berechnung in short char char short int Als Ergebniswert eines Ausdrucks sind char und short nicht m glich 4 aber jeder dar berliegende Typ unsigned Gem der nebenstehenden Darstellung long wird der niederwertige Datentyp in den h heren Typ konvertiert Sind jeweils beide Parameter vom unsigned long gleichen Typ kann berechnet werden ake Pointer integer ergibt Pointer Pointer Pointer ergibt integer Mit anderen Typen k nnen Pointer doble
37. messen wie in C Modularisierung geh rt zur Philosophie der Sprache und wird auch von den meisten C Programmierern eingehalten Seien Sie keine Ausnahme Die Compiler selbst verf gen auch ber eine effiziente Parameter bergabe den sogenannten Stack damit Funktions aufrufe zeitlich optimiert ablaufen Die Modularisierung ist dann sinnvoll wenn die Schnittstellen zwischen den Modulen so klein wie m glich gehalten werden Nur dann k nnen die Module als logisch eigenst ndige Einheiten betrachtet und auch als solche getestet werden Die Dokumentation mu zu allererst eine exakte Beschreibung dieser Schnittstellen Parameter extern Variable ent halten Falsche Inhalte in den Schnittstellendaten d rfen die Funktion selbstverst ndlich nur zu einer korrekten Fehlerr ckmeldung veranlassen Es darf nie vorkommen da ein Unterprogramm Funktion mit nicht korrekten R ckgabeparametern ins rufende Pro gramm zur ckkehrt Es ist notwendig in der rufenden Funktion dem Hauptprogramm die Prototypen aller aufgerufenen Funktionen Funktion bzw Unterprogramm zu vereinbaren Damit wird in der rufenden Funktion vereinbart welcher Datentyp von der aufgerufenen Funktion zur ckgegeben wird Ebenso wird in den neueren Ansi C Compilern Typ und Anzahl der Parameter vereinbart Es ist aber nicht m glich Anzahl oder Typ der Parameter im Prototyp zu deklarieren wenn die Funktion eine variable Anzahl Parameter hat printf Wenn ein Prototyp exis
38. n counter return 5 das ist eine korrekte wenn auch immer gleiche Funktionswertr ckgabe 8 OPERATOREN in C davon gibt es viele Rang 1 10 11 12 13 14 15 Operator 0 I gt sizeof Bemerkung bei Funktionsaufruf Klammerung normale Tabellenindizierung zum Ansprechen von Strukturelementen Strukturelemente mittels Pointer auf Struktur un r erzwungene Datentypkonvertierung un r Inhalt von nur bei Pointer un r Adresse von un r das minus Vorzeichen un r das plus Vorzeichen un r logische Negation NOT un r bitweises Komplement un r Inkrement x x 1 un r Dekrement x x 1 un r Speicherplatz in Byte z B sizeof x Multiplikation Division Modulo Restdivision Addition Subtraktion Rechts Shift bitweise Links Shift bitweise kleiner Vergleichsoperator gr er Vergleich kleiner gleich Vergleich gr er gleich Vergleich Vergleich auf Gleichheit Vergleich auf Ungleichheit bitweises und bitweises exclusiv oder EOR bitweises oder logisches und logisches oder bedingte Bewertung Zuweisung verk rzte Zuweisung x 1 Kommaoperator zur Statementtrennung C Skriptum Prei l 60 Auswertung strikt strikt strikt strikt li Ore li Ore li Ore li Ore Jede Variable kann eine logi sche Variable sein y Wichtig C Skriptum Prei l 6 1 C ist bekannt f r eine Unzahl von Operatoren Alle Operatoren k nn
39. nicht der true Zweig folgt direkt auf die schlie ende Klammer Im k rzesten Fall ist dieses Statement ein leere Anweisung oder irgend ein anderes Statement oder mehrere Statements in geschwungenen Klammern Der else Zweig ist nur bei Bedarf vorhanden es gilt sinngem dasselbe wie beim true Zweig Das ist ein Beispiel f r if und if else Statements include lt stdio h gt void main int data for data 0 data lt 10 data data 1 if data 2 ist der Vergleichsoperator gleich printf data enth lt jetzt d n data if data lt 5 C Skriptum Prei l 42 printf data ist jetzt d kleiner als 5 n data else printf data ist jetzt d was gr er als 4 ist n data Ende des for Loop berlegen Sie wie die Schleife ausgeht wenn Sie statt data nur data 2 schreiben Bei geschachtelten if else Konstrukten mu man wie blich darauf achten da die else Zweige auch zu den richtigen ifs geh ren Es gilt das else geh rt zum jeweils letzten if falsch ist folglich if Bedingung l if Bedingung 2 aktion im if 2 else aktion im else l richtig wird es so gemacht if Bedingung l if Bedingung 2 aktion im if 2 else else aktion im else l man k nnte aber auch folgendes versuchen if Bedingung l if Bedingung 2 aktion im if 2 else aktion im else 1l 6 7 break und continue aussteigen aus Schleifen bre
40. r die Signalbehandlung Am PC praktisch nur f r CTRL C notwendig wenn man selbst Funktionen mit variabler Parameterzahl schreibt enth lt allgemeing ltige Definitionen wie size_t wchar_t NULL stellt defines und Funktionen f r die Ein Ausgabe bereit enth lt Prototypen f r grundlegende Funktionen atoi malloc getenv exit system Funktionen zur Stringbehandlung strncpy strrchr strtok memmove Funktionen und Strukturen zur Zeitbehandlung struct tm time clock In der Folge werden einige wichtige Funktionen n her erl utert 11 1 1 ctype h Diese Funktionsgruppe pr ft Zeichen ob sie zu einer bestimmten Gruppe geh ren Weil die l nderspezifischen Angaben noch nicht bei allen Compilern korrekt sind kann es zu Problemen bei deutschen Umlauten kommen int isalnum int c pr ft c auf alphabetisch oder numerisch R ckgabewert true oder false int isalpha int c pr ft c auf alphabetisch R ckgabewert true oder false int iscntrl int c pr ft c ob es ein CTRL x Zeichen ist R ckgabewert true oder false int isdigit int c pr ft c auf numerisch R ckgabewert true oder false int isgraph int c pr ft c ob es druckbar aber kein blank ist R ckgabewert true oder false int islower int c pr ft c ob es ein Kleinbuchstabe ist R ckgabewert true oder false int isprint int c pr ft c ob es ein druckbares Zeichen ist R ckgabewert true oder false int ispunct int c pr ft c ob es ein Sonderzeichen
41. schwein printf Hund Sd Ochse d Schwein d n hund ochse schwein if hund ochse schwein gt 8 goto es_reicht hi es_reicht printf F r s erste sind das genug Viecher n printf nDas ist die erste Zeile vom Spaghetti Code n goto dort im wald printf Die dritte Zeile vom Spaghetti Code n goto irgendwo dort printf Es folgt das zweite Spaghetti n goto im wald genug_ists printf Ende des printf Wartungsprogrammiererarbeitsplatzsicherungsprogramms n 6 10 return Beenden Unterprogramm zur ckgeben Funktionswert Unterprogramme und Funktionen werden genauso geschrieben wie die Funktion main die bereits in vielen Beispielen vorkam Das Ende einer Funktion ist mit der letzten schlie Benden gegeben Will man aber schon vorher ein Unterprogramm verlassen oder mu man bei Funktionen einen Wert zur ckgeben so geht das mit return bzw mit return Aus druck int sign int x das ist eine Funktion die das Vorzeichen des Parameters bestimmt x ist der Parameter if x gt 0 return 1 else if x lt 0 return 1 else return 0 Als Hauptprogramm sind die folgende Zeilen sinnvoll Prototypen verringern die Fehlergefahr bei Funktions aufrufen wesentlich y vice C Skriptum Prei l 46 include lt stdlib h gt include lt stdio h gt int sign int vor der 1 Funktion steht diese Zeile der sogenannte Prototy
42. siehe memcmp char strepy char sl char s2 kopiert s2 nach s1 inklusive 0 R ckgabe s1 oder NULL C Skriptum Prei l 1 03 size_t strespn char s1 char s2 sucht in s1 nach dem ersten Zeichen welches in s2 vor kommt R ckgabe ist die gefundene Suchspalte char strerror int errorcode liefert bei internen Fehlernummern den passenden Text size_t strlen char s ermittelt L nge von s ohne 0 char strncat char sl char s2 size_t n kopiert s2 nach s1 bis zu 0 oder in der maximale L nge n sollte L nge von sl sein R ckgabe sl oder NULL int strnemp char sl char s2 size_tn vergleicht s1 mit s2 bis zum 0 oder in der maximalen L nge n R ckgabe siehe memcemp char strncpy char sl char s2 size_t n kopiert s2 nach s1 bis zum 0 oder in der maximalen L nge n R ckgabe s1 oder NULL char strpbrk char si char s2 wie strespn R ckgabewert aber NULL oder Zeichenadresse char strrehr char sl int c wie strchr gesucht wird aber das rechteste Zeichen gleich c size_t strspn char sl char s2 wie strespn gesucht wird aber ein Zeichen aus s1 welches in s2 nicht vorkommt char strstr char sl char s2 hnlich strchr es wird aber gepr ft ob der gesamte String s2 Teil des Strings s1 ist char strtok char sl char s2 aufwendige Funktion zerteilt in mehreren Aufrufen den String s1 in Teilstrings Trennung mittels Trennzeichen aus s2 11 1 7 time h Zeiten k nnen auf verschiedene Wei
43. versehen mit einer Zeilennummerierung wieder aus Die I O erfolgt ber stdin stdout als Zeilenl nge sind 80 Zeichen vorgesehen Damit das Programm trotzdem nicht zu trivial wird soll die Zeilen nummerierung nur in der minimal notwendigen Breite aber trotzdem in sauberer Spaltenausrichtung durchgef hrt werden Also vorher die h chste Nummer ermitteln dann erst mit der Ausgabe starten Ein zweimaliges Lesen der Eingabe w re nur bei Dateien m glich include lt stdlib h gt in jedem Programm hier n tig f r malloc include lt stdio h gt immer bei I O fgets printf include lt string h gt bei str Funktionen z B strncpy include lt math h gt mathemat Funktionen z B sqrt pow define ZEILENLAENGE 81 so kann die Zeilenl nge sp ter leicht ge ndert werden void main struct stru_elem struct stru_elem ptr_next Pointer auf Struktur stru_elem char text ZEILENLAENGE Platz f r Zeile unsigned long satzzahl 0 int i struct stru elem ptr_anker NULL ptr_work ptr_aktuell char buffer ZEILENLAENGE while fgets buffer sizeof buffer stdin NULL satzzahl dynamisches Bereitstellen von Hauptspeicher f r ein stru_elem ptr_work struct stru_elem malloc sizeof struct stru elem if ptr_work NULL Fehler beim malloc printf Speicherplatz ist nicht mehr verf gbar n exit 1 Ende und exit _code ans Betriebss
44. verwendet wird oder auch 0 pr ziser den NULL Zeiger falls ein Fehler aufgetreten ist filename ist ein String der den externen Filenamen eventl mit Pfad enth lt modus ist ein String der die Zugriffsart angibt modus Verarbeitung Dateizier ___IEOF Marke r lesen und schreiben M o b nwlesen in o Chal rbt lesen und schreiten 3 DEE KC wb Inurschreiben og 1 wtbod wbt lesen und schreiten a _ ____ nurschreiben Text Loge dem letzten Byte unver ndert ar lesen und schreiben 1 DD ab nurschreiben og N atb od abt lesen und schreiben eo r setzt eine bereits existierende Datei voraus wenn nicht liefert fopen den Wert NULL w berschreibt eine eventuell vorhandene Datei da sowohl Positionsanzeiger als auch EOF Marke auf die 1 Dateiposition gesetzt werden a schreibt jede Ausgabe hinter das aktuelle Ende der Datei FILE datei char zeile 1000 if datei fopen bsp txt r NULL perror Open bsp txt Fehlermeldung fgets zeile sizeof zeile datei C Skriptum Prei l 73 Sobald die Filebearbeitung beendet ist soll die Datei durch fclose geschlossen werden Bei Ausgabedateien wird vorher noch der Inhalt des Puffers in die Datei bertragen int fclose FILE datei datei ist der logische Dateiname fclose datei Er ffnen eines tempor ren Files FILE tmpfile void Funktioniert wie fopen der e
45. 0 printf Siedepunkt des Wassers printf n Ende for Schleife Ende Funktion main Es folgt ein weiteres Beispiel Name x x x xx x x Kur zbe s chre ibun g k d de d de de de de e de e de d He de ke de name Dieses Programm zeigt alle Zahlen von 0 99 Cr Datum xxxx die ein besonderes Nahverh ltnis zu einer 1 9 92 bestimmten Ziffer haben EFunktionsauf ruf e k d d k k k k d de de k k k k k d dk k k k EEE J keine eigenen Funktionen Mi C Funktionen printf Dateien k k k k d de de de k k k de de de k k k k ke de dk k k k k k kk k k k k kkk EEE J keine Dateien in Verwendung Parameter k k d k k k k k d dk k k k k k k k k k k k k kk EEE keine Parameter R ckgabeparameter oder Kommandozeilenangaben Exit Sta tus R ck gabewe r tk k k d d k k k de d k Ae ke de de h He ke wird nicht gesetzt kein Exit Code ans Betriebssystem in Funktionen w rde hier der R ckgabewert beschrieben globale Variable Hr d d d k k k de de de ke k H He de de de ke k k k ke de C Skriptum Prei l 4 8 keine Verwendung oder nderung globaler Variablen Be s chr e ibun g ek dek de dek dede de de de Hek e de de He de Hede e He de KU KK Nach einer Programmerkl rung mu der Benutzer die Ziffer ein geben Dann werden als 10 x 10 Tabelle die Zahlen von 0 99 ausgegeben wobei die zur Z
46. 09 Zeichen break else long switch sind m glich jedoch werden meist nur die case enum register typedef ersten n 31 oder mehr Stellen vom Compiler char extern return union verwendet Es ist m glich aber meist nicht der const float short unsigned Fall da externe Namen die der Linker kennen continue for signed void l mu weil der gleiche Name in mehreren Funk default goto sizeof volatile tionen verwendet wird auf bis zu 6 Stellen do if static while gek rzt werden Die nebenstehenden W rter sind reservierte W rter und d rfen nicht als Namen verwendet werden Verwenden Sie sprechende Namen n tzen Sie den Unterstrich zur Bildung sinnvoller Namen Funktions namen z B printf sind keine reservierten W rter Definieren Sie trotzdem keine Variable namens printf Variable m ssen vor ihrer ersten Verwendung definiert vereinbart werden deshalb soll ten die Variablendefinitionen am Anfang jeder Funktion bzw jedes Programmblocks stehen Je nachdem wo und wie die Variable definiert wurde kann sie nur innerhalb des Programmblocks innerhalb der Funktion innerhalb des gemeinsam compilierten Pro grammst cks oder auch im gesamten Bereich des ausf hrbaren Programms inclusive der in anderen Dateien stehenden Unterprogramme g ltig sein Sowohl die Lebensdauer als auch der G ltigkeitsbereich von Variablen werden sp ter noch genau besprochen Variablen sind im Prinzip mit folgender Syntax zu definieren Speicherklasse Daten
47. 3 das ist eine globale externe Variable static int zaehl das ist eine beschr nkt globale nur innerhalb der Datei des gemeinsam compilierten Codes g ltige externe Variable main register int index lokale auto Variable nur in main bekannt headl die erste der 3 Funktionen wird aufgerufen head2 bei 1 und 2 werden die R ckgabewerte ignoriert index head3 printf in main count extern d n count for index 8 index gt O index int stuff 0 lokale auto Variable nur g ltig bis zur Mi G ltigkeitsbereich nur im Block wo definiert stuff printf stuff d stuff printf index is now d n index int counter globale externe Variable g ltig von hier an Jede Variable gilt ab dem Punkt an dem sie definiert wurde im jeweiligen G ltigkeitsbereich headl int index lokale auto Variable nur in headl bekannt index 23 printf in headl index d n index mangels return endet die Funktion am Blockende der R ckgabewert per default vom Typ int ist undefiniert head2 int count dies hier ist eine nur in head2 bekannte lokale Variable sie ersetzt innerhalb von head2 die globale Variable count trotzdem sollten Variable gleichen Namens nie vorkommen count 53 printf in head2 count lokal d n count counter 77 head3 printf in head3 counter d
48. 8 M ller gegen Huber A Gasse 43 74000 km Streitwert 100 000 1234 A dorf VB 60000 Es fehlen m glicherweise Angaben wie Geschlecht wer sind M ller oder Huber bei welchem Gericht Jedes Datenelement Datum liefert eine Aussage Manche wie VB 60000 enthalten auch versteckte bzw mehrere Aussagen Preis und Verhandlungsbereitschaft ber diesen WICHTIG Es kommt auf den Blickwinkel an unter dem die Daten gesammelt werden Ein Autoverk ufer wird andere Daten ber Fahrzeuge sammeln als ein H ndler oder die Polizei ein Arzt andere Personendaten als ein Personalb ro oder eine Heiratsvermittlung Strukturieren der Daten am Beispiel eines Autos Ein Privater m chte einen Gebrauchtwagen kaufen und findet folgende Annonce Opel Kadett B Bj 1988 74000 km Pickerl bis 12 95 Schiebedach Vb 60000 Um mehrere Angebote leicht vergleichen zu k nnen legt er sich eine Tabelle an Marke Type Bau gefahrene Pickerl Extras Preis jahr km 1988 74000 12 95 Schiebedach 60000 Opel Kadett 1992 61000 8 96 Radio 75000 Alufelgen Anh ngekupplung OW oa 1991 Tea ID e 67000 Pond Escort 1978 1022000 Lamm Beim erfassen der Daten f llt folgendes auf e die Information VB beim Preis ging verloren weil man nur Zahlen angeben wollte e es ist unklar wieviele Extras ein Auto haben kann Datens tze mit Daten felder Wird diese Tabelle nicht auf Papier sondern in einem Computer auf der Festplatte gespei Nam
49. BELLE nl_array DIMl ARRAY n2 array DIM2 ARRAY float tabelle DIM TABELLE int array DIM1_ARRAY DIM2_ ARRAY printf Die Summe aller Werte ist d sufunkt n_tabelle tabelle nl_array n2_array array float sufunkt int n_tab float tab II int nl_mat int n2_mat int mat DIM2_ARRAY Hier folgen wiederum unvollst ndige Arraydefinitionen bei den Parametern Dies ist m glich weil die Parameter ja keinen eigenen Speicherplatz belegen sondern wegen Call by Adress direkt ber das jeweilige Hauptprogrammarray redefiniert sind int mat DIM2_ARRAY nur die erste Dimension kann weggelassen werden int i j float sum 0 auto Initialisierung bei jedem Funktionsaufruf for i 0 i lt n_tab i sum tab i for i 0 i lt nl_mat i for j 0 j lt n2_mat j sum mat i j return sum int strlen char stri Beispiel ermittelt L nge eines Strings int i for i 0 stri i 0 i return i void strcpy char s1 char s2 kopieren String von s2 nach s1 der Platz der Zielvariable sl mu im Haupt programm ausreichend gro vorhanden sein int i for i s2 i 0 i 10 2 7 Strukturen Strukturen wurden vollst ndig bei den Dateien behandelt 10 2 8 Unions Obwohl Unions genauso wie Strukturen definiert und angesprochen werden sind sie grundverschieden Bei Strukturen liegen die Elemente hintereinander im Speicher be
50. Beispielprogramm Das 1 Beispielprogramm Das 1 Beispielprogramm Das 1 Beispielprogramm Das 1 Beispielprogramm Das 1 Beispielprogramm Abschreckend nicht wahr C Skriptum Prei l 1 7 Wieviele Ausgabezeilen erzeugt das folgende Programm am Bildschirm include lt stdio h gt void main printf Das ist eine auszugebende Zeile n printf Das ist auch eine printf auszugebende Zeile n n printf Diese Ausgabe steht in der Ausgabezeile n Der Befehl printf genaugenommen eine Funktion und kein Befehl kann nicht nur feste Texte sogenannte Konstante ausgeben sondern auch den jeweiligen Wert von Variablen drucken Die W rter schreiben ausgeben oder auch drucken bedeuten hier sinngem immer dasselbe Wir definieren also im folgenden Programm eine Variable namens index und schreiben diese gemeint ist der Inhalt mehrmals Das d ist das dezimale Formatie rungszeichen f r die Variable index Im printf steht als erster Parameter immer ein String mehrere alphanumerische Zeichen unter Anf hrungszeichen der verschiedene mit be ginnende Formatierungssteuerzeichen f r die als weitere Parameter folgenden Variablen enth lt Hier haben wir den Formatierstring und jeweils nur einen Parameter die Variable index include lt stdio h gt void main int index index 13 printf Der Wert der Variablen index ist momentan d n index index 2727 printf Der Wert der Variablen index ist mo
51. Beispielsweise bezeichnet sich die Datenbank Oracle als das gr te C Programm der Welt Programme die auf verschiedenen Systemen mit guter Per formance laufen sollen kann man praktisch nur in C bzw C schreiben Allerdings ist es in C auch besonders einfach schlimme Fehler zu machen Die ersten gr Beren Programme von C Anf ngern kommen oftmals nicht zum Laufen weil die jeweiligen Entwickler zu chaotisch vorgehen Neben der blicherweise existierenden M glichkeit Tabellenindices ins Nirwana zu setzen kann man dies in C auch mit Pointern tun Auch kann man relativ leicht Variableninhalte mit deren Adressen verwechseln In all diesen F llen vernichtet man irgendwo im Hauptspeicher einige Bytes die man sp ter an einer v llig anderen Programmstelle dringend brauchen w rde Man tut daher gut daran C Programme seri s zu entwickeln und in kleinen Einheiten auszutesten Auch sollte man Listprogramme und andere einfache Anwendungen nicht unbedingt in C schreiben son dern solche Probleme besser und schneller mit speziell daf r geschaffener Software meist der 4 Generation l sen C ist sowohl maschinennahe verf gt aber auch ber alle Eigenschaften einer h heren Pro grammiersprache der 3 Generation Das w ren im Detail C verf gt ber umfangreiche Funktionsbibliotheken gute und preisg nstige Compiler auf PC s C Skriptum Prei l 1 4 e Datentypen skalare Typen integer float char Strukturen Arrays e Darstell
52. C wurden mehr Codezeilen geschrieben als in irgendeiner anderen Sprache C ist eine international ge normte Sprache C ist die objektorientierte Aufw rtsentwicklung von C C erm glicht nicht nur flexib le Programmierung sondern auch viele Fehler E Wichtig Die Programmiersprache C wurde 1972 von Dennis M Ritchie bei den Bell Laboratories AT amp T entwickelt Zusammen mit Ken Thompson arbeitete Ritchie damals daran das eben entwickelte Betriebssystem Unix auf einen weiteren Prozessor zu portieren Um den gro en Aufwand durch das Neuschreiben des Betriebssystems in der Maschinensprache des jeweiligen Prozessors zu vermeiden versuchte man eine Programmiersprache zu ent wickeln in der das Betriebssystem geschrieben werden konnte Der Portierungsaufwand reduziert sich dann auf das Anpassen des Betriebsystemkerns und des Compilers Nach zwei Probeversuchen BCPL und B schien der dritte Versuch brauchbar So entstand C als Sprache in der ber 90 von Unix geschrieben ist und die offensichtlich zum Schreiben von Betriebssystemen und anderer umfangreicher Software tauglich ist Von 1983 bis Dezember 1989 wurde von der Ansi Normungskommision die Normierung von C vorangetrieben Als Ergebnis liegt Ansi C Ansi X3 159 1989 vor das heute von allen Compilern unterst tzt wird Ansi C ist inzwischen auch eine internationale Norm ISO IEC 9899 1990 ltere Programme die vor dem Vorliegen der Norm entstanden sind aber nicht in irge
53. CHEN Tvpai 24 5 4 1 Spezielles zu char Arrays uuenessennensessensensenneenenneenennen nennen nennen 26 5 4 2 Suchen von Werten in Arrays unneeseesseeeseeseseeesneennennnenennnennenn nn nse nennen 27 5 4 3 Sortieren von Werten in Arrays ueeenseessesesnseessneeenseensnneenneennnnennsennnne essen 29 5 5 BEISPIELE F R EIN AUSGABE VERSCHIEDENER DATENTWPEN 32 5 6 SPEZIELLE VO F R TASTATUR BILDSCHIRM nennen 36 6 BEFEHLEIN SE 38 6 1 DASLEERE STATEMENT unse ns E RETEA KE E 38 6 2 ZUWEISUNG sense nn is sup oben haar ati 38 6 3 WHILE EE 38 6 4 DO WHILE DIE UNTIL SCHLEIFE INC ueensseessssesssnessnnsnsnnnsnnnnnsonssnnennsonssnnnnnnnnen 40 6 5 FOR SCHLEIFE ITERATIVE RCHLEIFE nennen 40 6 6 IF ELSE DIE KLASSISCHE BEomNOGUNMO nn nenn 41 6 7 BREAK UND CONTINUE AUSSTEIGEN AUS BCHLEIEEN nennen 42 6 8 SWITCH DIE C VARIANTE DES CASE BEFEHLS ceenseenneenseensennsnenneenenennenenn nenn 43 6 9 GOTO JA AUCH DIESES STATEMENT EXISTIERT ue zeerseerseesseenseennennnennenenenennennn nennen 44 6 10 RETURN BEENDEN UNTERPROGRAMM ZUR CKGEBEN FUNKTIONSWERT 45 7 DER AUFBAU EINES C PROGRAMMS ussonssnesnsssnsssnssnssssnssonssonsnonsonnsnnsnnnsnnnnne 51 7 1 FUNKTIONEN UND UNTERPROGRAMME ALLGEMEIN uuenseesssssssseessnnesnsnnssnesnsnnssnnsnsnnnenn 51 7 2 SCHNITTSTELLE ZWISCHEN FUNKTIONEN EUNKTIONSAUERUET 53 TP EE Ehe Eeer EE 53 7 2 2 Funktionsr ckgabewert nennen ns nn nenn 54 7 2 3 gl
54. Dazu schreibt man diese nicht mehrere Male hintereinander sondern sagt sinngem solange Bedingung erf llt wiederhole Anweisung Symbol Wiederholung 1 Ben tigt man Wiederholungen dann mu man die Symbole f r die Wiederholung verwenden a while Bedingung Dabei werden Anweisungen stehen dort wo hier k nnen beliebige man beliebige Symbole einf gen kann in Symbole eingef gt werden Abh ngigkeit von einer Bedingung wiederholt ausgef hrt Symbol Wiederholung 2 Die Bedingung wird dabei berpr ft ob sie wahr oder falsch ist Solange while die Be do hier k nnen beliebig dingung wahr ist werden die im Symbol ent Symbole eingef gt werden haltenen Anweisungen ausgef hrt Beim Sym bol Wiederholung 2 schreibt man statt while in while Bedingung anderen Sprachen auch until Do until bedeutet f hre die Anweisungen aus bis until die Bedingung wahr wird Struktogrammelement Auswahl C Skriptum Prei l 9 Wiederholungssymbol 1 Wiederholungssymbol 2 nennt man While Schleife Do while Schleife abweisende Schleife nicht abweisende Schleife kopfgesteuerte Schleife fu gesteuerte Schleife in anderen Sprachen auch do until Unterschied die Bedingung wird jeweils vor die Bedingung wird jeweils nach den Anweisungen gepr ft den Anweisungen gepr ft gt 0 bis n Durchl ufe gt 1 bis n Durchl ufe Beispiel um den Ablauf besser darzustellen folgt hier ein kleines Beispiel ern _ setze Variabl
55. Funktionen voneinander abh ngig Allgemein sollten diese Variablen Werte enthalten die global von Bedeutung sind die sich aber w h rend des Programmablaufs wenig oder gar nicht ndern Im n chsten und bern chsten Abschnitt werden lokale und globale Variable n her behan delt 7 3 Funktionen und Sourcecodedateien in C Generell werden in C einzelne Funktionen Unterprogramme geschrieben Diese Funkti onen k nnen nicht ineinander geschachtelt werden sondern nur in einem File eine Da tei hintereinander angef hrt werden oder auch jeweils alleine in einem File stehen Die Files mit einer oder mehreren Funktionen werden dann vom Compiler kompiliert es entstehen die Objektmodule Alle Objektmodule die ein ausf hrbares Programm bilden sollen werden dann vom Linker zum ausf hrbaren Programm zusammengebunden Dabei werden auch noch Bibliotheken f r die Systemfunktionen verwendet Ein Datei eines C Programms kann eine oder alle Funktionen eines Programms enthalten sieht daher folgenderma en aus Die Funktion main darf nur einmal pro ausf hrbarem Programm und nicht in jeder compilierten Datei vorhanden sein Preprocessor Anweisungen define include externe Variablendefinitionen static externe Variablendefinitionen extern Verweise auf anderswo definierte externe Variable Prototypen Funktion main Funktion 1 Funktion n Eine Funktion ist dabei folgenderma en aufgebaut C Skriptum Prei l 5 6 spei
56. Gr en und Linienarten f r Schrift Rahmen und Hintergrund e Geben Sie die Monatsums tze eines Jahres als vertikales Balkendiagramm aus Der Mittelwert wird als horizontale Linie eingezeichnet Neben der Ordinate soll der maxi male Monatsumsatz und der Mittelwert in Zahlen stehen e Aus dem Mathematikbuch wissen Sie wie eine Sinuskurve im Bereich von 0 bis 2 Pi aussieht Zeichen Sie diese formatf llend auf den Bildschirm
57. Parametertypen im Hauptprogramm es werden aber die folgenden zwei Konvertierungen get tigt die auch automatisch bei der aufgerufenen Funktion ber cksichtigt werden nur wenn diese in alter C Notation geschrieben wurde char short werden zu int float wird zu double 11 Anhang C Skriptum Prei l 99 11 1 Die C Bibliotheken Was immer in C als Elemente der Sprache nicht realisiert ist gibt es in Form von Funktionsbibliotheken wie beispielsweise die I O Jede Bibliothek besteht aus einer Library mit den Funktionen als Object Code und einer dazugeh rigen Include Datei xxx h in der die Funktionsprototypen Strukturdefinitio nen und hnliches mehr stehen In der C Norm sind die folgenden Bibliotheken vorgesehen assert h ctype h errno h float h limits h locale h math h setjmp h signal h stdarg h stddef h stdio h stdlib h string h time h stellt das Macro assert Bedingung als leicht abschaltbare Testhilfe zur Verf gung Code Type stellt die Gruppe der Funktionen is isdigit isupper toupper bereit erm glicht den Zugriff auf die interne Fehlernummer und definiert einige Fehlertypen definiert diverse Werte Wertebereich Stellenanzahl von Gleitkommafeldern definiert Wertebereiche f r die grundlegenden integer Typen auch char l nderspezifische Angaben z B isupper erkennt auch stellt diverse mathematische Funktionen bereit nur f r interne Puffersetzung relevant defines und Funktionen f
58. State ment z B if then else statement 6 2 Zuweisung Variablen wird ein Wert oder das Ergebnis eines Ausdrucks zugewiesen Die Zuweisung ist in C eigentlich kein Befehl weil sie nur aus dem Operator und seinen Operanden be steht Links vom mu ein Ausdruck stehen der ber einen definierten Speicherplatz ver f gt z B Variablennamen indizierte Arrayelemente Ausdr cke mit dem Operator void main Dieses Programm soll die normale Zuweisung zeigen int a b c Integer Variablen f r dieses Beispiel simple Addition simple Subtraktion simple Multiplikation simple Division S Rest der Division a b Modulo remainder 12 a b 2 a b 2 a c b 2 in welcher Reihenfolge werden c 4 13 a b 3 a b 2 a a die Operatoren abgearbeitet 1 Inkrement von a mehrfache Zuweisung a b c werden auf 20 gesetzt DpDpooooooo DP o 6 3 while Schleife while count lt 6 Die Bedingung wird vor dem while Bedingung Aktion Schleifendurchlauf gepr ft Die Bedingung wird berpr ft wenn sie TRUE ist v dann wird die Schleife durchlaufen die Aktion ausgef hrt danach wird wieder die Bedin gung gepr ft usw solange bis die Bedingung FALSE ergibt dann ist die Schleife zu Ende wiais Die Bedingung steht immer in Besteht die Aktion aus mehreren Statements dann sind diese in einzuschlie en Programmblock i
59. ULL wird bei EOF zur ckgegeben hier werden 24 Zeichen gelesen j fscanf datei2 d amp c j enth lt 1 wenn erfolgreich if j EOF break sonst EOF Mi die Zahl ist eingelesen fgets buffer BUFLEN datei2 if feof datei2 break jetzt wurde der Rest der Zeile n gelesen if i fclose datei2 0 printf File gt fiobsp 1 lt close Fehler d n i exit 1 exit 0 Will man Daten wie in den oben gezeigten Datens tzen schreiben und lesen dann hat man nicht nur charakters Zeichen welche in die Datei kommen sondern auch integer und float Werte Deshalb mu statt zeichenorientierter I O auf bin re datensatzweise UO ge wechselt werden Man wird die Datei mit b bin rer bertragungsmodus er ffnen und mit fread und fwrite jeweils ganze Datens tze lesen bzw schreiben 9 3 5 Lesen und Schreiben von Bin rfiles Lese und Schreibbefehl haben identisches Aussehen es werden sinngem immer eine Menge von Bytes L nge eines Datensazes Anzahl Datens tze geschrieben bzw gelesen C Skriptum Prei l 75 int fread void daten int datensatzgroesse int anzahl FILE datei int fwrite void daten int datensatzgroesse int anzahl FILE datei daten Adresse der ein oder auszugebenden Variablen amp Strukturname oder Arrayname ohne groesse Gr e eines Datensatzes in Byte sizeof anzahl Anzahl der zu lesenden bzw zu schreibenden Datens tze
60. Wesentlich ist da die Aktion im Gegensatz zur while Schleife unabh ngig von der Bedingung mindestens einmal durchlaufen wird nur wenn dies sinnvoll und notwendig ist sollten Sie die do while Schleife einsetzen Besteht die Aktion aus mehreren Statements dann sind diese in einzuschliessen include lt stdio h gt Beispiel f r die do while Schleife void maint int i printf Der Wert von i ist jetzt d n i i i 1 while i lt 5 Durchl ufe 0 1 2 3 4 i hat nacher den Wert 5 Mi So k nnte das Programm auch realisiert werden include lt stdio h gt void main kurze C like Variante gleiche Aktivit t int i 0 do printf Der Wert von i ist jetzt d n i while i lt 5 Dies ist ein Beispiel bei dem der Schleifenk rper mindestens einmal durchgef rt werden mu weil sonst die Bedingung nicht sinnvoll gepr ft werden kann Beispiel f r ein Programmst ck bei dem das Programm auf korrekte Eingabe eines numerischen Werts von 1 9 besteht ziffer 0 do printf Geben Sie die Ziffer 1 9 ein scanf d amp ziffer gesicherte Eingabeschleife fflush stdin zum Einlesen eines Werts while ziffer lt 1 ziffer gt 9 6 5 for Schleife iterative Schleife iterative oder z hlende Schlei fen sind while Schleifen Statement index 0 kombiniert mit anderen State ments for Statement p A Bedingung wh
61. abe des Zunamens int age Alter Mi int grade irgendeine Punktezahl Mi 1 struct person boy girl boy initial R boy age 15 boy grade 75 girl age boy age 1 sie ist ein Jahr j nger girl grade 82 girl initial H printf c ist d Jahre alt und hat eine Punktezahl von d n girl initial girl age girl grade printf c ist d Jahre alt und hat eine Punktezahl von d n boy initial boy age boy grade include lt stdio h gt Kombination Array und void main Struktur struct person char name 20 hier gibts den ganzen Namen int age int grade struct person kids 12 int index for index O index lt 12 index t strcpy kids index name Kind kids index name 0 Ai index kids index age 16 kids index grade 84 kids 3 age kids 5 age 17 kids 2 grade kids 6 grade 92 kids 4 grade 57 for index O index lt 12 index printf s ist d Jahre alt und hat eine Punktezahl von d n kids index name kids index age kids index grade Dies ist auch eine typische Form der Strukturdeklaration bei der nur der Aufbau der Struktur festgelegt wird struct tm Struktur f r die Zeitfunktionen der time h int tm sec seconds after the minute 0 59 C Skriptum Prei l 70 int tm min minutes after the hour 0 59 int tm_hour hours since midnight 0 23
62. ak ist manchmal sinnvoll break bewirkt den sofortigen Ausstieg aus while do while und for Schleifen und auch aus continue sollte manmeiden dem switch Statement continue bewirkt den n chsten Durchlauf einer while do while oder for Schleife es werden dabei die restlichen zu Aktion geh renden Statements ber sprungen Bei mehreren geschachtelten Schleifen wirken break und continue nur f r die Schleife in der sie verwendet werden Ein break in der innersten von drei geschachtelten Schleifen verl t nur die innerste aber nicht etwa alle drei Schleifen include lt stdio h gt void maint int xx for xx 5 xx lt 15 xx xx 1 if xx 8 break printf In der break Schleife ist xx jetzt d n xx for xx 5 xx lt 15 xx xx 1 if xx 8 continue printf In der continue Schleife ist xx jetzt d n xx Bei der ersten Schleife gibt printf daher die Werte 5 6 7 aus Beim Wert 8 erfolgt ein Aus stieg aus der Schleife In der zweiten Schleife erscheinen aber die Werte 5 6 7 9 10 11 12 13 14 Die Ausgabe von 8 wird durch continue bersprungen C Skriptum Prei l 43 6 8 switch die C Variante des Case Befehls switch pr ft einen Ausdruck Mit einer if else if else if else Kette kann eine Aneinanderreihung von Bedingungen er auf Gleichheit Diener folgen wobei die Sequenz solange durchlaufen wird bis ein if true wird Dieser spezielle hiedlichen Wert f j de p e z en A Fall sollte laut
63. also 0 5 lt 7 liefert 1 oder besser ungleich 0 Steht aber beispielsweise 23 in einer int Variablen so gilt das auch als true Verschiedene C Funktionen liefern irgendwelche Werte ungleich 0 wenn sie TRUE liefern Die runde Klammer wird ben tigt um die aufgrund der Priorit tsregeln der Operatoren gegebene Abarbeitungsreihenfolge in Ausdr cken zu ver ndern z B a b c Bei Funkti onen und Funktionsaufrufen stehen die Parameter auch in runden Klammern F r die Definition von Tabellen bzw Arrays und auch f r das Ansprechen einzelner Ta bellenelemente im Programmablauf einsetzbar Beim normalen Ansprechen von Elementen einer Struktur mu immer zuerst der Struktur name dann der Punkt und dann der Elementname angef hrt werden also strukt unterstrukt element Auch in numerischen Konstanten findet der Punkt als Dezi malpunkt bei Gleitkomma Verwendung Verf gt man ber einen Pointer der auf eine Struktur zeigt die Pointervariable enth lt die Adresse der Struktur dann ist nicht mehr der Punkt zu verwenden sondern der Operator gt Ein normaler Zugriff w re folgenderma en zu formulieren ptr_struktur gt element cast Damit k nnen beliebige Konvertierungen innerhalb eines Ausdrucks durchgef hrt werden An die Stelle von cast ist jeweils der Datentyp zu schreiben nach dem konvertiert werden soll Konvertiert wird der Ausdruckteil dessen Ergebnis der nach cast steht Wenn man sauber programmieren will da
64. as Programm sonst abst rzen oder falsch weiterlaufen kann Zahlensumme Zahlensumme Variable zahl summe summe 0 lese erste zahl while nicht EOF if Zahl gelesen 32 then else u l sche summe zahl Fehler Zeichen lese n chste zahl schreibe summe Kopierprogramm Kopieren Variable zeichen chr lese erstes zeichen while nicht EOF schreibe zeichen lese zeichen Beispiele f r die Ausgabe von Variablenwerten E Wichtig C Skriptum Prei l 3 4 Die folgenden Programme zeigen daher taugliche Leseschleifen f r verschiedene F lle Zuerst nochmal die Summierung der eingegebenen Zahlen Beachten Sie da nur bei kor rekt gelesenen Zahlen addiert wird wenn Fehler auftreten so w rden die falschen Zeichen weiter in der Eingabe verbleiben deshalb werden sie mit fflush stdin entfernt include lt stdio h gt void main wieder das Summierungsbeispiel int summe zahl rueck summe 0 rueck scanf d amp zahl while rueck 1 if rueck 1 nur verarbeiten wenn OK summe summe zahl else fflush stdin falsche Eingaben l schen rueck scanf d amp zahl printf Die Summe aller Zahlen ist d n summe Als minimales Kopierprogramm kann man das folgende Beispiel betrachten Jeweils ein Zeichen wird eingelesen und wieder geschrieben include
65. atik Feststellungen zur Probleml sung e Probleml sungspl ne werden immer von Menschen entworfen e Je nach Problem sind sie f r v llig unterschiedliche Zielgruppen konzipiert Denkt der Ausf hrende selbst mit so kann die Formulierung Freir ume enthalten Ist das nicht der Fall so mu eine sehr detaillierte exakte Verfahrensvorschrift zur Prob leml sung formuliert werden e Je nach Problem variiert die Darstellung allgemein verst ndlicher Text Text mit Fachausdr cken Spezialzeichen wie Noten Formeln graphische Darstellungen e H ufig sind Probleml sungspl ne eine Folge von nacheinander auszuf hrenden Anwei sungen Einfl sse auf die Probleml sung e Erfahrung bzw Wissen Viele bungsaufgaben sind zu Beginn schwer r ckwirkend betrachtet aber gar kein Problem mehr e Einstellung Bin ich interessiert neue Aufgaben zu l sen oder lasse ich sie lieber liegen kann ich meine Arbeit auch kritisch betrachten e Methodik Anf nger neigen zu einer eher chaotischen Vorgangsweise die bei Klein problemen auch funktionieren kann Braucht man aber l ngere Zeit oder arbeiten gar mehrere Leute an der Probleml sung dann mu systematisch vorgegangen werden Selbstverst ndlich ist auch die passende Idee zur rechten Zeit notwendig Intuition kann Detailarbeit wohl vermindern aber nicht vollst ndig ersetzten C Skriptum Prei l 6 Beispiel Rezept Pichelsteiner Eintopf Das nebenstehende Rezept ist vor allem wegen seiner
66. auch eine eigene String Konstante Diese String Konstante besteht in der Regel aus mehreren Zeichen be grenzt von Anf hrungszeichen z B Das ist eine Stringkonstante abcd Das char Array mu immer um 1 Byte gr er sein als der Text in der Konstante weil ein 0 als Endezeichen angef gt wird Dadurch entstehen variabel lange char Felder die zwar einen bestimmten Speicherplatz erfordern aber logisch nur bis zum ersten 0 im Feld rei chen Wenn Sie auf das 0 vergessen kann das tragische Folgen haben Wenn n mlich nach der Bef llung der Variablen durch eigene Programmteile eine Funktion aufgerufen wird die dieses char Array verwendet so hat die Funktion keine Ahnung von der Feldl nge und sucht sich quer durch den Hauptspeicher bis zum n chsten 0 Die String Konstante abcd ist daher auch 5 Bytes lang Die obigen Variablen k nnen auch problemlos bei der Definition initialisiert werden int nummer2 12 Direkt bei der Definition Mi long a2 b 33 c 12345678 erhalten die Variablen ihren float pi 3 14 e 2 71 eps 1 0e 5 ersten Wert gt initialisieren char backslash int k 0 5 4 Arrays Zusammenfassen mehrerer Elemente gleichen Typs Mit dem Arraynamen k nnen mehrere durchnumerierte Felder angesprochen werden Die Arrayindizes beginnen immer mit 0 E Wichtig Es k nnen in C ein oder mehrdimensionale Arrays Tabellen definiert werden Es werden mehrere Datenfelder mit gleichem Datent
67. auf den der Pointer zeigt unbekannt ist Normale Variable k nnen mit void nicht definiert werden 10 2 6 Arrays Arrays k nnen mit den Typen int char float enum mit Strukturen und auch mit Pointern gebildet werden Mehrdimensionale Arrays sind m glich Die Indizes beginnen immer von 0 aufw rts zu laufen Beachten Sie da es den Funktionen strcpy und strcat m glich ist die Parameter des Funktionsaufrufs zu ver ndern obwohl der Operator amp nicht eingesetzt wurde Spricht man ein Array an ohne es zu indizieren also ohne dann verwendet man automatisch die Adresse des Arrays bzw einen Pointer auf das erste Element mit Index 0 Im Ab schnitt Pointer wird diese Methode noch gr ndlicher betrachtet Man kann also problemlos Arrays aber nicht einzelne Elemente an eine Funktion als Pa rameter bergeben Es wird nur die Adresse bergeben wodurch die Funktion wie bei Adress bergabe blich in Wirklichkeit mit dem Array im Hauptprogramm arbeitet Die Funktion erf hrt aber nichts ber die Anzahl oder die Ausdehnung der Dimensionen Des halb mu das Array als Parameter in der Funktion definiert werden Lediglich die Angabe der Ausdehnung der 1 Dimension kann entfallen weil man sowieso selbst f r das Einhal ten der Dimensionsgrenzen verantwortlich ist C Skriptum Prei l 8 6 define DIM TABELLE 6 define DIMl1 ARRAY 3 define DIM2 ARRAY 5 include lt stdio h gt void main d int n_tabelle DIM TA
68. cherklasse f datentyp f funktionsname formale Parameter Deklaration formale Parameter nur im alten K amp R C gi im Ansi C ist die Deklaration direkt in den runden Klammern m glich Definition lokaler Variablen Anweisungen Es w re die folgende Situation denkbar include stdio h notwendig wenn I O Funktionen verwendet werden define EOF 1 wenn im Prog EOF vorkommt wird es durch 1 ersetzt int var_ext_int 8 diese Variable ist extern sie ist in den gemeinsam compilierten Funktionen bekannt und kann auch in anderen gesondert compilierten Funktionen bekannt sein static int var_ext_dat diese Variable ist in allen Funktionen dieser Datei bekannt gemeinsam compilierte Funkt extern int sonst_var Verweis auf eine in einer anderen getrennt compilierten Funktion definierten externen Variablen wenn extern angegeben ist so wird kein Speicherplatz belegt float funkt_privat char int Prototyp f r eine selbstgeschriebene Funktion main Hauptfunktion hier startet das Programm int i 0 float E lokale Variable nur in main bekannt static int i_stat lokale statische Variable 2 das ist der Aufruf der Funktion funk_privat float funkt_privat char instring int k Definition der Funktion funkt_privat float ff return ff korrekte R ckkehr mit einem float Wert Bei sinnvoll
69. chr nken auch der Ursprung des Koordinatensystems liegt links oben im Fenster Der Bildschirminhalt des Fensters bleibt erhalten kann aber mit clearviewport gel scht wer den Mit putpixel x y color kann ein Punkt in der durch color festgelegten Farbe gezeichnet werden getpixel x y liefert die Farbe eines Pixels zur ck C Skriptum Prei l 1 06 Objekte und Zeichenstil line x1 y1 x2 y2 zeichnet eine Linie von nach der Grafik Cursor bleibt unver ndet lineto x y Linie von der momentanen Position weg rectangle x1 y1 x2 y2 Rechteck bar x1 y1 x2 y2 gef lltes Rechteck arc x y start ende radius Kreisausschnitt circle x y radius Kreis ellipse x y start ende xradius yradius Ellipse fillellipse x y xradius yradius ausgef llter elliptischer Kreis drawpoly numpoints polypoints Umri eines Vielecks F r diese Objekte k nnen vorher mit setlinestyle linestyle pattern thickness die Linien art und mit setfillstyle pattern color das Muster der Fl chenf llung gew hlt werden floodfill x y border f llt einen mit border umschlossenen Bereich mit dem gesetzten F llmuster bungen e Zeichnen Sie ein Netz von senkrechten und waagrechten Linien zur Einstellung des Monitors auf den Bildschirm Die Strichst rke soll abwechselnd normal und dick die Farben sollen unterschiedlich sein e Geben Sie Ihren Namen und Ihre Adresse doppelt eingerahmt in der Mitte des Bild schirms aus Verwenden Sie verschiedene Farben
70. chts beim else Anweisungen stehen dann wird entweder der then Zweig oder der else Zweig bearbeitet beliebige Symbole m glich C Skriptum Prei l 1 0 Das n chste Beispiel zeigt vor allem wie verschiedene Struktogrammsymbole ineinander geschachtelt werden k nnen Programm zum Bezahlen einer Rechnung mit Schecks oder bar Yariable Bargeld Maximum Rechnungsbetrag Scheckanzahl Restbetrag Bargeld 0 Maximum 2500 lese Rechnungsbetrag von Tastatur ein if Rechnungsbetrag lt Bargeld Scheckanzahl Rechnungsbetrag Maximum Restbetrag Rechnungsbetrag modulo Maximum while Scheckanzahl gt 0 schreibe Scheck mit Betrag Maximum ausf llen schreibe Bar zahlen Scheckanzahl Scheckanzahl 1 if Restbetrag gt 0 schreibe Scheck mit Betrag Restbetrag ausf llen m Als Spezialform der Auswahl gibt es noch die sogenannte Fallunterscheidung Dabei wird abh ngig vom Inhalt einer Variablen oder einer Berechnung eine von mehreren Anweisun gen durchgef hrt Struktogrammelement Variable oder Berechnung Fallunterscheidung Ergebnis u ist1 4 beliebige beliebige beliebige beliebige Symbole Symbole Symbole Symbole bungen e Erweitern Sie das M nzfernsprecherstruktogramm so da ein kaputtes Telefon z B H rer fehlt oder eine sogenannte tote Leitung kein W hlzeichen erkannt werden e Erstellen Sie ein Struktogramm f r den Arbeitstag einer Supermarktkassiererin e Erstellen Sie ein Struktogramm
71. d die Funktion in diesem Fall durch das Ende des Funktionsblock es w re auch die return Anweisung ohne R ckgabewert denkbar Sa 0 if isprint b a b Die Definition von Funktionen ist immer klar weil die Schachtelung von Funktionen nicht erlaubt ist Nach dem Ende einer Funktion k nnen nur externe Variablen oder eben eine weitere Funktion kommen void upro2 int korrekte Prototypen mit Funktionsr ckgabewert char fun1 und Typ der Parameter int fun2 int int printf const char 1 Parameter fix weitere variabel int main int argc char argv Funktion main korrekt nach C Norm der R ckgabewert entspricht exit void upro2 a Funktion uprol ein Parameter kein R ckgabewert Mi int a Parameterschreibweise altes C char funl Funktion funl kein Parameter R ckgabewert char return x int fun2 int x Funktion fun2 ein Parameter R ckgabewert ist ein Pointer auf integer int zahl return amp zahl syntaktisch ist diese R ckgabe wohl korrekt aber Neben der Deklaration von Funktionen gibt es auch Pointer auf Funktionen C Skriptum Prei l 97 char fun1 Deklaration der Funktion Dun R ckgabewert char int fun2 Deklaration von fun2 R ckgabewert Pointer auf integer void upro2 Deklaration der Funktion upro2 kein R ckgabewert int funp weil die fehlen ist funp ein normal
72. dbreite die Ausgabe kann breiter aber nicht schm ler sein je nach Format links oder rechtsb ndig Genauigkeit bei Strings s die maximal auszugebende Zeichenanzahl bei Gleit komma die Anzahl Nachkommastellen L ngenangabe h f r short 1 oder L f r long Zus tze Format d i 0 x u unterschiedliche int Varianten c einzelne Character s Strings char Arrays mit 0 am Ende f Gleitkomma e Gleit komma in Exponentendarstellung g ist wertabh ngig ein f oder e C Skriptum Prei l 3 6 Feldbreite und Genauigkeit k nnen auch erst beim Programmablauf festgelegt werden Im Formatierelement mu jeweils angegeben werden in der Parameterliste mu f r jeden ein Parameter vom Typ int vorhanden sein der den jeweiligen Wert enth lt printf text Do Saal ar_feldbreite ar_genauigkeit 5 6 Spezielle I O f r Tastatur Bildschirm lt conio h gt bietet neue M g lichkeiten bringt aber Abh n gigkeit von bestimmten Com pilern Die Programme sind nicht mehr portabel Die bisher geschilderten I O Funktionen sind f r die Standardeingabe bzw Ausgabe ausge legt Weil man diese mit lt gt auch umleiten kann m ssen sie also auch mit Dateien funkti onieren Daher bieten die I O Funktionen keine speziellen Features f r Tastatur und Bild schirm Auch verwenden sie Pufferung Die Tastatur unterliegt normalerweise einer zei lenweisen Pufferung Sie m ssen eine ganze Zeile eingeben und mit re
73. der Compiler der Programmiersprache unser Ge schreibsel auch verstehen kann In C gibt es h ufig geschwungene Klammern und Strich punkte Unser Struktogramm welches nur einen Schreibbefehl enth lt wird trotzdem in mehrere Zeilen C Programm umgesetzt include lt stdio h gt void maint printf Hallo Leser n include lt stdio h gt Wenn man Schreibbefehle verwendet dann mu am Programmbe ginn diese Zeile stehen Es wird Information f r die Ausf hrung von Schreibbefehlen eingef gt void main Funktion namens main beginnt hier mit und endet mit void und besagen da die Funktion keine Daten zur ckgibt und auch keine erh lt Jeder Teil Ihres Struktogramms wird im Programm zu einer eigenen Funktion das Programm beginnt seinen Ablauf im mer mit der Funktion main Deshalb ist auch der Name main zwin gend w hrend andere Funktionen beliebig hei en k nnen S Soe g edeierd e Geschwungene Klammern fassen mehrere Befehle zu einer Einheit einem Programmblock zusammen Hier sind das jene Befehle die zur Funktion main geh ren printf n Schreibbefehl schreibt auf den Bildschirm und bewegt den Cursor in die n chste Zeile durch n CRLF bedeutet Carriage return LineFeed Alle Befehle m ssen mit beendet werden H tte Ihr Struktogramm gar keine Anweisung dann w rde daraus in C das folgende Pro gramm welches nat rlich auch nichts tut void main
74. der Modul wird isoliert vom restlichen Programm vollst ndig ausgetestet Kennt man die Dokumen tation eines Moduls so kann man diesen verwenden ohne seinen Code zu kennen C ist besonders gut f r Modularisierung geeignet Seit der Urzeit von C ist es auch blich da viele kleine Module Funktionen ein Programm ergeben Sie sollten da her auch ihre Beispielprogramme in getrennt compilierbare Module aufteilen NUR minimale und genau definierte Schnittstellen zwischen Modulen erm gli chen es einen Modul isoliert zu betrachten und zu testen Schreiben Sie den Code selbst strukturiert es sollte nie notwendig sein zum Ver st ndnis eines St cks Programmcode an vielen anderen Programmstellen nachse hen zu m ssen Ausnahme Definitionen aufgerufene Module In C sind Befehle vorhanden um die Elemente der Strukturierten Programmierung Sequenz if while until case exit direkt umzusetzen Gestalten Sie das Programm selbst lesbar Gute Gliederung einr cken zusammen h ngender Teile gezielte Kommentierung schwieriger Passagen sind sehr hilfreich Es ist durchaus blich in C Programmen praktisch jede Zeile mit einem Kommentar zu versehen In C hat sich vor allem durch den Beautifier cb und durch die Beispiele im Buch von Kernighan und Ritchie ein sehr bersichtlicher Programmierstil durchgesetzt Die Compiler unterscheiden auch Gro und Kleinschreibung Das wird genutzt um einige Teile Symbolische Konstante und mit
75. die Funktion ab und kehrt wieder zur rufenden Funktion main zur ck wo die Ausf hrung weitergeht Zu den normalen Befehlen der Programmiersprache if while Kommt zu s tzlich die M glichkeit andere Funktionen aufzurufen und deren Funktionalit t zu ver wenden Die folgende Abbildung skizziert die dann stattfindende Reihenfolge der Pro grammabarbeitung main Funktion 1 IT u F Aufruf an F Aufruf Obwohl bei der Ausf hrung der ganze Programmcode durchlaufen wird kann man die Codeerstellung problemlos auf verschiedene Personen aufteilen die voneinander fast nichts wissen m ssen Der Schreiber der rufenden Funktion mu die Spezifikation Ein gangsgr en Ausgangsgr en Zweck der aufgerufenen Funktion kennen Der Autor der aufgerufenen Funktion mu daf r sorgen da seine Funktion getreu den Spezifikationen funktioniert und auch durch falsche Eingangsgr en nicht abst rzt oder sonstigen groben Unfug macht Es ist daher auch blich da vorhandene gut dokumentierte Funktionen lange nach ihrer Erstellung noch immer von den Autoren neuer Programme verwendet werden C Skriptum Prei l 52 Eine Funktion sollte e einen gem der gesamten Aufgabenstellung logisch zusammengeh rigen Programm abschnitt umfassen e mehrfach verwendbar sein also von verschiedenen Stellen im restlichen Programm aufgerufen werden Wiederkehrende Programmteile werden nur einmal codiert e klein und kompakt bleiben Hausregel
76. e dateiname include lt stdlib h gt include lt stdio h gt include lt string h gt void main int argc char argv FILE fpin Deklaration des Eingabefiles File Pointer char buffer 502 int c 0 i 0 size_t bytezahl eine unsigned int Variable struct dyn stellt den Aufbau eines Elements der Liste dar struct dyn struct dyn next Vorw rtspointer next gt struct dyn prior R ckw rtspointer prior lt char zeile 502 Elementinhalt struct dyn anker_next kanker prior w_ptr w_ptr_vorher anker_next anker_prior w_ptr w_ptr_vorher NULL if argc gt 2 printf ung ltige Anzahl von Argumenten n printf Aufruf mit progname dateiname n exit 1 if argc 2 Input Filename im 1 Parameter if fpin fopen argv 1 r NULL printf Datei s nicht vorhanden n argv 1 exit 1 else fpin stdin stdin ist bereits er ffnet while c EOF c fgetc fpin if c EOF amp amp i 0 amp amp anker_next NULL printf leere Eingabe daher keine Ausgabe n exit 1 if c EOF c n i gt 500 ein Fall fuer Zeilenende if c EOF amp amp i 0 break EOF liegt direkt am Zeilenende also fertig buffer i n buffer i 0 in buffer steht jetzt eine ganze Zeile i enth lt die Anzahl Zeichen in der Zeile jetzt wird Sp
77. e char alt char neu rename von Date mit Name alt auf Name neu R ckgabe 0 wenn ok void rewind FILE f gleich wie fseek f 0L SEEK_SET positioniert auf Filebeginn int scanf char format liest formatiert aus stdin Im Formatstring nur Elemente angeben R ckgabe ist EOF oder die Anzahl erfolgreicher Formatierungen int sprintf char ziel char format gleich wie printf die Ausgabe aber in den String ziel int sscanf char von char format gleich wie scanf es wird aber aus dem String von gelesen FILE tmpfileO erzeugt einen tempor ren File wie fopen tname wb Beim fclose erfolgt ein automatisches remove char tmpnam char ze ein tauglicher Name f r tempor re Dateien wird in s abgelegt int ungetc int c FILE f schreibt ein Zeichen zur ck in den File f dieses wird sp ter gelesen int vprintf char format va_list ap gleich wie printf statt der Folgeparameter wird aber eine va_list verwendet siehe stdarg h Es gibt auch fvprintf und svprinff C Skriptum Prei l 1 02 11 1 5 stdlib h Hier wurden alle Funktionen gesammelt die keine eigenen Gruppen haben void abort void radikales Programmende bergibt Fehler Exit an das Betriebssystem int abs int i Absolutwert von i int atexit void fun void bergibt Pointer auf eine eigene Funktion die beim Programmexit ausgef hrt werden soll double atof char s wandelt die in s stehende Konstante in einen Gleitkommatyp um int
78. e ein Programm welches K rpergr en von Sch lern in cm einliest Nachdem alle Werte eingetippt wurden soll eine H ufigkeitsverteilung ausgegeben wer den z B 150 cm 2 Sch ler 151 cm 4 Sch ler 152 cm 0 Sch ler und so weiter f r den Bereich von 50 250 cm e Es soll ein beliebiger Text eingelesen werden Z hlen Sie wie viele Doppelbuchstaben wie hier pp sich im Text befinden Obwohl es an dieser Stelle etwas unmotiviert erscheint sei Ihnen dieses Beispiel nicht vor enthalten Es zeigt sogenannte Typkonvertierungen in C Man kann Variable verschiedenen Datentyps gilt nicht bei Arrays einander zuweisen Dabei wird der zugewiesenen Wert aber manchmal verst mmelt bzw ver ndert void main int a b c 32768 bis 32767 m glich bei Pcs unsigned char x y z 0 bis 255 oder 127 keine negativen Werte char kann auch als 1 Byte unsigned int angesehen werden der Code des Zeichens ist der Wert float num toy thing Gleitkomma mit einfacher Genauigkeit 27 allen 3 Variablen a b c wird 27 zugewiesen A thing 3 6792 a ist nun 65 character A x hat nun irgendeinen undefinierten Inhalt num ist jetzt 27 00 a enth lt jetzt 3 C Skriptum Prei l 3 8 6 Befehle in C 6 1 Das leere Statement S ein einsamer Strichpunkt der normalerweise jedes Statement abschlie t ist die Leeranweisung Ben tigt wird diese leere Anweisung beispielsweise beim if
79. e folgenden Zeilen einr cken weiter rechts schreiben Un ter zusammengesetzte Befehle versteht man jene Struktogrammsymbole die in ihrem Inne ren weitere Anweisungen enthalten Mit dem Ende des Befehls bzw bei der geschwunge Einr ckungen sind nen Klammer zu wird wieder weiter links weitergeschrieben ausger ckt N so oder auch so m Wichtig int variable 0 int variable 0 while variable lt 6 while variable lt 6 variable variable 1 variable 1 3 1 Beispielprogramm am Computer ausf hren Programme eines Computers sind in irgendwelchen Programmiersprachen geschrieben Der Computer selbst dessen CPU versteht auch eine Art Programmiersprache die Ma schinensprache der jeweiligen CPU diese besteht aber nur aus bin ren Zahlen und ist f r Menschen denkbar untauglich Deshalb wurden sogenannte problemorientierte Program miersprachen entwickelt die einerseits der Mensch leichter handhaben kann und die ande rerseits automatisch in die Maschinensprache des Computers bersetzt werden k nnen Unsere Sprache C wird daher von einem speziellen Compiler genannten Programm in jene Zahlenfolgen bersetzt die vom Prozessor der Maschine ausgef hrt werden k nnen Am PC sind das Maschinenbefehle aus dem Instruktionssatz des Intel 8086 Processors 1 Mithilfe eines Editors ein Programm welches Eingabe und Speicherung von Texten unterst tzt tippen wir unser Programm am Computer und speichern es
80. e z hler auf 0 Variable z hler z hler 0 while z hler lt 4 Ausgabe auf dem Bildschirm addiere 1 zur Yariablen z hler z hler z hler 1 schreibe Inhalt der Yariablen z hler schreibe Ende Dieses Struktogramm setzt sich aus mehreren Symbolen zusammen Die Abarbeitung be ginnt wie immer beim obersten Symbol und endet beim untersten Das Symbol Wiederho lung enth lt zwei einzelne Anweisungen die im konkreten Fall viermal ausgef hrt werden weil die vorher berpr fte Bedingung z hler kleiner 4 nur viermal wahr ist Dann hat z hler den Wert 4 die Bedingung ist falsch und die Verarbeitung geht nach dem Wiederho lungssymbol weiter M nzer sinnvolle Yariante Bei dieser Version des M nzfern sprechers kann man wiederholt telefonieren while Absicht ein Gespr ch zu f hren Die vorher dargestellte simple Vari ante wurde komplett in eine Schlei fe ein Wiederholungssymbol hin eingestellt und kann somit fter wiederholt werden Nach der Anweisung Nummer w hlen ist als neues Symbol die Bes f Verbindung i Auswahl verwendet worden Wenn if eine Verbindung zustande sprechen 000 kommt dann then sprechen an sonsten else nichts tun Nach dieser Auswahl geht es in jedem m Fall mit H rer einh ngen weiter Symbol Auswahl Das Symbol Auswahl wird dazu verwendet um abh ngig von einer Be dingung Anweisungen auszuf hren oder zu berspringen Wenn auch if Bedingung re
81. ebssystems Viele an dere Computerhersteller unterst tzen C auf ihren Maschinen und bieten ebenfalls Compiler an Auf PCs ist C eine der wichtigsten Sprachen und kann durch Produkte wie Visual C Borland C oder Symantec C sehr effizient eingesetzt werden Wie man sieht k nnen diese Compiler nicht nur C sondern auch C Programme bersetzen Im Gegensatz zur traditionellen Unix Umgebung ist es am PC blich mit Full Screen orientierten men ge f hrten und mit umfangreichen Hilfe Systemen versehenen Produkten zu arbeiten Aus der zahllosen angebotenen C Literatur werden hier nur zwei B cher erw hnt die C Bibel vom Meister Kerninghan Ritchie Programmieren in C Hanser Darstellung der Norm Plaugher Brody Ansi und ISO Standard C Programmer s Ref Microsoft Press Neben diesen eher f r Fortgeschrittene gedachten Werke gibt es noch viele B cher wel che auch die Programmierumgebung der jeweiligen Compiler und deren Spracherweiterun gen n her beschreiben C Skriptum Prei l 1 5 3 Erste Beispielprogramme Struktogramm Minibeispiel Variable keine schreibe Hallo Leser CRLF Struktogramm Auswahlbeispiel lese zeichen Variable zeichen if zeichen A then l else schreibe schreibe Es ist nein ein A kein A CRLF CRLF Jede Programmiersprache hat eine feste Syntax Schreibweise die eingehalten werden mu damit der Computer genauer
82. eiben Modularisierung ist noch wichtiger als Strukturierung y S Wichtig Wie hinl nglich bekannt ist die Wartbarkeit heute die wahrscheinlich wichtigste Eigen schaft eines ansonsten funktionsf higen Programms Daher sind die nachfolgenden be schriebenen Ma nahmen sinnvoll anzuwenden Sollte Ihnen dieses Kapitel teilweise unver st ndlich vorkommen so lesen Sie ihn am Ende des Skriptums nochmal und wenden vor l ufig nur die leicht verst ndlichen Abs tze an Schreiben Sie den eigentlichen Programmcode ausgenommen Definitionen erst dann wenn Sie bis ins Detail wissen wie er aussehen soll Wenn Sie schon fr her beginnen dann versauen die sp teren nderungen das Programm schon vor dem ersten Echtlauf W hrend der Denkphase hat man die beste Gelegenheit an der Dokumentation zu schreiben Zerlegen Sie das Problem sinnvoll in einzelne jeweils m glichst abgeschlossene Teile Module bevor Sie daran denken wie Sie es in der jeweiligen Sprache l sen werden Die einzelnen Module Unterprogramme Funktionen sollten nur ber mi nimale Schnittstellen Parameter Funktionsr ckgabewert globale Variable mitein ander verbunden sein Die T tigkeit eines Moduls mu exakt in seiner Dokumenta tion am besten im Programmkopf beschrieben sein es darf nicht notwendig sein den Code zu lesen um den Modul verwenden zu k nnen Keinesfalls darf der Modul abst rzen nur weil er mit falschen Parametern aufgerufen wird Je
83. eicherplatz angefordert aber nur soviel wie n tig Mi bytezahl 2 sizeof struct dyn i 1 w_ptr struct dyn malloc bytezahl if w_ptr NULL printf Fehler bei malloc kein Speicher exit 1 w_ptr gt next NULL f r Ende next gt w_ptr gt prior w_ptr_vorher weiterer prior lt strcpy w_ptr gt zeile buffer Modularisierung durch Funktionen y vice C Skriptum Prei l 95 if anker_next NULL beim 1 Mal next gt anker_next w_ptr if w_ptr_vorher NULL weiterer next gt w_ptr_vorher gt next w_ptr w_ptr_vorher w_ptr if i gt 500 buffer 0 c i 1 else i 0 else buffer i c anker_prior w_ptr_vorher der Ankerpointer f r prior lt also los mit der Ausgabe Die Abarbeitung einer Pointerkette ist relativ einfach man startet mit dem Anker Pointer und setzt solange dieser nicht NULL ist nirgendwohin zeigt mit dem jeweils n chstem Pointer in der Kette fort Jedes Element der Liste verf gt deshalb ber einen Pointer pro Pointerkette for w_ptr anker_prior w_ptr NULL w_ptr w_ptr gt prior printf s w_ptr gt zeile exit 0 exit beendet Prog liefert exit Code an Betriebssystem 10 2 10 Funktionen In keiner anderen Programmiersprache wird den Funktionen und damit der Modularisie rung des Gesamtprogramms in kleine berschaubare Einheiten soviel Bedeutung beige
84. eis 0 die beiden Gruppenstufen long summ km 0 t Type double summ preis 0 m Marke fseek autodat OL SEEK_SET an den Dateianfang stellen clrscr fread amp autol1 sizeof autol 1 autodat lese 1 Satz while feof autodat Gruppenkopf f r Marke summ km summ preis 0 printf Marke 20 20s n autol marke strcpy vergleich marke autol marke while strcmp autol marke vergleich marke 0 ee feof autodat Gruppenkopf f r Type sumt_km sumt_preis 0 printf Type 20 20s n autol type strcpy vergleich _type autol type while strcmp autol type vergleich_type 0 ee feof autodat Einzelsatzverarbeitung printf 4d 71d 12 21f n autol baujahr autol kilometer autol preis sumt_km sumt_km autol kilometer sumt_preis sumt_preis autol preis fread amp autol sizeof autol 1 autodat lese S tze Gruppenfu f r Type summ km summ km sumt_km summ preis summ preis sumt_preis printf Summe Type 71d 12 21f n sumt_km sumt_preis Gruppenfu f r Marke printf Summe Marke 71d 12 21f n summ_km summ preis printf n zur ck zum Men mit Tastendruck taste getch C Skriptum Prei l 8 1 lesen und r ckschreiben aller Datens tze alle Preise um 2 erh hen void autorewrite FILE autodat struct automobil autol int taste 0 int anzahl fseek autodat
85. eise der W rter die korrek te Setzung von Sonderzeichen und die grammatikalisch richtige Anordnung Schreiben Sie ein Programm in einer Programmiersprache so wird die Syntax Ihrer Zeilen vom Com puter berpr ft Als Semantik bezeichnet man die inhaltliche Bedeutung bzw die Logik Ihres Programms Ob Ihr Programm also auch genau das tut was es soll mu leider von Ihnen selbst ber pr ft werden dies ist auch die Hauptt tigkeit beim Testen von Programmen Der Probleml sungsplan bzw Teile desselben wird bei Computern Algorithmus genannt Ein Algorithmus ist eine Verfahrensvorschrift die so genau formalisiert ist da sie von einem Computer dessen Prozessor ausgef hrt werden kann Der Algorithmus besteht aus Anweisungen die wiederum Operationen mit verschiedenen Objekten ausf hren Ein Al gorithmus bildet Eingabeobjekte auf Ausgabeobjekte ab Er beschreibt in welchen Anwei sungen Operationen die Eingabeobjekte verwendet werden um die Ausgabeobjekte zu erzeugen Man kann einen Algorithmus mit verschiedenen Notationen darstellen e Pseudocode Verbale Darstellung meist angelehnt an die Schreibweise von Program miersprachen Ein Rezept Pichelsteiner Eintopf w re ein Pseudocode Beispiel e Programmablaufplan ltere graphische Form DIN Norm 66001 Die Darstellung wozu Programmiersprachen ist mit Programmablaufplansymbolen gestaltet e Struktogramm Die g nstigste Darstellungsform f r Algorithmen ist das S
86. eits sortierten Arrays aber nur n 1 Vergleiche 1 Verbesserung das Array abwechselnd in beide Richtungen durchlaufen Shakersort der vorher ung nstigste Fall wird damit sehr effektiv behandelt 2 Verbesserung zu Beginn nicht das n te mit dem n 1 ten Element vergleichen sondern den Vergleich zuerst in gr eren Abst nden n 2 durchf hren und den Vergleichsabstand laufend halbieren bis er 1 wird Shell Sort die Laufzeit wird dabei wesentlich verbessert C Skriptum Prei l 3 0 Als Beispiel folgt hier nur die einfache Variante des Bubblesort include lt stdio h gt Bubble Sort define TABDIM 21 define FALSE 0 die blichen defines f r die Wahrheitswerte define TRUE 1 void main int i sortiert tausch int tabelle TABDIM 77 97 14 47 22 34 95 42 99 1 43 69 73 3 76 78 82 52 89 92 66 printf nTab unsortiert for i 0 i lt TABDIM i printf d tabelle i sortiert FALSE while sortiert FALSE sortiert TRUE for i 0 i lt TABDIM 1 i if tabelle i gt tabelle it1 Vergleich der Nachbarn tausch tabelle i wenn n tig Tausch tabelle i tabelle i 1 tabelle i 1 tausch sortiert FALSE printf nTab sortiert for i 0 i lt TABDIM i printf d tabelle i Sie sehen hier die nderung der Reihenfolge nach jedem Durchlauf der inneren for Schleife W hrend die gr eren Werte 97 99 schon nach weni
87. en aber auch Strukturen er mittelt werden kann sizeof int liefert 2 oder 4 als Ergebnis sizeof stru_datum w rde also 6 oder 12 liefern Als bin rer Operator ist die normale Multiplikation x y z Damit wird die bliche Division durchgef hrt Sind beide Operanden int so ist auch das Ergebnis int Nachkommastellen werden abgeschnitten Ist aber ein Operand float bzw wird ein Operand mit dem cast Operator nach float konvertiert so gibt es float als Ergeb nistyp z x y liefert int z float x float y liefert float Modulo der Rest einer Ganzzahldivision wird mit dem ermittelt Es ergibt also 23 7 den Wert 2 Wenn x und y beide vom Typ int sind dann gilt x y y x y x Selbstverst ndlich kann auch addiert werden Als bin rer Operator bewirkt die Subtraktion Das ist ein Spezialoperator f r den bitweisen Rechtsshift 5 gt gt 2 bedeutet da in der internen Darstellung von 5 alle Bits um zwei Stellen nach rechts verschoben werden Die rechten beiden Bits gehen dabei verloren links wird mit 0 Bits aufgef llt Das Ergebnis ist daher 1 Bei negativen Zahlen sind shifts problematisch g ns tig w re es wenn nicht mit 0 sondern mit 1 aufgef llt w rde das machen aber nicht alle Compiler Der Operator ist nur auf int anwendbar die Anzahl Bits mu ebenfalls einen sinnvollen Wert haben 9 hat intern die Bitkombination 00 01001 9 gt gt 2 ergibt also 00 00010 das Ergebnis ist daher 2 Das ist der Li
88. en anwenden welches sich bin res Suchen nennt Genauso wie jeder Mathematiker dividieren kann sollte dieser Algorithmus zum Grundwissen eines jeden Programmierers geh ren bin res Suchen Man sucht in einem sortierten Array die Position den Index eines bestimmten Werts Selbstverst ndlich ist bekannt wieviele Werte im Array enthalten sind v 1 Errechnen des Index des mittleren Arrayelements bei 7 Elementen das 3 bei 100 Ele menten das 50 etc vice 2 Enth lt dieses Element den gew nschten Wert gt Treffer und fertig 3 Ist der gesuchte Wert kleiner als der Inhalt des Elements aus Punkt 2 dann mu dieser Wert wohl im linken unteren Teil der Matrix stehen ist er gr er dann im rechten Teil Man kann also die Suche auf eine H lfte des Arrays beschr nken und errechnet nun den Index des mittleren Arrayelements innerhalb dieser Arrayh lfte und geht zu Punkt 2 Ist die H lfte aber so klein da sich kein mittleres Element mehr errechnen l t dann gilt gt Wert nicht gefunden fertig Beispiel Array mit 21 Elementen sortiert Suche Element mit dem Wert 14 ja 3 114 22 134 42 43 47 52 66 69 73 76 77 78 82 89 92 95 97 99 mittleres Element C Skriptum Prei l 2 8 ja 3 114 22 34 42 43 47 52 66 169 173 76 77 78 82 89 192 95 197 199 A neues mittleres alle Werte gt 69 sind bedeutungslos der Element gesuchte Wert mu im linken Teil stehen ja 3 114 22 34
89. en der DEEN i f Be Datenfeld chert so werden die Daten in einer Datei engl File gespeichert Ein Spalte ein K stchen ac aus der Tabelle nennt man Datenfeld oder Datenelement eine Zeile hei t Datensatz C Skriptum Prei l 6 8 Jedes Datenfeld hat einen Namen und entspricht einer Variablen e Datenfelder sind Variable e Mehrere logisch zusammengeh rige Datenfelder finden sich in einem Datensatz e Mehrere gespeicherte Datens tze bilden eine Datei Sinnvollerweise wird man sich ein Verzeichnis der Datenfelder eines Datensatzes anlegen gefahrene km numerisch Je 06is999999 Laufleistung In Programmiersprachen nennt man solch eine Zusammenfasung von einzenen Variablen unterschiedlichen Typs eine Struktur 9 2 Strukturen Zusammenfassen von Elementen unterschiedlichen Typs Strukturen gliedern mehrere logisch zusammengeh rige Datenfelder zu einer Einheit Das folgende Beispiel definiert ein Struktur direkt struct int tag definieren einer Struktur datuml mit int monat den 3 Elementen tag monat jahr Mi int jahr datuml Will man an verschiedenen Programmstellen eine Struktur gleichen Typs nutzen so ist die folgende Variante zu empfehlen struct stru_datum int tag Deklaration einer Struktur vom int monat Typ stru_datum int jahr belegt keinen Speicherplatz struct stru datum datl dat2 Definition der Strukturen datl dat2 vom Typ stru_datum struct
90. en theoretisch in ei nem einzigem Ausdruck vorkommen dessen Ergebnis beispielsweise einer Variablen zu gewiesen wird oder aber auch als Ergebnis einer Bedingung in einem if Statement ver wendet wird Bei vielen Operatoren gibt es auch eine aufwendigere Einteilung in R nge mit Priorit ts reihenfolge und eine Auswertereihenfolge innerhalb des Rangs Der Rang bestimmt die Priorit tsstufe Hoher Rang 1 2 bedeutet hohe Priorit t Operato ren am gleichen Rang haben die gleiche Priorit t Sie werden gemeinsam betrachtet und gem der Auswertereihenfolge von links nach rechts oder von rechts nach links abgear beitet je nachdem wo sie im Ausdruck vorkommen Die meisten Operatoren sind auch in C bin re Operatoren mit infix Schreibweise die als Operand Operator Operand ge schrieben werden Die un ren Operatoren werden gr tenteils in prefix Notation O a perator Operand verwendet einige f sind auch postfix Operand Operator ein pretix setzbar postfix a ab Es ist im Gegensatz zu anderen Sprachen nicht einfach bei komplexen Ausdr cken den berblick zu behalten Klammerung kann immer eingesetzt werden um die normale Prio rit tenfolge zu durchbrechen und damit auch die Ausdr cke bersichtlicher zu machen Machen Sie in komplexen Ausdr cken Klammern auch dort wo sie aufgrund der Priori t tsreihe gar nicht notwendig w ren damit wird der Code leichter lesbar Beispielsweise sind p gt trp
91. enug Platz strcpy title Das ist der Titel f r den Text und ein 0 sein printf s n n title printf Name 1 is s n namel printf Name 2 is s n name2 printf Namel ist d Zeichen lang n strlen namel if strcmp name1 name2 gt 0 Vergleich liefert true if namel gt name2 strcpy mixed namel else strcpy mixed name2 printf Der alphabetisch gr ere Name ist s n mixed strcpy mixed namel strcat mixed strcat mixed name2 printf Beide Namen lauten s n mixed Die wichtigsten Funktionen welche char Array Bearbeitung unterst tzen strlen string Die Funktion strlen gibt die L nge der mit 0 abgeschlossen Zeichenkette string zur ck Das abschlie ende Nullbyte wird nicht mitgez hlt strepy stri str2 Mit der Funktion strepy wird der Inhalt von str2 nach str1 kopiert str2 mu eine mit 0 abgeschlossene Zeichenkette char Array sein strl mu lang genug sein um den Inhalt von str2 aufzunehmen streat strl str2 Die Funktion streat h ngt den Inhalt von str2 an str1 an Das Nullbyte das ur spr nglich am Ende von str1 stand wird vom ersten Zeichen der Zeichenkette str2 berschrieben Auch hier mu str1 lang genug sein um den Gesamtinhalt aufzu nehmen stremp stri str2 Die Funktion stremp vergleicht zwei mit 0 abgeschlossene Zeichenketten ge m Code und gibt einen Ergebniswert zur ck C Skriptum Prei l 21 5 4 2 Suchen von W
92. er Komplement Konstanten f r alle intern bin ren Typen d rfen keine Nachkommastellen haben k nnen jedoch als normale Dezimalzahlen aber auch als Oktalzahlen mit einer f hrenden Null und sogar als Hexadezimalzahl mit f hrenden 0x geschrieben werden Numerische Konstanten ohne Dezimalpunkt gelten als integer Konstanten ist der Zahlenwert zu gro so kann durch Anf gen eines L oder 1 eine long integer Konstante erzeugt werden Durch Anf gen eines u oder U erreicht man eine unsigned Konstante Es gibt keine dezitierte short Kon stante richtig 123 0 66 234573952LU 0127 35 Oxff 0xa27c 44821L Ox44L falsch 0678 3c61 3 14 0x6km2 12a6 Ox12lel2 66u 5 2 Datentyp Gleitkomma entspricht bin rem Maschinenformat float zahl2 normales Gleitkomma einfache float el pil Genauigkeit mindestens 6 Stellen double genauer doppelte Genauigkeit mind 10 Stellen long double noch _genauer noch h here Genauigkeit wenn m glich Der Wertebereich von float Variablen ist sehr maschinenabh ngig er reicht aber oft von 10 hech 100 bis 10 hoch 100 Die Norm verlangt blo einen Mindestbereich von 10738 bis 10 38 Als Konstante sind die blichen Ziffernschreibweisen mit Dezimalpunkt kein Komma m glich aber auch die Exponentenschreibweise Gleitkommakonstante gelten als double Durch Anh ngen von f F gibt es float durch Anh ngen von 1 L long double Konstante richtig 3 14 2 71 1238762 45 12 73e 7 14 3 0 12E 33 3 2F 12E 12L
93. er Modularisierung hat man schon bei mittleren Programmen relativ viele Funktionen Man legt f r ein Programm ein Subdirectory an wo f r jede Funktion eine Datei funkname c existiert Bei zuvielen Funktionen kann man auch logisch zusammen geh rige Funktionen gemeinsam in einer Datei gruppe c unterbringen Als Verbindung zwischen all diesen Dateien fungiert die programmeigene Header Datei progname h Wird eine Funktion ge ndert dann wird nur diese eine Datei compiliert und nachher wer den alle Objekt Files neu zum progname exe gelinkt Bei allen C Compilern kann man die Compilier und Linkvorg nge mittels Make bzw Projektdateien vollst ndig automatisieren Compiler Linker C Skriptum Prei l 5 7 Beispielsweise k nnten folgendende Dateien existieren ea et prog h include Tprog h include fprog h include fprog h char globvar include lt math h gt gemeinsame main int hfunkt int x int hilfsfuO includes include lt stdlib h gt int j k include lt stdio h gt j 8 aa Prototypen globvar A int hfunkt int j hfunkt i int hilfsfu OC if globvar A Verweis auf S globale Variab le extern char globvar compiler lib astige Libraries prog prj Wie oben gezeigt mu der Compiler pro C Datei einmal laufen w h rend der Linker nur einmal pro ausf hrbarem Programm aktiv wird Um die Compiliervorg nge zu automatisieren mu man im Prinzip bei allen Compilern g
94. er Pointer auf int int funptr O das ist die Definition eines Pointers Name funptr der auf Funktionen zeigt welche integer als R ckgabewert haben int fffpt O am sch nsten ist wohl dieser Pointer auf Funktionen welche als R ckgabewert einen Pointer auf integer liefern Pointer auf Funktionen Einen Pointer auf eine Funktion kann man nutzen wenn man beispielsweise schon im erm glichen sehr flexible Pro Hauptprogramm steuern m chte welche dritte Funktion in einem aufzurufendem Upro ee verwendet werden soll Im folgenden Kurzbeispiel wird von der Procedur haupt ein Poin 9 ter auf eine Funktion an die Funktion upro bergeben vice void upro int fp FILE haupt upro int pl FILE int c int funptr FILE FILE fp Aufruf von fgetc c pl fp funptr fgetc EE upro funptr Ein eher praxisnahes Beispiel ist die Verwendung der Funktion gsort aus stdlib h Diese Funktion sortiert bestimmte Elmente in einem Array welches als Parameter bergeben wird Ebenfalls als Parameter bergeben wird ein Pointer auf eine Vergleichsfunktion die man selbst schreiben mu void qsort void base Startadresse des Array Prototyp size_t nelem Anzahl Elemente size_t size L nge eines Elements Mi int cmp const void el const void e2 Vergleichsf int numcmp void vl void v2 dies ist die Vergleichsfunktion f r einen integer Vergleich
95. eranden ungleich 0 dann ist das Ergebnis 1 sonst immer 0 6 amp amp 1 liefert als Ergebnis True true amp amp true ergibt true Als letzter logischer Operator wird mit das oder dargestellt Wie allgemein bekannt wird das Ergebnis false 0 wenn beide Operanden 0 sind sonst gibt es immer das Ergebnis True 6 3 ergibt nat rlich auch True Fragezeichen Doppelpunkt ist ein spezieller C Operator der zwar den Neuling verwirrt aber sehr effizient einsetzbar ist Sinngem kann man damit einen if Befehl mitten in ei nem Ausdruck unterbringen Der Operator hat drei Operanden ist also tern r if a lt b x 2 else x 3 gleichwertig ist die folgende Anweisung x a lt b 2 3 Allgemein formuliert gilt bedingung true Teil false Teil Es ist aber zu beachten da true Teil und false Teil einen Wert liefern m en der ab h ngig von der Bedingung das Ergebnis des gesamten Operators der sogenannten beding ten Bewertung liefert Zur Maximum Bildung w rde sich eignen max a gt b a b laienhafte Mathematiker k nnten schreiben k b 0 0 ab Auch die Zuweisung gilt als Operator aber mit geringer Priorit t damit auch der ganze Ausdruck berechnet wird bevor die Zuweisung erfolgt Achten Sie auf die Auswertungs richtung re O li Es gibt eine verk rzte Schreibweise f r die Zuweisung bei der ein wenig an Schreibarbeit eingespart wird Anstelle einer blichen Schreibweise x x 4 kann auch x 4 ge schrieben w
96. erden Generell kann statt x x Operator Ausdruck als kurze Variante auch x Operator Ausdruck geschrieben werden Dies funktioniert mit den Operatoren amp lt lt gt gt Mit dem Komma k nnen mehrere einzelne Ausdr cke zu einem einzigen zusammengefa t werden Das Ergebnis des letzten rechtesten Teilausdrucks ist dann das Ergebnis des ge samten Ausdrucks Es ist auch m glich anstelle der Blockung mit dem Komma mehrere Einzelausdr cke zusammengefa t hinter eine while oder eine andere Anweisung zu stel len Soll der Komma Operator innerhalb einer durch Beistrich getrennten Liste stehen z B bei Funktionsaufrufen so mu er in runde Klammern gestellt werden C Skriptum Prei l 65 Und nun einige Beispiele include lt stdio h gt Dieses Beispiel zeigt die void main Dieses Beispiel zeigt die logischen Vergleichsoperatoren strikte links rechts Abar 27 beitung der Operatoren amp amp P und int x 11 y 11 z 11 char a 40 b 40 c 40 float r 12 987 s 12 987 t 12 987 5 if x y z 13 z wird auf 13 gesetzt te if x gt z a Ai a wird auf 65 gesetzt Ascii Code A Wichtig if x gt z a B nichts wird ge ndert if b lt c r 0 0 r wird auf 0 0 gesetzt if r s t c 2 t wird auf 20 gesetzt r s z 1000 x erh lt einen Wert ungleich 0 und z wird auf 1000 gesetzt 222 dies setzt x y and z
97. erten in Arrays Nachdem ein Array mit Werten bef llt wurde ist es oft notwendig einen bestimmten Wert innerhalb eines Arrays zu suchen entweder um nur seine Existenz nachzuweisen oder um seine Position den Index im Array festzustellen Das folgende Beispiel durchsucht ein Array nach Werten gr er als 200 und z hlt deren Vorkommen include lt stdio h gt define TABDIM 200 void main int anzahl i int tabelle TABDIM 22 44 66 234 55 532 345 62 91 die restlichen Elemente werden auf 0 gesetzt anzahl 0 for i 0 i lt TABDIM i i 1 if tabelle i gt 200 anzahl anzahl 1 printf Es gibt d Werte gt 200 in der Tabelle n anzahl Mit einer Schleife in diesem Fall eine for Schleife werden alle Elemente des Arrays sequentiell der Reihe nach berpr ft ob sie der Bedingung gr er 200 entsprechen Wenn ja wird das betreffende Arrayelement bearbeitet in diesem Programm wird nur gez hlt man k nnte das Element aber genausogut ver ndern Bei einem unsortiertem Array gibt es kaum sinnvollere Vorgangsweisen Sollten die Werte innerhalb des Arrays aber in sortierter Folge vorliegen dann m ssen nicht mehr alle Array elemente berpr ft werden Im vorliegenden Fall w rde man das Array wohl von oben nach unten durchsuchen und die Schleife verlassen sobald man auf den ersten Wert lt 201 trifft Sucht man nur einen bestimmten Wert in einem sortierten Array dann wird man wohl ein Verfahr
98. es diesmal auch b help 7 2 2 Funktionsr ckgabewert Funktionen geben beim Aufruf einen Funktionswert retour Der typische Aufruf von Funk tionen ist daher immer in einen Ausdruck eingebettet wo mit dem Funktionsergebnis wei tergearbeitet wird Es ist aber auch m glich Funktionen aufzurufen ohne den Funktions wert zu nutzen Auch printf ist kein Unterprogramm sondern eine Funktion der Funkti onswert ist vom Typ int und gibt die Anzahl der ausgedruckten Zeichen oder im Fehlerfall einen negativen Fehlercode zur ck Meist wird printf aber wie ein Unterprogramm gen tzt globale Variable sind in meh reren Funktionen bekannt C Skriptum Prei l 5 5 7 2 3 globale Variable Normalerweise sind Variable lokal das hei t nur innerhalb der Funktion verwendbar in der sie definiert sind es gibt aber auch globale in C extern definierte Variable die in mehreren Funktionen verwendbar sind Extern definierte Variable die in den Funktionen mittels extern deklariert werden In jenen Funktionen die gemeinsam mit der extern Definition compiliert werden kann die Deklaration entfallen Diese extern au erhalb einer Funktion definierten Variablen ste hen dann in jeder Funktion zur Verf gung in der ein extern Verweis existiert und k n nen daher auch jederzeit ver ndert oder abgefragt werden Globale externe Variable sollten sparsam angewendet werden Je mehr globale Variable Sie einsetzen desto mehr sind die einzelnen
99. esse eines anderen Datentyps nichtskalare Typen enthalten mehrere Elemente Arrays enthalten mehrere Elemente gleichen Typs Strukturen enthalten Elemente unterschiedlichen Typs Unions enthalten Elemente unterschiedlichen Typs die redefiniert sind C Skriptum Prei l 84 unvollst ndige Typen unvollst ndige Datentypbeschreibung unvollst ndige Arrays ohne Dimensionsangabe bei Parametern Initialisierung unvollst ndige Strukturen es wird keine Strukturvariable definiert unvollst ndige Unions es wird keine Unionvariable definiert void steht f r kein Datentyp bzw Datentyp nicht bekannt Funktionen definiert wird der Typ des Funktionsr ckgabewerts und der Parameter In der Folge werden die einzelnen Typen noch etwas genauer behandelt insbesondere wenn dies zu Beginn des Skriptums Kapitel 4 noch nicht der Fall war Die unvollst ndi gen Typen werden nicht extra aufgef hrt Void wird bei den skalaren Typen besprochen Pointer werden erst vor den Funktionen behandelt 10 2 1 Grundlegende integer Typen char stellt einen ein Byte langen integer dar der eben auch als Code eines Zeichens be trachtet werden kann Ein Minimum von 7 nutzbaren Bits 128 Zeichen ist garan tiert normal werden 8 Bits genutzt Es gibt die folgenden Varianten char signed char unsigned char int entspricht dem Maschinenregister wie bereits am Anfang besprochen Als Min destgr e belegt short 2 Byte und long 4 Byte Als sicher anzunehmen ist aber nur sho
100. f einen String der ein Argument enth lt int i for i 1 i lt argc i printf s n argv i return 0 R ckgabewert ans Betriebssystem Errorlevel Die Variable argv ist kein mehrdimensionales Array sondern ein Vektor von Pointern die jeweils die Adressen der Strings enthalten in denen die Argumente stehen Als erstes Ar gument Index 0 gilt der Programmname Ruft man nun ein Programm namens test1 folgenderma en auf testl paraml 2 param dritter so sind nach dem Aufruf die Variablen mit folgenden Werten gef llt 4 argc argv aM argv 0 GA test1 0 argv 1 i i param1 0 argv 2 i 2 param O argv 3 x i dritter O argv 4 S Be ist NULLpointe argv ist wie bei allen Arrays eine Adresskonstante die auf den Anfang des Arrays zeigt argv 0 ist das erste Element der Pointertabelle und zeigt dorthin wo der String testl steht Weil argv hier einen Pointervektor darstellt wird mit argv 0 nur ein Pointer auf den String testl angesprochen W rde man nur argv verwenden dann erh lt man nur einen Pointer auf den Beginn der Pointertabelle Will man hingegen direkt das t von testl ansprechen dann mu argv 0 verwendet werden Es gilt also C Skriptum Prei l 92 Pointer auf erstes Element des Pointerarrays argv 0 Pointer auf den String der den Programmnamen enth lt argv 0 char erstes Zeichen des Programmnamens In diesen Beispielen werden und belieb
101. g Speicherklasse static wurden schon bei den Funktionen behandelt 10 2 Datentyp Der Datentyp bestimmt die interne Darstellung der Variablen und legt gleichzeitig den m glichen Wertebereich fest Obwohl bei Bedarf Konvertierungen vorgenommen werden sollten im Interesse eines sau beren Programmierstils bzw m glicher Compilerdifferenzen unterschiedliche Datentypen in Ausdr cken nicht vermischt werden bzw nur dann vermischt werden wenn die dabei automatisch durchgef hrten Konvertierungen berblickt werden k nnen Noch wesent lich wichtiger ist die korrekte Einhaltung gleicher Datentypen bei den Funktionsr ckgabe werten und bei den Parametern weil der Compiler die Typdifferenzen nicht entdeckt wenn er nicht durch einen Prototyp informiert wurde Nie ohne Prototypen arbeiten und bei Funktionen mit variabler Parameterzahl wie printf immer den korrekten Datentyp der Parameter einhalten In der C Norm werden die Datentypen wie folgt gegliedert Gliederung der Datentypen normale Datentypen Datentyp von Variablen die Speicherplatz belegen skalare Typen bestehen aus genau einem Element arithmetische Typen sind f r Zahlenwerte geeignet integer Typen f r ganzzahlige Werte grundlegende integer Typen char short int long und deren Varianten Bitfeld Typen k nnen einzelne Bitgruppen anzusprechen aufz hlende Typen enumeration selbstdefinierte Typen Gleitkomma Typen float double long double Pointer speichert die Adr
102. gangsgr en Programmausgabe Spezifizierung genaue Beschreibung der Aufgabenstellung wenn n tig Unterteilung in Teilaufgaben der Eingangs und Ausgangsgr en jeder Teilaufgabe Bei Teilaufgaben werden die Punkte 5 bis 7 oder auch 5 8 pro Teilaufgabe durchge f hrt Suchen der Probleml sung des Algorithmus man verwendet entweder einen bew hrten Algorithmus bzw entwickelt gem Aufgabenstellung einen neuen Darstellung desselben in Form von Struktogrammen bzw Pseudocode berpr fung der Korrektheit des Algorithmus mittels Schreibtischtest man spielt den Ablauf des Algorithmus mit Testeingabegr en Testdaten durch und korrigiert allf l lige M ngel Codierung bersetzen umschreiben des Algorithmus vom Struktogramm in die Programmiersprache Testen des Programms auf korrekte Funktion Ein Testprotokoll kann Ihre Testt tigkeit beweisen z B Hardcopys vom Bildschirm machen Bedenken Sie da Programmierer bereits gerichtlich zu empfindlichen Strafen verurteilt wurden weil sie wichtige Pro grammteile konkret der else Zweig einer Auswahl nicht getestet haben Geschehen bei einem Programm zur Steuerung von Verkehrsampeln in Amerika Zusammenfassen der schriftlichen Unterlagen aus allen bisherigen Punkten zur Pro grammdokumentation auch Wartungsdokumentation genannt Mu sp ter ein anderer Programmierer Ihr Programm ndern bzw weiterentwickeln dann wird er hoffentlich
103. gen Durchl ufen rechts angelangt sind werden kleine Werte 1 3 pro Durchlauf immer nur um ein Position nach links bewegt 177 97 14 47 22 34 95 42 99 14316917313 76 78 82 52 89 92 66 77 14 47 22 34 95 42 197 43 16917313 76 78 82 52 89 92 66 og 14 a7 22 34 77 42 95 1 43 6917313 176178 82 52 89 92 66 97 99 14 22 34 42 47 43 69 173 3 76 177178 152 82 89 66 92 95 97 99 14 22 34 a2 43 14716913 173176 177152 178 82 66 89 92 95 97 99 14 22 34 42143 14713 69 73 176 52 77 78 66 82 89 92 95 97 199 14 22 34142143 3 147 169 73 152 76 77 66 78 82 89 92 95 97 199 pafi 2234122 3 143 147 69 52 173 76 66 77 78 82 89 92 95 97 99 1 14122 343 42 43 47 152 69 173 66 76 77 78 82 89 92 95 97 199 1 1412213 3442 43 47 52 69 66 73 76 77 78 82 89 92 95 97 199 LI 22 34 42 43 47 52 66 69 73 76 77 78 82 89 92 95 97 99 D 14 22 34 42 43 47 52 66 69 73 76 77 78 82 89 92 95 97 99 1 3 14 22 34 42 43 47 152 66 69 173 176 77 78 82 89 92 95 97 99 Einf gesort Direkt beim Einf gen der Daten ins vorher leere Array wird sortiert Die neue Zahl wird mit der im Array an letzter Stelle stehenden bereits sortierten Zahl verglichen Ist diese gr er als die neue Zahl so wird sie im Array um eine Stelle nach rechts ger ckt und
104. gendwelche Programmierkenntnisse zu ben tigen Besch ftigt man sich jedoch hauptberuflich mit dem Computer so ist die Programmierung ein wichtiger Teil des daf r n tigen Wissens In fr herer Zeit mu te man blo eine Programmiersprache erlernen und konnte sich bereits als Programmierer bezeichnen Heute sind aber die Anforderungen an Programme und damit ihre Gr e wesentlich gestiegen Auch die Qualit t der Programme mu erh ht wer den wessen Computer ist noch nicht abgest rzt F r eine gro e Programmieraufgabe ein komplexes Problem mu zuerst ein grunds tzli ches L sungsmodell aufgestellt werden die Gesamtaufgabe ist in kleinere Einheiten z B f r mehrere Personen aufzuteilen und die Einzelteile m ssen detailliert vorformuliert wer den z B Struktogramm Jetzt erst wird die L sung in einer Programmiersprache ge schrieben langl ufig als die eigentliche Programmierung bezeichnet Dann m ssen noch die Einzelteile und zum Schlu das die gesamten Programme gr ndlich auf korrekte Funk tion getestet werden Alle Arbeitsschritte m ssen gut dokumentiert werden soda ein mit der Materie nicht vertrauter Programmierer sp ter nderungen vornehmen kann C Skriptum Prei l 5 1 2 Zum L sen von Problemen Vor einem Problem stehen wir im allgemeinen dann wenn uns kein Plan bzw keine Mittel und Wege bekannt sind um von einem unerw nschtem Ausgangspunkt zu einem er w nschtem Zielzustand zu gelangen
105. gt Ende der Eingabe Die Variable zahl wurde nicht ver ndert und hat noch den fr heren Wert Weitere Lesebefehle sind sinnlos die Leseschleife mu beendet werden rueck zeichen getchar getchar liest genau ein Zeichen aus der Standardeingabe normal der Tastatur zugeordnet Jedes denkbare Zeichen es gibt gem Ascii Code 256 Zeichen kann gelesen werden Deshalb ist die Variable zeichen vom Typ int zeichen zwischen 0 und 255 gt ein Zeichen wurde eingelesen zeichen 1 gt Ende der Eingabe erreicht algemein gilt schreibt man char Variable int Variable so wird der int Zahlenwert als Ascii Code des Zeichens verwendet schreibt man int Variable char Variable so wird der Ascii Code des Zeichens als Zahlenwert in die int Variable gestellt rueck fgets text sizeof text stdin liest eine Zeile mehrer Zeichen mit der return Taste am Ende aus der Eingabe und h ngt hinten ein 0 an Dadurch entsteht ein korrekter String mehrere Zeichen in einem char Array mit 0 als Abschlu zeichen im Array text Ist die gelesene Zeile l nger als 79 Zeichen dann wird sie aufgeteilt und mit mehreren Lesebefehlen eingelesen Am Ende einer fertig gelesenen Zeile steht die return Taste n rueck 0 gt Zeile wurde gelesen rueck 0 gt Ende der Eingabe rueck gets text w rde hnlich funktionieren allerdings darf die maximale Eingabezeilenl nge niemals 79 L nge text 1 bersteigen weil d
106. hentag mo di mi do fr sa so enum wochentag var_enum Im Programm kann die Variable dann mit den definierten Werten verwendet werden Bei spielsweise if var_enum so farbe gelb Intern wird die Variable aber als integer gespeichert die angegebenen Werte werden von 0 beginnend durchnumeriert oder k nnen auch angegeben werden enum sex ma le 1 female 2 farbe blau printf farbe d farbe liefert daher 2 Die Werte des enum Typs werden wie normale Variablennamen behandelt es ist daher nicht mehr m glich eine Variable mit den Namen gelb oder mi zu definieren wenn die obigen enum Definitionen get tigt wurden Obwohl die enum Definition geeignet w re klarere Programme zu erstellen ist sie selten anzutreffen Die Folgezeile w re durchaus sinnvoll enum bool false 0 true 1 flag_aktion 10 2 4 Gleitkomma Typen Gleitkommatypen sind intern bin r und wurden bereits am Anfang besprochen Als m g liche Typen k nnen angegeben werden float einfache Genauigkeit double doppelte Genauigkeit long double extra gro e Gleitkommazahl wenn m glich 10 2 5 Void Der Typ void steht deshalb bei den unvollst ndigen Typen weil er eigentlich gar kein Da tentyp ist und daher nur bei der Funktionsdefinition und Pointern verwendet wird Es wird damit vereinbart da die Funktion keinen Wert zur ckliefert es wird also ein Unter programm definiert Bei Pointern wird void verwendet wenn der Datentyp
107. i Unions sind alle Elemente redefiniert sie liegen also alle auf der gleichen Speicheradresse Eine Zuweisung an ein Element ver ndert also mehr oder minder planlos auch die ande ren Elemente Unions k nnen daher nur dann eingesetzt werden wenn eine Redefinition ben tigt wird Pointer sind in C Programmen sehr h ufig y vice C Skriptum Prei l 87 main union int value das ist der erste Teil der Union struct char first diese Struktur ist der zweite Teil char second Beispiel f r Pc int wird mit 2 Bytes half L nge angenommen number long index for index 12 index lt 300000 index 35231 number value index printf 8x 6x 36x n number value number half first number half second 10 2 9 Pointer Wie bei einer Sprache f r Systemprogrammierung zu erwarten gibt es in C viele Ein satzm glichkeiten bzw Notwendigkeiten f r Pointer Wenn Sie die Call by Value berga be bei Funktionsaufrufen umgehen wollen m ssen Sie quasi h ndisch die Adressen der formalen Parameter bergeben und im Unterprogramm mit diesen Pointern arbeiten Ar raybez ge ohne Indexangabe stellen immer die Adresse einen Pointer des Arrays dar Sehr viele Funktionen liefern oder erwarten Pointer Zum bequemen Umgang mit Pointern gibt es auch spezielle Operatoren amp gt die nur im Zusammenhang mit Pointern an gewendet werden k nnen Mit den Pointern kann man auch rechne
108. i Strukturen werden Pointer normal definiert statt struname element kann aber struname gt element verwendet werden include lt stdio h gt void main struct person char initial int age int grade struct person kids 12 point int index for index 0 index lt 12 index point kids index Pointerarithmetik point gt initial A index point gt age 16 point gt grade 84 kids 3 age kids 5 age 17 kids 2 grade kids 6 grade 92 kids 4 grade 57 for index O index lt 12 index point kids index printf c is d years old and got a grade of d n point initial kids index age point gt grade Auswerten der Kommandozei le beim Aufruf C Skriptum Prei l 9 1 Eine spezielle Pointeranwendung macht es m glich aus der Kommandozeile beim Pro grammaufruf Argumente zu bernehmen Ruft man also ein fertig compiliertes und ge linktes Programm z B a out exe auf dann k nnen neben dem Programmnamen Werte mitgegeben werden die vom Betriebssystem aufgenommen und an das aufgerufene Pro gramm weitergegeben werden Will man diese Werte im Programm nutzen so mu die Funktion main folgenderma en aussehen include lt stdio h gt int main int argc char argv Programm gibt Argumente mehrzeilig aus argc ist die Anzahl der Argumente argv ist ein Array von Pointern mit argc Elementen jeder Pointer zeigt au
109. ien sind portabel unter Umst nden ist eine Zeichenkonvertierung notwendig abh ngig vom verwendeten Code 9 3 2 bin re Files haben keine allgemeing ltige Struktur sie entstehen als 1 1 Kopien von Pufferinhalten bei Schreiboperationen Wird der Inhalt einer integer oder anderen Variablen in eine Datei geschrieben so landet er unver ndert Bit f r Bit auf der Platte Zu bin ren Files ben tigt man die zugeh rige Dokumentation ber ihren Aufbau dann kann man die passenden Lesebefehle implementieren um die Daten wieder sinnvoll zu lesen Alle grafischen Dateiformen BMP GIF PCX oder auch der von Comiler und Linker erzeugte OBJ und EXE File sind bin re Dateien Sie k nnen im Handbuch der Grafikfor mate den Aufbau einer BMP Datei studieren und diese z B komprimieren oder modifizie ren Das Betriebssystem kennt exakt den Aufbau einer EXE Datei was dringlich notwen dig ist um Programme zu starten Zum Speichern von Daten siehe die Automobildatei nehmen bin re Files mehrere bis viele Datens tze auf die alle den gleichen Aufbau festgelegt mittels C Strukturen haben Die Strukturdeklarationen ber den Aufbau der Datens tze der Datei stehen blicherweise in einer Headerdatei z B filename h Alle Programme welche die Datei nutzen wollen inkludieren diesen Headerfile definieren passende Variable vom Typ der Struktur und haben damit sinnvollen Zugriff auf die Daten Mangels End of File Zeichen wird EOF a
110. iffer verwandten Zahlen durch Striche ersetzt werden Zahlenverwandtschaft ergibt sich durch Einerstelle der Zahl gleich der Ziffer Zehnerstelle der Zahl ist gleich der Ziffer Mi die Quersumme der Zahl ist gleich der Ziffer die Zahl ist durch die Ziffer ohne Rest teilbar Mi Aende run gen k ek de de de dek dede de e de de e E erh KK et d hier sollten sp tere nderungen mit Datum und Text stehen A kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk include lt stdlib h gt include lt stdio h gt define CODE STRICH xdd void main int i ziffer einer zehner quersumme rest char strich CODE_STRICH dies ist ein semigraphischer Strich printf Selektiere Zahlen 0 99 die eine bestimmte Ziffer n printf enthalten deren Quersumme die Ziffer ist bzw die n printf durch die Ziffer ohne Rest teilbar sind n n do printf Geben Sie die Ziffer 2 9 ein scanf d amp ziffer gesicherte Eingabeschleife fflush stdin zum Einlesen eines Werts Mi while ziffer lt 2 ziffer gt 9 for i 0 i lt 100 i Schleife von 0 99 einer i 10 Einerstelle ist der Rest zehner i 10 ganzzahlige Division quersumme einer zehner rest LS ziffer if einer 0 printf n 10 Zahlen pro Zeile ergeben eine Zahlentabelle if einer ziffer pr fe auf die gepla
111. ig ausgetauscht Das ist beim Zugriff auf Tabellen bzw Pointerkonstrukte zul ssig weil der Compiler sowieso alle auf Zugriffe umsetzt Bei der Definition von Arrays bzw Pointer auf Arrays d rfen aber und kei nesgwegs ausgetauscht werden Allzuleicht definiert man statt wirklichen Speicherplatz blo einen Pointer Beachten Sie daher int tab 3 2 definiert ein 2 dimensionals Array mit Speicherplatz f r 6 integer int tab 3 definiert eine Tabelle mit Speicherplatz f r 3 Pointer auf integer int tab definiert nur einen einzigen Pointer auf Pointer auf integer char texte eine beliebige Textzeile dies ist ein Array mit verschiedenen Textzeilen allerdings sind die Texte String Konstante das Array enth lt durch Initialisierung nur die Adressen der Text Konstanten die Dimensionsausdehnung ergibt sich durch die Initialisierung Diese Definition ist selbsterkl rend C Skriptum Prei l 93 dynamisches Anfordern von Pointer werden in C auch oft in Zusammenhang mit dynamischer Speicherplatzverwaltung en zur Programm genutzt Dabei wird zur Laufzeit eine bestimmte Menge Bytes an Hauptspeicher an gefordert Funktion malloc auf die man nur mittels Pointer zugreifen kann Dies ist ein typischer Programmieransatz wie er zur Entwicklung komplexer Systeme notwendig ist Li aber von Sprachen wie Cobol oder Fortran nicht geboten wird vice Dieses Programm liest eine Datei ein und gibt sie
112. ile Bedingung while index lt 6 Statement z Aktion Aktion printf Statement index index 1 6 6 if else Beim if gibt es kein Schl ssel wort then C Skriptum Prei l 4 1 ein simples for Beispiel hnlich dem obigen while Beispiel include lt stdio h gt void main int index for index O index lt 6 index index 1 printf Der Wert der Variablen index ist momentan d n index include lt stdio h gt void main Was macht wohl dieses n chste Beispiel unsigned int z d schalter weiter for z 2 z lt 65535 z erh ht z um 1 Mi schalter weiter 1 for d 2 d lt z amp amp schalter weiter d amp amp ist logisches und if z d 0 schalter _weiter 0 wenn modulo z d 0 if schalter weiter 0 ist Ungleichheit printf u ist P zahl n z wenn ungleich dann drucke Die innere for Schleife enth lt nur ein if Kommando als Aktion Die for Schleife bietet das oben angezeigte Grundkonstrukt f r den Ablauf der einzelnen Teile Jede der 3 Statementgruppen kann auch weggelassen werden for rt ist die z hlende Endlosschleife mit i als Z hler for Gasen ist eine einfache Endlosschleife die klassische Bedingung true Aktion false Aktion if bedingung true_aktion else false_aktion nur bei Bedarf Wie auch bei while etc ist die Bedingung in runden Klammern zu schreiben Ein then gibt es
113. in einer Datei Das Programm liegt nun im Sourcecode oder Quelltext vor 2 Mit dem Compiler bersetzten wir das Programm in die Maschinensprache des Rech ners 3 Dabei wird unser Programm auf Syntaxfehler berpr ft Gibt es welche dann endet die Compilierdurchf hrung mit Fehlermeldungen und oder Warnungen Wir m ssen die Fehler mit Hilfe des Editors ausbessern und erneut das Compilerprogramm starten 4 War unser Compiler erfolgreich so liegt jetzt ein sogenannter Objektmodul vor darin sind alle Befehle und auch Variable unseres Programms in Maschinensprache Dieser ist aber noch unbrauchbar weil zur Ausf hrung noch weitere vorgefertigte Teile bzw weitere eigene Funktionen ben tigt werden 5 Mit dem Linker Binder werden daher alle ben tigten Objektmodule zu unserem Mo dul dazugebunden Jetzt ist unser Programm ein ausf hrbares Programm und kann gestartet werden 6 Leider arbeiten Programme nicht gleich richtig und es m ssen beim Testen noch se mantische Fehler gefunden und korrigiert werden Daf r kann man einen Debugger verwenden ein Programm welches unser Programm schrittweise ausf hrt und dabei auch den Inhalt von Variablen anzeigen kann Ein Debugger erm glicht sinngem ei nen Schreibtischtest am Computer Wenn Fehler gefunden werden dann mu unser Programm Quelltext ge ndert werden und wir beginnen wieder bei 1 C Skriptum Prei l 1 9 Fr her wurden diese Schritte mit getrennten Programmen Editor Co
114. ionen der Datei bekannt in der sie de finiert wurde extern Deklarationen sind nicht m glich register ist nur bei lokalen Variablen m glich diese Angabe sagt dem Compiler da er die Variable in ein Register legen soll aber nicht mu Deshalb kann der Operator amp Adresse von nicht auf Variablen mit dem Speicherplatzattribut register ange wendet werden Register ist eigentlich keine richtiges Speicherklassenattribut und bei den heutigen Compilern auch nicht mehr notwendig typedef hat eigentlich nichts mit Speicherklassen zu tun bietet auch nicht die M glichkeit neue Typen zu vereinbaren man kann lediglich neue synonyme Namen f r beste hende Typen vergeben blicherweise werden die durch typedef erzeugten Namen in Gro buchstaben geschrieben Der bekannteste typedef ist typedef struct _iobuf FILE Man kann daher jederzeit FILE schreiben obwohl immer eine Struktur vom Typ _iobuf gemeint ist C Skriptum Prei l 5 9 Speicherklasse G ltigkeit global Block Funktion Block Funktion Block Funktion Block Funktion static bei lokal Block Funktion statie bei global Bei Funktionen gilt normal global als Speicherklasse weil die Funktion au erhalb anderer Funktionen definiert wird Static ist als Zusatz m glich wodurch die Funktion nur mehr von anderen Funktionen derselben Datei aufgerufen werden kann Hier folgt ein an sich schlechtes Programm der Sachverhalt wird aber gut demonstriert int count 3
115. ispielen konnte man den Prob Symbol Anweisung leml sungsplan stets als eine Folge von einmal hin auch Sequenz Folge tereinander auszuf hrenden Anweisungen darstellen Die obige Darstellung besteht daher auch nur aus 3 hintereinander ausf hrbaren Anweisungen die als rechteckige K stchen dargestellt sind Dieses Symbol f r die einzelne Anweisung bzw f r einen Verarbeitungsschritt nennt man auch Sequenz oder Folge weil man meist meh rere K stchen untereinander anordnet und auch exakt in dieser Reihenfolge abarbeitet M nzer simple Variante Beispiel Bedienung eines M nzfernsprechers zuerst eine simple Version bei der einzelne An weisungen hintereinander ausgef hrt wer W hlzeichen ert nt den Man spricht in jedem Fall egal ob sich der Gespr chspartner meldet oder nicht Nummer w hlen Man sollte eine sinnvollere Variante ent sprechen werfen bei der man mehrere W hlversuche machen kann Daf r ben tigt man aber H rer einh ngen Symbole f r die wiederholte Durchf hrung Restm nzen entnehmen Manche Probleme lassen sich aber nicht mittels einer einfachen Reihenfolge l sen Bei spielsweise werden einzelne Anweisungen nur dann ausgef hrt wenn bestimmte Bedin gungen zutreffen Umgangssprachlich formuliert sagt man Wenn Bedingung dann An weisung oder auch Wenn Bedingung dann Anweisung 1 sonst Anweisung 2 Auch ist es machmal sinnvoll einzelne Anweisungen mehrfach zu wiederholen
116. ken von Funktionstasten 1 10 Cursortasten und der 6 Tasten oberhalb der Cursortasten zu registrieren In diesen speziellen F llen werden quasi zwei Zeichen geliefert Beim erstenmal liefert getch den R ckgabewert 0 man mu nochmal mit getch lesen und erh lt nun einen Code f r die jeweilige Taste Schreiben Sie selbst ein kleines Versuchprogramm um die Werte zu testen F r die Ausgabe kann man verwenden Achtung nur beim Borland Compiler elrser l scht den Bildschirm gotoxy x Wert y Wert normalerweise wird eine Ausgabe am Bildschirm genau dorthin geschrieben wo gerade der Cursor steht Will man den Cursor versetzen so kann man gotoxy verwenden Beachten Sie da x die Spalte und y die Zeile ist W hrend getch und getche noch auf allen PC Compilern funktioniern sind diese Ausga bebeispiele nur mehr bei einem bestimmten Compilerhersteller verf gbar Im allgemeinen sollte man versuchen mit C Funktionen auszukommen die genormt und berall verf gbar sind Beispielsweise w rden die beiden printf Befehle genau das gleiche tun wenn man den Treiber ansi sys in der config sys geladen hat printf 033 2J Bildschirm l schen printf 033 d dH zeile spalte Cursor positionieren C Skriptum Prei l 3 7 bungen e Die Anzahl der Ziffern einer positiven ganzen Zahl ermitteln die in einen long Daten typ eingelesen wird e Text einlesen und die einzelnen Zeilen verkehrt ausgeben e Entwickeln Si
117. l strcpy student Ill Lunch Teebutter student 1 grade 77 student 7 descrip age 14 student 12 grade 87 9 3 Funktionen f r die Dateibearbeitung mit Beispielen Aus der Sicht eines Programms sind Dateien in der Regel Files die in einem vom Be triebssystem unterst tztem Filesystem auf Festplatten oder anderen Datentr gern gespei C Skriptum Prei l 7 1 chert sind Bei vielen Betriebssystemen werden aber auch Ger te wie Tastatur Drucker schnittstelle serielle Schnittstelle Bildschirm als spezielle Formen von Dateien betrachtet C sieht Dateien grunds tzlich als Streams Datenstr me sequentiell hintereinander ange ordnete Bytes mit Zeichen oder Bin rdaten Jedes File ist eine geordnete Folge von Zei chen Innerhalb der Zeichen gibt es blo eine logische Gliederung 9 3 1 Textfiles bestehen aus ASCII Zeichen genormten Steuerzeichen CR LF HT VT und lt STRG gt Z zum Markieren des Dateiendes Ihre Programmdateien name c sind typische Textdatei en sie haben eine Zeilenstruktur wobei die Zeilen unterschiedlich lang und durch ein Zei lenende Zeichen CRLF abgeschlossen sind Bei der I O solcher Dateien werden durch scanf printf numerische Daten von einer Zei chenfolge in der Datei in die internen Darstellung eines integers und umgekehrt konver tiert Am MS Dos System wird beim Einlesen aus CR LF gt LF n bei Ausgabeoperati onen umgekehrt aus LF gt CR LF Textdate
118. l im Array vorkommen Hinweis Zeichen werden durch Code Ascii dargestellt e Ermitteln Sie das erste und das letzte Vorkommen der Zahl 3 in einem Array e Sortieren Sie ein Array unter Verwendung des Selection Sort e Verbessern Sie den Bubble Sort indem Sie eine der vorgeschlagenen Erweiterungen einbauen e Schreiben Sie ein Programm welches das Einmaleins in optisch guter Darstellung am Bildschirm ausgibt C Skriptum Prei l 3 2 5 5 Beispiele f r Ein Ausgabe verschiedener Datentypen lese Zahlen bis Eingabe 0 schreibe summe Damit man bequem Ein und Ausgabebefehle Input Output I O durchf hren kann gibt es in C die sogenannte Standardeingabe normal ber Tastatur und Standardausgabe normal am Bildschirm die immer verf gbar ist Sp ter im Skriptum wird auch Ein Aus gabe auf Dateien Daten auf einer Diskette oder Festplatte verwendet Weil die Ein Ausgabebefehle je nach Objektart Datentyp der Variablen unterschiedlich sind werden an dieser Stelle die verschiedenen M glichkeiten gezeigt Alle Befehle sind auf allen C Compilern aller Computer gleich entsprechen der C Norm und werden auch mit Dateien in hnlicher Form funktionieren Wenn man sie verwendet dann mu man include lt stdio h gt in den Programmkopf schreiben Statt Variablenname setzt man jeweils den Namen der eigenen Variablen ein EEE Eingabebefehle Ausgabebefehle int Ganzzahl scanf d amp Variablenname printf d Variablenname
119. le static informieren den dem Compiler extern register bzw oder dienen ber haupt anderen Zwecken typedef lokale Variable defniert innerhalb der einer Funktion Diese Variable ist nur inner halb der Funktion bzw des Programmblocks g ltig Bei jedem Aufruf der je weiligen Funktion wird die Variable neu angelegt beim Funktionsende verworfen globale Variable defniert au erhalb der einer Funktion Variable die au erhalb von Funktionen definiert werden sind globale Variable sie leben w hrend des gan zen Programms und sind berall im Programm bekannt Damit der Compiler solche Variable auch in gesondert compilierten Funktionen korrekt erkennt ist dort eine Deklaration notwendig die genauso aussieht wie die Definition allerdings schreibt man das Speicherplatzattribut extern davor int varname globale Variable definiert au erhalb von extern int varname Deklaration notwendig in anderen Dateien die zum gleichen Programm geh ren informiert den Compiler da es eine globale integer Variable namens varname gibt static als Zusatz zu lokalen Variablen ver ndert die Lebensdauer diese ist jetzt das ge samte Programm Der G ltigkeitsbereich bei lokalen in der Funktion definierten Variablen bleibt aber die Funktion Wird static bei externen Variablen au erhalb der Funktion verwendet so ndert sich die G ltigkeit die Variable ist nur mehr begrenzt global sie ist nur mehr in den Funkt
120. le legt durch int fest da strlen einen Funktionsr ckgabewert vom Typ int zur ckliefern wird char stri beschreibt einen Parameter die Eingangsgr e ein char Array Die eckigen Klammern sind deshalb leer weil das Array immer die Gr e jenes Arrays annimmt das beim Funktionsaufruf mitgegeben wird Als letztes Statement der Funktion findet sich return i wodurch der errechnete Wert zur ckgegeben wird Bei void main ist das Fehlen von Parametern leicht festzustellen Durch void wird zu s tzlich festgelegt da es auch keinen Funktionsr ckgabewert gibt Funktionen ohne R ckgabewert nennt man Unterprogramme auch Proceduren bzw Subroutinen In C sind Unterprogramme also als Spezialfall einer Funktion m glich in den meisten anderen Sprachen werden Unterprogramme durch den Befehl CALL aufgerufen Bei Funk tionen wird hingegen immer der Funktionsr ckgabewert genutzt Funktionen werden daher so verwendet als w ren sie Variable Einer Variablen kann man allerdings auch Werte zuweisen bei Funktionen ist das nicht m glich Den einfachsten Fall eines Unterprogramms zeigt das folgende Beispiel void updruck Unterprogramm welches eine Textzeile ausgibt Ir printf und UP Zeilenabschlu ausgeben n C Skriptum Prei l 5 3 void main printf Zeile 1 ausgeben updruck wird mehrfach aufgerufen updruck die Aktivit t ist jedesmal genau printf Zeile 2 ausgeben gleich
121. leich vorgehen Die ben tigten Dateien m ssen namentlich im Projekt File genannt werden Im Turbo C 2 0 mu te man noch eine normale Datei namens prog prj anlegen in der die Dateinamen aller f r das endg ltige C Programm notwendigen Dateien stehen mu ten In allen neueren Compilern gibt es eigene Men punkte Open Project wo man die Zusam mengeh rigkeit mehrerer Dateien zu einem Programm festlegen kann Es w re noch m g lich zus tzliche xx c oder xx obj oder xx lib Dateien anzugeben falls ben tigt Die compi lerspezifische name lib Datei wird automatisch von Linker verwendet Eine xx lib Datei enth lt lediglich mehrere xxx obj Dateien die vom Linker verwendet werden falls dies notwendig ist C Skriptum Prei l 5 8 7 4 lokale globale Variable Speicherklasse Lebensdauer und G ltigkeitsbereich Allgemein gesehen gibt es in guten Programmiersprachen globale und lokale Variable lokal in einer Funk nur w hrend die nur im Pro Lebensdauer ist tion Funktion l uft grammblock Programmlaufzeit global au erhalb einer die gesamte Pro gesamtes Pro G ltigkeit ist nur Funktion grammlaufzeit gramm mehr Datei Syntax bei der Variablendefinition Speicherklassenattribut Datentyp Typattribut Name Initwert Name Initwert Die Speicherklasse einer Variablen lokal oder global wird nur durch den Ort der Vari ablendefinition bestimmt Die Speicherplatzattribute beeinflu en die Eigensschaften der Variab
122. ler d n i exit 1 exit 0 In der n chsten Zeile steht der Inhalt der Datei fiobsp 2 nach Programmende Danach fin den Sie alle Meldungen die dieses Programm auf stdout ausgegeben hat abcdefghijklmnopgrstuvwxyz0123 89 die Position in der Datei ist 0 nach 1 fread steht fgh im buffer C Skriptum Prei l 77 die Position in der Datei ist 8 nach 2 fread steht mnop im buffer die Position in der Datei ist 16 die Position in der Datei ist 34 Nach diesem inhaltlich eher sinnlosen Programm folgt jetzt ein gr eres Programm wel ches eine Datei mit Autodaten bearbeitet In einer seperaten h Datei findet sich der Da tensatzaufbau etc Die einzelnen Funktionen sollten als einzelne Dateien gespeichert wer den jede Datei enth lt include auto h hier folgen alle in Serie auto h Headerdatei f r das Autodatei Programm include lt stdio h gt h ufig ben tigte includes include lt conio h gt define FALSE 0 und defines define TRUE 1 Prototypen der Funktionen autoinsert FILE autodat neue Autos einf gen autolist FILE autodat Autos einfach auflisten autosort FILE autodat Datei sortieren autogrupp FILE autodat einfache Liste gruppiert nach Marke Type autorewrite FILE autodat Preiserh hung aller Autos 1 lesen ndern und r ckschreiben struct automobil Aufbau der Datensatz Struktur der Datei char marke 21 Marke des Autos VW cha
123. ll alle Fragen die dem Benutzer vor und w hrend der Arbeit mit dem Programm kommen beantworten k nnen Sie wird in normalen deutschen S tzen nicht in Computer slang abgefa t Folgende Punkte sollten enthalten sein berschrift mit kurzer Erkl rung des Programmes Installation des Programmes Hardware u Softwareanforderungen Start des Programmes Bedienungsanleitung Ein Ausgaben wichtige Tasten Verhalten im Fehlerfall Weitere wichtige Informationen z B Einschr nkungen 1 6 Allgemeine Eigenschaften eines guten Programmes 1 aus der Sicht des Anwenders Das Programm mu richtige Ergebnisse liefern und absturzfrei laufen F hrung des Benutzers mit Men Strukturell gleich aufgebaute Bildschirmseiten Gleiches an gleicher Stelle z B Meldungszeile e Erkl rende Texte bei Eingaben und Ausgaben von Werten e Eingabe berpr fungen e Genaue Fehlermeldungen nicht Fehler besser Datei nicht gefunden noch besser Benutzeranleitung e Hilfetexte die immer mit derselben Taste meist F1 erreichbar sind 2 ausder Sicht der Wartung Programmierrichtlinien beachten Programmaufbau Konstantenvereinbarungen z B define GROSS 10 e Code strukturiert schreiben einr cken und untereinander e Sprechende Namen verwenden Ausf hrliche Kommentare z B bei schwierigen Algorithmen C Skriptum Prei l 1 3 2 Allgemeines zu C C ist eine universelle Sprache f r komplexere Aufgaben In
124. lle Operatoren f r die Pointer amp gt C Skriptum Prei l 8 8 include lt stdio h gt void main nochmal in einem abgeschlossenem Programm int index ptl pt2 index 39 irgendein numerischer Wert pti amp index die Adresse der Variablen index pt2 pt1 printf Der Wert ist d d d n index ptl pt2 ptl 13 der Wert von index wird ver ndert printf Der Wert ist d d d n index ptl pt2 Pointern kann man mit dem amp Operator Adressen von anderen Variablen zuweisen Auch viele Funktionen liefern einen Pointer als Funktionswert zur ck In Sonderf llen bei ex trem systemnaher Programmierung kann man auch absolute Adressen zuweisen Der Poin ter gilt als leer zeigt nirgendwo hin wenn er NULL enth lt Wie man in stdlib h nachle sen kann gilt define NULL void 0 Die 0 ist hier als absolute Adresse zu verste hen void ist ein cast Operator der die integer 0 in einen Pointer konvertiert der auf void zeigt Pointer auf void stellen einen Sonderfall dar sie zeigen auf keinen bzw auf einen noch unbekannten Datentyp Der Operator kann nicht auf einen void Pointer ange wendet werden Der void Pointer hat damit die Funktion eines Zwischenspeichers von Adressen und wird haupts chlich dann angewendet wenn noch nicht bekannt ist auf welchen Datentyp der Pointer zeigt Ein void Pointer kann mittels cast Operator in einen anderen Pointer umgewandelt werde
125. lle Variab len definiert und die eigentlichen Programmbefehle geschrieben Die Programmbefehle werden sequentiell hintereinander bzw gem dem Ablauf von Befehlen wie if while switch abgearbeitet Abgesehen davon da Codeteile ausgelassen if oder andere Codetei le wiederholt ausgef hrt werden while for folgt die Programmabarbeitung im Groben der Reihenfolge von oben nach unten durch die Funktion main Unsere bisherigen Probleml sungen waren cher klein f r ernsthafte Probleme m te man aber den Code und damit die Funktion main wesentlich vergr ern An einer Funktion kann aber praktisch nur eine Person arbeiten folglich w ren gro e Softwareprojekte niemals denkbar Die gesamte Aufgabenstellung wird daher m glichst sinnvoll in Teilbereiche aufgeteilt Module werden gebildet Bei gr eren Softwareprojekten ist genau diese Modularisierung die anspruchsvollste und schwierigste Programmieraufgabe seien Sie froh da Sie vorl u fig nur mit kleinen Programmieraufgaben befa t sind Jeder Teilbereich ist nun eine eigen st ndige berschaubare Einheit die auch arbeitsm ig bew ltigbar ist Aus der Sicht einer Programmiersprache steckt der gesamte Programmcode nicht in der Funktion main sondern wird auf mehrere bei gr eren Aufgaben auch viele Funktionen aufgeteilt Der Programmablauf beginnt nach wie vor in main beim Aufruf einer Funktion bzw eines Unterprogramms wechselt die Programmausf hrung aber dorthin arbeitet
126. lt stdio h gt hier enthalten ist ein define EOF 1 void main dies ist ein Kopierprogramm alle eingelesenen Zeichen kommen unver ndert in die Ausgabe int zeichen char chr zeichen getchar while zeichen EOF chr zeichen printf c chr zeichen getchar zeichen mu int sein sonst kann EOF nicht erkannt werden Im Gegensatz zu anderen Sprachen wo es f r das Einlesen Sprachbefehle gibt sind in C alle Lese und Schreibaktivit ten durch Funktionen gel st Das wiederum erm glicht da direkt in der Bedingung einer while Schleife nicht nur die EOF Abfrage steht sondern auch die Lesefunktion geschrieben wird Dies ist mit allen drei Lesefunktionen m glich include lt stdio h gt ebenso m glich ist daher diese Variante void main dies ist ein Kopierprogramm alle eingelesenen Zeichen kommen unver ndert in die Ausgabe int zeichen char chr while zeichen getchar chr zeichen printf c chr EOF Verschiedene Auspr gungen des printf Befehls genauer der Funktion printf include lt stdlib h gt Diese beiden include sollten in include lt stdio h gt jedem Programm stehen main es wird das Ausdrucken von Variablen demonstriert int a gew hnliche integer Typ long int b long integer Typ short int c short integer Typ unsigned int d unsigned integer Typ char
127. m File f R ckgabewert ist die Anzahl formatierter Elemente oder EOF int fseek FILE f long anz int art verstellt die aktuelle Positionierung im File abh ngig von art Filebeginn ende aktuelle Position um anz Bytes bzw auf das durch anz bezeichnete Byte fseek f 12 SEEK_SET auf das 11 Byte von vorne int fsetpos FILE f fpos_t pos setzt ein Positionierung im File die fr her mit fgetpos ermittelt wurde long ftell FILE f liefert die aktuelle Positionierung von Filebeginn oder EOF size_t fwrite void p size_t size size_t nelem FILE f schreibt ab Adresse p size nelem Bytes nach File f R ckgabewert ist nelem wenn ok oder lt 0 wenn fehlerhaft int gete FILE an gleich wie fgetc ist aber ein Macro int getchar gleich wie fgetc stdin char gets char s liest eine Zeile nach s ersetzt n durch 0 keine L ngenbe schr nkung m glich R ckgabewert NULL oder s void perror char s schreibt den Text der letzten internen Fehlermeldung nach stderr Der String in s wird getrennt durch vor die Fehlermeldung gestellt int printf char format wurde bereits in Kapitel 3 gr ndlich erl utert int putc int c FILE an gleich wie fputc ist aber ein Macro int putchar int c gleich wie fputc c stdout int puts char s schreibt den String s nach stdout und h ngt noch ein n an R ckgabewert gt 0 wenn ok sonst EOF int remove char fnam l scht die Datei mit Namen fnam R ckgabe 0 wenn ok int renam
128. m besseren Verst ndnis printf d taste if taste lt 256 printf c taste gotoxy 5 24 switch taste Auswerten der gedr ckten Taste case a case printf Men punkt A noch nicht implementiert break case 3 case printf Men punkt B noch nicht implementiert break case case printf Men punkt C noch nicht implementiert break case e case E taste E break default gotoxy 5 24 printf falsche Taste w hlen Sie einen Men punkt delay 2000 2 sec warten damit man Fehlermeldung lesen kann printf Bye n n 6 9 goto ja auch dieses Statement existiert Wo ein goto existiert mu es auch Labeln geben die mit dem goto angesprungen werden Beides ist in C m glich Weil alle notwendigen Statements f r die Realisierung struktu rierter Programme vorhanden sind gibt es wenig Grund einen goto zu verwenden Das folgende Beispielprogramm ist zwar ein abschreckendes Beispiel zeigt aber gleichzeitig die wahrscheinlich einzige sinnvolle Nutzung des goto Statements C Skriptum Prei l 45 kein Vorbild include lt stdio h gt void main int hund ochse schwein goto start_ist_hier irgendwo printf Eine andere Zeile aus diesem Mist n goto genug _ ists in der innersten Schleife steht der einzige sinnvolle goto start_ist_hier for hund 1 hund lt 6 hund t for ochse 1 ochse lt 6 ochse t for schwein 1 schwein lt 4
129. matischen Konvertierungen Andere Sprachen konvertieren automatisch was nicht immer im Sinne des Programmierers ist Auch in C wird sehr viel automatisch konvertiert was viel Mitdenken durch den Pro grammersteller erfordert Verlassen Sie sich nicht zu sehr auf automatische Konvertierungen Sehen Sie sich Ihre eigenen Programme einige Monate nach der Fertigstellung nochmals an und f llen Sie ein selbstkritisches Urteil Wenn Sie noch mutiger sind lassen Sie Ihr Programm von Kollegen begutachten erz hlen Sie aber das Programm h tte irgendein Unbekannter verfa t C Skriptum Prei l 22 5 Variable Datentypen und Konstante in C Namen geben Sie Ihren Variablen und Funktionen Variable k nnen Inhalte in einem bestimmten Datentyp aufnehmen geh ren zu ei nem Objekttyp Namen von Variablen und Funktionen bestehen in C aus Buchstaben dem Unterstrei chungszeichen _ und aus Ziffern Die erste Namensstelle darf keine Ziffer sein und sollte kein Unterstreichungszeichen sein weil sehr viele compilerinterne Namen damit beginnen Gro und Kleinbuchstaben werden unterschieden Es ist blich sogenannte symboli sche Konstante die mit dem define definiert werden und auch Namen aus typedef Definitio nen vollst ndig mit Gro buchstaben alle ande ren Namen Variable Funktionen vollst ndig Gesperrte W rter in C in Kleinbuchstaben zu schreiben Die L nge der auto double int struct Namen ist beliebig mindestens 5
130. men durchgef hrt mit Variable allgemein Daten zusammengefa t zu Reelle Zahlen Objektart C Skriptum Prei l 7 bungen Verfassen Sie Probleml sungspl ne f r die folgenden Probleme e Sie sollen einem nicht ortskundigen Freund Ihren Schulweg erkl ren Mit Ihren schrift lichen Aufzeichnungen soll dieser m glichst schnell zur Schule gelangen e Kaffee kochen mit einem Filterautomat e Mit einem Auto wegfahren e Tanken bei einer Selbstbedienungstankstelle 1 3 Probleml sung speziell am Computer Probleml ser ist der Computer der Algorithmus ist das Ver fahren der Probleml sung Struktogramme stellen Algo rithmen graphisch dar Wenn ein Computer die Probleml sung ausf hrt so mu der Probleml sungsplan nicht nur sinnvoll und richtig sein er mu auch bis auf den letzten Beistrich exakt und genau formu liert werden noch dazu in einer Programmiersprache Schon bei kleinen Fehlern lehnt der Computer die Probleml sung ganz ab oder macht unvorhergesehene Dinge Das Erlernen einer Programmiersprache ist Gott sei Dank wesentlich einfacher als beispielsweise Fran z sisch zu lernen Beherrscht man die Sprache einigerma en mu man sich auch Gedan ken ber die sinnvolle Anwendung machen Schlie lich k nnte man ja auch im Deutschen grammatikalisch richtige aber inhaltlich vollkommen sinnlose S tze bilden hnlich verh lt es sich bei Programmiersprachen Als Syntax einer Sprache bezeichnet man die richtige Schreibw
131. mentan d n index index 3 printf Der Wert der Variablen index ist momentan 3d n index Die Programmausgabe w rde folgenderma en aussehen Der Wert der Variablen index ist momentan 13 Der Wert der Variablen index ist momentan 2727 Der Wert der Variablen index ist momentan 3 Ein bersichtlicher Programmierstil erleichtert das Verst ndnis eines Programms gewaltig Weil Sie in C aber an keinerlei Spaltenbegrenzungen gebunden sind der Code wird vom Compiler als ein endloser Befehlsstrom interpretiert lediglich Preprocessoranweisungen beginnen am Zeilenanfang mit einem und enden in derselben Zeile k nnen Programme auch sehr schlecht geschrieben werden include lt stdio h gt void main Das Hauptprogramm startet hier printf Gute Form printf kann helfen printf ein Programm zu verstehen n printf Schlechte Form printf macht ein Programm printf unleserlich n besser w rde dieses Programm aber so aussehen include lt stdio h gt void main Das Hauptprogramm startet hier printf Gute Form printf kann helfen printf ein Programm zu verstehen n printf Schlechte Form printf macht ein Programm printf unleserlich n C Skriptum Prei l 1 8 Wesentlich f r eine saubere Programmgestaltung sind Einr ckungen Wann immer zu sammengesetzte Befehle verwendet werden bzw wenn eine geschwungene Klammer auf geschrieben wird sollte man di
132. mpiler Linker De bugger ausgef hrt Insbesondere am PC gibt es heute Integrierte Entwicklungsumgebun gen die alle Funktionalit t unter einer men gesteuerten und mausunterst tzten Oberfl che anbieten Ebenfalls mit dabei sind Hilfesysteme die teilweise schon Zugriff und Suche auf in allen Handb chern der Programmiersprache erm glichen Lediglich die Bedienung wurde verbessert die Arbeitsvorg nge sind aber die gleichen geblieben auch die jeweiligen Dateien pname c Quellcode pname obj Objektmodul pname exe ausf hrbares Programm sind noch immer die gleichen Mit gt standard lib lt liegt eine sogenannte Bibliothek Library vor in der vorgefertigte Objektmodule enthalten sind Editor pname c Tastatureingabe pname obj Compiler 4 Linker pname exe standard lib bungen das fertige startbare Programm e Sie m ssen die Programmierumgebung Ihres Compilers in den Griff kriegen Nehmen Sie das gr ere Beispielprogramm und versuchen sie es zum Laufen zu bringen Geben Sie auch den Wert der Variable index mit aus Versuchen Sie auch mit dem Debugger eine schrittweise Durchf hrung Ihres Programms e Setzen Sie das Struktogramm eines einfachen fr heren Beispiels aus den fr heren bungen in ein C Programm um und entwickeln es am Rechner C Skriptum Prei l 20 4 Richtlinien zur vern nftigen Programmierung Zuerst denken dann den Pro grammcode schr
133. n Hier folgen aber nur triviale Sortieralgorithmen wir sind ja auch erst im ersten Drittel des Skriptums Selection Sort Select Sort Sortieren durch direktes Ausw hlen Sortieren durch Minimumsuche Metho de des kleinsten Elementes Man sucht das kleinste Element im Array und tauscht es gegen das an erster Stelle befindli che aus anschlie end sucht man das zweitkleinste Element wird dadurch gel st da man im Array ab der zweiten Stelle das kleinste sucht und tauscht es gegen das an zweiter Stelle befindliche aus usw Der Positionszeiger r ckt immer weiter links von ihm ist bereits alles sortiert nur mehr der Rest wird durchsucht Man ben tigt ungef hr n 2 Vergleiche und n Austauschoperationen Bubblesort Sortieren durch direktes Austauschen Sprudelmethode Elementares Sortierverfahren auch dieses mu jedermann frau im Schlaf beherrschen Benachbarte Elemente beginnend mit dem ersten werden verglichen und wenn n tig gem der Sortierreihenfolge ausgetauscht Der Vergleich ali gt alit1 wenn TRUE wird getauscht f hrt dazu da nach dem ersten Durchlauf das gr te Element an der letzten Stelle steht nach n 1 Vergleichen Ung nstigster Fall Wenn der kleinste Wert an der letzten Stelle steht Turtle dann m s sen n 1 Durchl ufe gemacht werden bis er an die erste Stelle kommt n 1 Vergleiche n 1 Durchl ufe n 1 Vergleiche das entspricht etwa n Im g ns tigsten Fall eines ber
134. n char Pointer char void Pointer Ein Pointer ist auf Unix Maschinen und PCs mit Small Modell identisch mit einem integer Deshalb gab es in der Vergangenheit gelegentlich unseri se Programme es wurden Pointer in integer Variablen abgespeichert Pointer die auf unterschiedliche Datentypen zeigten wurden vermischt etc Pointer sind aber generell eigene Variable Auf PCs im Large Modell sind Pointer 4 Byte ein int aber nur 2 Byte lang Jeder Pointer mu exakt definiert sein auf den richtigen Datentypzeigen der Pointer darf nicht als Pointer auf char definiert sein wenn im Speicher tats chlich ein integer steht Wenn Sie mit der Funktion scanf Variable einlesen wollen so d rfen Sie diese Variable nicht normal als Parameter bergeben Vielmehr mu mit dem Operator amp die Adresse der Variablen bergeben werden So ist garantiert da scanf in den Parametern auch Werte zur ckliefern kann Das gilt nat rlich f r jeden anderen Funktionsaufruf wo Sie ber die Parameter Werte zur ck haben wollen int i j scanf d amp i Die Funktion scanf erwartet Adressen der Variablen scanf d amp j d bedeutet integer lesen und dorthin stellen wo der pointer auf int amp j gerade hinzeigt Diese Methode eine Call by Adress zu erzwingen kann man sich bei Arrays ersparen weil diese ohnehin als Adresse des ersten Elements gelten wenn kein Index angegeben wird Werden bei mehrdimensionalen Arrays hinten I
135. n etc aufbereitet und in s bis zur maximalen L nge von n 1 abgespeichert R ckgabewert ist L nge von s oder 0 time_t time time_t zs die aktuelle Maschinenzeit wird im Zeitformat time_t in zs abgelegt wenn zs NULL und auch zur ckgegeben oder 1 bei Fehler C Skriptum Prei l 1 04 Zum besseren Verst ndnis noch eine berblicksdarstellung der Funktionen z N z N double clock t en time S g clock A ctime sfr N char gt mktime at EE R asctime gmtime strftime localtime gt structtm 11 2 Grafikm glichkeiten unter DOS mit Borland BGI Turbo C verf gt ber die Bibliothek GRAPHICS LIB mit ber 70 Grafikfunktionen f r Linien Figuren Fl chenf llung Schriftarten etc die in der Datei graphics h als Prototy pen deklariert sind Der Bildschirm unter DOS funktioniert entweder im Text oder im Grafikmode Als erstes mu der Schirm die Grafikkarte in den Grafikmode EGA VGA umgeschaltet werden int graphdriver graphmode errorcode graphdriver DETECT die Bestimmung des installierten Grafik Adapters EGA VGA geschieht somit automatisch initgraph amp graphdriver amp graphmode c te bgi pr ft die Hardware schaltet in den Grafikmodus und l dt das entsprechende Treiberprogramm EGAVGA BGI aus dem angegebenen Verzeichnis 3 Parameter Ein Leerstring bedeutet aktuelles Verzeichnis Die Funktion graphresult liefert den Fehlercode der letzten Grafikoperation und setz
136. n was aber etwas un gew hnlich funktioniert Selbstverst ndlich werden Pointer auch zur dynamischen Haupt speicherplatzverwaltung ben tigt POINTER in C werden nicht als blo e Adressvariable sondern immer als Variable definiert welche die Adressen bestimmter anderer Variablentypen aufnehmen k n nen Man spricht daher immer von Pointer auf int oder Pointer auf Pointer auf int bedeutet da auf der Adresse die der Pointer enth lt eine int Variable steht erwartet wird Diese int Variable wird angesprochen wenn man den Operator auf den Pointer anwendet W h rend man im Assembler mit der Adresse alleine auskommen kann mu ist es in einer Hochsprache notwendig da der Compiler auch den Datentyp jeder Variablen auch einer solchen die mit Pointer adressiert wird kennt damit Ausdr cke korrekt bearbeitet werden k nnen Einen Pointer definiert man hnlich wie eine normale Variable vor den Variablennamen Pointernamen stellt man aber einen Stern der in diesem Zusammenhang aber kein Ope rator ist int ptr definiert einen Pointer auf int namens ptr float fpt definiert einen Pointer auf float int a b a 12 ptr 8a ptr enth lt nun die Adresse von a b ptr der Wert der int Variablen auf die der Pointer ptr zeigt wird der Variablen b zugewiesen Weil ptr als Pointer auf int definiert ist wird keine Konvertierung vorgenommen b a h tte die gleiche Zuweisung bewirkt Mi Spezie
137. nclude lt stdio h gt void main wie man sieht ein while Beispiel int count count 0 while count lt 6 printf Der Wert von count ist d n count count count 1 Durchl ufe 0 1 2 3 4 5 count hat nachher den Wert 6 C Skriptum Prei l 3 9 Die while Schleife ist in Programmen immer anzuwenden wenn bestimmte Anweisungen codieren Sie keine wiederholt ausgef hrt werden m ssen Beachten Sie aber da mindestens ein Befehl in Endlosschleiten nerhalb der Schleife dazu f hren mu da die Bedingung irgendwann false wird weil ansonsten die Schleife ewig l uft und das Programm nie mehr zu seinem geplantem Ende kommt Hier folgt eines der vielen Programme das Schleifen ben tigt Die u ere Schleife sorgt Wichtig f r die Eingaben durch den Benutzer erstmals in diesem Skriptum erh lt der Benutzer eine Eingabeaufforderung was halten Sie davon und das Programmende Die innere geschachtelte Schleife f hrt die Potenzierungsberechnung durch include lt stdio h gt void main Programm berechnet x hoch y int x 0 y 0 yausgabe double ergebnis 0 printf nProgramm zur Berechnung von x hoch y f r Zahlen gt O n n printf x hoch y Bitte X Leerzeichen und Y eingeben return Taste scanf d amp x scanf d amp y while x gt 0 amp amp y gt 0 amp amp bedeutet und ergebnis x yausgabe y wozu gibt es die Variable yausgabe
138. ndeinem Dialekt geschrieben sondern im sogenanntem K amp R Ker ninghan und Ritchie C Durch das Buch Programmieren in C haben sie nicht nur die Syntax sondern auch den Stil von C Programmen vorgegeben soda zwischen genormten und fr heren Programmen nur geringe Unterschiede bestehen Wesentliche Unterschiede bei verschiedenen C Compilern ergeben sich haupts chlich bei Compiler oder maschinen spezifischen Erweiterungen die in der Norm nicht enthalten sind Nicht genormt sind typi scherweise Graphikausgabe maschinenspezifische Ausgabe Bildschirmspeicher Window Systeme hardwarenahe File VO Als Weiterentwicklung von C gewinnt C zunehmend an Bedeutung Weil aber C prak tisch vollst ndig in C enthalten ist ist es sinnvoll zuerst C zu erlernen Sobald man einige bung hat und gr ere C Programme schreiben will bzw soll ist der Umstieg auf C sinnvoll Auch die meisten heutigen Compiler sind C Compiler sie k nnen C und nat rlich auch C Programme bersetzen Heute kann man C bzw C als die wichtigste Programmiersprache f r Systementwick ler bezeichnen tauglich f r alle komplexen Programmieraufgaben speziell auf kleineren und mittleren Systemen Obwohl Compiler auch auf Gro anlagen existieren wird sich bedingt durch die dortige Rechnerarchitektur blockorientierte Bildschirme etc die Spra che langsamer durchsetzen Der Gro teil aller auf PCs und Unix Maschinen angebotener Software ist in C geschrieben
139. ndizes weggelassen dann gilt dies eben falls als Adresse im Array Jeder Arrayname der nicht ber alle Indexangaben eine pro Dimension verf gt gilt als Pointer auf den Datentyp der Arrayelemente Im Zusammenhang mit den Arrays mu jetzt auch die Pointerarithmetik besprochen wer den weil diese die Grundlage der speziellen Arrayindizierung ist Neben den typischen Pointeroperatoren gt amp k nnen auch arithmetische Operatoren und der Vergleichsoperator auf Pointern angewendet werden Addiert man aber 2 zu einem Pointer auf int so wird dieser nicht um 2 Byte erh ht sondern um 2 mal die L nge des Datentyps auf den der Pointer definiert ist es gibt eine spezielle Pointerarithmetik y vice So hnlich k nnten die String funktionen aussehen C Skriptum Prei l 89 int pointer pointer erh ht den Pointer um sizeof int Bytes Da es normal nicht berm ig sinnvoll ist einen Pointer quer durch den Hauptspeicher zu addieren wird diese Methode bei Arrays angewendet Wird ein Pointer der auf das erste Element zeigt um 1 also um die Anzahl Bytes der Elementl nge erh ht so zeigt er auf das zweite Element int i ar 7 Sp a p_a ar ar ist Adresse des ersten Elements amp ar 0 for i 0 i lt 7 i space 0 auch so werden alle Elemente mit 0 gef llt P att for i 0 i lt 7 i pa i 0 alternative for Schleife include lt stdio
140. ned long int system char s In s steht ein Betriebssystembefehl der auf Betriebsystemniveau ausgef hrt wird Dessen Exit Code kommt zur ck In der C Norm sind noch die Funktionen mblen mbstowcs mbtowc wcstombs wctomb f r die Arbeit mit multibyte Characters 2 und mehr Bytes pro Zeichen vorgesehen 11 1 6 string h Um Strings bequemer behandeln zu k nnen ist eine gr ere Gruppe von Funktionen vorhanden void memchr void s int c size_t n ein character Array auf Adresse s in der L nge n wird nach dem Zeichen c durchsucht R ckgabe ist die Adresse auf der das Zeichen gefunden wurde oder NULL int mememp void s1 void s2 size_t n die Strings sl und s2 werden in der L nge n verglichen R ckgabe s1 gt s2 gt 0 s1 lt s2 lt 0 s1 s2 0 void memcpy void s1 void s2 size_t n kopiert s2 nach s1 in der L nge n R ckgabe s1 oder NULL void memmove void s1 void s2 size_t n kopiert s2 nach s1 in der L nge n R ckgabe s1 oder NULL Bei Redefinitionen ist korrektes kopieren garantiert char strcat char s1 char s2 h ngt s2 an s1 an R ckgabe sl oder NULL char strehr char sl int c sucht c im String s1 bis zum 0 R ckgabe ist die Adresse auf der das Zeichen gefunden wurde oder NULL int stremp char s1 char s2 vergleicht s1 mit s2 bis zum Vi R ckgabe siehe mememp int strcoll char sl char s2 vergleicht s1 mit s2 nach l nderspezifischen Vergleichs regeln R ckgabe
141. nicht kombiniert werden long date Char gilt als ein Byte langer int Bei Zuweisungen wird jeweils der vorhandene Typ in den Zieltyp konvertiert Dabei ist folgendes zu beachten Das niederwertigste rechte Byte eines short oder long Typs wird direkt zum char Umgekehrt werden die linken Bits des int Typs mit 0 aufgef llt Man erh lt im in teger den jeweiligen Code des char Zeichens Unterschiedliche short long int L ngen werden duch Unterdr ckung oder Auff l lung der linken Bits konvertiert Unsigned signed wird entsprechend angepa t Double wird durch Rundung nach float konvertiert ebenso long double nach doub le Float wird aber durch abschneiden nach int bzw long konvertiert Bei Pointern gilt generell Nur Pointer auf den jeweils gleichen Typ und Pointer auf void sollten einander zugewiesen werden Ein integer kann in einen Pointer umge wandelt werden und umgekehrt Wenn beim Funktionsaufruf Parameter bergeben werden so erfolgt immer Call by Value Die Variablen des rufenden Programms werden vor dem wirklichen Aufruf in den soge nannten Stack bertragen Dort werden sie dann von der aufgerufenen Funktion verwendet Ist ein Prototyp angegeben dann sind die Datentypen am Stack identisch mit denen des Prototyps Sollten Unterschiede zu den Datentypen beim Funktionsaufruf vorliegen dann erfolgt die Konvertierung wie bei der Zuweisung Gibt es keinen Prototyp so ist der Typ der Variablen am Stack identisch den
142. nicht wesentlich ber eine Seite A4 ist die Funktion zu gro dann mu sie in weitere Funktionen aufgeteilt werden e cine minimale Schnittstelle Parameter Funktionsr ckgabewert zum restlichen Pro gramm aufweisen e in sinnvoller Kombination mit den anderen Funktionen den Gesamtcode des Pro gramms minimieren Auch die Erfinder der Sprache C waren von der Sinnhaftigkeit von Funktionen berzeugt und haben massiv davon Gebrauch gemacht In C gibt es nur sehr wenig wirkliche Befehle die vom Compiler auch als Befehl interpretiert und in Maschinencode umgesetzt werden Alle echten Befehle if while for sind in der Liste der gesperrten W rter Ist ein Befehl dort nicht dabei getchar printf strcpy dann ist er eigentlich eine Funktion und wurde mit dem Compiler mitgeliefert Wenn Ihr Programm die Zeilen char name 80 Rosalinde printf Der Name ist d Stellen lang n strlen name enth lt dann sind das zwei Funktionsaufrufe printf und strlen Zuerst wird strlen aufgeru fen Das char Array name stellt die Eingangsgr e von strlen dar Nach der Ermittlung der L nge wird strlen diese als Zahl zur ckliefern die wiederum in printf als Eingangsgr De Verwendung findet W hrend printf eine komplizierte Funktion ist k nnte strlen etwa so aussehen int strlen const char stri Beispiel ermittelt L nge eines Strings int i for i 0 strili 0 i return i Die erste Zei
143. nksshift der sinngem gleich funktioniert x 1 x x lt lt 2 printf d Dat ergibt 4 sind die Vergleichsoperatoren Diese funktionieren wie blich es ist aber wichtig den Gleichheitsoperator nicht mit dem Zuweisungsoperator zu verwechseln Ansonsten bleibt die Anweisung syntaktisch korrekt es wird aber eine Variable unkon amp amp C Skriptum Prei l 64 trolliert mit einem Wert versorgt und die Bedingung wird immer true oder auch immer false ausgehen Generell liefern die Vergleichsoperatoren einen int Datentyp der eine Zahl ungleich 0 meist 1 f r true oder 0 f r false enth lt Dieses Ergebnis entspricht der schon oben erw hnten logischen Variablen Will man zwei Operanden vom Typ integer bitweise nach der AND Regel verkn pfen kann das mit amp erreicht werden 6 amp 3 ergibt dabei 2 weil die Bitkombination 110 ver kn pft mit 011 zwangsweise 010 als Ergebnis liefert Sie sollten das bitweise und amp nicht mit dem logischem und amp amp verwechseln auch wenn das meist keine schlimmen Auswir kungen auf Ihr Programm haben wird z B 110 amp 001 Auch exclusiv oder kann mittels bei der Bitverkn pfung eingesetzt werden 6 3 ergibt 5 110 011 liefert 101 Da Sie das bitweise oder ebenfalls durchschauen ist v llig klar da der Ausdruck 6 3 als Ergebnis 7 hat Das logische und wird mit dem Operator amp amp realisiert Die Operanden sollten zwei logische Datentypen sein Sind beide Op
144. nktionen sowie globale Variable doch dazu sp ter Jedes C Programm mu genau eine Funktion mit Namen main beinhalten die beim Pro grammstart aufgerufen wird Das ist jener Teil des Algorithmus mit dem das Programm beginnen soll Bestand der Algorithmus nur aus einem Teil wie hier dann stellt die Funk tion main auch schon das ganze Programm dar Gibt es noch andere Teile dann folgen diese als eigene selbstgeschriebene Funktionen nach der Funktion main Zwischen steht die eigentliche Funktion Als erstes wird hier die lokale Variable index definiert die vom Typ int ist Objektart int bedeutet ganze Zahlen Lokale Variablen das sind solche innerhalb einer Funktion werden immer nach einer definiert und sind bis zur dazupassenden verwendbar Mit einer Wertzuweisung nur ein wird der Wert der Variablen index der bisher undefiniert war auf 0 gesetzt Die nachfolgende while Schleife hat 2 Befehle innerhalb der Schleife Deshalb m ssen diese mit zu einer Einheit zusam mengefa t werden Zu Beginn der while Schleife wird die Bedingung index lt 6 gepr ft Weil diese zutrifft wird mit printf ein fixer Text samt Zeilenvorschub ausgegeben Der Wert der Variablen index wird um 1 erh ht die Bedingung der Schleife wird wieder ge pr ft usw solange bis der Wert der Variablen index zu hoch ist Dieses Programm f hrt die Schleife sechsmal aus Weil n jeweils eine neue Zeile bewirkt ergibt die Ausgabe am Bildschirm Das 1
145. nn ist es g nstig unterschiedliche Typen nicht zu vermi schen sondern wenn n tig eine Konvertierung mit dem cast Operator durchzuf hren auch wenn die gleiche Konvertierung automatisch durchgef hrt w rde Beispielsweise float f int i i int f f float i Dieser Operator kann nur auf Pointer angewendet werden Es wird der Inhalt des Feldes bereitgestellt auf das der Pointer gerade zeigt Weil Pointer in C an einen Datentyp ge bunden sind wird also ein Feld dessen Inhalt in diesem Datentyp bereitgestellt Will man einem Pointer einen Wert zuweisen so ist es sinnvoll die Adresse einer Varia blen zu verwenden Mit diesem Operator wird die Adresse eruiert Im anschliessenden Kapitel werden amp und Operator n her erkl rt Das Vorzeichen f r negative numerische Werte Beispielsweise 222 x x y Es gibt in Ansi C auch ein als un res positives Vorzeichen Als logische Negation wird das verwendet Als logischer Operator liefert das generell nur die int Ergebniswerte 0 oder 1 x 5 x liefert 0 x 6 y 6 x y liefert 1 Das Zeichen die Tilde erzeugt das bitweise Komplement der jeweiligen Variablen die aber nur int oder char sein darf Der Inkrementoperator erh ht Wert um 1 ist in der in C vorkommenden Form eine Spe zialit t Er erh ht den Operanden selbst sonst wird der Operand nie ver ndert um 1 und gibt abh ngig von der postfix oder prefix Schreibweise den Ursprungswert oder den um 1 erh
146. nt wenigsten sinnvoll FILE datei int filelen line_no setrandomizestart if datei fopen name dat r NULL printf datei fehlt n exit 0 filelen find size datei line_no rand filelen 1 pick_line datei line_no C Skriptum Prei l 82 setrandomizestart long timeval timeval time 0 srand timeval find_size datei FILE datei char buf 83 int filelen 0 while feof datei fgets buf 82 datei if buf 0 filelen rewind datei return filelen 2 pick_line datei line_no FILE datei int line_no int i 0 char buf 83 while i lt line_no fgets buf 82 datei if buf 0 i printf n s buf fgets buf 82 datei while buf 0 printf s buf fgets buf 82 datei C Skriptum Prei l 83 10 Variablen und Funktionsdefinition exakt Syntax der Variablendefinition Speicherklasse Datentyp Typattribut Name Initwert Name Initwert 10 1 Typattribute Typattribute stellen zus tzliche Angaben dar die bei jedem Datentyp m glich sind const macht die Variable zu einer Konstanten die nur initialisiert bzw der nur einmal ein Wert zugewiesen werden kann Weitere Zuweisungen an diese Variable sind nicht m glich volatile verhindert jegliche Optimierungen in Zusammenhang mit dieser Variablen Sinn voll nur bei Systemprogrammierun
147. nten zehner ziffer Kriterien quersumme ziffer rest 0 printf c c strich strich ja also Strich else printf 4d i nein also Zahl printf n n Zeilenvorschub am Ende Wird ein Testlauf durchgef hrt und dabei die Ziffer 7 eingegeben so erscheint die folgen de Ausgabe Il 1 2 3 4 5 6 8 9 10 11 12 13 15 II II 18 19 20 II 22 23 24 II 26 II Il 29 30 31 32 33 II Il 36 II 38 39 40 41 II II 44 45 Ae 48 l 50 51 I 53 54 55 Il 58 59 en Il 62 II 64 65 ee ep 69 Il I I III III Il IA 80 81 82 83 85 86 88 89 90 Il 92 93 9 95 9 II Il 99 Die Ansi genormten ESC Sequenzen sind ein taugliches Mittel zur Bildschirmansteue rung C Skriptum Prei l 49 Nun folgt noch ein letztes Beispiel bevor es mit C weitergeht Das nachfolgende Beispiel zeigt den m glichen Einsatz einer Funktion Das Hauptprogramm hat nur den Zweck die Funktion zu testen Wie man sieht zeichnet die Funktion einen Rahmen auf den Bildschirm Die Rahmenposition und die Gr e wird Mi als Parameter an die Funktion bergeben Dieses Programm ist nicht direkt portabel durch Anpassung der define Zeilen kann es aber an einen anderen Bildschirm angepa t werden Das Programm l uft aber immer nur auf einem bestimmten Bildschirm Das ist am PC brauchbar f r Unix Maschinen aber nicht denkbar include lt stdlib h gt include
148. ntergrenze 0 obergrenze TABDIM 1 gefunden 0 while gefunden 0 amp amp obergrenze gt untergrenze i untergrenze obergrenze 2 die Mitte berechnen if tabelle i suchwert gefunden 1 bewirkt Ende der while Schleife else if tabelle i gt suchwert obergrenze i 1 else untergrenze i 1 if gefunden 1 printf Gefunden der Wert steht im Element mit Index d n i else printf Wert nicht in der Tabelle enthalten n C Skriptum Prei l 29 5 4 3 Sortieren von Werten in Arrays Man kann Arrays sequentiell der Reihe nach bef llen und dann extra sortieren ebenso kann man beim Einf gen eines neuen Elements bereits die richtige Position suchen und das Element dort einf gen Dabei mu man alle hinteren rechten Elemente um eine Position verschieben Man kann auch Dateien sortieren die auf Platten gespeichert sind Im prakti schen Einsatz wird heute die meiste Sortierarbeit im Rahmen von Datenbanksprachen erle digt Die Wissenschaft Universit t und daher auch unser Programmierunterricht versteht unter Sortieren normalerweise ein gef lltes Array auf welches man einen Sortieralgorith mus anwendet der alle Elemente in aufsteigende oder absteigende Reihenfolge bringt Auch dies ist ein Gebiet wo kluge K pfe schon vor Ihrer Zeit taugliche man k nnte auch sagen perfekte Algorithmen ausgefeilt haben die Sie am besten verwenden und wenn m glich verstehen sollte
149. obale E 55 7 3 FUNKTIONEN UND SOURCECODEDATEIEN IN 55 7 4 LOKALE GLOBALE VARIABLE SPEICHERKLASSE LEBENSDAUER UND G LTIG AURIA ALS E D SOS S E deed E 58 8 OPERATOREN INC DAVON GIBT ES VIELE rssosssossonssossoossonssonssnnennssnnnne 60 9 DATEIEN IN E 67 9 1 GRUNDLEGENDES ZU DATEIEN erresis aeiae e EEEE Eaa s TA EEEE nAi 67 9 2 STRUKTUREN ZUSAMMENFASSEN VON ELEMENTEN UNTERSCHIEDLICHEN TYPS 68 9 3 FUNKTIONEN F R DIE DATEIBEARBEITUNG MIT BEISPIELEN ssesssssessssrsserssreesteeresesesee 70 E ON 71 C Skriptum Prei l 3 9 3 2 inare Pilsen Jessen erst unse e T Eege de 71 9 3 3 Dateien aus C onsprechen nennen 72 9 3 4 I O Befehle f r Dateien 73 9 3 5 Lesen und Schreiben von Bin rfiles u eeeennnenneenneensenee nenn 74 10 VARIABLEN UND FUNKTIONSDEFINITION EXAKT 00r0000r000000000000000 83 10 1 IXPATTIRIBUTE eege EEN EAR dE 83 UR Ne a AE E A E E ES 83 10 2 1 Grundlegende integer Typen ssceeeeesseeeeereeiseriresrssesisrerreesrssesesresesrereses 84 102 2 Bitfeld Typen ne anna ansehe 84 10 2 3 aufzahlende Typen nenne A EAEE EE EE 84 10 2 4 Gleitkomma Tunpen 85 TE E X 0177 EE A3 E EE EE 85 10 2 72 Str kturen zas an snseen E E r E a r 86 D E E E 86 10 29 tree EE EE 87 1 0 2 1 03 RUNkHONen ne ee Beau needed eet 95 10 3 KONVERTIERUNGEN ZWISCHEN DATENTXBEN essen 97 RRE HCH EE SE 99 11 1 2DIECBIBLIOTHEKEN 222022223222 AR EES 99 TRL Tepe eege ra nalen tege e
150. ouble modf double x double pint zerlegt x in einen ganzzahligen Teil der in pint abgespeichert wird und in einen Rest als R ckgabewert beide mit Vorzeichen von x double pow double x double y liefert xY zur ck double sin double x Sinus double sinh double x Sinus hyperbolicus double sqrt double x liefert die Quadratwurzel von x double tan double x Tangens double tanh double x Tangens hyperbolicus 11 1 3 signal h Bekannterweise k nnen in Unix eine Menge von Signalen an verschiedene Prozesse verschickt werden In DOS sind das nur wenige bei dr cken von CTRL C das Signal SIGINT SIGFPE bei Gleitkommafehler Normalerweise wird ein Proze durch das Eintreffen eines Signals abgebrochen Mit der Funktion signal kann man eintreffende Signale ignorieren bzw sinnvoll behandeln void signal int sig void func int int 11 1 4 stdio h Im bisherigen Skriptum wurden schon oft Funktionen der stdio verwendet In stdio h sind auch wichtige defines wie FILE EOF FOPEN_MAX FILENAME MAX enthalten Hier folgt nun eine komplette Aufstellung und auch einige Beispiele void clearerr FILE f setzt die internen Schalter f r Fehler und EOF f r den File f auf 0 int fclose FILE f schlie en des Files f R ckgabewert 0 wenn ok EOF wenn Fehler int feof FILE f wenn EOF erreicht dann R ckgabewert true sonst false int ferror FILE f wenn Fehlerstatus gesetzt dann R ckgabewert true sonst false int fflush
151. p dadurch kennt der Compiler Anzahl und Daten typ der Parameter und des Funktionswerts und kann die sp ter im Code vorkommenden Aufrufe berpr fen void main int i j vorzeichen while j scanf d amp i EOF in die Variable i wurde nun eine Zahl eingelsen vorzeichen sign i Aufruf der Funktion printf Das Vorzeichen von d ist d n i vorzeichen fflush stdin Damit wird eine selbstgeschriebene Funktion aufgerufen mit printf wurde bereits fter eine Funktion aus den Standardbibliotheken verwendet Weil hier erstmals Parameter verwendet werden mu auch die wahrscheinlich wichtigste Ansi C Neuerung die unterschiedliche Parameter Notation erl utert werden Ansi C ver steht auch die alte Schreibweise Altes C Ansi C int sign x int sign int x int x Parameter extra im Hauptprogramm steht als Prototyp int sign int sign int im alten C wurde dem Compiler des Hauptprogramms nichts ber die Parameter mitgeteilt Weil nun die Befehle fertig aufgez hlt sind wird wieder erinnert da diese auch bersicht lich angewendet werden sollen Es folgen hiezu gute und schlechte Beispiele Besonders bei kurzen Beispielprogrammen neigt man dazu das Programm eher unsch n zu schreiben So ist das folgende Programm zwar gut einger ckt aber das ist auch schon alles include lt stdio h gt void maint int x1 x2 x3 printf Temperat
152. r type 21 Typenbezeichnung Golf int baujahr Baujahr 1991 long kilometer gefahrende Kilometer 35000 double preis Verkaufspreis des Autos 87000 include auto h main enth lt das Auto Hauptmen void main int taste 0 FILE autodat autodat fopen auto dat r b ffne Datei if autodat 0 ging nicht r ckfragen printf n nDatei auto dat existiert nicht neu angelegen j n taste getch if taste J taste j autodat fopen auto dat w und eine leere Datei fclose autodat wird angelegt autodat fopen auto dat r b if autodat 0 exit 1 sofortiges Ende von main des Programm wenn es jetzt noch keine Datei gibt while taste E Hauptmen anzeigen und bearbeiten clrscr gotoxy 10 3 printf Willi s AUTOHAUS Hauptmen gotoxy 14 6 printf A Autos sequentiell auflisten gotoxy 14 8 printf B Liste mit Summenwert pro Marke Type gotoxy 14 10 printf C Autos sortieren nach Marke Type gotoxy 14 12 printf P Preise der Autos um 2 erh hen gotoxy 14 14 C Skriptum Prei l 7 8 printf D Autos erfassen gotoxy 14 18 printf E Programm beenden gotoxy 45 20 printf bitte ausw hlen gotoxy 65 20 taste getch if taste 0 taste getch 256 Funktions Cursortaste gotoxy 5 24 switch taste
153. r zum Sortieren ordern delay 2000 Zeit zum Lesen return und retour autotab stellt jetzt eine Tabelle mit anzahl Elementen dar jedes Element ist vom Typ struct automobil einlesen der Datei ins Array fseek autodat OL SEEK_SET an den Dateianfang stellen for i 0 fread amp autotab i sizeof struct automobil 1 autodat i sortieren des Arrays sortiert FALSE while sortiert FALSE sortiert TRUE for i 0 i lt anzahl 1 i if strcmp autotab i marke autotab i 1 marke gt 0O strcmp autotab i marke autotab i 1 marke 0 amp amp strcmp autotab i type autotab i 1 type gt 0 autol autotab i wenn n tig Tausch autotab i autotab i 1l autotab i 1 autol sortiert FALSE C Skriptum Prei l 80 zur ckschreiben des Arrays auf die Datei fseek autodat OL SEEK_SET an den Dateianfang stellen for i 0 i lt anzahl amp amp fwrite amp autotab i sizeof struct automobil 1 autodat i Speicherplatz wieder hergeben free autotab printf n d Datens tze wurden sortiert n anzahl printf n zur ck zum Men mit Tastendruck taste getch auflisten der gespeicherten Autos mit Gruppenwechsel nach Marke und Type void autogrupp FILE autodat struct automobil autol int taste 0 char vergleich marke 20 vergleich _type 20 Vergleichsfelder long sumt_km 0 Summenfelder f r double sumt_pr
154. rammblock int index Variable index vom Typ integer Ende mehrzeilger Kommentar index 0 while index lt SCHLEIFENZAHL Wiederholung printf Das 1 Beispielprogramm n Ausgabe einer Zeile index index 1 index erh hen Mi Ende Programmblock while Ende Programmblock main hier ist nur Kommentar oder eine neue Funktion sinnvoll Dieses Programm enth lt jede Menge Kommentar Jeder Text der zwischen und steht ist ein Kommentar und dient nur dem Autor oder Leser zum besseren Programmverst nd nis Er k nnte weggelassen werden In C ist auch alles Kommentar was zwischen und dem Zeilenende steht Zu Beginn gibt es sogenannte Preprocessoranweisungen die mit beginnen und noch in derselben Zeile enden Ein include kopiert Sourcecode erg nzenden Programmtext ins Programm Immer wenn man Befehle aus vordefinierten Bibliotheken verwendet printf mu man auch einen dazugeh rigen include im Programm haben Ein define erzeugt sogenannte symbolische Konstante Der Text SCHLEIFENZAHL ist hier ein symbolischer Name f r den Text 6 wo immer SCHLEIFENZAHL im Pro gramm vorkommt wird es durch 6 ersetzt Sp ter noch ben tigte vordefinierte symbolische Konstante sind z B EOF oder NULL welche beide innerhalb von stdio h definiert sind Mit include werden diese ins Programm kopiert und sind verf gbar An dieser Stelle im Programm finden sich sp ter noch Prototypen eigener Fu
155. rt lt int lt long Als m gliche Varianten k nnen angegeben werden short short int signed short signed short int unsigned short unsigned short int int signed int signed unsigned int unsigned long long int signed long signed long int unsigned long unsigned long int 10 2 2 Bitfeld Typen Einzelne Bits werden in C blicherweise mittels und bzw oder Verkn pfung angespro chen Mit der und Verkn pfung wird das Bit abgefragt mit der oder Verkn pfung gesetzt define BIT3 4 int schalter statt BIT3 eher einen besseren Namen if schalter amp BIT3 True wenn das 3 Bit von rechts auf 1 schalter schalter BIT3 setzt das 3 Bit von rechts auf 1 Mi schalter schalter amp BIT3 setzt das 3 Bit von rechts auf 0 Mi Zus tzlich gibt es noch die cher selten verwendete M glichkeit der Bitfeld Typen die hier an einem Beispiel gezeigt wird Es werden zwei Bytes mit einer Struktur struct flags aus Bits bzw Bitgruppen belegt unsigned int cf a cf ist das 1 Bit von rechts unsigned int das 2 Bit von rechts bleibt frei pf S bitstru pf 0 bitstru iopl 3 jede Bitgruppe kann als verk rzter unsigned int betrachtet werden bitstru 10 2 3 aufz hlende Typen Der Typ enum erm glicht es bestimmte Werte aufzuz hlen und als Wertebereich einer Variablen festzulegen Void hei t kein Datentyp C Skriptum Prei l 85 enum rot gelb blau schwarz farbe enum woc
156. s oder a amp amp b c durchaus korrekte wenn auch schwer verst ndliche Ausdr cke Weil es hier einige logische Operatoren gibt mu noch einiges zur Abarbeitung derselbi gen gesagt werden W hrend man in anderen Sprachen an einer Stelle wo eine Bedingung erwartet wird keinen beliebigen Ausdruck schreiben kann ist dies in C durchaus m glich if a 3 ist erlaubt und sogar sinnvoll einsetzbar Jeder Ausdruck bringt ein Ergebnis das in einem Datentyp vorliegt der sich mittels Konvertierung aus den Datentypen der einzelnen Operanden ableiten l t Wenn dieses Ergebnis f r eine Bedingung genutzt wird dann wird das Ergebnis des Ausdrucks bzw der Inhalt einer Variablen verwendet um die Bedingung mit WAHR oder FALSCH zu bewerten Der Wert 0 gilt als FALSE alle ande ren Werte als TRUE Das Ergebnis von Vergleichsoperatoren z B a gt 0 ist ein int Typ mit dem Wert 0 oder 1 Es sind daher die folgenden Alternativen gleichwertig if a gt 5 v a gt 5 Di if b 2 w b 2 if w Kurz zusammengefasst gilt also Jeder Datentyp ist als logische Variable verwendbar FALSE 0 TRUE 0 Weil das Ergebnis aller Ausdr cke bzw der Inhalt aller Variablen als Zahl betrachtet wer den kann sind im Programmcode auch beliebige Ausdr cke erlaubt wo eine Bedingung ausgewertet wird gt C Skriptum Prei l 62 Wenn als Wert 0 herauskommt dann false bei allen anderen Werten true 3 gt 4 liefert
157. se dargestellt und bearbeitet werden Als Standarddarstellung wird time_t eingesetzt ein unsigned long welcher immer eine Anzahl Sekunden enth lt die seit einem bestimmten Zeitpunkt dem 1 1 1970 vergangen sind Mit anderen Funktionen kann man time_t in die Darstellung der Struktur struct tm siehe Kapitel ber Strukturen berleiten Zeitwerte unter der Sekundengrenze werden in Clock Ticks des Prozessors seit Start des Programms ermittelt CLOCKS_PER_SEC sagt aus wieviele Clock Ticks eine Sekunde ergeben Am PC ist dies meist 1000 char asctime struct tm zp die Zeit aus zp wird als String mit Standardformat formatiert clock_t clock R ckgabewert die Clock Ticks seit Programmstart oder 1 char ctime time_t zs Die Zeit aus zs wird als String mit Standardformat formatiert double difftime time_t tl time_t t2 Zeitdifferenz tl t2 in Sekunden struct tm gmtime time_t zs Die Teit aus zs wird in einer Struktur tm f r die Zeitzone UTC Zeit in Greenwich aufbereitet und deren Adresse oder NULL retourniert struct tm localtime time_t zs genauso wie gmtime aber f r die lokale Zeitzone mu auch gesetzt sein sonst eine amerikanische Zeitzone time_t mktime struct tm zp Wandelt Zeitformat struct tm nach Format time_t um size_t strftime char ze size_t n char format struct tm zp die Zeit aus zp wird gem dem Formatierstring format hnlich printf aber zahlreiche zeit spezifische Formatelemente f r Minute
158. stru_datum dat3 27 2 1997 Initialisierung der 3 Felder datl tag 14 datl monat 9 einzelne Strukturelemente ansprechen dat2 datt ganze Struktur ansprechen Beispiel mit Unterstruktur struct stru_angestellter char name 20 char vorname 20 struct stru_datum geburtsdatum struct stru_angestellter personal die Definition der Struktur personal geburtsdatum tag 24 bef llen einzelner Elemente personal name 0 H strcpy personal vorname Wilma Weil Strukturen mehrere Elemente unterschiedlichen Typs enthalten m ssen auch alle einzelnen Elemente mit Namen und Typ in geschwungenen Klammern angef hrt werden Als Elemente sind alle skalaren Datentypen aber auch Arrays andere Strukturen und Poin ter zugelassen Es ist sinnvoll den Aufbau einer Struktur gesondert zu deklarieren und bei der Definition die Elemente nicht mehr aufzuz hlen C Skriptum Prei l 69 Die Elemente von Strukturen werden mit dem Operator als strukturname elementname angesprochen Wenn man Pointer auf Strukturen verwendet dann wird der Operator gt als pointer gt elementname eingesetzt Neben diesen beiden Operatoren kann man auf Strukturen nur mehr den Operator amp anwenden Dieser liefert die Adresse der Struktur den blo en Strukturnamen zu verwenden ist nur m glich wenn man eine Struktur einer anderen zuweist include lt stdio h gt void main struct person char initial erster Buchst
159. strukturierter Programmierung mit einer speziellen Anweisung erledigt wer den k nnen Leider ist die switch Anweisung nur in der Lage auf unterschiedliche ganzzah lige Werte einer Variablen bzw eines Ausdrucks zu reagieren aber nicht auf eine beliebige Bedingungskette Die Variable mu auch int oder char sein switch Bedingungsausdruck case Wertl Aktion case Wert2 Aktion2 default Aktion n Der default Zweig kann weggelassen werden Auch wenn die Aktionen aus mehr als einem Statement bestehen bedarf es keiner geschwungenen Klammer Daf r steht der gesamte Statementteil nach Bedingungsausdruck in Achtung Es ist blich jede Aktion nach case oder default mit einem break zu beenden weil ansonsten ab dem Zutreffen eines case Zweiges alle Aktionen bis zum Ende des switch Statements ausgef hrt werden also jene der nachfolgenden case Teile und des default Teils Dies ist eine etwas gew hnungsbed rftige C Spezialit t vergessen Sie das break nicht include lt stdio h gt beim switch sind breaks not void main wendig int lauf for lauf 3 lauf lt 13 lauf lauf 1 printf lauf 2d lauf switch lauf case 3 printf Der Wert ist jetzt drei n break case 4 printf lauf enth lt jetzt Anni break case case case case printf Wert ist im Bereich von 5 bis 8 n break Alle Werte von 5 8 bringen diese Meldung weil kein break bei 5 6 7 case 11 printf Jetz
160. t den Fehlerstatus auf grOk zur ck Fehlerfrei Ergebniscode 0 Konstante grOk 0 errorcode graphresult speichern von graphresult if errorcode grOk printf Grafik Fehler s n grapherrormsg errorcode printf Programm abgebrochen getch exit 1 R cksprung zum Betriebssystem mit Fehlermeldung cleardevice l scht den Bildschirm closegraph beendet den Grafikmodus und stellt den Textmodus wieder her Innerhalb des Programms kann mit restoreertmode und setgraphmode beliebig zwischen Text und Grafikmodus umgeschaltet werden C Skriptum Prei l 1 05 Verschiedenste grafische Ausgabefunktionen verwenden voreingestellte Vordergrund und Hintergrundfarben Die Zeichenfarbe Vordergrund wird mit setcolor color die Hinter grundfarbe mit setbkcolor color eingestellt W hrend man am Textbildschirm meistens 24 25 Zeilen und 80 Spalten vorfindet hat der Grafikmodus keinerlei zeichenorientierte Einteilung Zeichnerische und auch textm ige Ausgaben im Grafikmodus verwenden den Grafik Cursor der auf einem Bildschirmpi xel gem Aufl sung normalerweise VGA 640 x 480 steht und nicht sichtbar ist moveto x y setzt den Grafik Cursor auf den angegebenen Punkt im 640 x 480 Bereich bedenken Sie da EGA oder Super VGA andere Aufl sungen hat Clipping beeinflu t diese Positionierung nicht getx y liefert die momentane X Y Koordinaten des Grafik Cursors getmaxx y ermittelt die ma
161. t schl gt es elf n break default printf ein Wert ohne besonderen Text n break Ende zu switch Ende for Schleife Der Weg eines Programmieranf ngers bis zum Meister der in der Lage w re heutige pro fessionelle Programme zu schreiben alle heutigen Programme werden aber in gro en Teams und nicht mehr von genialen Einzelg ngern geschrieben ist lang Daher ist die Bezeichnung simples Men system f r das folgende Programm durchaus gerechtfertigt obwohl es sicher keinem heute verwendeten Men nahekommt C Skriptum Prei l 44 include lt stdio h gt include lt conio h gt void main simples Men programm zeigt Ausgabe mit conio h Eingabe mit getch siehe Sondertasten und eine int taste 0 Anwendung des switsch Befehls while taste E clrscr der Men Ausgabetext gotoxy 10 3 printf Minibeispiel eines Men systems gotoxy 14 6 printf A Men punkt A ausw hlen gotoxy 14 8 printf B Men punkt B ausw hlen gotoxy 14 10 printf C Men punkt C ausw hlen gotoxy 14 18 printf E Programm beenden gotoxy 45 20 printf bitte ausw hlen gotoxy 65 20 taste getch Tastendruck lesen wenn 0 dann ist es eine if taste 0 taste getch 256 Funktions Cursortaste 0 255 sind Codes normal gedr ckter Tasten gt 256 sind nun die Codes der Spezialtasten die folgende Anzeige zu
162. tante sein Be reichs berschreitungen falsche Indexwerte beim Zugriff auf das Array werden vom Com piler nicht erkannt also Vorsicht Was w rde wohl passieren wenn Sie statt i lt TABDIM versehentlich i lt TABDIM schreiben Beispiele simple Verwendung von ein und zweidimensionalen Array include lt stdio h gt void main int index int stuff 12 float weird 12 for index O index lt 12 index stuff lindex index 10 weird index 12 0 index 7 printf s n namel printf s n n name2 for index O index lt 12 index printf 5d 5d 310 3f n index stuff index weird index include lt stdio h gt define DIM GROSS 8 void main int i j int gross DIM GROSS DIM GROSS maechtig 25 12 for i 0 i lt DIM GROSS i for j 0 j lt DIM GROSS j gross i j i j enth lt das Einmaleins bis 8 x 8 for i 0 i lt 25 i for j 0 j lt 12 j maechtig i j i j stellt eine Summentabelle dar gross 2 6 maechtig 24 10 22 gross 2 2 5 gross gross 2 2 gross 2 2 177 entspricht gross 5 5 177 for i 0 i lt DIM GROSS i for j 0 j lt DIM GROSS j printf 5d gross i j printf n Newline f r zeilengerechte Ausgabe int tab1 5 0 1 44 2 8 int matrix 3 2 2 3 1 4 7 5 pro Index einmal char textl1 6 h a 1l 1 o
163. tiert dann kann der Compiler erkennen ob die Datentypen von Funktionsr ckgabewert und Parametern bereinstimmen und wenn n tig eine automatische Typconversion durchf hren Wenn aber kein Prototyp existiert bzw f r die Parameter kein Prototyp m glich ist dann wird als Funktionsr ckgabewert int angenommen die Parameter werden bergeben wie sie eben vorliegen Es liegt dann in Ihrer Verantwortung da jede Funktion nur mit Parametern im korrekten Datentyp aufgerufen wird Es kann bereits von entscheidender Bedeutung sein ob man 0 oder OL verwendet C Skriptum Prei l 96 Funktionen k nnen die Werte in den blichen skalaren Datentypen aber auch Pointer aller Art zur ckgeben Wenn eine Funktion per Definition nichts zur ckgeben soll dann wird void angegeben damit ist die Funktion ein Unterprogramm Schreibt man keinen Datentyp vor die Funktion dann wird per Default int angenommen Funktionen haben normalerweise das Speicherplatzattribut extern durch Angabe von static ist auch ein extern static nur innerhalb des Files g ltig m glich void upro Prototyp im alten C kein Datentyp f r Parameter main kurzes Hauptprogramm f r upro Aufruf int x char y upro amp x y void static upro a b Parameternotation im alten C int a char b dies ist eine Funktion ohne R ckgabewert void Mi die G ltigkeit erstreckt sich nur auf den gemeinsam compilierten Code static beendet wir
164. truk togramm DIN Norm 66261 Durch die graphische Darstellung ist gute Lesbarkeit ge sichert Die graphischen Symbole erm glichen keine chaotische Vorgangsweise son dern f hren automatisch zu gut strukturierten Programmen welche heute Stand der Technik sind Beispiel Widerstandsberechnung als Struktogramm Sinnvollerweise wird man gleich die allgemeine Formel mit R1 R2 R3 verwenden damit man f r verschiedene Ohm Eingabewerte den Gesamtwiderstand R errechnen kann Algorithmus Widerstands schaltung R2 R3 verwendete Objekte berechne R R1 Variable R R1 R2 R3 R2 R3 schreibe den Wert von R auf den Bildschirm Variable sind die normalen Objekte innerhalb eines Programms Struktogrammelement Anweisung Struktogrammelement Wiederholung C Skriptum Prei l 8 Eine Variable ist ein Objekt mit einem vom Programmierer vergebenen Bezeichner dem Namen z B R1 R2 Eine Variable hat einen Wert der durch Anweisungen bzw Operati onen ver ndert werden kann also variabel ist Das obige Beispiel enth lt 3 Anweisungen wobei in der ersten Anweisung drei Zahlenwer te vom Benutzer mit der Tastatur eingegeben und in die Variablen R1 R2 R3 hineingestellt werden In der zweiten Anweisung wird eine umfangreiche Berechnung mit mehreren Operationen durchgef hrt und das Ergebnis in die Variable R gestellt In der dritten An weisung nimmt man den Wert der Variablen R und schreibt ihn auf den Bildschirm In den bisherigen Be
165. turn abschlie en bevor der Puffer an Ihr Programm bergeben wird Dies ist bei Kommandozeileneingabe auch durchaus sinnvoll denn so kann man unabh ngig vom Programm mit der Backspace taste auch mal falsche Eingaben korrigieren Es wird eben ein Tastendruck nicht sofort sondern erst nach der Return Taste an das Programm bergeben Bei fgets spielt das keine Rolle bei der getchar Schleife m ssen Sie aber bedenken da erst nach dem Dr cken der return Taste alle Zeichen gelesen werden und auch das in der Schleife befindliche printf erst dann aktiv wird Soll Ihr Programm auf jeden Tastendruck sofort und unverz glich reagieren k nnen dann finden Sie mit den Funktionen aus der lt stdio h gt nicht das Auslan gen Sie m ssen Funktionen aus der lt conio h gt verwenden die aber nicht genormt sind und nur auf den PC Compilern funktionieren F r die Eingabe kann man verwenden getche wie getchar jedes getippte Zeichen wird aber sofort ans Programm geliefert Tippt der Anwender aber auf gar keine Taste dann wartet getche nat rlich auch bis die n chste Taste gedr ckt wurde getch wie getche das getippte Zeichen ist aber nicht wie sonst blich am Bild schirm zu sehen Normalerweise ist bei der Tastatur immer das sogenannte E cho aktiv welches getippte Zeichen auch am Schirm zeigt Bei getch nicht W hrend getchar nur Buchstaben Ziffern und Sonderzeichen lesen kann ist es mit getch getche auch m glich das Dr c
166. typ Name z B int zahll zahl2 Die Speicherklasse wird sp ter erl utert zeigt da sie weggelassen werden kann Der Datentyp hier int kann auch aus mehreren W rtern bestehen Pro Datentyp k nnen auch mehrere Variablen definiert werden angezeigt durch Mit Strichpunkt werden in C alle Statements abgeschlossen 5 1 Datentyp Ganzzahl interne Bin rzahl int a integer ist der zum Register der Maschine int wert passende Datentyp daher 2 Byte am PC aber int zahl temp work 4 Byte auf den meisten anderen Maschinen short int de braucht man nur 2 Byte 32768 bis 32767 short int index faktor so kann man aus Platzgr nden in S tzen von short varl var2 Dateien short einsetzen long int dd braucht man 4 Byte nimmt man long und hat long zaehler input ber 2 Mrd 2147483648 bis 2147483647 unsigned short z164 braucht man keine negativen Zahlen so ver unsigned long var_gross doppelt man den positiven Wertebereich mit unsigned int workvar3 unsigned kein Vorzeichen C Skriptum Prei l 23 Wenn Sie portabel also f r mehrere Anlagen programmieren wollen dann d rfen Sie int nur einsetzen wenn die L nge und damit der Wertebereich egal ist Weil int normaler weise dem Register der Maschine entspricht sind auch l ngere int und long Typen denk bar Mit Sicherheit gilt aber L nge short lt L nge int lt L nge long Die Darstellung negativer ganzzahliger Werte erfolgt intern im sogenannten 2
167. typedef vereinbarte Namen voll st ndig gro und das restliche Programm vollst ndig klein zu schreiben C Skriptum Prei l 2 1 Verwenden Sie f r alle Variablen sprechende Namen Ausgenommen davon sollten nur kurzzeitig eingesetzte Workfelder bzw Indizes sein Wenn jemand rechenfeld statt rf schreibt so ist das zwar ein langer aber kein sprechender Name sum me_mwst f r die Summe der Mehrwertsteuerspalte w re aber sinnvoll voraus gesetzt die Variable wird ausschlie lich daf r verwendet Einzelne Namensteile trennt man normalerweise mit dem Underliner beispielsweise ist sum me_gehalt angestellte ein brauchbarer Name Als alternative Schreibweise wird auch SummeGehaltAngestellte gelegentlich angetroffen Weil C Gro und Klein schreibung unterscheidet mu man sich aber genau daran halten Hier ist es mit C schlecht bestellt Die meisten Compiler k nnen zwar endlos lange Namen bew ltigen es ist aber leider blich kurze Namen zu verwenden In diesem Punkt sollten Sie die C Tradition nicht fortsetzen Die einzelnen Variablen haben Datentypen bin r gezont Verschiedene Operato ren k nnen auf bestimmte Datentypen angewandt werden Die Division ist nur mit numerischen Variablen m glich Substring Bildung kann nur mit gezonten alpha numerischen Variablen sinnvoll sein Wenn die verwendeten Variablen nicht genau zusammenpassen dann kommt es zu einer automatischen Konvertierung Typen strenge Sprachen machen keine auto
168. ungsm glichkeit komplexer Typen Listen B ume e Kontrollstrukturen zur Strukturierung Programmbl cke mit if while do while until case for iterative Schleife e Methoden zur dynamischen Hauptspeicherverwaltung Pointer Hauptspeicheranforderung zur Laufzeit malloc e Modularit t Funktionen Unterprogramme e Precompiler Macrom glichkeit Neben dem Sprachumfang selbst der sehr klein gehalten ist gibt es zu jedem Compiler noch eine umfangreiche gro teils genormte Bibliothek vorgefertigter Funktionen die we sentlich zur Brauchbarkeit von C beitr gt Dort befinden sich s mtliche M glichkeiten der Ein und Ausgabe keine eigenen Sprachbefehle alle mathematischen Funktionen M g lichkeiten zur Bildschirmansteuerung etc Auch alle speziellen Zugangsm glichkeiten zum Prozessor der Maschine die in den anderen Hochsprachen fehlen sind durch Funktionen realisiert Erwirbt man irgendwelche Produkte z B Window Systeme Isam Datei Management so werden auch diese als Funktionsbibliothek geliefert Beispielsweise ist die Programmierung von MS Windows aus C mittels vieler Funktionen realisiert Als klassische Programmierumgebung zu C gab es neben dem Compiler cc und dem Linker ld auch noch weitere Werkzeuge wie lint Syntaxpr fung cb Beautyfier ar Bibliothe ken sdb Debugger cflow Aufrufhierarchie make automatische Compilierung etc Diese Werkzeuge sind wie der Compiler Bestandteile des Unix Betri
169. urtabelle Celsius und Farenheit n n for x1 2 x1 lt 12 x1 x1 1 x3 10 xl x2 32 x3 9 5 printf C 4d F 4d x3 x2 if x3 0 printf Gefrierpunkt des Wassers if x3 100 printf Siedepunkt des Wassers printf n C Skriptum Prei l 47 Obwohl das Programm alles tut was die Problemstellung verlangt kann man damit nicht zufrieden sein Nur weil zuf llig drei l ngere Strings gedruckt werden kann man leicht erraten was das Programm macht Es fehlen sprechende Namen aber auch jegliche Do kumentation und Kommentierung Dabei w re die L sung auch wesentlich besser denkbar beispielsweise so Name x x x xx x x Kur zbe s chre ibun g k d k de d de de de de EE EE temptab c dieses Programm listet eine Temperaturtabelle Eine einfache und effektive Cr Datum Celsius Fahrenheit in 10er Schritten von Mi Dokumentation am Beginn 1 9 92 20 bis 120 C auf stdout des Programmfiles Eunk ti on s au f ru f e he de de de de de de e de de He de de de e He de He de e e de He de He de e He de He de He he e ke de kke kek ke f keine eigenen Funktionen Mi C Funktionen printf Dateien k k k k d de de de k k ke de de de k k k k ke de de k k k k k EEE J keine Dateien in Verwendung Parameter k k d k k k k k dk k k k k kkk k k kkk kkk EEE keine Parameter R ckgabeparameter oder Kommandozeilenangaben Exit Sta t
170. us R ckgabewe r t k d d k k ke de d k ke e de de k He ke wird nicht gesetzt kein Exit Code ans Betriebssystem in Funktionen w rde hier der R ckgabewert beschrieben globale Var iab l e k de de k k H He de de ke k H He He de de ke k H He He d keine Verwendung oder nderung globaler Variablen Be s chre ibun g k ded de ded dek de de de Hek e Eh e He de KK KK hier wird eine l ngere Beschreibung Grobablauf in Pseudo Mi code bersichtstabellen etc erwartet Mi Aende rungen k ek ed de dek ded ee de de e E erh de He de e e He de e E He e Heke e ke e e e et d hier sollten sp tere nderungen mit Datum und Text stehen E F e e k H H He he de de ke H He He He e de ke H 2 2 2 2 2 22 2 2 2 22 22 2 2 2 kek k k k k 2 2 2 22 2 2 2 2 2 22 2 2 2 kkk include lt stdlib h gt include lt stdio h gt void maint Kommentar zu wichtigen Variablen und Codestellen int i int fahrenheit enth lt Temperatur in Fahrenheit Graden int celsius enth lt Temperatur in Celsius Graden printf Temperaturtabelle Celsius und Fahrenheit n n for i 2 i lt 12 i Schleife pro Zeile der Ausgabetabelle celsius 10 i mal 10 f r die Ausgabe in Zehnerspr ngen fahrenheit 32 celsius 9 5 Umrechnungsformel printf C 4d F 4d celsius fahrenheit if celsius 0 printf Gefrierpunkt des Wassers if celsius 10
171. us der im Verzeichnis Directory des File systems eingetragenen Dateigr e erkannt Nach der Dauer ihrer Existenz unterscheidet man permanente und tempor re Files die Lebensdauer eines tempor ren Files ist durch Programmterminierung begrenzt das Pro gramm l scht die Datei selbst C Skriptum Prei l 72 9 3 3 Dateien aus C ansprechen Dateien werden unter Verwendung einer Struktur vom Datentyp FILE vereinbart FILE ist ein in stdio h definierter Typ der Informationen ber das ge ffnete File enth lt Zugriffstyp nur lesen nur schreiben beides e Pufferungstyp nicht vollst ndig zeilenweise e Pufferadresse D Fehlerstatus Die 3 Standarddateien werden automatisch beim Start des Programmes zugeordnet Norma lerweise ist die Standard Eingabedatei stdin die Tastatur die Ausgabedateien stdout und stderr sind dem Bildschirm zugeordnet durch die O Umleitung auf Betriebssystemebene k nnen auch beliebige Dateien involviert sein Will man vom Programm aus eine bestimmte Datei ansprechen dann mu diese mit der Funktion fopen er ffnet werden FILE fopen const char filename const char modus Mit Dateiname und ffnungsmodus lesen schreiben wird die Datei ge ffnet bzw die Verbindung zwischen C Programm und dem Filesystem hergestellt Als Funktionsr ckga bewert liefert fopen die Adresse werden sp ter noch n her erl utert einer Struktur vom Typ FILE die f r alle weiteren Lese und Schreiboperationen
172. utc A dateil 1 Zeichen schreiben fputs nfang der Zeile Nummer dateil Stringinhalt ohne 0 schreiben fprintf dateil d n i Rest der Zeile schreiben C Skriptum Prei l 74 if i fclose dateil 0 printf File gt fiobsp 1 lt close Fehler d n i exit 1 exit 0 Die Ausgabe dieses Programms geschrieben in die Datei fiobsp 1 sieht folgenderma en aus Anfang der Zeile Nummer Anfang der Zeile Nummer Anfang der Zeile Nummer Anfang der Zeile Nummer Anfang der Zeile Nummer DG OM 2 Beispiel zur Anwendung der C I O Funktionen include stdio h define BUFLEN 25 Jetzt wird die Ausgabe des vorigen Programms wieder eingelesen Es wird versucht jeweils die zur Ausgabe quivalenten Befehle zu verwenden fgets liest ganze Zeilen bis inclusive n aber nur eine maximale Anzahl von Zeichen Hier liefert das erste fgets daher nur 24 Zeichen das zweite fgets liest den Zeilenrest void main FILE datei2 int i j c char buffer BUFLEN char ptr_c if datei2 fopen fiobsp 1 r NULL puts Eingabefile gt fiobsp 1 lt open Fehler exit 1 der File ist nun er ffnet for i 1 i lt 6 i c fgetc datei2 1 Zeichen lesen if c EOF break zwei gleichwertige Abfragen if feof datei2 break ob EOF vorliegt ptr_c fgets buffer BUFLEN datei2 if ptr_c NULL break N
173. welches eine Zahl einliest daraus die Fakult t der Zahl n berechnet und ausgibt e Lesen Sie 2 Zahlen ein und geben Sie den Wert der gr ten Zahl aus e Lesen Sie 3 Zahlen ein und geben Sie den Wert der gr ten Zahl aus e Lesen Sie einen Bruttogehalt ein und ermitteln Sie den abzuf hrenden Steuerbetrag grob vereinfacht unter 10000 S steuerfrei von 10000 S bis 20000 S 20 Steuer ber 20000 S 30 Steuer e Lesen Sie 3 Zahlen ein und geben Sie die Summe und den Durchschnitt aus e Lesen Sie eine Folge von Zahlen ein wenn die Zahl 0 eingelesen wird geben Sie Sum me und Durchschnitt aller Zahlen aus und beenden das Programm C Skriptum Prei l 1 1 1 4 Analytisches Verfahren zum Probleml sen AVP Dies hier ist eine m gliche Vorgangsweise die dem Anspruch auf eine ingenieur m ige Softwareentwicklung gerecht werden kann m Wichtig Wie schon h ufig betont wurde mu bei gr eren Programmen Problemstellungen syste matisch vorgegangen werden Hier wird ein m glicher Weg gezeigt wie das passieren k nnte 1 Wie lautet das Problem Man berlege sich eine passende pr gnante Problembenennung als geistigen Auf h nger berlegungen wie Gibt es ein vergleichbares Problem oder Wie kann ich das Problem verallgemeinern sind sicher hilfreich Was ist bekannt hier sind alle bekannten Eingangsgr en Programmeingabe aufzuz hlen Was wird gesucht Aufz hlung aller Aus
174. ximal m gliche X Y Koordinate des Bildschirms Das Koordinatensystem hat seinen Ursprung in der linken obere Ecke des Bild schirms Bei einer Bildschirmaufl sung von 640 x 480 Punkten ergeben sich folgende Koordinaten Ecke links oben 0 0 rechts oben 639 0 links unten 0 479 rechts unten 639 479 Die Textausgabe in simplen grafischen Systemen wie dem BGI verwendet einen bitweise definierten Zeichensatz 8 8 Punkte pro Zeichen und mehrere Vektor Zeichens tze CHR die als normale Dos Dateien vorliegen Die Ausgabe wird entweder mit outtext string oder outtextxy x y string vorge nommen Ist Clipping nicht aktiv so werden Ausgaben mit dem Standardzeichensatz komplett unterdr ckt wenn rechts von der momentanen Grafikcursorposition bzw x y nicht gen gend Platz vorhanden ist die Zeichengr e der gew hlten Schrift bestimmt den Platzbedarf Vor der Ausgabe k nnen mit den Funktionen settextstyle font direction charsize und settextjustify horiz vert noch Schriftart richtung gr e und die Ausrichtung li zent riert re unten z oben eingestellt werden Normalerweise bezieht sich die Ausgabe auf alle Pixel des Bildschirms Es ist jedoch m g lich ein Grafikfenster zu definieren Mit setviewport x1 y1 x2 y2 clip l t sich ein rechteckiges Fenster am Bildschirm festlegen Der Grafik Cursor geht automatisch auf den Ursprung dieses Fensters Die folgenden Ausgaben werden sich dann auf dieses Fenster bes
175. xterne Filename wird automatisch so generiert da er nicht mit dem eines existierenden Files bereinstimmt modus wb Schlie en eines tempor ren Files ist nicht notwendig wird bei Programmende geschlossen 9 3 4 I O Befehle f r Dateien Gliederung der UO Eingabebefehle Ausgabebefehle Befehle f r zeilenorientierte Dateien fgetc fetc getchar fputc putc putchar mit ASCII Zeichen fgets gets fputs puts fscanf scanf fprintf printf fvprintf vprintf T O von und nach Strings sscanf sprintf svprintf f r I O von bin ren Dateien fread fwrite Open Art b ftell fseek fgetpos fsetpos Die nachfolgenden Beispiele verfolgen nur den Zweck verschiedene I O Befehle in kor rekter Syntax wiederzugeben Das erste Programm beschreibt eine Textdatei fiobsp 1 mit 5 Zeilen Im zweiten Programm werden diese 5 Zeilen mit quivalenten Befehlen wieder ausgelesen include stdio h 1 Beispiel zur Anwendung der C I O Funktionen In jeder Sprache m ssen Dateien definiert und anschlie end er ffnet werden In C wird ein Pointer auf eine File Struktur enthalten in stdio h angelegt Das geschieht mit FILE dateil datei2 die Datei kann nun er ffnet bearbeitet und geschlossen werden void main FILE dateil int i if dateil fopen fiobsp 1 w NULL puts Ausgabefile gt fiobsp 1 lt open Fehler exit 1 der File ist nun er ffnet for i 1 i lt 6 i fp
176. yp unter einem Variablennamen zusam mengefa t Mit Hilfe des Index werden die Felder sozusagen durchnumeriert Es ist auch m glich die Felder nicht alle hintereinander eindimensional sondern in Form eines Rechtecks zweidimensional oder auch mehrdimensional anzuordnen Der Index jeder Dimension beginnt immer von 0 weg zu laufen int tab 3 ist ein eindimensionales Array und hat 3 Elemente tab 0 tab 1 tab 2 Der Index wird nach dem Tabellennamen in eckigen Klammern geschrieben und wird ab 0 durchnumeriert versuchen Sie im Programm tab 3 anzusprechen so liegen Sie au erhalb hinter der Tabelle und bewegen sich im Speicherbereich einer anderen Va riable Weil C wie die meisten anderen Programmiersprachen solche Fehler nicht erkennt ist dies h ufig die Ursache f r schlimme semantische M ngel int feld 2 3 ist zweidimensional und definiert 6 Elemente feld 0 0 feld 0 1 feld 0 2 feld 1 0 feld 1 1 feld 1 2 Dieses kurze Programmst ck eignet sich zum lnitialisieren Bef llen einer Tabelle define TABDIM 9 das ist eine symbolische Konstante die int tab TABDIM i als Dimensionsangabe verwendet wird i 0 while i lt TABDIM alle Elemente aus tab werden auf 0 gesetzt tab i 0 alternativ for i 0 i lt TABDIM i i 1 is itil tab i 0 C Skriptum Prei l 25 Die Dimensionsausdehnungen d rfen nur Konstante oder symbolische Kons
177. ystem strncpy ptr_work gt text buffer size_t ZEILENLAENGE if ptr_anker NULL Aktion beim 1 Satz ptr_anker ptr_work ptr_aktuell ptr_work else bei den Folges tzen ptr_aktuell gt ptr_next ptr_work ptr_aktuell ptr_work ptr_aktuell gt ptr_next NULL Abschlu der Pointerkette for i 1 i lt 20 i wieviel stellig ist satzzahl if satzzahl int pow 10 i 0 break for ptr_aktuell ptr_anker satzzahl 1 ptr_aktuell NULL ptr_aktuell ptr_aktuell gt ptr_next satzzahl printf lu s n i satzzahl ptr_aktuell gt text i gibt die minimale Breite der Formatierung der Zeilennummer an long unsigned Formatierung exit 0 C Skriptum Prei l 94 Hier folgt ein hnliches Beispiel es wird aber eine doppelt verkettete Liste erzeugt auch mit dem Hauptspeicher wird sparsamer umgegangen Dieses Programm liest eine Datei Dateiname als Aufrufparameter ein speichert diese zeilenweise in einer vorw rts und r ckw rts verketteten Liste Speicherplatz f r die Listenelemente wird dynamisch angefordert und gibt die Zeilen dann in verkehrter Reihenfolge aus wobei die R ck w rts Pointerkette verwendet wird Zeilenende wird durch n oder EOF erkannt Zeilen ber 500 Bytes werden geteilt Der Name der Eingabedatei kann als Parameter beim Aufruf angegeben werden wenn dieser fehlt dann wird stdin verwendet Aufrufsyntax prognam

Download Pdf Manuals

image

Related Search

Related Contents

Philips 8718696483787 lighting spot  Kingston Technology ValueRAM Memory 1GB 333MHz DDR ECC CL2.5 DUAL x4  1 / 50 位置識別機能付火災探知装置の承認試験基準 [1] 総論 (1) 船舶  19_FEB_10 Reunión de planeación  Bonus « investissement associatif » Mode d`emploi Objectif Champ  Murphy PSB User's Manual  Enjoy Charging Technology ROMOSS  Télécharger document - Lefèvre Pelletier & associés  クローラ型運搬車 XSF900LD  

Copyright © All rights reserved.
Failed to retrieve file