52
Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Embed Size (px)

Citation preview

Page 1: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Stefan Hartmann

Forschungszentrum caesar

Ein kleiner Einführungskurs

in die Programmiersprache C

Page 2: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Was ist C?

• C ist das Produkt vieler Autoren und einer langjährigen Entwicklung.

• Erste Publikation: 1972• Vorgänger einiger Sprachen, z.B. C++, Java...

Page 3: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein einfaches Beispiel#include <stdio.h>

#include <stdlib.h>

int main (){

printf("Hello World!");system("Pause");return 0;

}

#include: Einbindung einer Headerdatei aus der Standardbibliothek in den Programmtext

Die Headerdatei <stdio.h> enthält Ein- und Ausgabebefehle; <stdlib.h> enthält vermischte Standardfunktionen wie z.B. system().

Page 4: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein einfaches Beispiel#include <stdio.h>

#include <stdlib.h>

int main (){

printf("Hello World!");system("Pause");return 0;

}

main: legt den Programmstart des Hauptprogrammes fest

Page 5: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein einfaches Beispiel#include <stdio.h>

#include <stdlib.h>

int main (){

printf("Hello World!");system("Pause");return 0;

}

int: gibt dem Computer einen ganzzahligen Rückgabewert zurück.

(0= Alles Klar!)

Page 6: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein einfaches Beispiel#include <stdio.h>

#include <stdlib.h>

int main (){

printf("Hello World!");system("Pause");return 0;

}

printf: Gibt einen Text aus.

Page 7: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiel 2#include <stdio.h>

#include <stdlib.h>

int main (){

int dm;float euro;printf("Bitte ganze DM eingeben: ");scanf("%i", &dm);euro = dm / 1.95583;printf("Das sind %f Euro\n", euro); system("Pause");return 0;

}

int dm: Deklariert die Variable dm als Variable vom Typ int. Der Typ gibt an, was in ihr gespeichert wird. (int = ganze Zahlen, „Integer“).

Page 8: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiel 2#include <stdio.h>

#include <stdlib.h>

int main (){

int dm;float euro;printf("Bitte ganze DM eingeben: ");scanf("%i", &dm);euro = dm / 1.95583;printf("Das sind %f Euro\n", euro); system("Pause");return 0;

}

scanf: Damit werden eingegebene Zahlen bzw. Zeichenketten eingelesen, ist sozusagen das Gegenstück zu printf.

Formatierung: Es wird ein Integer-Wert eingelesen!

Adresse der Variablen dm

Page 9: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiel 2#include <stdio.h>

#include <stdlib.h>

int main (){

int dm;float euro;printf("Bitte ganze DM eingeben: ");scanf("%i", &dm);euro = dm / 1.95583;printf("Das sind %f Euro\n", euro); system("Pause");return 0;

}

float euro: Fließkommazahl (Zahl mit Nachkommastellen), die in der Variablen euro gespeichert wird.

Page 10: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiel 2#include <stdio.h>

#include <stdlib.h>

int main (){

int dm;float euro;printf("Bitte ganze DM eingeben: ");scanf("%i", &dm);euro = dm / 1.95583;printf("Das sind %f Euro\n", euro); system("Pause");return 0;

}

Der letzte printf-Befehl gibt den errechneten Wert wieder aus.

Formatierung: Es wird eine Gleitkommazahl (float) ausgegeben.

Zeilentrenner

Page 11: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiele zur Formatierung

• %d (oder %i): dezimale ganze Zahl• %6d (oder %6i): dezimale ganze Zahl, mindestens 6

Zeichen breit • %hd short integer• %ld: long integer• %f: Gleitkommazahl in Festkommaform• %.2f: Gleitkommazahl mit 2 Zeichen hinter dem

Dezimalpunkt• %6.2f: Gleitkommazahl mit 2 Zeichen hinter dem

Dezimalpunkt, mindestens 6 Zeichen breit

• %e: Gleitkommazahl in Exponentialform• %g: Gleitkommazahl, möglichst kompakt• %s: Zeichenkette• %c: einzelnes Zeichen

Page 12: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 1

Schreibe ein Programm zur Berechnung des Preises von Mehl (in Euro, Ausgabe mit 2 Nachkommastellen).

1kg Mehl kostet 0,89175€.

Page 13: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 1 #include <stdio.h> #include <stdlib.h>

int main (){

float kg, euro;printf("Bitte Kilogramm eingeben: ");scanf("%f", &kg);euro = kg * 0.89175;printf("Das sind %.2f Euro\n", euro); system("Pause");return 0;

}

Page 14: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Variablen

Wie kann ich eine Variable in C einbauen?

• Variable deklarieren,Beispiele:

int j; float x, y;

• Initialisierung (Wertzuweisung),Beispiele: int j = 32; float x = 2;

Wichtig: In C müssen alle Variablen immer am Anfang des Programms/jeder

Funktion deklariert werden!

Page 15: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Typen von Variablen (maschinenabhängig!)

• char: ganze Zahlen von 0 bis 255(ASCII)

• short: kleine ganzzahlige Werte

• int: ganzzahlige Werte

• long: große ganzzahlige Werte

• unsigned int: positive ganzzahlige Zahlen

• float: Gleitkommazahl mit einfacher Genauigkeit

• double: Gleitkommazahl mit doppelter Genauigkeit

• bool: Wahrheitswert (0 oder 1)

Page 16: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

ASCII-Code

Im ASCII-Code werden Zeichen (z.B. Buchstaben, Datentyp char) als ganze Zahlen codiert.

Beispiel: ‘A‘ == 65

Für einzelne Zeichen immer ‘.‘

schreiben; "..." ist für Zeichenketten

reserviert.

Page 17: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 2

Schreibe ein Programm, mit dem man den ASCII-Code eines einzelnen Zeichen abfragen kann.

Page 18: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 2#include <stdio.h>

#include <stdlib.h>

int main (){

char x;printf("Bitte eingeben:");scanf("%c", &x);printf("Der ASCII-Code lautet: %d\n", x); system("Pause");return 0;

}

Page 19: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Felder (Arrays)

Felder sind mehrere Variablen, die im Speicher direkt hintereinander liegen. int X[20]; ← Ein Feld von 20 int-Variablen;

Achtung: Zählungbeginnt bei 0!

int X[3]={2,3,5} ← Auch Felder können initialisiert werden.

int X[]={1,2,3,4} ← Bei initialisierten Feldern benötigt man

keine Dimensionsangaben.

Page 20: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Zeichenketten (Strings)

In C sind Strings einfach Arrays von char.

Beispiel:

char X[] = "hallo";

ist das gleiche wie:

char X[] = {104, 97, 108, 108, 111, 0};

char X[] = {‘h‘, ‘a‘, ‘l‘ , ‘l‘, ‘o‘, ‘\0‘};

Page 21: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Frage

Es sei txt eine Stringvariable:char txt[30];1) Wie kann man das fünfte Zeichen

von txt ausgeben lassen?printf(%c,txt[4]);

2) Wie kann man die ersten 10 Zeichen ausgeben lassen?printf(%10s,txt);

Page 22: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Operatoren

Besonderheiten:

• Test auf Gleichheit ist == (und nicht etwa = )

• Test auf Ungleichheit ist !=• && steht für logisches UND• || steht für logisches ODER• & steht für bitweises UND

(Was macht der Befehl x = x & 0177; ?)• | steht für bitweises ODER• ! steht für logisches NOT

Page 23: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Weitere Operatoren

Inkrement und Dekrement:++x oder x++ ↔ x = x+1--x oder x-- ↔ x = x-1Aber: x=5; y=x++; → y=5, x=6

x=5; y=++x; → y=6, x=6

Zuweisungsoperatoren:z.B: x+=20; ↔ x = x+20;

x-=12; ↔ x = x-12;x*=y; ↔ x = x*y;x/=12; ↔ x = x/12;

Page 24: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 3

Berichtige alle Fehler des folgenden „Programms“!

#include <stdio.h> #include <stdlib.h>

Int main (){

char txt1= "Hallo\n";print(txt1)char txt2[4];scanf("%3s“, txt2); print(txt2;system("Pause");return 0;

}

Page 25: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 3

#include <stdio.h> #include <stdlib.h>

int main (){

char txt1[]= "Hallo\n";char txt2[4];printf(txt1);scanf("%3s", txt2); printf(txt2);system("Pause");return 0;

}

Page 26: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Kontrollstrukturen

Es gibt (u.A.) folgende Kontrollstrukturen:• if und else• while und do• for• switch-case

Page 27: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

if und elseif (TEST){

IFBLOCK}else{

ELSEBLOCK}

TEST

true false

IFBLOCK ELSEBLOCK

Wenn im IF- oder ELSEBLOCK oder in einem anderen Anweisungsblock nur eine einzelne Anweisung steht, kann man die geschweiften Klammern ( {} ) auch weglassen. Bei mehreren IF- und ELSE-Anweisungen bezieht sich das else stets immer auf das letzte if.

Page 28: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 4

In einem Programm finden sich folgende zwei Zeilen:

/* Falls x oder y größer als 5 */

if ((x || y) >5)

Warum tut diese if-Anweisung nicht das, was der Programmierer offenbar vorgesehen hat? Wie lautet die korrekte Bedingung, die diesem Kommentar entspricht?

Page 29: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 5

In einem Programm finden sich folgende Zeilen:

x = 10.0/3.0 + 2.0/3.0;

if (x == 4.0)

printf("Exakt vier!!“);

Obwohl x eine float-Variable ist und das Ergebnis der Berechnung auch 4 ergeben müsste, erscheint beim Ablauf des Programms der Text “Exakt vier!!“ nicht auf dem Bildschirm. Warum?

Page 30: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

while

while (TEST)

{

BLOCK

}

TEST

true false

BLOCK

Page 31: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

do-while

do{

BLOCK} while (TEST);

TEST

true false

BLOCK

Page 32: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

for

for (INIT;TEST;STEP)

{

BLOCK

}

TEST

false

BLOCK

INIT

STEP

Page 33: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

BeispielWir wollen ein Programm schreiben, das alle Buchstaben des Alphabets bis auf ‘E‘, ‘R‘ und ‘T‘ nacheinander ausgibt.

#include<stdio.h>#include<stdlib.h>

int main(){ char ch; for (ch='A'; ch<= 'Z'; ch++) {

if (ch=='E' || ch=='R' || ch=='T') continue;

printf("%c",ch); } system("PAUSE"); return 0;}

Page 34: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 6

Schreibe ein Programm, das alle Kleinbuchstaben einer Zeichenkette in Großbuchstaben umwandelt.

Tipp: Verwende die Funktion strlen(), die die Länge der Zeichenkette bestimmt. Die Funktion toupper() wandelt alle Klein- in Großbuchstaben um. Zu der Standardbibliothek kommen diese zur Verwendung der Funktion noch hinzu: #include <string.h>#include <ctype.h>

Page 35: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 6#include <stdio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>

int main(){ char txt[80]; short index; printf("Zeichenkette:\n"); scanf("%s",txt); for ( index=0; index<strlen(txt); index++ ) txt[index] = toupper(txt[index]); printf(txt); system("pause"); return 0;}

Page 36: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

switch-case

switch (X)

{

case 1: case 2:

//Code für X==1 und X==2

break;

case 3:

//Code für X==3

break;

default:

//Code für alle anderen Werte von X

}

Page 37: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 7

In folgender switch-Anweisung wird abhängig vom Wert der char-Variablen ch der short-Variablen x ein Wert zugewiesen. Wandle die switch-Anweisung in eine else-if-Kette um.

Page 38: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

switch (ch)

{

case ‘A‘: case ‘B‘: case ‘C‘: case ‘D‘: case ‘E‘:

case ‘F‘: case ‘G‘: case ‘H‘: case ‘I‘: case ‘J‘:

case ‘K‘: case ‘L‘: case ‘M‘: case ‘N‘: case ‘O‘:

x = 1; break;

case ‘a‘: case ‘b‘: case ‘c‘: case ‘d‘: case ‘e‘:

case ‘f‘: case ‘g‘: case ‘h‘: case ‘i‘: case ‘j‘:

case ‘k‘: case ‘l‘: case ‘m‘: case ‘n‘: case ‘o‘:

X = 2; break;case ‘0‘: case ‘1‘: case ‘2‘: case ‘3‘: case ‘4‘:case ‘5‘: case ‘6‘: case ‘7‘: case ‘8‘: case ‘9‘:

X = 3; break;case ‘#‘ : case ‘&‘

x = 4; break;default;:

x = -1; break;

Page 39: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 7if(ch>=‘A‘ && ch<=‘O‘)

x=1;else if(ch>=‘a‘ && ch<=‘o‘)

x=2;else if(ch>=‘0‘ && ch<=‘9‘)

x=3;else if(ch==‘#‘ || ch==‘&‘)

x=4;else

x=-1;

Page 40: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

FunktionenDefinition:

Rückgabewert

Argumente

Aufruf:

Int max (int x, int y)

{

if (x >y)

{

return x;

}

return y;

}

max (12, 1)

Page 41: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Beispiel#include <stdio.h>#include <stdlib.h>

int Summe (int s1, int s2){ return (s1+s2);}

int main (){ int a=2, b=4, c; c= Summe (a,b); printf("Die Summe ist: %d\n",c); system("pause"); return 0;}

Aufruf der Funktion „Summe“

Definition der Funktion „Summe“ die als Rückgabewert (return)

„s1+s2“ liefert

Page 42: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 8Schreibe nun ein Programm, welches den Mittelwert dreier Werte berechnet, die im Hauptprogramm festgelegt werden. Der Mittelwert soll hierbei nicht direkt im Hauptprogramm berechnet werden, sondern stattdessen durch eine Funktion

float Mittel(float x, float y, float z)

übergeben werden.

Page 43: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 8#include <stdio.h>#include <stdlib.h>

float Mittel(float,float,float);int main (){ float Wert1,Wert2,Wert3; float Mittelwert; Wert1 = 3.5; Wert2 = 7.5; Wert3 = 3; Mittelwert = Mittel(Wert1,Wert2,Wert3); printf("Der Mittelwert ist: %f\n",Mittelwert); system("pause"); return 0;}float Mittel(float x, float y, float z){ return ((x+y+z)/3);}

Page 44: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein weiteres Beispielprogramm:Wie lange hält sich die Schaumkrone eines Bieres?

#include<stdio.h>#include<math.h>#include<stdlib.h>const float hweiss=60;const float hpils=75;const float hdunkel=90;int main(){ const float h_ende=0.2; int sorte,wahl; float t_halb,t_ende,h_0; printf("Welche Biersorte trinken Sie?\n\n"); printf("1. Hefe-Weizenbier\n2. Pils\n3. Dunkelbier\n\

n"); printf("0. Ich trinke kein Bier\n\n"); wahl=0; while(wahl!=1) { scanf("%d",&sorte);

Page 45: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

if(sorte==1) {t_halb=hweiss; wahl=1;} if(sorte==2) {t_halb=hpils; wahl=1;} if(sorte==3) {t_halb=hdunkel; wahl=1;} else {}; } printf("Wie hoch ist der Bierschaum in cm?\n"); scanf("%f",&h_0); t_ende=-t_halb*(log(h_ende)-log(h_0))/log(2); printf("Bis der Schaum nur noch eine Lage Blasen "); printf("hoch ist,\ndauert es %f Sekunden\n",t_ende); system("pause"); return 0;}

Page 46: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

BeispielWir möchten mit C nun Pseudo-Zufallszahlen aus dem Intervall [0,1) erzeugen. Dazu verwenden wir die Funktion rand(), die in C ganzzahlige Pseudo-Zufallszahlen zwischen 0 und einem hohen Wert RAND_MAX erzeugt.#include<stdio.h>#include<stdlib.h>int main (){ int i, max; float x; printf("Geben Sie die Anzahl der Zufallszahlen ein:"); scanf("%d",&max); for (i=0;i<max;i++) { x=(double)rand()/(double)(RAND_MAX+1.0); printf("%f\n",x); } system("pause"); return 0;}

Wichtig!Sonst x=0, da als int interpretiert!

Page 47: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 9

Die dir bereits bekannte Monte-Carlo Simulation zur

Annäherung von lässt sich natürlich auch gut mit C

programmieren.

Schreibe ein Programm zur Approximation von .

Page 48: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 9#include<stdio.h>#include<stdlib.h>int main (){ int i, max; float inkreis, x, y, z, pi; inkreis=0; printf("Geben Sie die Anzahl der Iterationen ein:"); scanf("%d",&max); for (i=0;i<max;i++) { x=(double)rand()/(double)(RAND_MAX+1.0); y=(double)rand()/(double)(RAND_MAX+1.0); z=(x*x+y*y); if(z<=1) inkreis++; } pi=4*inkreis/max; printf("Das Ergebnis ist: pi=%f\n",pi); system("pause"); return 0;}

Page 49: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Zeiger (pointers)

Zeigervariablen weisen auf den Speicherort anderer Variablen hin. Zeiger werden durch ein * vor der Variablendargestellt.

int *X; ← Zeiger auf eine int- Variable float *Y; ← Zeiger auf eine float- Variable

Page 50: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Ein Beispiel#include<stdio.h>#include<stdlib.h>

int main(){ char x[]="C macht Spass"; char *i;

for (i=&x[0];*i;i++) { printf("Speicheradresse %i enthaelt%c\n",i,*i); }

system("pause"); return 0;}

Definition des Zeigers i

i zeigt auf die Adressen des Strings „x“ (signalisiert durch das ‚&‘); *i entspricht „*i!=0“

Page 51: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Aufgabe 10

Schreibe mit Hilfe eines Zeigers ein Programm,das alle „a“ in einem einzulesenden Wort durch „b“ersetzt!

Page 52: Stefan Hartmann Forschungszentrum caesar Ein kleiner Einführungskurs in die Programmiersprache C

Auflösung Aufgabe 10#include<stdio.h>#include<stdlib.h>

int main (){ char txt[5]; printf("Eingabe:\n"); scanf("%s",txt); char *i; for (i=&txt[0];*i;i++) { if (*i=='a') {*i='b';} printf("%c",*i); } system("pause"); return 0;}