Progrmmieren in C/C und Mtl Sine Schmidt & Sestin Buer Institut für Geowissenschften Christin-Alrechts-Universität zu Kiel Progrmmieren in C/C und Mtl CAU, SS 08
for- / while-schleifen: - numerische Integrlerechnung - numerische Berechnung von Felder / Arrys Letzte Woche - Deklrtion, Dimensionierung, mehrdimensionle Felder [i][j] - Initilisierung - Indizierung, Indexopertor [ ] - fixe Größe, ei Progrmmstrt zu definieren Continer / Vektoren - Deklrtion und Initilisierung - Indizierung, Itertor pos - flexile Größe, während des Pogrmmlufs vriel Progrmmieren in C/C und Mtl CAU, SS 08
Progrmmieren in C/C und Mtl CAU, SS 08 Üung 1
Progrmmstruktur: Üung 1 - Vrilendeklrtion - Vrileninitilisierung - Routine zum Einlesen der eiden 2x2-Mtrizen von der Tsttur - Einge der gewünschten Opertion (Addition/Multipliktion) - Ausführen der Opertion: Fllunterscheidung - Routine zur Ausge der neu erechneten Mtrix uf den Bildschirm Progrmmieren in C/C und Mtl CAU, SS 08
Vrilendeklrtion: Üung 1 Die Art der enötigte Vrilen richtet sich nch den uszuführenden Opertionen und Kontrollstrukturen. Es werden enötigt: 3 Mtrizendtenstrukturen: zweidimensionle Arrys des Typs doule [...][...] Wie groß müssen die Arrys sein? Kontrollvrile für die Fllunterscheidung Addition/Multipliktion: ei 2 möglichen Opertionen ist eine if / else Struktur sinnvoll. Tip: Benutzen Sie eine Vrile des Typs int ls Kontrollvrile ( Flg ). Mtrizenopertionen sind effizient mit Hilfe von geschchtelten for-loops zu implementieren: for(i=0;i<2;i) for(j=0;j<2;j)... Hierzu werden sog. Lufvrilen (Typ int) enötigt: i,j,... Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Vrileninitilisierung: Die deklrierten Vrilen müssen initilisiert werden. Dies knn ei einfchen Vrilen direkt ei der Deklrtion erledigt werden: int i = 0; Arrys können effizient durch for-loops initilisiert werden: for(i=0;i<2;i) for(j=0;j<2;j) doule [i][j]=0; Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Routine zum Einlesen der Mtrizen von der Tsttur: Benutzen Sie die iostrem Opertoren cout / cin : cout <<...Anweisung... " << endl; cin >> [0][0] >> [0][1];... Einge der gewünschten Opertion Benutzen Sie die iostrem Opertoren cout / cin um die Flg für die gewünschte Opertion zu setzen Ausführen der Opertion: Fllunterscheidung Benutzen Sie deine if / else Struktur sinnvoll mit der een eingelesenen Flg ls Kontrollvrile. Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Ausführen der Opertion: Fllunterscheidung Für eide Fälle (Addition/Multipliktion) sind geschchtelte forloops zu implementieren. Ausge der erechneten Mtrix Benutzen Sie den iostrem Opertoren cout und einen for-loop Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Progrmmieren in C/C und Mtl CAU, SS 08 Mtrizenddition = = = 11 11 01 01 00 00 11 01 00 11 01 00 c ij ij ij c = = = = 11 11 11 00 11 01 01 00 01 00 00 11 01 00 11 01 00 0 c n k kj ik ij c Mtrizenmultipliktion
Üung 1 Deklrtion & Initilisierung #include <cstdli> #include <iostrem> using nmespce std; int min(int rgc, chr *rgv[]) { // Vrilendeklrtion int fll=0; // flg zur Fllunterscheidung Addition / Multipliktion int i,j,k; // Lufvrilen doule [][], [][], c[][]; // 3 x Arrys // Initilisierung for(i=0;i<;i) for(j=0;j<;j) [i][j]=[i][j]=c[i][j]=0.0; Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Einlesen der Anweisungen // Einlesen der Mtrizen von der Tsttur cout << "Bitte die erste 2 x 2 Mtrix zeilenweise eingeen "; cout << "und jeweils Enter druecken. " << endl; cin >> [0][0] >> [0][1]; cin >> [1][0] >> [1][1]; cout << "Bitte die zweite 2 x 2 Mtrix zeilenweise eingeen "; cout << "und jeweils Enter druecken. " << endl; cin >> [0][0] >> [0][1]; cin >> [1][0] >> [1][1]; // Einlesen der Mtrizenopertion von der Tsttur cout << "Geen sie eine 0 fuer eine Addition oder eine 1 fuer "; cout << "eine Multipliktion der Mtrizen ein und drücken Sie Enter." << endl; cin >> fll; Flg fll Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Ausführung der Mtrizenerechnung: Fllunterscheidung // Afngen von Eingefehlern if(fll!= 0 && fll!= 1 ) // ist nicht... und ist uch nicht... { cout << "Sie hen gewehlt: Flsche Einge. "; cout << "Progrmmruch." << endl; system("pause"); return 0; } // Fllunterscheidung Addition / Multipliktion else if(fll == 0) { cout << "Sie hen gewehlt: Addition " << endl; for(i=0;i<2;i) for(j=0;j<2;j) c[i][j] = [i][j] [i][j]; } else if(fll == 1) { cout << "Sie hen gewehlt: Multipliktion " << endl; for(i=0;i<2;i) for(j=0;j<2;j) for(k=0;k<2;k) c[i][j] = [i][k] * [k][j]; } Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Ausführung der Mtrizenerechnung: Fllunterscheidung // Ausge der Mtrix C if(fll == 0) cout << "Die Addition der Mtrizen erg:" << endl; else cout << "Die Multipliktion der Mtrizen erg:" << endl; for(i=0;i<2;i) { for(j=0;j<2;j) cout << c[i][j] << " "; cout << endl; } cout << endl; system("pause"); return EXIT_SUCCESS; } Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Progrmmieren in C/C und Mtl CAU, SS 08 Üerprüfen Sie Ihr Progrmm nhnd der folgenden Mtrizen: = = 12 8 6 8 4 7 3 6 2 5 1 8 7 6 5 4 3 2 1 = = 50 43 22 19 4*8 3*6 4*7 3*5 2*8 1*6 2*7 1*5 8 7 6 5 4 3 2 1
Üung 1 Erweiterung uf Mtrizen (fst) elieiger Größe: Um den Code für die Berechnung von Mtrizen verschiedener Größen (z.b. 1x1 is x) zu verllgemeinern wird zusätzlich eine Routine zur Afrge der gewünschten Mtrizengröße enötigt: int dim = 0; // Einlesen der Dimension der Mtrizen von der Tsttur cout << "Bitte die Dimension der Mtrizen eingeen und "; cout << "Enter druecken. " << endl; cin >> dim; if(dim >= 1 && dim <= ) // ist größer gleich... oder kleiner gleich... cout << "Sie hen gewehlt: " << dim << endl; else { cout << "Sie hen gewehlt: " << dim << endl; cout << "Die Diemnsion der Mtrix ist nicht zwischen 1 x 1 "; cout << "und x. Progrmmruch." << endl; system("pause"); return EXIT_FAILURE; } Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Erweiterung uf Mtrizen (fst) elieiger Größe: Auch ds Einlesen der Mtrizen vom Bildschirm muss verllgemeinert werden: Es werden for-loops zur Einge enötigt. // Einlesen der Mtrizen von der Tsttur cout << "Bitte die erste Mtrix zeilenweise eingeen und "; cout << "jeweils Enter druecken. " << endl; for(i=0;i<dim;i) for(j=0;j<dim;j) cin >> [i][j]; cout << "Bitte die zweite Mtrix zeilenweise eingeen "; cout << "jeweils Enter druecken. " << endl; for(i=0;i<dim;i) for(j=0;j<dim;j) cin >> [i][j]; Progrmmieren in C/C und Mtl CAU, SS 08
Üung 1 Erweiterung uf Mtrizen (fst) elieiger Größe: Auch ei der Mtrizenerechnung und der Mtrizenusge müssen die for-loops verllgemeinert werden: Die hrt definierte Oergrenze der loops wird durch dim ersetzt for(i=0;i<dim;i) for(j=0;j<dim;j) Progrmmieren in C/C und Mtl CAU, SS 08
Progrmmieren in C/C und Mtl CAU, SS 08 Üung 2
Progrmmstruktur: Üung 2 - Vrilendeklrtion - Vrileninitilisierung - Routine zum Einlesen des Vektorinhlts - Einge der Anzhl der neu einzufügenden Vektorelemente - Einge der Position und des Wertes für jedes einzufügende Element - Routine zur Ausge des neuen Vektors uf den Bildschirm Progrmmieren in C/C und Mtl CAU, SS 08
Üung 2 Deklrtion & Initilisierung & Einlesen d. Vektors: #include <cstdli> #include <iostrem> #include <vector> // Extr Deklrtion im heder notwendig using nmespce std; int min(int rgc, chr *rgv[]) { // Vrilendeklrtion int n=0, wert, index; // Anzhl einzufuegende Werte int lenge; // Lenge des Vectors für Ausge vector < int> v_int(,0); // Vector mit int Zhlen, lle initilisiert std::vector<int>::itertor pos; // Itertor uf den Vector v_int // Einlesen der Zhlen von der Tsttur cout << "Bitte integer Zhlen eingeen. "; cout << "Nch jeder Zhl Enter druecken " << endl; for(int i=0;i<;i) cin >> v_int[i]; Progrmmieren in C/C und Mtl CAU, SS 08
Üung 2 Einfügen der neuen Elemente des Vektors: // Einfuegen von n Werten; Afrge n von Tsttur cout << "Wie viele Werte sollen eingefuegt werden? " ; cin >> n; // Einlesen des Wertes und der Position, n der der Wert eingefügt werden soll: cout << " Wert und Index, hinter dem eingefuegt werden soll, ngeen: " << endl; for(int i=0; i<n;i){ cin >> wert >> index; // Einlesen wert und index pos = v_int.egin() index; // Berechnung der Itertorposition mit // implizite Typumwndlung von int nch // std::vector<int>::itertor if(index <= i) // Bereichsprüfung - git es den Index? v_int.insert(pos, wert); // Einfuegen von wert n index else cout << " Index existiert nicht" << endl; } Progrmmieren in C/C und Mtl CAU, SS 08
Üung 2 Bildschirmusge des erweiterten Vektors: // Ausge, vriler oerer Zehlindex cout << "Vector neu: " << endl; // Zunächst muss estimmt werden, wie groß der erweiterte Vektor nun ist: lenge = v_int.size(); // Bestimmung der Schleifenoergrenze durch die Funktion //.size() des Dtenkontiners vector for(int i=0;i<lenge;i){ cout << v_int[i] <<" "; } cout << endl; system("pause"); return EXIT_SUCCESS; } Progrmmieren in C/C und Mtl CAU, SS 08