Programmieren in C/C++ und MATLAB Sebastian Bauer Sven Willert Sabine Schmidt Institut für Geowissenschaften Christian-Albrechts-Universität zu Kiel Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-1 Übung 1) Schreiben Sie ein Programm, das die Fläche unter einer Parabel, also das Integral b ∫ x²dx a approximativ auswertet. Nähern Sie die Fläche als Summe schmaler Rechtecke konstanter Breite und mit Höhe x². Eingabe soll sein der obere und der untere Integrationswert a und b sowie die Anzahl der zu verwendenden Stützstellen, Ausgabe die berechnete Fläche. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-2 Übung: Integralberechnung Numerik: f(x) Näherung des Integralwertes durch Stützstellen bei i/2 δx, an denen die Höhe des Rechtecks zu f(x) = x2 = ((i+1./2.) δx)2 berechnet wird. Die Breite des Rechtecks ist jeweils δx = (b-a)/n, wobei n die Anzahl der Stützstellen ist. Ergänzung: Vergleichen Sie ihr numerisches Ergebnis mit der analytischen exakten Lösung. Sebastian Bauer Institut für Geowissenschaften 0.5 δx 1.5 δx δx δx Programmieren in C/C++ und MATLAB CAU 4-3 2.5 δx δx x Übung: Integralberechnung #include <cstdlib> #include <iostream> int main(int argc, char *argv[]) { // Variablen: double a, b; // Untere und obere Integrationsgrenze int stuetzstellen; // Anzahl der Stuetzstellen double flaeche = 0.0; // Integralwert double delta_x, x; // Integrationsintervall, Integrationsvariable /* Eingabe der Werte über die Tastatur */ cout << " Berechnung des Integrals von a nach b über x^2 anhand von n Stuetzstellen" << endl; // Eingabe der unteren Integrationsgrenze cout << " Bitte geben Sie die untere Integrationsgrenze ein (a): "; cin >> a; // Eingabe der oberen Integrationsgrenze cout << " Bitte geben Sie die obere Integrationsgrenze ein (b): "; cin >> b; // Eingabe der Anzahl der Stuetzstellen cout << " Bitte geben Sie die Anzahl der Stuetzstellen ein (n): "; cin >> stuetzstellen; cout << " Ihre Eingabe: a: " << a << ", b: " << b << ", n: " << stuetzstellen << endl; Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-4 Programm weiter auf nächster Folie using namespace std; /* Berechnung des Integrals F = integral von a nach b über x^2 */ Übung: Integralberechnung /* Berechnung des Integrals */ // Berechnung des Integrationsintervalls delta_x = (b-a)/((double)stuetzstellen); // Setzt Startwert für die Stuetzwerte entlang der x-Achse a = a + delta_x/2.0; for(int i=0; i < stuetzstellen; i++){ x = a + delta_x*((double)i); flaeche += (x*x)*delta_x; cout << "i: " << i << ", x: " << x << ", Flaeche: " << flaeche << endl; } /* Ergebnisausgabe */ cout << " Der Integralwert betraegt: " << flaeche << endl; /* Vergleich echte Integration */ double flaeche2 = (b*b*b-a*a*a)/3.0; cout << " Analytische Integration ergibt: " << flaeche2 << endl; cout << " Differenz [%]: " << (flaeche2-flaeche)/flaeche2*100.0 << endl; system("PAUSE"); return EXIT_SUCCESS; } Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-5 Kontrollstrukturen Bisher eingeführt: Daten – Datentypen (Deklaration, Definition, Variablen) Operatoren – Verknüpfung von Daten bzw. Änderung von Daten Zu den grundlegenden Sprachelementen gehören nun auch noch Bedingungen und Kontrollstrukturen, die es erlauben, bestimmte Operationen nur unter bestimmten Umständen oder mit einer bestimmten Struktur auszuführen. Dazu gehören - Bedingungen: Wenn (...) Dann (...) - Schleifen: Solange (...) mache (...) Ohne diese Elemente kommt kein Programm aus! Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-6 Bedingungen Fast kein Programm läuft geradlinig durch, fast immer muss überprüft werden, ob bestimmte Voraussetzungen erfüllt sind, sodass in Abhängigkeit dieser Voraussetzungen sich der Programmablauf verzweigt. Dazu muss im einzelnen jeweils überprüft werden, ob eine bestimmt Bedingung erfüllt ist oder nicht. Die Vorgehensweise ist dabei immer gleich: Wenn die Voraussetzung erfüllt ist wird etwas ausgeführt, sonst etwas anderes. Die if-Bedingung (Wenn-Bedingung): if (Bedingung) Anweisung; Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-7 Bedingungen Die if-else-Bedingung (Wenn-dann-Bedingung): if (Bedingung) Anweisung1; else Anweisung2; Dabei können mehrere Anweisungen in einem Teil ausführen, diese müssen dann zu einem Block zusammengefasst werden: if (Bedingung) { Anweisung1; Anweisung2; Anweisung3; } else Anweisung4; Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-8 Bedingungen Formulieren einer Bedingung: Eine Bedingung ist ein Ausdruck, der einen Ganzzahltyp oder bool ergibt. Dafür können alle Vergleichsoperatoren (<, >, ==, !=, etc.) verwendet werden. Die Bedingung ist erfüllt, wenn sie true oder verschieden von 0 ist. Ausdrücke können logisch verknüpft werden (&& (und), || (oder), ! (Negation)) if (a>0) x = x/a; if (p != 0 && x != 0) x *= p; else x = 1; if (boolwert == true) i++; Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-9 Bedingungen Bedingungen können geschachtelt werden, d.h. in einem Block einer if-Bedingung kann eine weitere if-Bedingung gestellt werden. Ebenso sind Sprachkombinationen mit allen anderen Kontrollstrukturen möglich. Kurzformen: if (wert != 0) ist gleichbedeutend mit if (wert == 0) ist gleichbedeutend mit Sebastian Bauer Institut für Geowissenschaften if (wert) if (!wert) Programmieren in C/C++ und MATLAB CAU 4-10 Mehrfachbedingungen Es gibt oft Fälle, in denen es mehr als zwei Möglichkeiten gibt. Die Darstellung durch if-Abfragen kann sehr kompliziert werden, daher gibt es den folgenden Befehl in C++. switch (Ausdruck) { case: Konstante1 : Anweisung1; break; case: Konstante2 : {Anweisungen2}; break; ... default: Standrd‐Anweisung; } Der Ausdruck muss ganzzahligen Typs sein (char, long, int), ebenso wie die Konstanten, mit denen ja intern verglichen wird. Immer break am Ende eines case verwenden! Die Standard-Anweisung ist für den Fall, dass keine der caseAnweisungen zutrifft. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-11 Schleifen Oft gibt es in Programmen Aufgaben, die wiederholt ausgeführt werden müssen. Dies geschieht entweder, bis eine bestimmte Bedingung erfüllt oder eine Höchstzahl an Wiederholungen erreicht ist. Für diese Art der Kontrollstruktur gibt es in C++ drei Arten von Schleifen die eng verwandt sind. Schleife mit Anfangsüberprüfung (while-Schleife) Hier wird zunächst das Abbruchkriterium überprüft, bevor der Block der Schleife Ausgeführt wird while (Ausdruck) { //Schleifenblock Anweisung; } Der Ausdruck ist wie bei if-Bedingung zu verstehen. Bei dieser Art der Schleife kann der Schleifenblock nicht ausgeführt werden. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-12 Schleifen Schleife mit Endüberprüfung (do-while-Schleife) Hier wird das Abbruchkriterium nach Ausführen der Anweisungen im Block der Schleife ausgewertet: do {//Schleifenblock Anweisung; } while (Ausdruck); Der Ausdruck ist wie bei if-Bedingung zu verstehen. Bei dieser Art der Schleife wird der Schleifenblock immer mindestens einmal ausgeführt. Die beiden Schleifenformen lassen sich ineinander überführen, oft jedoch mit zusätzlichen Bedingungen. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-13 Schleifen for-Schleife for (Initialisierung; Bedingung; Anpassung;) { // Anweisungen; } Initialisierung: Startwert des Schleifenpoarameters/Laufvariablen, nur zu Beginn der for-Schleife ausgewertet Bedingung: Die for-Schleife wird ausgeführt, solange die Bedingung erfüllt ist (Ausdruck hat Wert ungleich 0) Anpassung: Nach jeder ausführung des Schleifenblocks kann hier der Schleifenparameter angepasst werden int zaehler=0; for (int i=1; i<=100; i++){ zaehler +=i; cout << “ Summe bis i: “ << zaehler << endl; } Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-14 Schleifen Wird kein Block mit {...} verwendet, so gilt die Wiederholung nur für die nächstfolgende Anweisung. Die Zählvariable kann in der for-Schleife deklariert werden, sie ist dann nur innerhalb der Schleife gültig. for-Schleifen sind in C++ sehr mächtig, und können für alle Datenstrukturen eingesetzt werden. Schleifenkontrolle Abbruch einer Schleife durch break – geknüpft an eine Bedingung. Damit wird die Abarbeitung der Schleife unterbrochen. Abbruch der Anweisungen im Schleifenbkörper, aber Fortführen der Schleife mit angepasstem Schleifenparameter: continue Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-15 Vergleich - Schleifen while-Schleife Sebastian Bauer Institut für Geowissenschaften do-while-Schleife Programmieren in C/C++ und MATLAB CAU for-Schleife 4-16 Übung Schreiben Sie ein Programm, das die Zahl π durch 4 4 4 4 4 π = 4 − + − + − + ... 3 5 7 9 11 approximiert. Schreiben Sie das Programm einmal mit einer for-Schleife und einmal mit einer do-while-Schleife. Die Schleifen sollen jeweils abbrechen, wenn die gewünschte Genauigkeit (über Benutzereingabe vorgegeben) erreicht ist, und das Ergebnis soll auf den Bildschirm ausgegeben werden. Zusatzaufgabe: Schreiben Sie das Programm so um, dass es eine while-Schleife verwendet. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 4-17