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