Informatik I - ¨Ubung 5 Arrays und Strings

Werbung
Initialisierung :
• bei der Definition mit {} :
Informatik I - Übung 5
Arrays und Strings
int a [ 5 ] = {2 ,13 ,21 ,35 ,4};
• separat :
Daniel Hentzen
[email protected]
int b [ 3 ] ;
b [ 0 ] = 7;
26. März 2014
• partielle Initialisierung möglich :
i n t c [ 5 ] = { 1 , 2 } ; // r e s t l i c h e Elemente a u f 0 g e s e t z t
1 Theorie : Übung 5
• ohne Grössenangabe :
1.1 Arrays
int d [ ] = {11 ,34 ,2};
Ein array ist eine Variable, die viele Werte eines gleichen Typs speichert. Es ist
mit einer Liste oder einem Vektor vergleichbar.
Achtung : Werte müssen bei der Definition initialisiert werden! Der Compiler ermittelt automatisch die Grösse.
Achtung : Falls bei einem Aufruf die Grösse des arrays überschritten wird, gibt
der Compiler keinen Fehler aus (kein compile time error)! Das Programm wird
also kompilieren und fehlerhaft laufen. Dies nennt man ”runtime error”.
1.1.1 1-dimensional (”Liste”/ ”Vektor”)
int e [ 3 ] = {1 ,2 ,3};
i n t zahl = e [ 4 ] ; // runtime e r r o r !
<type> <name >[<number of elements >]
// B e i s p i e l :
i n t lotto [ 6 ] ; // ” L i s t e ” von 6 i n t
Beispiel : Maximum in einer Liste suchen
Achtung : Anzahl Elemente muss eine Konstante sein.
c o n s t i n t dim = 3 ;
d o u b l e vec [ dim ] = { 1 . 0 , − 5 . 0 , 8 . 0 } ;
d o u b l e maxVal = vec [ 0 ] ;
Zugriff auf einzelne Elemente :
lotto [ 3 ] ; // 4 . Element !
i f ( vec [ 1 ] > maxVal )
maxVal = vec [ 1 ] ;
Merke : Der Index geht von 0 - (#Elemente -1)!
• erstes Element : lotto[0]
• zweites Element : lotto[1]
i f ( vec [ 2 ] > maxVal )
maxVal = vec [ 2 ] ;
• ...
cout << ”Max : ” << maxVal << endl ;
• letztes Element : lotto[5]
1
Achtung : ’...’ um einen char zu initialisieren, ”...” um einen string zu initialisieren!
1.1.2 2-dimensional (”Tabelle”/ ”Matrix”)
c h a r a = ' x ' ; // v a l i d , c h a r
c h a r b = ”y” ; // i n v a l i d , s t r i n g
<type> <name >[ Zeilen ] [ Spalten ]
// B e i s p i e l :
int b [ 2 ] [ 3 ] = {{1 ,2 ,3} ,{4 ,5 ,6}};
1
4
2
5
Eingabe mit cin / getline :
c h a r name [ 1 0 0 ] ;
cin >> name ; // s t o p p t beim e r s t e n L e e r z e i c h e n / ENTER
3
6
c h a r name [ 1 0 0 ] ;
cin . getline ( name , 1 0 0 ) ; // l i e s t ganze Z e i l e e i n
Zugriff auf einzelne Elemente :
int b [ 1 ] [ 2 ] = 12;
Ausgabe mit cout :
”Zweites Element in der ersten Zeile ist 12.”
Achtung : Grösse der Spalten muss angegeben werden !
cout << name ; // nur f u e r c−s t r i n g a r r a y s ! ! !
i n t c [ ] [ ] = . . . ; // n i c h t m o e g l i c h
i n t c [ 5 ] [ ] = . . . ; // n i c h t m o e g l i c h
i n t c [ ] [ 3 ] = . . . ; // m o e g l i c h
i n t zahlen [ 2 ] = { 1 , 2 } ;
cout << zahlen ; // i n v a l i d ! !
Nützliche Funktionen für Zeichenketten :
• Grossschreibung : toupper (in <ctype.h>)
1.2 C-Strings
c h a r str [ ] = ” abc ” ;
str [ 0 ] = toupper ( str [ 0 ] ) ; // s t r = Abc
Ein string ist ein array von char’s, also eine Zeichenkette. Dieser Typ kann ganze
Wörter oder Sätze speichern.
• Kopieren : strcpy (in <cstring>)
Initialisierung :
Man kann den string auf zwei Arten definieren :
strcpy ( Ziel , Quelle )
1. als array von char’s : Hier muss man als letztes Element ein '\0' einfügen.
Dies zeigt dem Compiler, dass er das array als string interpretieren soll, und
nicht etwa als Liste von einzelnen Zeichen.
c h a r str [ ] = ” abc ” ;
c h a r str2 [ 8 0 ] ;
strcpy ( str2 , str ) ; // s t r 2 = abc
c h a r name [ 4 ] = { 'H ' , ' a ' , ' n ' , ' s ' } ; // i n v a l i d
c h a r name [ 5 ] = { 'H ' , ' a ' , ' n ' , ' s ' , ' \0 ' } ; // v a l i d
• Anfügen : strcat (in <cstring>)
strcat ( Ziel , Quelle )
2. als Zeichenkette : Wir benutzen hier ” ... ”. Dies zeigt dem Compiler, dass
es sich schon um einen string handelt. Die Grösse des arrays wird dann
automatisch bestimmt.
c h a r name [ ] = ”Hans” ; // ohne
c h a r str [ ] = ” abc ” ;
strcat ( str , ” d e f ” ) ; // s t r = a b c d e f
'... '
2
• Länge : strlen (in <cstring>)
Beispiel : drwxr−xr−x
• Unterorder erlaubt
c h a r str [ ] = ” 1234 ”
int n ;
n = strlen ( str ) ; // n=4
• user : read, write, execute erlaubt
• group : read, execute erlaubt
strlen gibt also die Anzahl Zeichen im string (mit Leerzeichen, ohne '\0')
zurück.
• others : execute erlaubt
Festlegen :
chmod u=rwx <filename>
chmod g=rx <filename>
chmod o=rx <filename>
2 Tipps zur Übung
2.1 Aufgabe 3 : Arrays
Alternative : Oktalzahlen : 4∗r + 2∗w + 1∗x (r,w,x = 0 / 1)
Variablentausch : benutze eine zusätzliche Variable zum Zwischenspeichern
Beispiel : chmod 755 <filename>
user : 4*1 + 2*1 + 1*1 = 7
group : 4*1 + 2*0 + 1*1 = 5
others : 4*1 + 2*0 + 1*1 = 5
2.2 Aufgabe 5 : Unix : Benutzerrechte (praktisch!)
Jede Datei / jeder Ordner hat verschiedene Zugriffsrechte für verschiedene Benutzergruppen.
Zugriffsrechte
Benutzergruppen
read
write
execute
owner
group
others
2.3 Lösung zu Fehlermeldung in Eclipse
”Launching has encountered a problem”.
Lösung : Pfeil neben dem ”Play” Symbol > Run as... > Local C/C++ Application
Um diese im Terminal anzuzeigen benutzt man den Befehl ls −l <Dateiname>
Man bekommt eine Ausgabe der Form drwxrwxrwx.
• d : Unterordner erlaubt
• r : read (lesen) erlaubt
• w : write (schreiben) erlaubt
• x : execute (ausführen) erlaubt
• 3 mal für die 3 Benutzergruppen : user, group, others
• falls etwas nicht erlaubt : -
3
Herunterladen