1 HARALD NAHRSTEDT C++ für Ingenieure Einführung in die objektorientierte Programmierung C++ Quellcodes zum Buch Kapitel 1 Erstell am 27.04.2009 Beschreibung Diese Seiten enthalten den Quellcode aus dem Buch. Sie können kopiert und zur eigenen Programmierung weiter verwendet werden. Für die Ausführung wird jedoch keine Haftung übernommen. 2 Quellcodes zum Buch Code 1-1 Struktur einer Header-Datei #ifndef MYHEADER_H #define MYHEADER_H // Kommentar: Dateiname und Aufgabe // Erstellungsdatum // Version // Revision // Compilerschalter #define WINDOWS #undef UNIX //Include-Dateien #include <iostream> #include “myModul.h” // Symbolische Konstanten #define TRUE 1 // Makros #define MIN(ZahlA,ZahlB)((a)<(b)?(a):(b)) //Globale Konstanten const double MAX=100; //Datenstrukturen und Typvereinbarungen typedef float Flaeche; //Globale Variablen extern int Mass; // Deklarationen von Funktionen double Flaeche(float Breite, float Hoehe); #endif Code 1-2 Header-Schalter #ifndef MY_MODUL_H #define MY_MODUL_H ... #endif Code 1-3 Anwendungsbeispiel – Satz des Pythagoras /* Pythagoras.cpp Dieses Programm berechnet die Hypotenuse eines rechtwinkligen Dreiecks nach dem Satz des Pythagoras */ #include <iostream.h> #include <math.h> C++ Quellcodes zum Buch Kapitel 1 int main (){ // Deklarationen double Seite_a, Seite_b, Seite_c; // Eingabe cout << „Seite a = „; cin >> Seite_a; cout << „Seite b = „; cin >> Seite_b; // Auswertung Seite_c = sqrt(Seite_a * Seite_a + Seite_b * Seite_b); // Ausgabe cout << „Seite c = „ << Seite_c; system („Pause“); return 0; } Code 1-4 Anwendungsbeispiel – Kräfte im Raum /* Kraefte.cpp Das Programm bestimmt mit Parametern von Kräften im freien Raum resultierende Kraft, Moment und Dyname */ #include <iostream.h> #include <math.h> int main () { char weiter; double x, y, z; double Fx, Fy, Fz; double Sux, Suy, Suz; double SuFx, SuFy, SuFz; double SuMx, SuMy, SuMz; double Fr, Mr, p; double Mx, My, Mz; double ax, ay, az; do { cout << "weiter (E=Ende/N=Neu/W=Weiter/A=Ausgabe) "; cin >> weiter; switch (weiter) { case 'E': /* Ende */ break; case 'N': /* Neuanfang */ Sux = 0; Suy = 0; Suz = 0; 3 4 Quellcodes zum Buch SuFx = 0; SuFy = 0; SuFz = 0; SuMx = 0; SuMy = 0; SuMz = 0; case 'W': /* weiter */ // Eingaben cout << "Angriffspunkt (x) = "; cin >> x; cout << "Angriffspunkt (y) = "; cin >> y; cout << "Angriffspunkt (z) = "; cin >> z; cout << "Kraftkomponente (x) = "; cin >> Fx; cout << "Kraftkomponente (y) = "; cin >> Fy; cout << "Kraftkomponente (z) = "; cin >> Fz; // Auswertung Sux = Sux+x; Suy = Suy+y; Suz = Suz+z; SuFx = SuFx+Fx; SuFy = SuFy+Fy; SuFz = SuFz+Fz; SuMx = SuMx+y*Fz-z*Fy; SuMy = SuMy+z*Fx-x*Fz; SuMz = SuMz+x*Fy-y*Fx; break; case 'A': /* Ausgabe */ Fr = sqrt(SuFx*SuFx+SuFy*SuFy+SuFz*SuFz); Mr = sqrt(SuMx*SuMx+SuMy*SuMy+SuMz*SuMz); ax = (SuFy*SuMz-SuFz*SuMy)/(Fr*Fr); ay = (SuFz*SuMx-SuFx*SuMz)/(Fr*Fr); az = (SuFx*SuMy-SuFy*SuMx)/(Fr*Fr); p = SuFx*SuMx+SuFy*SuMy+SuFz*SuMz; Mx = p*SuFx/(Fr*Fr); My = p*SuFy/(Fr*Fr); Mz = p*SuFz/(Fr*Fr); cout << "Resultierende Kraft = " << Fr << cout << "Resultierendes Moment = " << Mr << cout << "Dyname Ortsvektor (x) = " << ax << cout << "Dyname Ortsvektor (y) = " << ay << cout << "Dyname Ortsvektor (z) = " << az << cout << "Momentenvektor (x) = " << Mx << cout << "Momentenvektor (y) = " << My << cout << "Momentenvektor (z) = " << Mz << break; default: endl; endl; endl; endl; endl; endl; endl; endl; C++ Quellcodes zum Buch Kapitel 1 cout << "Falsche Eingabe!" << endl; } } while (weiter!='E'); } Code 1-5 Anwendungsbeispiel – Bestimmung der Eindringtiefe für eine Härteprüfung /* Eindringtiefe.cpp Dieses Programm berechnet die Eindringtiefe durch einen Kugelabdruck bei der Härteprüfung nach Brinell */ #include <iostream.h> #include <math.h> int main () { // Deklarationen int Radius; double KugelRadius; double AbdruckRadius, AbdruckHoehe; // Eingaben cout << "Kugelradius r = "; cin >> Radius; KugelRadius = (double) Radius; cout << "Abdruckradius x = "; cin >> AbdruckRadius; // Auswertung AbdruckHoehe = KugelRadius - sqrt(KugelRadius * KugelRadius AbdruckRadius * AbdruckRadius); // Ausgabe cout << "Eindringtiefe h = " << AbdruckHoehe << endl; system ("Pause"); } Code 1-6 Anwendungsbeispiel – Lösung einer kubischen Gleichung /* Kubische_Gleichung.cpp Dieses Programm bestimmt die Lösungen einer kubischen Gleichung nach del Ferro */ #include <iostream.h> #include <math.h> int main () { // Deklarationen float a, b, c; float p, q, r, s, u, v, w, z; 5 6 Quellcodes zum Buch float D; float y1, y2, y3, y2i, y3i, x1, x2, x3; float f = 0.3333333; // Eingaben cout << "Geben Sie die Faktoren ein" << endl; cout << "zur Gleichung:" << endl; cout << "x^3 + a x^2 + b x + c = 0" << endl; cout << "-------------------------" << endl; cout << "a = "; cin >> a; cout << "b = "; cin >> b; cout << "c = "; cin >> c; cout << endl << endl; cout << "Die Loesung der Gleichung "; cout << "x^3 + " << a << " x^2 + " << b << " x + " << c << " = 0" << endl; cout << "lautet:" << endl; // Auswertung p = b-pow(a, 2)/3; q = (2*pow(a, 3))/27-(a*b)/3+c; D = pow((q/2), 2)+pow((p/3), 3); cout << "Determinante D = " << D << endl; if (D<0) { r = sqrt(-pow((p/3), 3)); z = -(q/2)/r; w = atan(-z/sqrt(-z*z+1))+2*atan(1); y1 = pow(2*r, f)*cos(w/3); y2 = pow(2*r, f)*cos(w/3+8*atan(1)/3); y3 = pow(2*r, f)*cos(w/3+16*atan(1)/3); x1 = y1-a/3; x2 = y2-a/3; x3 = y3-a/3; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; cout << "x3 = " << x3 << endl; } else { if (D==0) { y1 = 2*pow((-q/2), f); y2 = pow((-q/2), f); y3 = y2; x1 = y1-a/3; x2 = y2-a/3; x3 = y3-a/3; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; cout << "x3 = " << x3 << endl; C++ Quellcodes zum Buch Kapitel 1 7 } else { s = sqrt(D); z = -(q/2)+s; if (z>=0) u = pow(z,f); else u = -pow((-z), f); z = -(q/2)-s; if (z>=0) v = pow(z, f); else v = -((-z), f); y1 = u+v; y2 = -(u+v)/2; y2i = sqrt(3)*(u-v)/2; y3 = -(u+v)/2; y3i = -sqrt(3)*(u-v)/2; x1 = y1-a/3; x2 = y2-a/3; x3 = y3-a/3; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << " + i" << y2i << endl; cout << "x3 = " << x3 << " + i" << y3i << endl; } } // Stop system ("Pause"); } Code 1-7 Anwendungsbeispiel – Bestimmung des Speicherbedarfs einiger Datentypen /* Speicherbedarf.cpp Das Programm zeigt den Speicherbedarf verschiedener Datentypen */ #include <iostream.h> #define CH 'x' int main(void) { char ch = 'x'; bool stop; cout cout cout cout cout cout cout << << << << << << << "sizeof "sizeof "sizeof "sizeof "sizeof "sizeof "sizeof /* Zeichenkonstante */ /* Zeichenvariable */ int = " << sizeof(int)<< endl; char = " << sizeof(char) << endl; ch = " << sizeof(ch) << endl; wchar_t = " << sizeof(wchar_t) << endl; float = " << sizeof(float) << endl; double = " << sizeof(double) << endl; long double = " << sizeof(long double) << endl; 8 Quellcodes zum Buch cin >> stop; return 0; } Code 1-8 Anwendungsbeispiel – Bitoperationen /* BitOperationen.cpp Beispiele */ #include <iostream.h> #include <iomanip.h> using std::cout; using std::endl; // Definition der benutzten Variablen unsigned short myVal1 = 0xAF19, myVal2 = 0xBE28; // Hauptprogramm int main (){ // Umstellung der Ausgabe auf hex mit Angabe der Zahlenbasis cout << std::hex << std::showbase; // Die Variablen cout << endl; cout << “myVal1: “ << myVal1 << endl; cout << “myVal2: “ << myVal2 << endl; // High-Byte der Variablen ausgeben cout << “High-Byte von “ << myVal1 << “: “ << (myVal1>>8) << endl; // Low-Byte der Variablen ausgeben cout << “Low-Byte von “ << myVal1 << “: “ << (myVal1&0xFF) << endl; // Einfache Operationen cout << endl; cout << “myVal1 & myVal2: “ << (myVal1 & myVal2) << endl; cout << “myVal1 | myVal2: “ << (myVal1 | myVal2) << endl; cout << “myVal1 ^ myVal2: “ << (myVal1 ^ myVal2) << endl; cout << “~ myVal1: “ << (~ myVal1) << endl; // Zurückstellen der Ausgabe auf dezimal cout << std::dec; // 2er Potenzen cout << endl; cout << „2 hoch cout << „2 hoch cout << „2 hoch ausgeben 0: „ << (1<<0) << endl; 1: „ << (1<<1) << endl; 2: „ << (1<<2) << endl; // Division durch 2er Potenzen cout << endl; cout << “244/4: “ << (244>>2) << endl; cout << “244/8: “ << (244>>3) << endl; C++ Quellcodes zum Buch Kapitel 1 9 cout << “244/16: “ << (244>>4) << endl; system(“Pause”); return 0; } Code 1-9 Anwendungsbeispiel – Minimale Oberfläche /* MinOberflaeche.cpp Das Programm bestimmt die minimale Oberfläche eines zylindrischen Behälters bei vorgegebenem Volumen */ #include <iostream.h> #include <math.h> const double pi = 4*atan(1); //Konstante pi // Radius in cm double Rad(double d) { return d/2; } // Oberfläche in cm^2 double Ob(double V, double d) { return 2*pi*Rad(d)*Rad(d)+2*V/Rad(d); } // 1. Ableitung der Oberfläche double Ob1(double V, double d) { return 4*pi*Rad(d)-2*V/(Rad(d)*Rad(d)); } // 2. Ableitung der Oberfläche double Ob2(double V, double d) { return 4*pi+4*V/(Rad(d)*Rad(d)*Rad(d)); } int main () { double V, d1, d2, d, e; double o1, o2; bool M; cout << endl << "Volumen [ccm] V = "; cin >> V; cout << endl << "Startwert [cm] d1 = "; cin >> d1; cout << endl << "Startwert [cm] d2 = "; cin >> d2; 10 Quellcodes zum Buch cout << endl << "Abschaltgrenze = "; cin >> e; cout << endl << "d\t\tO\t\tO'\t\tO''" << endl; // Startüberprüfung M = true; o1 = Ob1(V, d1); o2 = Ob1(V, d2); if (o1>=0) { if (o2>=0) { M = false; } } else { if (o2>=0) { d = d1; d1 = d2; d2 = d; } else { M = false; } } if (M==true) { // Berechnung do { d = d1-o1*(d2-d1)/(o2-o1); if (Ob1(V, d)>0) d1 = d; else d2 = d; cout << d << "\t\t" << Ob(V, d) << "\t\t"; cout << Ob1(V, d) << "\t\t" << Ob2(V, d) << endl; } // Abbruchkriterium while (fabs(Ob1(V, d)) > e); cout << d << "\t\t" << Ob(V, d) << "\t\t"; cout << Ob1(V, d) << "\t\t" << Ob2(V, d) << endl; } else cout << "Startwerte falsch!" << endl; system ("Pause"); } C++ Quellcodes zum Buch Kapitel 1 Code 1-10 Anwendungsbeispiel—Maximales Volumen /* MaxVolumen.cpp Das Programm bestimmt den Zuschnitt für ein maximales Quader-Volumen bei vorgegebener Materialfläche */ #include <iostream.h> #include <math.h> // Volumen in cm^3 double Vol(double a, double x) { return x*(a-2*x)*(a-2*x); } // 1. Ableitung des Volumens double Vol1(double a, double x) { return 12*x*x-8*a*x+a*a; } // 2. Ableitung des Volumens double Vol2(double a, double x) { return 24*x-8*a; } int main () { double a, x, e; bool M; int i; cout << endl cin >> a; cout << endl cin >> x; cout << endl cin >> e; cout << endl << "Kantenlaenge [cm] a = "; << "Startwert [cm] x = "; << "Abschaltgrenze = "; << "x\t\tV\t\tV'\t\tV''" << endl; // Berechnung do { x = x-Vol1(a, x)/Vol2(a, x); cout << x << "\t\t" << Vol(a, a) << "\t\t"; cout << Vol1(a, x) << "\t\t" << Vol2(a, x) << endl; } // Abbruchkriterium while (fabs(Vol1(a, x)) > e); cout << x << "\t\t" << Vol(a, x) << "\t\t"; cout << Vol1(a, x) << "\t\t" << Vol2(a, x) << endl; 11 12 Quellcodes zum Buch system ("Pause"); } Code 1-11 Anwendungsbeispiel – Satz des Heron /* Heron.cpp Dieses Programm berechnet den Flächeninhalt eines beliebigen Dreiecks nach dem Satz von Heron */ #include <iostream.h> #include <math.h> int main (){ // Deklarationen double a, b, c, s, f; // Eingaben cout << "Seite a = "; cin >> a; cout << "Seite b = "; cin >> b; cout << "Seite c = "; cin >> c; // Auswertung und Ausgabe s=(a+b+c)/2; if (a<s && b<s && c<s) { f = sqrt(s*(s-a)*(s-b)*(s-c)); cout << "Flaeche = " << f << '\n'; } else { cout << "Eingabefehler !" << '\n'; } system ("Pause"); } Code 1-12 Anwendungsbeispiel – Volumenberechnung von finiten Elementen /* Volumen.cpp Diese Switch-Anweisung berechnet das Volumen eines Zylinders oder einer Rechteckplatte, je nach Inhalt von Form */ #include <iostream.h> #include <math.h> int main() { char Form; long a,b,c,Vol; C++ Quellcodes zum Buch Kapitel 1 cout << "Form = "; cin >> Form; switch (Form) { case 'Z': /* Zylinder */ cout << "Durchmesser = "; cin >> a; cout << "Hoehe = "; cin >> b; Vol=a*a*3.14159/4*b; cout << "Volumen = " << Vol; break; case 'R': /* Rechteckplatte */ cout << "Laenge = "; cin >> a; cout << "Breite = "; cin >> b; cout << "Hoehe = "; cin >> c; Vol=a*b*c; cout << "Volumen = " << Vol; break; default: /* Sonst */ cout << "Falsche Eingabe!"; } system ("Pause"); } Code 1-13 Anwendungsbeispiel – Numerische Integration: Das bestimmte Integral als Flächeninhalt /* Iteration_Flächeninhalt.cpp Das bestimmte Integral als Flächeninhalt: Die Funktion bestimmt den Flächeninhalt in n Schritten zwischen der Parabel y=f(x)=x*x und der x-Achse im Intervall 1<=x<=2 durch Angabe der Unter- und Obersummen */ #include <iostream.h> #include <math.h> int main() { int i, n; double x, dx, Us=0, Os=0; bool Stop; cout << "Iterationen = "; cin >> n; dx=1/(double)n; x=1.0; for (i=1; i<=n; ++i) { 13 14 Quellcodes zum Buch Us=Us+x*x*dx; x=x+dx; Os=Os+x*x*dx; }; cout << "Untersumme = " << Us; cout << "Obersumme = " << Os; system("Pause"); } Code 1-14 Anwendungsbeispiel – Nullstellenbestimmung nach der Bisektionsmethode /* Nullstelle_Bisektion.cpp Die Funktion bestimmt eine Nullstelle der mathematischen Funktion F(x)=x*x-7=0 nach der Bisektionsmethode mit den Startwerten x1=2 und x2=4 */ #include <iostream.h> #include <math.h> // Zu untersuchende Funktion double f(double x) { return x*x-7; } int main() { int i=0; double x1=2, x2=4; double y1, y2; double x, y; while ((x2-x1) > 0.0001) { i=i+1; x=x1+(x2-x1)/2; y=f(x); if (y < 0) { x1=x; y1=y; } else { x2=x; y2=y; } } cout << "x1,x2 = " << x1 << " / " << x2 << '\n'; cout << i << " Iterationen" << '\n'; system ("Pause"); } C++ Quellcodes zum Buch Kapitel 1 Code 1-15 Anwendungsbeispiel – Nullstellensuche durch sukzessive Approximation /* Nullstelle_Approximation.cpp Die Funktion bestimmt eine Nullstelle der mathematischen Funktion y=x*x-7 nach der Methode der sukzessiven Approximation x = F(x) mit dem Startwert x=2.6 */ #include <iostream.h> #include <math.h> // Zu untersuchende Funktion double f(double x) { return sqrt(3+sqrt(x)); } int main() { int i=0; double x1, x2=2; double y1, y2; do { x1=x2; i=i+1; x2=f(x1); } while ((x2-x1) > 0.00001); cout << "x1,x2 = " << x1 << " / " << x2 << '\n'; cout << i << " Iterationen" << '\n'; system("Pause"); return 0; } Code 1-16 Anwendungsbeispiel – Schleifenkonstruktion mit continue und break /* Nullstellen_Vergleichend.cpp Die Funktion bestimmt alle Nullstellen der mathematischen Funktion F(x)=x*x-7=0 im Intervall von -100 bis 100 durch vergleichende Auswertung */ #include <iostream.h> #include <math.h> // Zu untersuchende Funktion double f(double x) { return x*x-7; } 15 16 Quellcodes zum Buch int main() { int i, i1, i2; double x0, x1, x2=-100; double y1, y2; double x, y; // erster Funktionswert mit Vorzeichen y2=f(x2); i2=1; if (y2<0) i2=-1; for (x=-100; x<100; x++) { // Vertauschung x1=x2; y1=y2; i1=i2; // zweiter Funktionswert mit Vorzeichen x2=x; y2=f(x2); i2=1; if (y2<0) i2=-1; // Vorzeichen gleich, dann weiter if (i1==i2) continue; cout << "x1, y1= " << x1 << " / " << y1 << '\n'; cout << "x2, y2= " << x2 << " / " << y2 << '\n'; // Nullstelle mit maximal 1000 Itarationen annähern for (i = 1;i < 1000; i++) { x0=x2-x1; if (x0<0.001) { cout << "Nullstelle = " << x1 << " / " << x2 << '\n'; break; // Ausstieg aus der for-Anweisung } else { x0=x1+(x2-x1)/2; y=f(x0); if (y < 0) { x1=x0; } else { x2=x0; } } } } system("Pause"); } C++ Quellcodes zum Buch Kapitel 1 17 Code 1-17 Anwendungsbeispiel – Die Nutzung eines ternären Operators /* ten_Operator.cpp Die Funktion zeigt an einfachen Beispielen die Nutzung eines ternären Operators */ #include <iostream.h> int main() { int a = 1; int b; // ursprügliche Verzweigung if(a==1) b = 1; else b = 2; cout << "b ist gleich " << b << '\n'; // Kürzere Schreibweise des oberen Konstrukts: b = (a==1) ? 2 : 3; cout << "b ist gleich " << b << '\n'; // Verschachtelung ohne Klammerung schwer lesbar b = (a==1) ? (a!=1) ? (a ==2) ? 1 : 2 : 3 : 4; cout << "b ist gleich " << b << '\n'; system("Pause"); return 0; } Code 1-18 Anwendungsbeispiel – Seilverlauf mit der Interpolation nach Newton /* Seilverlauf_Interpolation.cpp Die Funktion bestimmt einen Seilverlauf aus gemessenen Werten durch Interpolation nach Newton */ #include <iostream.h> int main() { int i, j; double xi, yi, zi; double x[]={0,10,20,30,35,40,50}; double y[]={30,18,11.5,10,10.5,12.5,20}; double z[8][8]; //Matrix für Schema int n=6; // Schema aufbauen for (j=0; j<=n+1; j++) for (i=0; i<=n+1; i++) //gemessene Positionen //gemessene Seilhöhen 18 Quellcodes zum Buch z[i][j]=0; for (j=0; j<=n; j++) z[j][0]=x[j]; for (j=0; j<=n; j++) z[j][1]=y[j]; cout << endl; // Dividierte Steigungen for (i=2; i<=n+1; i++) for (j=0; j<=n-i+1; j++) z[j][i]=(z[j+1][i-1]-z[j][i-1])/(z[j+i-1][0]-z[j][0]); // Verlauf for (xi=x[0]; xi<=x[6]; xi++) { yi=y[0]; for (j=2; j<=n+1; j++) { zi=z[0][j]; for (i=0; i<=j-2; i++) zi=zi*(xi-z[i][0]); yi=yi+zi; } cout << "x,y = " << xi << " } /* Ausgabe Schema for (j=0; j<=n+1; j++) { for (i=0; i<=n+1; i++) cout << z[j][i] << " cout << '\n'; } */ " << yi << '\n'; "; system("Pause"); } Code 1-19 Anwendungsbeispiel – Einschrittige Codes nach der Backtracking-Methode /* Einschrittige_Codes.cpp Dieses Programm sucht alle möglichen einschrittigen Codes nach der Backtracking-Methode */ #include <iostream.h> #include <string.h> int main () { // Deklarationen int A[16][4], U[4], M[16]; C++ Quellcodes zum Buch Kapitel 1 int i, j, k, l, n; int p1, p2; int y, z, s; // Start cout << "Anzahl der Codes bis zum Stop: "; cin >> z; cout << "Bitte haben Sie etwas Geduld!" << endl; y = 1; // Ausgangskonfiguration 0000 for (j=1;j<5;j++) { A[1][j] = 0; } // Merker Ausgangswerte for (i=1;i<17;i++) { M[i] = 0; } // Start i = 1; do { // Schritt vor for (j=1;j<5;j++) U[j] = A[i][j]; if (M[i]<4) { M[i]++; U[M[i]] = 1-U[M[i]]; // Prüfung // wird die gleiche Konstellation noch einmal gefunden // ist p1=1 p1 = 0; for (k=1;k<i+1;k++) { p2 = 0; for (j=1;j<5;j++) { if (U[j] != A[k][j]) p2 = 1; } if (p2==0) p1 = 1; } // neue Konstellation if (p1==0) { i++; for (j=1;j<5;j++) { 19 20 Quellcodes zum Buch A[i][j] = U[j]; } if (i==16) { // Prüfung, ob der Code in sich geschlossen ist s = 0; for (j=1;j<5;j++) { if (A[1][j] != A[i][j]) { s++; } } if (s==1) { // Code brauchbar und wird registriert for (k=1;k<17;k++) { for (j=1;j<5;j++) { if (A[k][j]==1) cout << "X"; else cout << "_"; } cout << endl; } y++; // Merkerstand zeigen cout << "Merker:" << endl; for (k=1;k<17;k++) cout << M[k]; cout << endl; // Stop if (y==z+1) system("Pause"); } // Schritt zurück M[i] = 0; i--; } } } else { // Schritt zurück M[i] = 0; i--; } } while (i>0); cout << y << " gefundene Codes!" << endl; C++ Quellcodes zum Buch Kapitel 1 system("Pause"); } Code 1-20 Anwendungsbeispiel Zufallszahlen – BubbleSort /* BubbleSort.cpp Dieses Programm erzeugt 50 Zufallszahlen und sortiert sie nach der BubbleSort-Methode */ #include <iostream> #include <iomanip> #include <time.h> // stream io // stream io mit Tab // Pseudozufallszahlen using namespace std; // Anzahl Zahlen #define MaxAnz 50 typedef int IntArray[MaxAnz]; // Zufallszahlen generieren void Zufall ( IntArray Zahlen , int Anz ) { srand(time(NULL)); //Generator Initialisierung for (int i = 0; i<Anz; i++) Zahlen[i] = rand(); //Pseudozufallszahl } // Zeigen des Arrays void Zeigen ( IntArray Zahlen , int Anz ) { for (int i=0; i<Anz; i++) cout << setw(8) << Zahlen[i]; cout << endl; } // Vertauschen der Adressen void Swap ( int &i , int &j ) { int k = i; i = j; j = k; } // Sortieren mit BubbleSort void BubbleSort ( IntArray Zahlen , int Anz ) { for (int i=0; i<Anz-1; i++) for (int j=0; j<Anz-i-1; j++) if (Zahlen[j] > Zahlen[j+1]) Swap(Zahlen[j], Zahlen[j+1]); } int main ( void ) { int Anz = 50; IntArray Zahlen; bool Stop; 21 22 Quellcodes zum Buch Zufall(Zahlen, Anz); // Zufallszahlen erzeugen cout << "Erzeugte Zufallszahlen:" << endl; Zeigen(Zahlen, Anz); // Zufallszahlen zeigen BubbleSort(Zahlen, Anz); // sortieren cout << "Sortiert:\n"; Zeigen(Zahlen, Anz); cin >> Stop; return 0; } Code 1-21 Anwendungsbeispiel – Operation mit reellem und komplexem Anteil /* ComplexReell.cpp Demoprogramm zeigt gemischte Multiplikation complex * reell */ #include <iostream.h> #include <complex.h> int main() { complex<float> c(1.0, -1); cout << "Koml.Zahl c = " << c << endl; // Multiplikation einer komplexen Zahl // mit dem reellen Wert pi c *= 4*atan(1); cout << "c * pi = " << c << endl; system("Pause"); } Code 1-22 Anwendungsbeispiel – Rechnen mit komplexen Zahlen /* Reihenschwingkreis.cpp Anwendung komplexer Zahlen am Beispiel des Frequenzgangs eines Reihenschwingkreises */ #include <stdio.h> #include <iostream.h> #include <math.h> #include <complex> using namespace std; int main() { double x, y, f, Omega, R, C, L; double u = 180.0/M_PI; C++ Quellcodes zum Buch Kapitel 1 FILE *puffer; puffer = fopen("C:\\Temp\\Frequenz.dat","w"); cout << "\nWiderstand [Ohm] = "; cin >> R; cout << "\nKapazitaet [Nano-Farad] = "; cin >> C; cout << "\nInduktivitaet [Mikro-Henry] = "; cin >> L; cout << endl << "\nf[Hz]\tlog(f)\tBetrag(z3)\tlog(Betrag(z3))\tPhase(z3)\n\n"; for(f=10;f<1000000000;f=f*1.2) { Omega = 2*M_PI*f; x = Omega*C; y = Omega*L; complex <float> z1(R,0),z2(R,-1/x+y), z3; z3 = z1/z2; // Ausgabe auf den Bildschirm cout << f << "\t" << log10(f) << "\t" << abs(z3) << "\t" << log10(abs(z3)) << "\t" << arg(z3)*u << endl; // Ausgabe in eine Datei fprintf(puffer,"%4.1e\t%4.1e\t%4.1e\t%4.1e\t%4.1f\n", f, log10(f), abs(z3), log10(abs(z3)), arg(z3)*u); } fclose(puffer); system("Pause"); } Code 1-23 Anwendungsbeispiel – Addition von Zeichenketten: char-Version /* Die Funktion kopiert zwei Zeichenkettenliterale in zwei Zeichenketten und fügt diese zu einer zusammen */ #include <iostream.h> main() { char s1[10]="Zeichen-"; //Zeichenketten char s2[10]="Kette"; //Deklarationen int i=0,j=0; // Bestimmung der Länge von s1 while (s1[i]!='\0') { i++; } // anhängen von s2 an s1 while (s2[j]!='\0') { s1[i]=s2[j]; i++; j++; 23 24 Quellcodes zum Buch } s1[i]='\0'; // Ausgabe cout << s1; } Code 1-24 Anwendungsbeispiel – Addition von Zeichenketten: string-Version /* Die Funktion kopiert zwei Zeichenkettenliterale in zwei Strings und fügt diese zu einem String zusammen */ #include <iostream.h> #include <string.h> // Deklarationen der String-Funktionen char s1[10], s2[10]; // Definition der Strings main() { bool Stop; strcpy (s1, "String-"); strcpy (s2, "Verkettung"); strcat (s1, s2); cout << s1; cin >> Stop; } Code 1-25 Anwendungsbeispiel – Farbcode von Widerständen /* FarbCode.cpp Die Funktion bestimmt den Farbcode eines Widerstandwertes vereinfacht ohne Toleranzangabe */ #include <iostream.h> #include <string.h> // Deklarationen der String-Funktionen main() { char Ohm[1], Code; int i=0, Max, Nullen=0; cout << "Widerstandswert [Ohm] = "; cin >> Ohm; Max=strlen(Ohm); cout << '\n' << "Widerstandsfarben = "; for (i=0; i<=Max; i++) { if (Ohm[i]=='\n') break; Code=' '; if (i<=1) {Code=Ohm[i];} else C++ Quellcodes zum Buch Kapitel 1 { if (Ohm[i]=='0') { Nullen++;} else { Nullen=0;} } if (i>1 && i==Max-1) {Code=(char)(Nullen+48);} switch (Code) { case '0': { cout << " Schwarz"; break; } case '1': { cout << " Braun"; break; } case '2': { cout << " Rot"; break; } case '3': { cout << " Orange"; break; } case '4': { cout << " Gelb"; break; } case '5': { cout << " Gruen"; break; } case '6': { cout << " Blau"; break; } case '7': { cout << " Violett"; break; } case '8': { cout << " Grau"; break; } case '9': { cout << " Weiss"; break; } default: {cout <<"";} } } system("Pause"); } Code 1-26 Anwendungsbeispiel – Einfache Nutzwertanalyse /* NutzWertAnalayse.cpp Das Programm bestimmt den Nutzen unterschiedlicher Lösungen aus Faktoren und Nutzwerten */ #include <iostream.h> #include <string.h> // Deklarationen der String-Funktionen main() { int i, j, x, Loesungen, Kriterien; // Lösungen cout << "Anzahl Loesungen = "; cin >> Loesungen; std::string Loesung [Loesungen]; cout << "Beschreiben Sie die Loesungen:\n"; for (i=0; i<Loesungen; i++) { cout << i+1 << ". = "; cin >> Loesung[i]; } cout << "\n"; // Kriterien cout << "Anzahl Kriterien = "; cin >> Kriterien; std::string Kriterium [Kriterien]; int Wichtung[Kriterien]; int Grad[Loesungen][Kriterien]; 25 26 Quellcodes zum Buch cout << "Beschreiben Sie die Kriterien:\n"; for (i=0; i<Kriterien; i++) { cout << i+1 << ". = "; cin >> Kriterium[i]; } cout << "\nGeben Sie die Gewichtungsfaktoren\n"; cout << "der Kriterien bezogen auf das\n"; cout << "Gesamtprojekt ein:\n"; for (i=0; i<Kriterien; i++) { cout << Kriterium[i] << " = "; cin >> Wichtung[i]; } cout << "\nBeurteilen Sie den Erfuellungsgrad\n"; cout << "der einzelnen Kriterien\n"; cout << "durch die Loesungen:"; for (i=0; i<Kriterien; i++) { cout << "\nErfuellungsgrad von " << Kriterium[i] durch:\n"; for (j=0; j<Loesungen; j++) { cout << Loesung[j] << " = "; cin >> Grad[i][j]; } } // Auswertung for (i=0; i<Kriterien; i++) { for (j=0; j<Loesungen; j++) { Grad[i][j] = Grad[i][j] * Wichtung[i]; } } cout << "\n\nAuswertungs-Matrix:\n"; for (i=0; i<Kriterien; i++) { for (j=0; j<Loesungen; j++) cout << Grad[i][j] << " "; cout << endl; } cout << "\nErgebnis:\n"; for (i=0; i<Loesungen; i++) { x=0; for (j=0; j<Kriterien; j++) { x = x + Grad[j][i]; } cout << endl; cout << Loesung[i] << " = " << x; } << " C++ Quellcodes zum Buch Kapitel 1 cout << endl; system("Pause"); } 27