Docsity
Docsity

Prüfungen vorbereiten
Prüfungen vorbereiten

Besser lernen dank der zahlreichen Ressourcen auf Docsity


Download-Punkte bekommen.
Download-Punkte bekommen.

Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo


Leitfäden und Tipps
Leitfäden und Tipps

C++ Zusammenfassung, Grafiken und Mindmaps von Informatik

Gesamtüberblick zur C++ Sprache.

Art: Grafiken und Mindmaps

2019/2020

Hochgeladen am 10.04.2020

Sophie_Bünnagel
Sophie_Bünnagel 🇩🇪

4.6

(38)

Unvollständige Textvorschau

Nur auf Docsity: Lade C++ Zusammenfassung und mehr Grafiken und Mindmaps als PDF für Informatik herunter! C++ ZUSAMMENFASSUNG Christian Forster, 28. August 2007 Patrik Rohner, 15. Juli 2008 AUFBAU EINES PROGRAMMS #include <iostream> #include <cstdlib> #include <cmath> //für math. func #include <string> //für c++ strings #include "headerfile.h" //einbinden #include <time.h> //Zeitmessung using namespace std; //structs, functions, enums int main(void) { system(“pause”); return 0; } VARIABELN int 32bit . positive und negative ganze Zahlen range: -2 31 bis 2 31 -1 char int mit 8bit ( = 1 Byte) für Buchstaben char[] Buchstaben Array -> String float Kommazahlen 32bit, Eingabe: double Kommazahlen 64bit, Eingabe: short .. .. Verkürzung. short int -> 16 bit int long .. .. Verlängerung long int -> 32 unsigned .. .. nur positive Zahlen int -> 0 bis 2 bool Wahrheitswerte (true/1, false/0) VARIABELNNAMEN Keine Leerzeichen, Satzzeichen oder Symbole Keine Zahl oder __ am Anfang case sensitivity – Gross - Kleinschreibung beachten EINFACHE VARIABELN DEKLARIEREN int a,a2; int b = 10; float c = a*b – 0.5; CASTS Änderung einer Variable in einen anderen Typen double a = 1.5; int b; b = int (a); b = (int) a; // b=1 7/2 = 3 , 7/(double)2 = 7/2.0 = 3.5 double(7/2) = 3.0 , int(19/10.0) = 1 ENUM Enum ist ein Aufzählungstyp. Die Konstanten aus der Enum kann man im Programm verwenden. enum farbe {ROT, BLAU, GELB}; farbe f = ROT; if(f != BLAU) { }; 3.0f 3.0 bit (wie int) 32 -1 . HEXADEZIMALER CODE & 0,1,…,9,A,B,C,D,E,F (hex) anstelle von 0,1,…,14,15,16 Adressen werden hexadezimal angegeben. a,a+1,a+2 int, float (4byte = 32bit) double 0x22ff70 0x22ff70 0x22ff74 0x22ff78 0x22ff78 0x22ff80 0x22ff7c 0x22ff88 FLIESSKOMMAZAHLEN Float 1bit->sign, 8bit->exponent, 23bit Wert = (-1) S x 2 (E-127) Bsp1: 0.125 = 2 -3 » 0|01111100|00000000000…0 = 0.125 0|01111111|00000000000…0 = 1 1|01111111|11000000000…0 = 0|00000000|00000000000…0 = 0 0|11111111|00000000000…0 = 0|00000000|10010101110… Double 1bit->sign, 11bit->exponent, Wert = (-1) S x 2 (E-1023) OPERATOREN + - / * ^ mathematische Operatoren % ganzzahliger Rest einer Division x += i x = x + i; 1.1E-5 = 1.1*10-5 i++, i-- erhöht / verkleinert i um 1 b=5; c=b++; → c=5, b=6 verwende Für weitere mathematische Funktionen: #include <cmath> fabs(), sqrt(), exp(), log(), cos(), acos() LOGISCHE KONSTRUKTE <, <=, >, >= grö || “oder” && “und” == “gleichheit” != “ungleich” ! “nicht” EINGABE & AUSGABE cout << “a = “ << endl; cin >> a; \n Zeilenende \t horizontaler Tabulator \” Anführungszeichen UMRECHNUNG BINÄR 13 1 Dezimalzahl durch 2 teilen und Rest 6 0 notieren. Bits von unten nach oben 3 1 lesen. 1 1 Bsp: 13 = 1101 0 1001 = 1*2 3 + 0*2 2 + 0*2 1 ADRESSEN (dec) ,a+3… (8byte = 64bit) ->mantisse x (1.F) S -> 0, E -> 124, F -> 0 -1.75 +infty = NaN 52bit->mantisse x (1.F) 15%6==3 ebenso *=, /=, -= ++b für c=6, b=6 sser, grössergleich, kleiner //Ausgabe //Eingabe – DEZIMAL + 0*2 0 = 8+0+0+1 = 9 KONTROLLSTRUKTUREN IF if(a==10){ b=15; } else if(a==11) b=14; else b=10; oder kurz: a==10?b=15:a==11?b=14:b=10; FOR for(int i=0; i<10; i++) { a=a+i; } abbrechen mit break; WHILE while(b<20){ b++; } oder do { b--; //mindestens 1 x } while(b!=15); abbrechen mit break (immer nur die innere Schleife) Überspringen des Rests des Rumpfes zur nächsten Auswärtung mit continue; SWITCH switch(a) { case 15:cout<<”a=15”;break; case 14:cout<<”a=14”;break; //a==14 default:cout<<”a!=15,a!=14”; //else } ÄQUIVALENTE STRUKTUREN Man kann verschiedene Strukturen verwenden um dasselbe auszudrücken: int i=0; do { i=i+1; if (i==10) break; }while(true); //aka immer …ist äquivalent zu… for(int i=0;i!=10;i++){} BEISPIELE FÜR ENDLOSSCHLEIFEN int i=10; do { i=i+1; if (i==10) break; }while(true); for(int i=3;i!=20;i=(i+3)%300) int i=99; while(i>10){ i--; if(i==15) i*=6;} ; //a==15 ein und ARRAYS int Array mit 4 Zellen: int a[4]; Inhalte definieren: a[0] = 1; int a[4] = {1,2,3,4}; 2D Array (Matrix): int b[3][2] 3D Array: int c[x][3][ Bei int a[N]; muss N als definiert werden. Eine const int Programmablauf nicht geänd Ein Array beginnt immer mit a[0] Übergibt man ein Array einer Funktion by Reference”. Das Original-Array wird verändert. ARRAYS UND POINTER Arraynamen Bei der Definition eines Arrays wird Speicherplatz für eine bestimmte Anzahl Objekte reserviert. Die Arrayvariable zeigt auf das erste Objekt dieses Speicherplatzes. Darum sind folgende Ausdrücke identisch: int c[10]; //Array definieren int* pc; //Pointer definieren pc = c; //Pointer zeigt auf Array pc[3] = 10; ↔ c[3]=10; Folgendes generiert auch ein Array mit Platz für 3 int * a = new int[3]; a[0] = 3; //ohne Stern * delete [] a;//Speicher wieder freigeben STRUCTURES Structs werden vor der main() struct point { int x, y; double gamma; }p,q; //p,q schon definiert Neuer “point” definieren: Variabeln in struct definieren: Schnell initialisieren: Rest wird mit 0 aufgefüllt: Zuweisung: p=q ist gleichbedeutend mit p.y=q.y; p.gamma=q.gamma Falsch: struct falsch {int i;falsch x;}; Strichpunkt am Ende nicht vergessen: struct point {int i;double y;} FUNKTIONEN IN STRUCTS Die Konstruktor-Funktion wird bei der Generierung eines neuen Structs aufgerufen. struct Bar { Bar() { //Konstruktor } }; Funktionen können auch ausgelagert w struct Bar { void bier void Bar::bier(){ }; Aufrufen der Funktion: bqm.bier(); = {{1,2},{ x-1] = {{{ const int N = 10; kann während dem ert werden. und endet mit a[N-1] , ist das wie “Call sind Pointer! ↔ *(pc+3)=10; Integer: (!) Funktion definiert. point p; p.x = 2; p = {1,2,0.75}; q={1}->q={1,0,0}; p.x=q.x; ; ; erden: (); } bqm; FUNKTIONEN Ermöglichen Aufspaltung des Programms in Unterprogramme. Aufbau: rückgabewert funktionsname (argument) {funktionskörper} Der Rückgabewert ist immer nur 1 Element und kann von beliebigem Typ sein. Falls die Funktion keine Rückgabe hat, schreibt man void. Der Funktionsname darf nicht mit einer Zahl beginnen. Nur ein Wert als Rückgabewert. Workaround: St PROTOTYP EINER FUNKTION Falls eine function g die function f benötigt, muss f vorab definiert sein: int f(int,int,int); //prototyp int g(int x, double y){… a=f(x)+y …}; int f(int x, int y, int z){… b=g(z) …}; CALL BY VALUE Wenn eine Funktion aufgerufen wird, warden by call value die Argumente auf den Stack kopiert. void swap1(int a, int b) {int c=a; a=b; b=c;} int main(){ int x=2, y=3; swap1(x,y);… //bringt nichts Auch wenn ich a und b innerhalb der Funktion bleiben x und y in main() noch gleich. -> structures struct st{int a,b}; st swap1(int a, int b){ int c=a; a=b; b=c; st ret={a,b}; return ret;} int main(){ int x=2, y=3; st out = swap1(x,y); //mit structure x=out.a; y=out.b;… //kopieren CALL BY REFERENCE (STATISCH) Die Variabeln werden nicht kopiert. Es wird eine Referenz auf das Objekt gemacht. Nun geht das Vertauschen einfach: void swap2(int& a, int& b) {int c=a; a=b; b=c;} int main(){ int x=2, y=3; swap2(x,y);… //vertauschen Ein Funktionsaufruf swap2(x,y);vertauscht x und y. Es warden von der Funktion nur die Adressen der Variabeln genommen und diese vertauscht, was Rückwirkung hat. Referenzen zeigen auf fixe Adressen, Pointer können ihre Adresse ändern. int n; int& nr = n; nr und n können nun als Synonyme verwendet werden. nr und n sind aliases. ructs -by- tausche, -> x,y CALL BY REFERENCE (DYNAMISCH Hier wird statt der Referenz ein Pointer auf das Objekt übergeben. Damit auf das Objekt zugegriffen werden kann, muss der übergeben Pointer dereferenziert werden. void swap3(int* a, int* b) {int c=*a; *a=*b; *b=c;} int main(){ int x=2, y=3; swap3(&x,&y);… Aufruf: swap3(pa,pb); wenn pa swap3(&a,&b); wenn a, b Mann kann auch einer Funktion einen dereferenzierten Pointer übergeben: void swap3(int a, int b){… Aufruf: swap3(*pa, *pb call-by-value und macht hier keinen Sinn. REKURSION Der return Wert der Funktion ruft die Funktion selber wieder auf. Dabei müssen die Abbruchbedingungen definiert werden. Es wird bis zur Abbruchbedingung in die Rekursion hineingegangen und dann int fakultaet( int n ) { if(n==1) return 1; return n * fakultaet(n Aktive Funktion belegt Speicherplatz im Stack. Dieser kann dadurch überfüllt werden. STRINGS C – STRINGS char text[] = “hallo”; char text[] = {’h’,’a’,’l’,’l’,’o’,’/0’} char text[6]= “hallo”; nicht: char text[5]= ”hallo”; char* text = “hallo”; char* str = new char[4]; str[0] = ‘C’; Ein String wird als Pointer auf ein Array von chars definiert Das Array hat die Länge n+1. text[i] (int) text[i] int strlen(char text[]) char(65) liest n-1 Zeichen von der Tastatur in an: void cin.getline(char str[], int n); C++ - STRINGS In C++ neue Klasse, benötigt Überladene Operatoren in der string string myname, yourf myname = ”dick banger” cout << ”please enter your name ”; cin >> yourfname >> if (yourfname +" "+ {cout << ”\n What a coincidence!”; ) //vertauschen , pb Pointer sind oder keine Pointer sind. } ); Das wirkt dann aber wie von innen aufgelöst. -1);} //auto: ‘/0’ . a[n] = O Bit, Abschluss, ‘/0’ liefert das i-te Zeichen liefert den ASCII Code des i-ten Zeichens liefert Länge ohne “\0” -> A (aus ASCII Tabelle) str[] und hängt “\0” #include <string> -Klasse (+,…), siehe Bsp name, yourlname; yourlname; yourlname == myname) } ASCII TABELLE 00-31: NUL,… 48-57: 0-9 97-122: a 32: SPACE 65-90: A-Z 127: DEL POINTER Ein Pointer speichert und zeigt auf eine Adresse dieser Adresse ein Objekt liegt, dann zeigt der Pointer auf das Objekt. Pointer braucht (meist) 4Bytes Speicherplatz. Dereferenzierungsoperator *: Zugriff auf Inhalt der Speicherzelle auf die der Pointer verweist. Referenzierungsoperator &: Ermittlung der Adresse einer Variable. int* pa = 0; //Pointer der auf int int *pb; //zeigen soll 0 pb = NULL; //setzen. int a = 3; pa = &a; //pa unzeigen, o.k. *pb = 3; //b über pb ändern Wenn ein Zeiger auf NULL zeigt, ist er unbrauchbar, er muss zuert wieder umgezeigt warden. Man kann * und & beliebig kombinieren. Ein Paar Beispiele: int i=1, *ip, **ipp; //ipp zeigt auf ip = &i; ipp = &i; //ip auf i **ipp=6; //i und **ipp=i=6 cout<<*&**&ip; //-> 6 Achtung: && ist ein logisches Konstrukt. Beispielaufgaben: Welchen Typ haben die Variabeln? a = &b; b = c[12]||(2>=1); -> bool* a; bool b; bool c[20] a = b.c*3.14; b.a = char(b.c%2) == c; //==,% beachten -> double a; char c; -> struct foo {bool a; int c;} b.b = &b; b.dat = “jawohl, genau du”; -> struct ff{ff* b; char* dat;} a; a.b[2] = 5.0f; a.a = (a.b[2] > a.b[1]); -> struct sss{float b[5]; bool a;} a; DYNAMISCHE SPEICHERALLOZIERUNG Mit new kann man einen Pointer und neues Objekt erzeugen. Bei Arrays muss die Grösse nicht mehr double *dp = new double; int *ip = new int(3); //*pd=3 int *pe = new int[n]; //dyn. Falls kein Speicher vorhanden -> Fehler. Abhilfe: delete dp = new (nothrow) double [n]; if (dp == 0) cout<<”Error mem alloc”; else {…} //kein Programmabbruch -z . Wenn an (NULL) -> FEHLER ip, ->ipp auf ; b; const sein. Array Array vergrössern/Löschen: int*aa = new int[2*n]; for (int i=0;i<n;i++) { aa[i]=a[i]; } delete[] a; a=aa; n=2*n; aa=NULL; POINTER AUF ARRAYS Wie schon erwähnt, sind Arraynamen Pointer, genauer gesagt Pointer auf eine konstante Adresse, auf das erste Element des Arrays. int* const ip //const. Zeiger (Array) const int* ip //Zeiger auf const int* const ip POINTER AUF STRUCTS struct triple {int a, *(trp.b) //deref von (trp.b) *trp.b //wie oben triple* tp = new struct triple; tp->a=10; //a in tp beschreiben (*tp).a=10; //wie oben tp->getBeer(); // ARGUMENTE VON MAIN int main(int argc, char** for(int i=0;i<argc;i++)cout<< … argc ist die Anzahl der Parameter argv ist das Array dieser Parameter atoi()konvertiert ascii to integer, EINFACHE LISTEN Man generiert Elemente (Knoten), die über einen auf das jeweils nächste Element zeigen. struct tNode{ int key; tNode* next; }; tNode *list = 0; Der Zeiger auf den Anfang der Liste ist NEUER KNOTEN AM ENDE Die neue Liste braucht 2 neue letzten Knoten, node auf den tNode *node, *last; node = new tNode; node->key = value; node->next = NULL; if (list == 0){ last = node; //neuer letzer Knoten list = node;} //Anker auf Anfang else { last->next = node last = last->next Beim Aufbau der List mit Anhängen der Knoten am Anfang geht man gleich vor, nur umgekehrt: (nicht mehr 0) verknüpft den neuen Knoten, //neues Array aa //kopieren von a //nach aa //löschen von a //umzeigen … const. int //beides *b,c;}trp; siehe Klassen argv){ //output atof() to float Pointer der Anker (aka root). Pointer, last zeigt auf den aktuellen Knoten: //neuer Knoten //Daten einfügen //letzter Knoten //Liste leer? //anhängen //neuer l. Knoten node->next=list …