C - Grundlagen und Konzepte C-Datenstrukturen
Andreas Gadelmaier
2. Juli 2014
Inhaltsverzeichnis
1
Einleitung:
Warum brauchen wir Datenstrukturen?
2
Hauptteil:
1. struct
2. union
3. array
4. string
5. enum
6. typedef
Warum brauchen wir Datenstrukturen?
Essenziell zum Programmieren
Effizient
Struct
Sammelstruktur
Fassen verschiedene Komponenten zusammen
Diese Komponenten sind von unterschiedlichen Typen
Anzahl der Komponenten ist unbegrenzt
Syntax
Deklaration von Name und Inhalt:
1 s t r u c t B a n k K u n d e { 2 c h a r v o r n a m e [ 2 0 ] ; 3 c h a r n a c h n a m e [ 2 0 ] ; 4 int k o n t o n u m m e r ; 5 f l o a t k o n t o s t a n d ; 6 } K u n d e ;
BankKunde
Beispiel
Kontoinhaber
1 s t r u c t B a n k K u n d e K u n d e 2
3 K u n d e . v o r n a m e = " Max " ;
4 K u n d e . n a c h n a m e = " M u s t e r m a n n " ; 5 K u n d e . k o n t o n u m m e r = 1 2 3 4 5 6 7 ; 6 K u n d e . k o n t o s t a n d = 9 8 7 6 5 . 3 2 ;
BankKunde max
Zugriff
1 p r i n t f ( " K o n t o d a t e n : ␣ \ n 2 V o r n a m e ␣ = ␣ % s ␣ \ n
3 N a c h n a m e ␣ = ␣ % s ␣ \ n 4 K o n t o n u m m e r = ␣ % d ␣ \ n 5 K o n t o s t a n d ␣ = ␣ % f "
6 , max . v o r n a m e 7 , max . n a c h n a m e 8 , max . k o n t o n u m m e r 9 , max . k o n t o s t a n d );
Ausgabe
Kontodaten:
Vorname = Max
Nachname = Mustermann
Kontonummer = 1234567
Kontostand = 98765.32
Syntax
Setzt sich aus verschiedenen Komponenten zusammen Definition von Variablen im selben Speicherbereich Der Speicherbedarf wird durch die gr¨ oßte Komponente bestimmt
1 u n i o n K u n d e n d a t e n { 2 int k u n d e n n u m m e r ; 3 s h o r t f i l i a l e ; 4 } D a t e n ;
Beispiel
Anwendungsbereiche d¨ urfen sich nicht ¨ uberschneiden
1 D a t e n max
2 max . k u n d e n n u m m e r = 1 2 3 4 5 6 ; 3 p r i n t f ( " % d " , max . k u n d e n n u m m e r );
Ausgabe: 123456
Beispiel
1 D a t e n max
2 max . k u n d e n n u m m e r = 1 2 3 4 5 6 ;
3 p r i n t f ( " % d \ n " , max . k u n d e n n u m m e r );
4 max . f i l i a l e = 2 2 6 ;
5 p r i n t f ( " % d " , max . f i l i a l e );
Ausgabe f¨ ur Kundennummer: 123456
Ausgabe f¨ ur Filiale : 226
Gefahr
Variablen teilen sich einen Speicherbereich
Fehler die daraus resultieren sind schwer zu finden
1 D a t e n max
2 max . k u n d e n n u m m e r = 1 2 3 4 5 6 ; 3 max . f i l i a l e = 2 2 6 ;
4 p r i n t f ( " % d \ n " , max . k u n d e n n u m m e r );
5 p r i n t f ( " % d " , max . f i l i a l e );
Ausgabe f¨ ur Kundennummer: Falsch
Syntax
Sammelstruktur
Deklaration von Typ und Gr¨ oße Gleiche Typen
M¨ oglichkeit 1
1 f l o a t m o n a t l i c h e r K o n t o s t a n d [ 1 2 ] ; 2
3 m o n a t l i c h e r K o n t o s t a n d [ 0 ] = 2 3 5 0 . 0 0 ; 4 m o n a t l i c h e r K o n t o s t a n d [ 1 ] = 2 1 6 7 . 2 0 ; 5 m o n a t l i c h e r K o n t o s t a n d [ 2 ] = 2 8 0 0 . 7 0 ;
Syntax
M¨ oglichkeit 2
1 f l o a t m o n a t l i c h e r K o n t o s t a n d [ 1 2 ] = { 2 3 5 0 . 0 0 , 2 2 1 6 7 . 2 0 ,
3 2 8 0 0 . 7 0 , 4 5 2 6 0 . 9 0 , 5 5 7 2 0 . 5 0 , 6 . . . . } ;
Zugriff
Bei nicht Inizialisierung 0
1 int i ;
2 for ( i =0; i < 1 2 ; i + + ) { 3 p r i n t f ( " K o n t o s t a n d : ␣ \ n 4 % f " , k o n t o s t a n d [ i ];) 5 } ;
6 put ( " ␣ " );
Ausgabe: 2350.00 2167.20 2800.70 5260.90 5720.50
Mehrdimensonale arrays
1 int t e r m i n k a l l e n d e r [ 3 6 5 ] [ 3 ] ={
2 {1 , 123 , 456} ,
3 {2 , 789 , 101} ,
4 {3 , 112 , 131} ,
5 { . . . } 6 };
string
Strings sind Zeichenketten
Char Arrays zum Speichern von Zeichenketten Funktionieren genau wie int Arrays
1 c h a r n a m e = ’ a ’ ;
2 c h a r n a m e [ 2 0 ] = ’ m ’ , ’ a ’ , ’ x ’ , ’ \0 ’ ; 3 c h a r n a m e [ 2 0 ] = " max " ;
charr Array
Char Arrays werden oft dynamisch erstellt
1 c h a r s t r i n g [] = ( " K o n t o ␣ ist ␣ l e e r ! " );
Mehrdimensonale char Arrays
1 c h a r K u n d e n l i s t e [ 3 ] [ 2 0 ] = { 2 " M u e l l e r "
3 , " K r a u s e "
4 , " S c h a e f e r "
5 };
enum
Enumeration ist eine Aufz¨ ahlung Quelltext wird lesbarer
MagicNumbers : x?
1 f l o a t d r u c k e Z i n s e n (int x ){
2 if( x < 6) p r i n t f ( " Z i n s s a t z ␣ bei ␣ 1 ,5% " );
3 e l s e( x >= 6) p r i n t f ( " Z i n s s a t z ␣ bei ␣ 2 ,7% " ) 4 };
Syntax
Elemente im enum sind Nummeriert
1 t y p e d e f e n u m{
2 januar , februar , maerz ,
3 april , mai , juni ,
4 juli , august , s e p t e m b e r , 5 oktober , n o v e m b e r , d e z e m b e r 6 } m o n a t e ;
7 f l o a t d r u c k e Z i n s e n ( m o n a t m ){
8 if( m < 6) p r i n t f ( " Z i n s s a t z ␣ bei ␣ 1 ,5% " );
9 e l s e( m = > 6) p r i n t f ( " Z i n s s a t z ␣ bei ␣ 2 ,7% " ) 10 };
Beispiel
1 int m a i n (){
2 d r u c k e Z i n s e n ( 4 ) ; 3 r e t u r n 0;
4 }
Beispiel
1 int m a i n (){
2 d r u c k e Z i n s e n ( mai );
3 r e t u r n 0;
4 }
typedef
Datenvereinbarung
Name f¨ ur bestehende Struktur
keine Unterscheidung zur Variablendeklaration
Beispiel
Mit typedef:
1 t y p e d e f c h a r c h a r a c t e r 2 c h a r a c t e r b u c h s t a b e = ’ A ’ ;
Ohne typedef:
1 c h a r b u c h s t a b e = ’ A ’ ;
Beispiel
Mit typedef:
1 t y p e d e f s t r u c t B a n k K u n d e { 2 c h a r v o r n a m e [ 2 0 ] ; 3 c h a r n a c h n a m e [ 2 0 ] ; 4 int k o n t o n u m m e r ; 5 f l o a t k o n t o s t a n d ; 6 } K u n d e ;
1 int m a i n ( ){
Beispiel
Ohne typedef:
1 int m a i n ( ){
2 s t r u c t B a n k K u n d e max ; 3 r e t u r n 0;
4 }