Informatik: Einführung in C - Teil 3
Released by matroid on Do. 12. April 2007 10:16:42 [Statistics]
Written by matph - 3568 x read [Outline] Printable version Printer-friendly version -  Choose language   
Informatik

\(\begingroup\) Die Fortsetzung der Serie Einführung in C mit dem nächsten Programm - Taschenrechner

C


[Teil 1: Installation eines C-Compilers] [Teil 2: Hello World] [Teil 4: Advanced Track]

Programm

Nach dem wir im 2. Teil einen überblick über C und dessen Aufbau gewonnen haben, werden wir uns nun mit den wichtigsten Funktionen vertraut machen. Zeigen möchte ich diese an hand des kleinen Rechners: \sourceon C #include #define MAXLENGTHSTR 255 int main(void) { /* Deklaration der Variablen */ int ein1, ein3, aus; char ein2; char s1[MAXLENGTHSTR]; /* Usereingabe */ printf("Eingabe: "); flushall(); gets(s1); /* Interne Verarbeitung des Input */ sscanf(s1, "%d %c %d", &ein1, &ein2, &ein3); aus = 0; /* Berechnung */ switch(ein2) { case '+': aus = ein1 + ein3; break; /* Addition */ case '-': aus = ein1 - ein3; break; /* Subtraktion */ case '*': aus = ein1 * ein3; break; /* Multiplikation */ case '/': aus = ein1 / ein3; break; /* Division */ case '%': aus = ein1 % ein3; break; /* Modulo */ default: printf(" Input error!\n"); break; } /* Ausgabe */ printf("Ergebnis: %d\n", aus); /* Ende */ return 0; } \sourceoff calculator.c In diesem Programm lesen wir 2 Integere Zahlen so wie den Operator, mit welchem diese verknüpft sind, ein, berechnen das Ergebnis, und geben dieses dem Benutzer wieder aus. In C müssen alle Variablen vor ihrer ersten Verwendung deklariert werden, dabei legen wir den Typ (int, float, double,...) fest. Konstanten, die wir bereits letztes Mal in der Form von pi gesehen haben, können im Verlauf des Programms keinen neuen Wert zugewiesen bekommen. Bei anderen Variablen kann jederzeit, und beliebig oft, der Inhalt Upgedated werden. Dies geschieht mit dem =-Operator. s1 ist in diesem Beispiel ein Array, welches 255 Byte lang ist, hier definiert mit MAXLENGTHSTR welche über define am Anfang ihren Wert erhält, ebenfalls währe es z.B. über die Verwendung der hexadezimalen Schreibweise 0x*** für die Dezimalzahl realisierbar, dies würde char s1[0xFF]; ergeben, oder 255 direkt zu schreiben. Auch const unsigned int statt dem Makro stellt eine Möglichkeit dar. Zwischen /* und */ stehen Kommentare, diese werden vom Compiler ignoriert, und dienen lediglich der Information des Programmierers. Sie können mehr als eine Zeile umfassen, so ist es auch einfach bei der Fehlersuche ganze Programmteile als Kommentar zu kennzeichnen. Doch sehen wir uns die verwendeten Elemente und Techniken etwas mehr im Detail an...

Kontrollstrukturen

Eine der wohl wichtigsten Überprüfungsmöglichkeiten ist die if-Funktion, welche ihr Argument auswertet, und daraufhin entscheidet, wie fortgefahren wird. Der übergebene Ausdruck muss den Typ bool - d.h. wahr true oder unwahr false - zurückliefern. Um diese Werte zu erhalten, gibt es eine Reihe von Vergleichsoperatoren, die wichtigsten sind dabei sicherlich ==, welcher auf Gleichheit überprüft, >= größer Gleich, < kleiner als,... mit ! kann außerdem verneint werden. Auch die Verknüpfungen verschiedener Aussagen über && (und) bzw. || (oder) sind möglich. \sourceon C if(a==b){ /* wenn wahr */ } else{ /* wenn unwahr */ } \sourceoff Nach dem diese Art der Kontrolle sehr oft benötigt wird, bietet C eine kürzere Notation, den ternären Operator: Bedingung ? wenn Richtig : wenn Falsch Um nicht unnötig viele verschachteln zu müssen, existiert weiters Konstrukt, der case-Ausdruck den wir auch im Beispiel verwenden. Mit switch übergeben wir die Variable, in jedem case überprüfen wir auf Gleichheit, mit default geben wir an, wie zu verfahren ist, passt kein angegebener Fall. Es werden dabei jeweils alle Ausdrücke ausgeführt, die bis zu break deklariert sind. Die for-Schleife haben wir bereits im letzten Teil kennen gelernt, auch gibt es eine weitere Möglichkeit, die while-Schleife, hier wird ebenfalls lediglich eine Bedingung übergeben, so lange diese true zurückliefert, wird das Konstrukt durchlaufen.

Zeiger

Diese sind gerade am Anfang für viele recht verwirrend, dies müssen sie allerdings nicht sein. Man darf es sich nur nicht unnötig kompliziert vorstellen. Eine Deklaration wie die Folgende int *z; Initialisiert eine neue Zeigervariable, dies gibt der * an, d.h. hier speichern wir verschiedene Adress-Werte des Hauptspeichers, wobei diese hier auf int-Zahlen zeigen sollten. Mit & geben wir die Speicheradresse zurück, nicht den Wert an dieser Stelle. Sehen wir uns dazu ein Beispiel an: \sourceon C int i, *j; i= 5; j= &i; printf ("%d %d", i, *j); \sourceoff Das Programm wird 5 5 ausgeben, wichtig ist dabei, es existieren keine zwei 5er im Speicher, j referenziert lediglich den Wert von i. Im Beispielprogramm benötigen wir ebenfalls diese Technik in sscanf(s1, "%d %c %d", &ein1, &ein2, &ein3); um in die Speicherplätze von ein1,... die Werte zu schreiben.

IO

Funktionen für Input und Output werden in der entsprechenden standard IO Bibliothek definiert, welche wie alle anderen den im Grunde bereits für sich sprechenden Namen dafür besitzen, hier stdio.h. Für die Ausgabe haben wir printf bereits gesehen, diese Funktion ist folgendermaßen zu beschreiben: \sourceon C printf(String, Var1, Var2,...) \sourceoff Dabei kann im String Bezug auf die nachkommenden Variablen genommen werden. Mit %d fügen wir an entsprechender Stelle beispielsweise eine Dezimalzahl ein, mit %f eine Fließkommazahl, %c gibt einen Char an, und %s einen ganzen String. So wird formatierte Ausgabe am Terminal ermöglicht. scanf funktioniert fast genauso, nur das wir von stdin lesen, und die Adressen der Variablen übergeben. Im Beispiel benutze ich sscanf welche nicht vom Input liest, sondern von der Variablen s1. Doch sehen wir uns die Eingabe im Rechner etwas näher an. Wir geben als erstes Eingabe: aus, hier hängen wir keinen Zeilenumbruch an, d.h. die folgende Eingabe geschieht in der selben Zeile. Auch weitere Ausgaben würden ohne eine neue Zeile zu beginnen an der entsprechenden Stelle fortgesetzt. Dann entleeren wir den Buffer mit flushall(). Wichtig ist dies vor allem wenn wir mit scanf arbeiten, an Eingabe des Users wird ein Newline-Char angehängt, sobald dieser die Return-Taste betätigt, welcher im Buffer verweilt, wenn wir diesen in der Formatierung nicht berücksichtigen. Hier lesen wir allerdings erstmal die gesamte Zeile ein, dies geschieht mit gets und wir erhalten jeden einzelnen Buchstaben, den der User eingegeben hat. Erst intern verarbeiten wir diese nun via sscanf weiter, um die Werte zu erhalten, mit denen wir im Programm rechnen können. Die Ausgabe-Variable aus setzten wir dabei noch schnell standardmäßig auf 0, denn diese wurde bei der Initialisierung nicht gelöscht, hier steht sonst noch immer der Wert welcher sich zuletzt, z.B. durch ein anderes Programm, im Hauptspeicher des PCs befand. Wir können auch auf Files in anderen Geräten zugreifen, um von hier zu lesen bzw. zu schreiben, dies geschieht in dem wir mit fopen die Datei öffnen, und dann beispielsweise mit fgets lesen, oder mit fprintf in das File schreiben. Zu beachten ist, wir sollten dieses vor Beendigung des Programms wieder schließen, dies geschieht mit fclose, um den Zugriff anderer Programme wieder zu ermöglichen. Auch feof ist beim Einlesen wichtig, diese Funktion überprüft ob das Ende der Datei erreicht ist.

Datenstrukturen

Der Syntax eines Arrays in C ist \sourceon C int count[6]; /* 6 element integer array */ float meter[10]; /* 10 element floating point array */ \sourceoff Der Index dieser Beginnt in dieser Programmiersprache immer mit 0, d.h. das Array count enthält die Elemente 0, 1, 2, 3, 4 und 5, es existiert kein Element 6 - es währe das siebente Element. Schreiben wir nun count[4] = 10; so führen wie ein Update des vierten Elements auf die Zahl 10 durch. Auch mehr Werte können an ein Array übergeben werden, so können wir durch int count[] = {10,20,30} ein Array erzeugen, welches 3 Elemente besitzt und die Werte 10, 20 und 30 besitzt. Auch mehrere Dimensionen sind kein Problem, so können wir Beispielsweise eine Matrix der Größe 5 * 6 erzeugen, in dem wir float matrix[5][6] eingeben. Auch wenn wir "Hello" eingeben, handelt es sich um ein Array, dieses besitzt den Typ char und 5 Elemente. Beendet wird dieses, so wie die anderen Arrays mit einem 0-Byte, explizit erzeugt werden kann es mit \0. Im Beispiel benutzen wir ein Char-Array um die Eingabe des Users ab zu speichern. Dies funktioniert so lange diese nicht länger ist als der dafür reservierte Speicherplatz, wir sollten uns daher bereits beim Schreiben des Programms Gedanken darüber machen, wie die Eingabe aussieht. Doch auch mit Zeigern lässt sich auf Eingaben referenzieren, um derartige Problematiken zu vermeiden.

Funktionen

Sehen wir uns zum Abschluss noch eine modifizierte Version von helloWorld an: \sourceon C #include int hello() { printf("Hello World!\n"); return 0; } int main(void) { hello(); return 0; } \sourceoff helloWorld.c Hier definieren wir eine weitere Funktion des Typs int mit dem Namen hello welche Hello World! ausgibt, und in main() aufgerufen wird. Wir können natürlich auch eine Funktion definieren, die Argumente übernimmt, diese müssen zwischen den Klammern angegeben werden. Deren Werte stehen unter den dortigen Namen in der Funktion zur Verfügung. Auch der Rückgabewert, in diesem Falle die 0, kann einer Variablen zugewiesen, oder direkt ausgegeben werden. Ein Beispiel hierzu: \sourceon C #include const double pi=3.141592653589793; float zylinder(float h, float r) { float s; s=2*pi*r*(r+h); return(s); } int main(void) { float ra,hi; printf(" -----------------------\n"); printf(" Zylinderoberflaeche\n"); printf(" -----------------------\n\n"); printf("Hoehe: "); scanf("%f",&hi); printf("Radius: "); scanf("%f",&ra); printf("\nOberflaeche: %f",zylinder(hi,ra)); return 0; } \sourceoff zylinder.c Wichtig dabei ist zu beachten, in C sind Funktionen nicht Funktionen im mathematischen Sinn, diese müssen nicht bei gleichen Eingaben immer den selben Wert zurückliefern, siehe z.B. scanf, und dürfen Seiteneffekte besitzen, wie hier in hello() z.B. die Ausgabe. Auch globale Variablen können bei einem Aufruf verändert, und umgekehrt darf auf diese Bezug genommen werden, auch so kann der Ablauf einer Funktion so wie deren Rückgabewert variieren.

Zur Fortsetzung >>> [Teil 4: Advanced Track]
\(\endgroup\)
Get link to this article Get link to this article  Printable version Printer-friendly version -  Choose language     Kommentare zeigen Comments  
pdfFür diesen Artikel gibt es keine pdf-Datei


Arbeitsgruppe Alexandria Dieser Artikel ist im Verzeichnis der Arbeitsgruppe Alexandria eingetragen:
: Informatik :: automatisch eingefügt und unbearbeitet :
Einführung in C - Teil 3 [von matph]  
Die Fortsetzung der Serie Einführung in C mit dem nächsten Programm - Taschenrechner [Teil 1: Installation eines C-Compilers] [Teil 2: Hello World]
[Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

 
 
Aufrufzähler 3568
 
Aufrufstatistik des Artikels
Insgesamt 21 externe Seitenaufrufe zwischen 2012.04 und 2021.12 [Anzeigen]
DomainAnzahlProz
http://matheplanet.com14.8%4.8 %
https://matheplanet.com29.5%9.5 %
https://google.de14.8%4.8 %
http://google.de1361.9%61.9 %
http://isearch.avg.com29.5%9.5 %
http://google.at14.8%4.8 %
http://172.16.137.1:191014.8%4.8 %

Aufrufer der letzten 5 Tage im Einzelnen
Insgesamt 1 Aufruf in den letzten 5 Tagen. [Anzeigen]
DatumAufrufer-URL
2021.12.03 01:01links.php?op=viewslink&sid=146

Häufige Aufrufer in früheren Monaten
Insgesamt 4 häufige Aufrufer [Anzeigen]
DatumAufrufer-URL
201206-06 (4x)http://google.de/url?sa=t&rct=j&q=minimalpolynom rechner online

[Top of page]

"Informatik: Einführung in C - Teil 3" | 5 Comments
The authors of the comments are responsible for the content.

Re: Einführung in C - Teil 3
von: Jockel am: Do. 12. April 2007 12:54:27
\(\begingroup\)Hallo, einen Verbesserungsvorschlag hätte ich für deinen Taschenrechner. Sinnvolle Bezeichner halte ich für wichtiger als Kommentare, daher finde ich 'ein1, ein2, ein3' nicht gelungen. Besser wäre es sie so zu nennen, was sie auch sind, nämlich Operanden und Operatoren. Grüsse Jockel\(\endgroup\)
 

Re: Einführung in C - Teil 3
von: javaguru am: Do. 12. April 2007 14:30:25
\(\begingroup\)Hi, ich finde diesen Artikel sehr gut gelungen und bedanke mich nochmal für die Fortsetzung meiner begonenen Artikelserie... javaguru\(\endgroup\)
 

Re: Einführung in C - Teil 3
von: gisa am: Mo. 13. August 2007 11:11:09
\(\begingroup\)finde den Artikel sehr gut :-). Bitte weitere Teile :-). Viele Grüße Gisa \(\endgroup\)
 

Re: Einführung in C - Teil 3
von: Ex_Mitglied_40174 am: So. 13. Januar 2008 16:18:19
\(\begingroup\)hi hi, bin recht neu in c, habe fehlermeldung 13 E:\progamming\bins\t_rechner.cpp `flushall' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) was hab ich falsch gemacht?????\(\endgroup\)
 

Re: Einführung in C - Teil 3
von: matph am: So. 13. Januar 2008 17:49:18
\(\begingroup\)Hallo, Ändere mal die Extension auf .c 😄 -- mfg matph\(\endgroup\)
 

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]