C++ für Ingenieure

Werbung
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
Zugehörige Unterlagen
Herunterladen