Ingenieurinformatik Programmiersprache C Teil 1 Die Programmiersprache C wurde 1972 von Dennis M. Ritchie in den Bell Laboratories (USA) entwickelt. Als Vorgänger von C galt die System-Programmiersprache B oder BCPL (Basic Combined Programming Language). Daher der Name C. C++ ist die objektorientierte Erweiterung von C. Charakteristische Eigenschaften: • maschinennah : C ist eine Hochsprache, in der Elemente höherer Programmiersprachen (wie Prozeduren, Blöcke, Schleifen und Datentypen etc. ) mit Assembler-ähnlichen Konstrukten(z. B. Inkrement- und Dekrement-Operatoren) vereinigt sind. • portable: C zeichnet sich durch eine weitgehend maschinenunabhängige Programmierung aus. • universell : In C werden Datenbankprogramme, Kalkulationsprogramme sowie Grafik-Applikationen geschrieben. C-Syntax: Grammatik der Programmiersprache C Der Programmtext wird nach genau festgelegten Regeln formuliert. Diese Regeln sind durch die Grammatik einer Programmiersprache festgelegt. C-Compiler: Softwareprogramm zur Übersetzung des in C geschriebenen Programmcodes in Maschinenbefehle, die der Prozessor des Rechners unmittelbar ausführen kann. Erstellen und Übersetzen von C-Programmen 1. Anhand eines Texteditors wird der Quellcode in einer Quelldatei mit der Endung .c abgelegt. 2. Die Quelldatei wird dem Compiler zur Übersetzung gegeben. Geht alles gut, so erhält man eine Objektdatei (gleicher Dateiname mit Endung .obj) , die den Maschinencode enthält. 3. Schließlich bindet der Linker eine oder mehrere Objektdateien (mit Hilfe des Makefile) mit Funktionen der Standardbibliothek oder selbst erstellten schon früher übersetzten Programmteilen (aus dem Projekt) zu einer ausführbaren Datei mit der Endung .exe. IDE („integrated development environment“): Moderne Compiler bieten eine integrierte Entwicklungsumgebung, welche die obigen drei Schritte zusammenfasst. Von einer gemeinsamen Benutzeroberfläche aus wird das Programm editiert, kompiliert, gelinkt und ausgeführt (www.lcc.com). Dr.-Ing. K. Jäger-Hezel, 10.11.2006 1 Ingenieurinformatik Editor Quelldatei …c Compiler Header-Datei ….h Objektdatei …..obj Benutzer-Bibliotheken Linker Standardbibliotheken Ausführbare Datei …exe Struktur von C-Programmen Beispiel: C-Programm „Hello world“ #include <stdio.h> int main() { printf(„\nHello world!\n“); return 0; } Typ Funktionsname Beginn der Funktion Rückgabe des integer Wertes 0 Ende der Funktion Ausgabe: Hello world! Dr.-Ing. K. Jäger-Hezel, 10.11.2006 2 Ingenieurinformatik Ein C-Programm besteht aus einzelnen Funktionen, die sich gegenseitig aufrufen. Die Funktion main() hat eine besondere Rolle. Sie bildet das Hauptprogramm und muss daher in jedem C-Programm vorhanden sein. Jede andere Funktion entspricht einem Unterprogramm. Die main()-Funktion unterscheidet sich – abgesehen vom feststehenden Namen - nicht von der Struktur anderer Funktionen. Die Programmausführung beginnt mit der ersten Anweisung in der Funktion main(). Die Anweisung #include ist für den Preprocessor bestimmt, der die sog. Header-Dateien (z. B. stdio.h) an diese Stelle in den Quellcode kopiert. Dadurch stehen dem Programm alle Definitionen von Funktionen zur Verfügung, die in den Header-Dateien enthalten sind. Der Funktionsblock im Programmbeispiel „Hello world“ enthält zwei Anweisungen. Mit printf wird der Text auf dem Bildschirm ausgegeben. Das Steuerzeichen „\n“ löst einen Zeilenvorschub aus. Die zweite Anweisung return 0; beendet die die Funktion main() und damit das Programm. Dabei wird der Wert 0 dem aufrufenden Programm als Exit-Code zurückgegeben. Jede Anweisung wird in C mit einem Semikolon beendet. Beispiel: C-Programm für Multiplikation zweier Ganzzahlen #include <stdio.h> /*Multiplication zweier Ganzzahlen*/ int main() { int a; int b; int erg; a = 3; b=4; erg = a*b; printf(„\nErgebnis: %d“, erg); return 0; } Jede Zeichenfolge, die das Zeichenpaar /* ….. */ einschließt, ist Kommentar und wird vom Compiler ignoriert. Dr.-Ing. K. Jäger-Hezel, 10.11.2006 3 Ingenieurinformatik Definition von Variablen Variablennamen Variablen und Funktionen werden im Programm über Namen angesprochen. Für die Bildung von Namen gelten folgende Regeln: • • • • Folge von Buchstaben, Ziffern oder Unterstrichen (_). Deutsche Umlaute und der Buchstabe ß sind nicht zulässig. Groß- und Kleinbuchstaben werden unterschieden („case sensitiv“). Das erste Zeichen muss ein Buchstabe oder ein Unterstrich sein. Ein Name kann beliebig lang sein. (Signifikant sind nach ANSI-Standard nur die ersten 31 Zeichen.) Schlüsselwörter (z.B. float , int , long etc.) dürfen nicht als Name benutzt werden. Datentypen In C gibt es zwei Gruppen von elementaren Datentypen: Ganzzahlen und Gleitpunktzahlen Typ Speicherplatz Wertebereich Ganzzahlen: (unsigned) signed (signed) unsigned (signed) unsigned (signed) unsigned char char short short int int long long 1Byte 1Byte 2Byte 2Byte 4Byte 4Byte 4Byte 0 bis 255 -128 bis +127 -32768 bis 32767 0 bis 65535 -2147483648 bis 2147483648 0 bis 4294967295 „ Ganzza hlige Datentypen haben die Schlüsselworte signed (mit Vorzeichen) und unsigned (ohne Vorzeichen). Die Größe des benötigten Speicherplatz bleibt dabei erhalten. Nur der Wertebereich ändert sich, da bei signed-Werten das höchste Bit das Vorzeichen bestimmt. Die Datentypen short, int und long werden standardmäßig mit Vorzeichen interpretiert, der Typ char standardgemäß ohne Vorzeichen. C unterscheidet nicht zwischen Zeichen und Ganzzahl, da Zeichen intern als Ganzzahlen dargestellt werden, und zwar im Zeiche ncode der Maschine (ASCII-Code). Gleitpunktzahlen: Typ Speicherplatz float double long double 4Byte 8Byte 10Byte Dr.-Ing. K. Jäger-Hezel, 10.11.2006 Genauigkeit Wertebereich (dezimal) 9 Stellen 1.2E-38 bis 3.4E+38 15 Stellen 2.3E-308 bis 1.7E+308 19 Stellen 3.4E-4932 bis 1.1E+4932 4 Ingenieurinformatik Zur Darstellung der Gleitpunktzahlen wird üblicherweise das IEEE-Format verwendet: Beispiel: float mit 32 Bit Vorzeich. 31 Exponent zur Basis 2 30 ……………….. Mantisse 24 23 …………………………………0 Die Mantisse hat einen Wert der größer oder gleich 1 und kleiner 2 ist. Der reservierte Speicherplatz für die Mantissse bestimmt die Genauigkeit, der für den Exponenten den Wertebereich. „normalisierte“ Form Beispiel: -4.5 = -1 * 1.125 * 22 Die Genauigkeit gibt an, wie viel Dezimalstellen einer Zahl gespeichert werden können. Zum Beispiel bedeutet 9 Stellen genau, dass die 10. Dezimalstelle nicht mehr genau gespeichert werden kann. So sind die Zahlen 1234567.89 und 1234567.897 nicht unterscheidbar, ebenso nicht 0.000123456789 und 0.0001234567897. Beim lcc-Compiler hat der Datentyp float eine 24 Bit lange Mantisse. (vgl. Header-Datei float.h). Wertzuweisung Die Zuweisung eines Wertes erfolgt immer von rechts nach links. Beispiel: a = 5; Funktion „printf“ Die Funktion printf dient zur Ausgabe am Bildschirm. Die in der Klammer enthaltene Zeichenkette wird ausgegeben. Die darin enthaltenen Formatelemente (sog. Formatierer) werden durch die Werte der Argumente nach dem Komma ersetzt. Beispiel: printf(„Hello world!“); Dr.-Ing. K. Jäger-Hezel, 10.11.2006 Ausgabe: Hello world! 5 Ingenieurinformatik Bildschirmausgabe mit Anführungszeichen: printf(„\“Text\““); Ausgabe: „Text“ Formatierer: %d %f %lf %c %s Ausgabe als Dezimalzahl Ausgabe als Gleitkommazahl mit einfacher Genauigkeit float Ausgabe als Gleitkomma mit doppelter Genauigkeit double Ausgabe als Zeichen Ausgabe einer Zeichenkette Beispiel: printf(„%d %f“, 333,1.234); Ausgabe: 333 1.234000 Feldbreite: bedeutet: minimale Ausgabelänge (bzw. Feldlänge), schneidet nicht ab. printf(„%2d“, 123); printf(„%2d“,1); Ausgabe:123 Ausgabe:_1 printf(„%f“, 9.8765); printf(„%4.2f“, 9.8765); Ausgabe:9.876500 Ausgabe: _9.88 Ausgabe linksbündig/rechtsbündig: printf(„rechtsbündig:%5d linksbündig: %-5d“, 123,123); Ausgabe: rechtsbündig:__123 linksbündig: 123__ Funktion „scanf“ Funktion zur Eingabe von Daten. Die Zeichen werden von der Standardeingabe (Tastaturpuffer) gelesen, gemäß Formatierer konvertiert und der konvertierte Wert wird in der Variablen gespeichert, die durch das Argument adressiert wird. Beispiel: int a; scanf(„%d“, &a); Dr.-Ing. K. Jäger-Hezel, 10.11.2006 6 Ingenieurinformatik & ist Adressoperator, d.h. &a liefe rt die Adresse der Variablen a (Zeiger (pointer) auf die Variable a). Für jedes Formatelement wird das nächste Eingabefeld eingelesen, konvertiert und in die entsprechende Variable abgelegt. Eingabefelder sind durch Zwischenraumzeichen (Leer, Tabulator- und Newline-Zeichen) voneinander getrennt. Beispiel: int a = 0; int b = 0; printf(„Bitte zwei Integer-Zahlen eingeben!“); scanf(„%d%d“,&a,&b); fflush(stdin); Eingabe: 12 enter Inhalt: a=1 b=2 1 2 enter enter a=1 b=2 12 enter a = 12 b=0 scanf wartet auf weitere Eingabe! Wichtiger Hinweis: Um Fehler beim Einlesen zu Vermeiden, empfiehlt es sich, nach der scanf-Funktion die Anweisung fflush(stdin) durchzuführen. Dadurch wird der Tastaturpuffer gelöscht. Rückgabewert der scanf -Funktion: Die scanf-Funktion gibt einen Wert zurück, der die Anzahl der tatsächlich eingelesenen (und konvertierten) Werte (bzw. Eingabefelder) angibt. Daran kann erkannt werden, ob die Eingabe erfolgreich war. Beispiel: int a,b,ret; do{ printf(„ \nZwei Ganzzahlen eingeben ! “ ) ; ret = scanf( „ %d%d“, &a,&b); fflush(stdin); }while(ret != 2); Dr.-Ing. K. Jäger-Hezel, 10.11.2006 7 Ingenieurinformatik „ do…while“ Schleife Struktogramm: Anweisung Solange (Ausdruck wahr ist) fußgesteuerte („nicht abweisende“) Schleife C-Anweisung: do { ….. ….. } while( <Bedingung>); „while“ Schleife Struktogramm: Solange (Ausdruck wahr ist) Anweisung kopfgesteuerte („abweisende“) Schleife C-Anweisung: while ( <Bedingung>) { ….. ….. } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 8 Ingenieurinformatik Übung: Prüfung von Benutzereingaben Beispiel Copy-Shop: Die eingegebene Anzahl der Kopien soll geprüft werden. Def. und Initialisierung der Variablen zahl Auff. Anzahl Kopien eingeben Einlesen nach zahl Solange zahl <1 Ausgabe: Sie haben korrekt eingegeben. Ausgabe: Das Programm ist beendet /*Datum*/ /*Thema*/ /*Name*/ #include <stdio.h> int main() { int zahl = 0; do { printf(„Bitte geben Sie die Anzahl der Kopien ein!“); scanf(„%d“,&zahl); fflush(stdin); /*Löschen des Eingabepuffers*/ } while( zahl <1); printf(„Sie haben korrekt eingegeben! \n“); printf(„Das Programm ist beendet.“); return 0; } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 9 Ingenieurinformatik Verzweigung mit „if….else“ Anweisung if(Bedingung) { Anw. 1; …. } else { Anw. 2; …. } Bed. ja. nein Anw.1 Anw.2 Arithmetische Typenumwandlung In C ist es möglich, die arithmetischen Datentypen zu mischen. Das bedeutet, dass die Operanden einer arithmetischen Operation verschiedene Datentypen haben können. Der Compiler nimmt dann automatisch eine implizite Typanpassung vor. Dabei gilt generell, dass der Datentyp mit dem kleineren Wertebereich in den Datentyp mit dem größeren Wertebereich umgewandelt wird, damit der Wert erhalten bleibt. Mit dem Cast-Operator kann der Datentyp explizit geändert werden. Problem: Bei der Division zweier Ganzzahlen können Brüche entstehen. int a,b,c; a = 4; b = 3; c = a/b; Dr.-Ing. K. Jäger-Hezel, 10.11.2006 /*Ergebnis: Inhalt von c ist 1, da der Rest verworfen wird. */ 10 Ingenieurinformatik Lösung: Das Ergebnis einer Gleitpunktzahl zuordnen. int a,b; a = 4; b = 3; float erg; erg = a/b; /*Ergebnis: Inhalt von erg ist 1.000000 */ 2 Lösungmöglichkeiten: implizite Typumwandlung: erg = 1.0 * a/b; /* Inhalt von erg ist 1.333333*/ oder: explizite Typumwandlung mit dem Cast-Operator: erg = (float) a/b; /* Inhalt von erg ist 1.333333*/ Cast-Operator Übung: Copy-Shop • • • • • • Anzahl der Kopien eingeben (Eingabe > 0) Abfangen fehlerhafter Benutzereingaben Meldung, wenn Falscheingabe Preis pro Kopie definieren (50 Cent pro Kopie) Gesamtpreis in Cent ausgeben Gesamtpreis in Euro ausgeben Dr.-Ing. K. Jäger-Hezel, 10.11.2006 11 Ingenieurinformatik Init. und Def. int zahl = 0 Init und Def. int preis = 50 Aufforderung „Kopierzahl eingeben“ Einlesen in zahl zahl < 1 ja Sie haben falsch eingegeben! nein Kopierzahl wird übernommen! Solange (zahl <1) preis = preis * zahl Ausgabe von preis in Einheit Cent Ausgabe von preis/100 in Einheit Euro Ausgabe „Programm ist beendet!“ Dr.-Ing. K. Jäger-Hezel, 10.11.2006 12 Ingenieurinformatik C-Code: /*Datum*/ /*Thema*/ /*Name*/ #include <stdio.h> int main() { int zahl = 0; int preis = 50; /* Preis in Cent */ do { printf(„Bitte geben Sie die Anzahl der Kopien ein: “); scanf(„%d“,&zahl); fflush(stdin); /*Löschen des Eingabepuffers*/ if(zahl<1) { printf(„\nSie haben falsch eingegeben!“); }else { printf(„\nKopierzahl %d wird übernommen!“, zahl); } } while( zahl <1); preis = preis *zahl; printf(„Gesamtpreis in Cent: %d\n“, preis); printf(„Gesamtpreis in Euro: %5.2f\n“, (float)preis/100); printf(„Das Programm ist beendet!“); return 0; } Formatelement %5.2f bedeutet: 5 ist die minimale Feldbreite bzw. Ausgabelänge (ohne Dezimalpunkt) und 2 die Anzahl der Stellen hinter dem Dezimalpunkt. Beispiele: float y = 2.98765; printf(„>%10f<\n“,y); printf(„>%-10f< \n“,y); printf(„>%10.2f<\n“,y); Dr.-Ing. K. Jäger-Hezel, 10.11.2006 Ausgabe : > 2.987650< >2.987650 < > 2.99< linksbündig 13 Ingenieurinformatik Funktion pow() „power“ berechnet die Potenz xy . Ist als Funktion in der Header-Datei math.h definiert. Bei Verwendung der Funktion muß entweder die Header-Datei math.h includiert werden mit • #include <math.h> oder • deren Prototyp muss vor Gebrauch definiert sein mit: double pow(double, double); Return-Wert /*Prototyp von pow()*/ Übergabe-Werte oder Argumente oder Parameter, die an die Funktion übergeben werden ANSI-Standard: Der Prototyp einer Funktion besteht aus 3 Teilen: • Datentyp der Rückgabe-Werts • Name der Funktion • Datentypen der Parameter, die an die Funktion übergeben werden Beispiel: Berechnung der Wurzel aus 77 sowie 772 . /*Datum*/ /*Thema*/ /*Name*/ #include <stdio.h> double pow(double, double); /*Prototyp*/ int main() { double x = 77 , y ; y = pow(x, 0.5) ; /*Wurzel aus 77*/ printf(„Wurzel aus 77 ergibt: %.3f\n“, y) ; printf(„77 hoch 2 ergibt: %.3f\n“, pow(x, 2.0)) ; return 0; } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 14 Ingenieurinformatik Funktion sqrt() Funktion sqrt(x) („square root“), berechnet die Quadratwurzel des Arguments x. Der Wert x darf nicht negativ sein. Die Funktion gibt den Wert der Quadratwurzel zurück, wenn die Berechnung korrekt ist. Falls das Argument x negativ ist, so wird 0 zurückgegeben. Der Prototyp von sqrt() ist in math.h enthalten: double sqrt(double); Übung: Gegeben: double st = 16; double erg; Gesucht ist die Quadratwurzel der Variablen st, berechnet mit der Funktion pow() und der Funktion sqrt(). Ergebnis nach erg. Nur C-Code. #include <stdio.h> #include <math.h> int main() { double st = 16; double erg; erg = pow(st, 0.5); printf(“Ergebnis von pow(): %10.4lf\n”, erg); printf(„Ergebnis von sqrt(): %10.4lf\n“, sqrt(st)); return 0; } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 15 Ingenieurinformatik „modulo“-Funktion Während bei der Division zweier Ganzzahlen der Rest verworfen wird, ist das Ergebnis der „modulo“-Funktion genau dieser Rest. C- Code: % Division von Ganzzahlen - verwirft Ergebnis und liefert den Rest ! Beispiele: 7%6 = 1 9%3 = 0 3%9 = 3 4%9=4 ….. 9%9=0 10%9=1 sprich: 7 modulo 6 3728%2 = 0 2555551%2 =1 Zahl ist gerade Zahl ist ungerade Übung: • • • • Frage nach ganzer Zahl. Überprüfe, ob die Za hl durch 5 teilbar ist. Wenn ja, Ausgabe „Zahl durch 5 teilbar. Wenn nicht, gibt Text „nicht teilbar!“ aus und gib die nächst kleinere Zahl, die durch 5 teilbar ist, aus. Struktogramm und C-Code Dr.-Ing. K. Jäger-Hezel, 10.11.2006 16 Ingenieurinformatik Auff. „Bitte eine ganze positive Zahl eingeben!“ Einlesen nach int zahl ja zahl durch 5 teilbar ? nein Ausgabe: Zahl ist nicht teilbar ! Ausgabe: Zahl ist durch 5 teilbar! zahl = zahl -1 Solange (zahl >0 und nicht teilbar durch 5) ja zahl > 0 nein „Richtig wäre gewesen: zahl“ ersetzen (zahl > 0) && ( zahl != zahl – (zahl modulo 5)) Dr.-Ing. K. Jäger-Hezel, 10.11.2006 17 Ingenieurinformatik C-Code: #include <stdio.h> int main() { int zahl = 0; printf(„Bitte ganze positive Zahl eingeben!\n“); do { scanf(„%d“, &zahl); fflush(stdin); }while (zahl <=0); int rest= zahl %5; if(rest == 0 ) /*Vergleichsoperator “identisch gleich“ */ { printf(„Zahl ist durch 5 teilbar.\n“); } else { printf(„Zahl ist nicht durch 5 teilbar!\n“); do { zahl = zahl -1; rest = zahl%5; }while(zahl >0 && rest >0); if(zahl>0) { printf(„Richtig wäre gewesen: %d\n“, zahl); } } return 0; } Ersatz-Code für do…..while: do { zahl--; }while( zahl>0 && zahl != zahl - (zahl%5)); Dr.-Ing. K. Jäger-Hezel, 10.11.2006 18 Ingenieurinformatik Logische Operatoren Mit logischen Operatoren werden zusammengesetzte Bedingungen formuliert. C-Code ODER || binärer Operatoren UND && NOT ! (Bedingung1 || Bedingung2 ) && unärer Operator !(Bedingung) In C liefert ein logischer Ausdruck als Ergebnis : entweder „falsch“ , d.h. den int Wert 0 oder „wahr“ d.h. den int Wert 1 Wahrheitstabellen: AND: OR: Bed.1 w w f f w w f f Bed.2 w f w f w f w f ________________________________________________________________ Erg. w f f f w w w f NOT: f w _________________ w f Beispiele für logische Ausdrücke: x 1 0 1 0 y -1 0 0 1 Dr.-Ing. K. Jäger-Hezel, 10.11.2006 Logischer Ausdruck x <= y || y >= 0 x> -5 && y == 0 x == 1 && !y !(x+1) || (y-2) >0 Ergebnis 0 (falsch) 1 (wahr) 1 (wahr) 0 (falsch) 19 Ingenieurinformatik Übung: Fordere eine ganze positive Zahl an, prüfe die Eingabe und gibt die Quersumme dieser Zahl aus. Struktogramm und C-Code Auff. „Ganze positive Zahl eingeben!“ Einlesen der zahl und Prüfung der Eingabe int sum =0, int rest =0 rest = zahl % 10; sum = sum + rest; zahl = zahl /10 Solange (zahl > 0) Ausgabe Quersumme sum #include <stdio.h> int main() { int zahl = 0, sum =0; do { printf(„Bitte eine positive ganze Zahl eingeben! \n“); scanf(„%d“, &zahl); fflush(stdin); }while( zahl <= 0); do { sum = sum + zahl %10; zahl = zahl/10; }while (zahl > 0); printf(„\nQuersumme: %d“, sum); return 0; } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 20 Ingenieurinformatik Zählschleife (“for”-Schleife) • • • Index mit festem Anfangswert festem Endwert Erhöhung um festen Wert pro Schleifenumlauf Struktogramm solange( i <= 10 ) Aktionen i = i+1 C- Code for( int i = 1; i<=10; i = i+1) { ….. } oder for(int i =1; i<=10; i++) Inkrement-Dekrement-Operator Unärer Operator, der den Wert um 1 erhöht bzw. erniedrigt. i++; i--; entspricht entspricht i = i+1; i = i -1; i wird um 1 erhöht. i wird um 1 erniedrigt Schreibweise ist in for-Schleifen üblich: for( s= 1; s<=10; s++) Man unterscheidet zwischen Postfix und Präfix: Postfix: j = i++; Dr.-Ing. K. Jäger-Hezel, 10.11.2006 bedeutet: j = i; i = i+1; Zuerst wird der Wert von i dem Wert von j zugeordnet und dann wird i um 1 erhöht. 21 Ingenieurinformatik Präfix: j = ++i; bedeutet: i = i+1; j = i; Zuerst wird i um 1 erhöht und dann sein Wert dem Wert von j zugeordnet. Beispiel: int i,j; i = 1; j = ++i +1; /* i = 2, j = 3 */ i wird um 1 erhöht, bevor es im Ausdruck verwendet wird. i = 1; j = i++ +1; /* i = 2, j = 2 */ i wird um 1 erhöht, nachdem es im Ausdruck verwendet wird. Übung: Geben Sie eine Multiplikationstabelle von 1 bis 10 am Bildschirm aus. 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 10 20 30 40 50 60 70 80 90 100 4 5 6 7 8 9 10 Hilfestellung: 2 ineinander geschachtelte for-Schleifen Dr.-Ing. K. Jäger-Hezel, 10.11.2006 22 Ingenieurinformatik Ausgabe Kopfzeile mit Tabulator-Zeichen Int Variablen Zeile = 1; spalte = 1; erg = 0; Solange zeile <=10 Ausgabe Zeilennummer zeile Solange spalte <=10 Erg = zeile * spalte Ausgabe: \t erg Spalte = spalte +1 Zeile = zeile +1 #include <stdio.h> int main() { printf(„\n\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10“); int z = 0, s = 0; int erg = 0; for( z = 1; z<=10;z++) { printf(“\n%d”, z); for( s= 1; s<=10; s++) { erg = z*s; printf(“\t%d”, erg); } } return 0; } Dr.-Ing. K. Jäger-Hezel, 10.11.2006 23