Programmieren in C. Burkhard Bunk 6.3.2013



Ähnliche Dokumente
Einführung in die C-Programmierung

Programmieren in Fortran

1 Vom Problem zum Programm

Ingenieurinformatik Diplom-FA (Teil 2, C-Programmierung)

Dr. Monika Meiler. Inhalt

Tutorium Rechnerorganisation

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Einführung in die Programmiersprache C

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

2. Programmierung in C

Die Programmiersprache C99: Zusammenfassung

Übersicht Programmablaufsteuerung

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Grundlagen. Kapitel 1

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Die Programmiersprache C

Excel Funktionen durch eigene Funktionen erweitern.

Anweisungsblöcke (dazu zählen auch Programme) werden in geschweifte Klammern eingeschlossen.

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Erwin Grüner

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Einführung in die C++ Programmierung für Ingenieure

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Einführung in die Programmierung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Java Kurs für Anfänger Einheit 5 Methoden

Programmierkurs Java

Computerarithmetik ( )

Deklarationen in C. Prof. Dr. Margarita Esponda

5. Tutorium zu Programmieren

Kurzeinführung in C. Johannes J. Schneider

Informatik Repetitorium SS Volker Jaedicke

Übungen zu C++ Kapitel 1

Modellierung und Programmierung 1

Objektbasierte Entwicklung

Grundlagen der Programmiersprache C++

Propädeutikum. Dipl.-Inf. Frank Güttler

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Zählen von Objekten einer bestimmten Klasse

Programmierung in C. Grundlagen. Stefan Kallerhoff

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Einführung in die Programmierung

Vorkurs C++ Programmierung

Native Zeichenketten (C-Strings)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Kurzeinführung LABTALK

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Unterprogramme, Pointer und die Übergabe von Arrays

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Hochschule München, FK 03 FA SS Ingenieurinformatik

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Artikel Schnittstelle über CSV

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Eine Einführung in C-Funktionen

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Prozedurale Datenbank- Anwendungsprogrammierung

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

DLLs (dynamic loaded libraries) mit MingW erstellen

Grundlagen von Python

Aufgaben zur C-Programmierung für die Praktikumsperiode des 1.Semesters

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Zusammenfassung des Handzettels für Programmieren in C

1Schnelleinstieg 14. 2Wie aus einer einfachen Textdatei. 3 Wie man eigene Programme erstellt 30. Inhaltsverzeichnis. ein Programm wird 20

FB Informatik. Fehler. Testplan

EINFACHES HAUSHALT- KASSABUCH

PHP 5.4 ISBN Stephan Heller, Andreas Dittfurth 1. Ausgabe, September Grundlagen zur Erstellung dynamischer Webseiten GPHP54

Testen mit JUnit. Motivation

VisualBasic - Variablen

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Ingenieurinformatik Diplom-FA (C-Programmierung)

C/C++ Programmierung

Einführung in die Programmierung

10 Lesen und Schreiben von Dateien

Die Excel Schnittstelle - Pro Pack

Übung 9 - Lösungsvorschlag

Objektorientiertes Programmieren für Ingenieure

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Version 0.3. Installation von MinGW und Eclipse CDT

Fallunterscheidung: if-statement

Projektverwaltung Problem Lösung: Modulare Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

I.1 Die Parrot Assemblersprache

Transkript:

Programmieren in C Burkhard Bunk 6.3.2013 1 C Die Programmiersprache C wurde Anfang der 70er Jahre von Brian Kernighan und Dennis Ritchie bei Bell Labs (später AT&T) entwickelt und 1989 (in etwas weiter entwickelter Form) standardisiert (ANSI C). Es ist die Sprache für Probleme auf der Ebene des Betriebssystems, insbesondere Unix, und der darauf aufbauenden Anwendungssoftware. Inzwischen werden aber auch viele Programme für numerische Probleme in C geschrieben. 2 Beispielprogramm Das folgende Programm steht in einer Datei wurzeln.c, die von http://poolinfo.physik.hu-berlin.de heruntergeladen werden kann. Es berechnet Quadrat und Kubikwurzeln mit Hilfe der Iterationen x n+1 = 1 (x n + z ) z 2 xn y n+1 = 1 ( 2y n + z ) z 1/3 3 yn 2 2.1 Listing 1 /* B Bunk 4/2001 2 Tabelle von Quadrat- und Kubikwurzeln berechnen rev 3/2012 3 und in File schreiben 4 */ 5 #include <stdlib.h> /* fuer exit() */ 6 #include <stdio.h> /* fuer printf, scanf, fopen etc */ 7 #include <math.h> /* nicht noetig */ 8 9 #define NMAX 100 10 static float tol = 1.e-6; 1

11 12 float w2(float z); /* Prototypen der weiter unten */ 13 void sub3(float z, float *w3); /* definierten Unterprogramme */ 14 15 int main(void){ 16 17 float tabelle[nmax][3]; /* Index-Bereiche 0:(NMAX-1), 0:2 */ 18 float x0, dx, x, w3; 19 int n, i; 20 FILE *tabfile; 21 22 printf("x0 dx n? "); /* Parameter abfragen */ 23 scanf("%f%f%i", &x0, &dx, &n); /* und einlesen */ 24 25 if (n > NMAX){ 26 printf("fehler: Anzahl zu gross fuer Tabelle\n"); 27 exit(1); 28 } 29 30 for (i = 0; i < n; i++){ /* Schleife ueber Tabellenzeilen */ 31 x = x0 + i*dx; 32 33 tabelle[i][0] = x; /* Tabellenzeile berechnen */ 34 tabelle[i][1] = w2(x); /* Funktionsaufruf */ 35 36 sub3(x, &w3); /* Aufruf von Unterprogramm */ 37 /* Adresse von w3 uebergeben */ 38 /* fuer Rueckgabe des Ergebnisses */ 39 tabelle[i][2] = w3; 40 41 /* Kontrollausdruck */ 42 printf("%10f %10f %10f\n", 43 tabelle[i][0], tabelle[i][1], tabelle[i][2]); 44 } 45 46 tabfile = fopen("wurzeln.tab","w"); /* File zum Schreiben oeffnen */ 47 for (i = 0; i < n; i++){ 48 /* Zeile schreiben */ 49 fprintf(tabfile,"%10f %10f %10f\n", 50 tabelle[i][0], tabelle[i][1], tabelle[i][2]); 51 } 52 fclose(tabfile); /* File schliessen */ 53 exit(0); 54 } 55 56 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ 57 2

58 float w2(float z){ 59 60 /* w2 <- sqrt(z) berechnen */ 61 62 float x, xalt; 63 64 if (z < 0.){ /* Argument pruefen */ 65 printf("fehler in w2: negatives Argument\n"); 66 exit(2); 67 } 68 69 xalt = 0.; 70 x = 1.; /* Startwert */ 71 while (fabs(x-xalt) > tol){ /* Konvergenztest */ 72 xalt = x; 73 x =.5 * (x + z/x); /* Iteration */ 74 } 75 return x; 76 } 77 78 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ 79 80 void sub3(float z, float *w3){ 81 82 /* w3 <- z**(1/3) berechnen */ 83 84 float w, walt; 85 86 if (z < 0.){ /* Argument pruefen */ 87 printf("fehler in sub3: negatives Argument\n"); 88 exit(3); 89 } 90 91 w = 1.; /* Startwert */ 92 do { 93 walt = w; 94 w = (2*w + z/(w*w))/3; /* Iteration */ 95 } 96 while (fabs(w-walt) > tol); /* Konvergenztest */ 97 *w3 = w; 98 return; 99 } 3

3 Zeilenkommentar 3.1 Struktur 5-13: Vorspann 15-54: Hauptprogramm main 58-76: Funktion w2 für Quadratwurzel 80-99: Prozedur sub3 für Kubikwurzel 3.2 Vorspann 1-4: /*... */ ist ein Kommentarblock (über mehrere Zeilen) 5-7: Präprozessor bindet Systemdateien (Header) ein 9: Präprozessor Definition einer Konstanten (max. Tabellengröße) 10: globale Variable, gültig in der ganzen Quelldatei 12-13: Compiler wird informiert über Unterprogramme, die erst weiter unten definiert werden (Prototypen) 3.3 Hauptprogramm 15: Hauptprogramm heißt (immer) main, gibt eine int ans Betriebssystem zurück (return value) Argumentliste ist leer (void), d.h. keine Übernahme aus der Kommandozeile { leitet den Definitionsblock des Hauptprogramms ein (endet in Zeile 54) 17: Deklaration einer Matrix (für die Tabellierung der Werte) mit NMAX Zeilen und drei Spalten Indizes 0..(NMAX 1) bzw. 0..2 18-19: Deklaration der Variablen vom Typ Gleitkommazahl (float) und Ganzzahl (int) 20: Deklaration eines Zeigers auf eine Datei (file pointer) 22: Bildschirmausgabe der Frage nach Parametern (ohne Zeilenvorschub) 23: Einlesen der Parameter von der Tastatureingabe. Es sollen n Werte tabelliert werden, angefangen mit x 0 und in Schritten von dx. Die Formatangaben %f (für eine Variable vom typ float) und %i (für int) werden der Reihe nach den Variablen zugeordnet, die folgen. Hier müssen die Adressen der Variablen stehen, z.b. &x0, nicht der Wert x0. 25-28: Programm wird (mit Fehlermeldung) gestoppt, wenn Tabelle zu klein (Rückgabewert = 1) 30-44: Schleife über x-werte, d.h. Tabellenzeilen 31-33: aktuellen x-wert berechnen und in die erste Tabellenspalte schreiben 34: Wurzelfunktion (s.u.) aufrufen, Resultat in die zweite Spalte 36-39: Prozedur für Kubikwurzel aufrufen, Resultat w3 in die dritte Spalte 42-43: aktuelle Tabellenzeile (Spalten 0..2) auf den Schirm schreiben 46: Datei zum Schreiben öffnen, Zeiger tabfile definieren 47-51: Tabelle zeilenweise in Datei schreiben 52: Datei schließen 4

53: normales Ende des Programms (Rückgabewert = 0) 54: Ende des Hauptprogrammblocks 3.4 Funktion w2 58: Kopfzeile der Funktion w2 mit Dummy Argument z; der Funktionsname dient als Variable, um das Resultat zurückzugeben; Typen werden gleich hier deklariert 62: Deklaration lokaler Hilfsvariablen 64-67: Fehlerbehandlung (ggf. Rückgabewert = 2) 69-70: Iteration initialisieren 71-74: Iterationsschleife 71: while Schleife läuft, solange Genauigkeit noch nicht erreicht ist 75: x als Wert der Funktion zurückgeben, Unterprogramm beenden 76: Ende des Unterprogrammblocks 3.5 Prozedur sub3 80: Kopfzeile der Prozedur mit Dummy Argumenten z zur Eingabe und w3 zur Rückgabe des Resultats (Zeiger); der Name der Prozedur dient nur zum Aufruf (Typ void) 84: Deklaration lokaler Hilfsvariablen 86-89: Fehlerbehandlung (ggf. Rückgabewert = 3) 91: Iteration initialisieren 92-96: Iterationsschleife 96: do-while Schleife: läuft mindestens einmal und dann weiter, solange Genauigkeit noch nicht erreicht ist 97: w als Wert von w3 zurückgeben 98: Unterprogramm beenden 99: Ende des Unterprogrammblocks 4 Übersetzen und Aufrufen Das Quellprogramm muss mit einem C Compiler übersetzt werden. In erster Linie bietet sich dafür der GNU C Compiler gcc an, aber man kann auch die Compiler von Intel oder Portland benutzen: oder oder unix> gcc wurzeln.c -lm unix> icc wurzeln.c unix> pgcc wurzeln.c Der Schalter -lm bindet die (zu math.h gehörige) Mathematik Bibliothek libm ein. Er ist nur bei gcc nötig, die beiden anderen Compiler machen das automatisch. 5

In allen Fällen entsteht eine ausführbare Binärdatei mit dem Standardnamen a.out, deren Aufruf das Programm ablaufen lässt: unix> a.out Meist gibt man der Binärdatei gleich beim Übersetzen einen besseren Namen, z.b. einfach den Basisnamen wurzeln ohne Erweiterung: unix> gcc -o wurzeln wurzeln.c -lm unix> wurzeln 5 Einige Punkte im Überblick 5.1 Quellformat Präprozessor sind an einem # in der ersten Spalte zu erkennen. Im eigentlichen C Programm ist die Formatierung frei, müssen mit ; (Semikolon) abgeschlossen werden. Sie können sich über den Zeilenumbruch fortsetzten, auch mehrere pro Zeile sind möglich. Namen für Objekte und Schlüsselwörter bestehen aus Buchstaben (groß/klein, signifikant), Ziffern (nicht am Anfang) und (Unterstrich). Zeichenketten werden mit ".." begrenzt. Benutzung der Klammersymbole: ( ) in Ausdruecken und fuer Funktionsargumente, [ ] fuer Indizes von Feldern, { } fuer Anweisungsbloecke. Kommentare werden durch /*... */ geklammert und können sich über mehrere Zeilen erstrecken, dürfen aber nicht geschachtelt werden. 5.2 Datentypen Die wichtigsten sind int long ganze Zahl, 4 Bytes, Bereich ca +/- 2x10^9 ganze Zahl, 4 oder 8 Bytes float double Kommazahl, 4 Bytes, 7 Stellen, aus +/-10^(+/-38) Kommazahl, 8 Bytes, 16 Stellen, aus +/-10^(+/-308) char Zeichen(kette) Die Bedeutung von long hängt von der Architektur des Systems ab (32/64 bit). Deklarationen stehen entweder oberhalb der Programmteile (im Dateikopf), dann gelten sie bis ans Ende der Datei, oder am Anfang eines Programm oder Anweisungsblocks (vor den ausführbaren ), dann gelten sie bis zum Ende des Blocks. 6

Alle Namen muss man deklarieren, bevor man sie benutzt. Das gilt auch für aufzurufende Funktionen und Prozeduren, für die man einen Prototyp vorausschickt (meist im Dateikopf). Für die Systemfunktionen geschieht das über Headerdateien, die der Präprozessor im System sucht und über Direktiven wie #include <stdlib.h> einfügt. 5.3 Zeiger und Werte In C hat man nicht nur auf gespeicherte Werte Zugriff, sondern auch auf die Speicheradressen. Das sind eigentlich uninteressante Hausnummern im RAM, die auch noch bei jedem Programmstart anders ausfallen können. Trotzdem sind sie wichtige Objekte, z.b. für Zugriff auf Elemente von zusammengesetzten Datensätzen wie Listen (Vektoren), Matrizen, Zeichenketten etc; Rückgabe von Ergebnissen aus Unterprogrammen. Ein Name kann dabei entweder für den Wert oder für die Adresse stehen, je nach Deklaration: double x; /* x bezeichnet einen Double-Wert */ double *y; /* y bezeichnet die Adresse */ &x /* Zugriff auf die Adresse von x */ *y /* Zugriff auf den Double-Wert von y */ Eine Adressgröße wie y wird als Zeiger (pointer) bezeichnet. 5.4 Kontrollstrukturen while ( Bedingung ) /* Test vor dem Durchlauf */ do while ( Bedingung ); /* Test nach dem Durchlauf */ for ( Initialisierung; Bedingung; Inkrement/Dekrement ) if ( Bedingung ) /* einfachste Form */ if ( Bedingung ) else if ( Bedingung ) /* optional */ 7

else if ( Bedingung ) /* optional */... else /* optional */ Nicht vergessen: jede Anweisung mit ; abschließen, Blöcke aus mehreren in {..} setzen. Vergleichsoperatoren: ==!= > < >= <= Hier noch eine Übersicht über Befehle, die etwas beenden: Befehl.. continue break return exit() beendet.. Schleifendurchlauf Schleife Unterprogramm Programm In einer Funktion setzt man mit return Ausdruck auch gleich den Rückgabewert. Mit dem Argument von exit() kann man den Rückgabewert des Programms ans Betriebssystem übergeben. 5.5 Mathematische Funktionen Hier eine Auswahl von Funktionen, die über #include <math.h> deklariert und (wenn nötig) mit der Compileroption -lm eingebunden werden: pow fabs sqrt exp log sin... Diese Funktionen sind in double implementiert, aber auch mit float aufrufbar. Es gibt kein Rechenzeichen für die Potenz, man muss dafür die Funktion pow verwenden! Den Absolutwert für int und long bekommt man mit abs bzw. labs (aus stdlib.h). Hilfe zu den eingebauten Funktionen kann man über die Unix Manpages aufrufen, z.b. unix> man sqrt 5.6 Formatangaben Beim Lesen/Schreiben von formatierten Daten mit scanf, printf,.. muss man einen Formatstring angeben, in dem jeder Zahl (oder auch Zeichenkette) in der Argumentliste eine von % eingeleitete Formatspezifikationen zugeordnet ist. Hier die wichtigsten: 8

Spezifikation.. für Datentyp.. %i (oder %d) int %li long wichtig bei scanf %f float %e float/double Exponentialform %g float/double %f oder %e je nach Größe %lf (nicht %d!) double wichtig bei scanf %s char Zeichenketten Hinter dem % kann noch eine Angabe über Feldweite und Dezimalstellen eingefügt werden, z.b. %10f fuer float, Feldweite (mindestens) 10 Zeichen %20.10f fuer float, Feldweite 20, 10 Nachkommastellen Wenn der Platz nicht reicht, wird das Feld verbreitert. 9