Vous êtes sur la page 1sur 166

Computer Science

and Programming

for Engineer

Fakulty for mechanical Engineering and

Prof. Dr.-Ing. Hans-Werner Dorschner

WS 2010/11

September 2009

Fakultät für Maschinenbau u. Mechatronik

Prof. Dr.-Ing. Hans-Werner Dorschner

Hochschule Karlsruhe Technik und Wirtschaft

Contents

Seite II/166

Contents

Contents

2

1 Lecture Outline

5

2 Sprachsyntax von C/C++

7

2.1 C++ - Character Set

8

2.2 Variables

9

2.2.1 Expressions

10

2.2.2 Operators

10

2.3 Characters

12

2.4 Data Structures

13

 

2.5 Arrays

14

2.5.1 Array Definition

14

2.5.2 Array Initializing

15

2.5.3 Mehrdimensionale Arrays

17

2.5.4 Initializing of multidimensional Arrays

17

2.5.5 Arrays als Funktionsparameter

21

2.6 Mathematische Funktionen

23

 

2.7 Zeiger

30

2.8 Call-by-reference

32

2.9 Adressierung von Arrays

35

2.10 Referenz als Konstante

43

2.11 Speicherplatzbelegung (new, delete)

45

2.12 Numerische Integration

48

2.13 Numerische Ableitung

51

2.14 Numerische Nullstellensuche

54

2.14.1 Nullstellensuche durch lineare Interpolation

54

2.14.2 Nullstellenbestimmung nach dem Tangentenverfahren

58

2.15 Numerischen Lösung linearer Gleichungssysteme

63

2.16 Klassen

68

2.16.1 NimmSpiel als Klasse

68

2.16.2 Klasse Vektoren

71

2.17 Konstante Elementfunktionen

73

2.18 Externe Methodendefinition

75

2.19 Klassenkonstruktor

75

2.20 Überladen des Klassenkonstruktors

77

2.21 Initialisierungslisten

78

2.22 Klassendestruktor

80

2.23 Klassendeklaration und Methodendefinition

81

2.24 Vererbung

91

2.25 Klassen als Datenelemente einer Klasse

93

2.26 Strings

97

2.26.1 C-Strings

97

2.26.2 strcpy-Funktion

99

2.26.3 string-Klasse

100

2.27

I/O-Stream-Klassen

103

2.27.1 Formatierte Ausgabe mit cout

103

2.27.2 Nationale Sonderzeichen

104

2.27.3 Umwandlung von Zahlen und Strings

105

2.27.4 I/O-Verkehr mit Dateien

107

Contents

Seite III/166

3

Computeralgebra mit MATLAB

112

 

3.1 Benutzeroberfläche von MATLAB

113

3.2 Elementare MATLAB-Operationen

116

 

3.2.1 Variablendefinitionen

116

3.2.2 Matrixoperationen

117

3.2.3 Matrixarithmetik

120

3.2.4 Vektorarithmetik

124

3.2.5 Polynome

131

3.2.6 Mathematische Funktionen

134

3.2.7 Graphikfunktionen

136

 

3.3 Symbolic Toolbox

140

3.4 MATLAB-Programmierung

144

 

3.4.1 Funktionen und Prozeduren

144

3.4.2 MATLAB-Funktion feval

146

3.4.3 Differentialgleichungen

147

3.4.4 Graphik-Animation

149

 

3.5

Simulink-Toolboxen

151

 

3.5.1 Lösung von Differentialgleichungen

153

3.5.2 Simulation dynamischer, linearer, zeitinvarianter Systeme

157

 

3.6

Anhang MATLAB Funktionen

160

 

3.6.1 Steuerfunktionen für MATLAB:

160

3.6.2 Mathematische Funktionen

162

Literaturverzeichnis

A

Contents

C++ - Character Set

Seite 4/166

Copyright

This script was written by Prof. Dr.-Ing. Hans-Werner Dorschner, HS Karlsruhe – University of Applied Sciences. It is only for internal use for the semester student of MSST at VGU in HCMC. It is expressly forbidden to document on paper or electronically to third parties or use infor- mation for training purposes or other commercial or noncommercial purposes. Violators will be prosecuted with all legal means necessary.

Prof. Dr.-Ing. H.-W. Dorschner

Lecture Outline

C++ - Character Set

Seite 5/166

1 Lecture Outline

The course is not a computer science course in the original sense. Rather it is an active guide to programming and to logic and mathematics and algorith- mic issues. You cannot learn programming if you onlylook at the syntax. One has to learn by doing. So a lot of exercises are necessary to become an expert in C++ programming and in understanding to structure a problem in order to implement it into an algorithm.

First and foremost I would like to make two basic statements, which one should be aware of:

Those who see the computer more than a tool, underestimates himself ! The man knows
Those who see the computer more than a tool,
underestimates himself !
The man knows what he is doing,
the computer does what he knows.

Lecture Outline

C++ - Character Set

Seite 6/166

Sprachsyntax von C/C++

C++ - Character Set

Seite 7/166

2 Sprachsyntax von C/C++

Sprachsyntax von C/C++

C++ - Character Set

Seite 8/166

2.1 C++ - Character Set

Der C-Zeichensatz umfasst die folgenden Zeichen:

Numbers:

 

0

1 2

3

4

5 6

7

8

9

Alphanumericals:

 

A

B

C

D

E F G

H

I J

K L M N

O P

Q R

S T U V

W

X Y Z

 

a

b

c

d

e

f g

h

i

j

k l m n

o p

q r

s t

u v

w

x y z

 

Special Symbols:

 
 

+

plus

 

^

circumflex

-

hyphen

 

or minus

~

tilde

*

asterisk

 

underscore

   

_

 

%

percent

(

left parenthesis

/

slash

)

right parenthesis

\

backslash

[

left bracket

"

double quote

 

]

right bracket

'

apostrophe

{

left brace

#

number sign

}

right brace

!

exclamation pt.

 

=

equal

Leerzeichen,

<

less than

 

Tabulator,

>

greater than

 

:

colon

Seitenwechselzeichen (whitespaces)

;

semicolon

 

,

comma

.

period

?

question mark

|

vertical bar

&

ampersand

Sprachsyntax von C/C++

Variables

Seite 9/166

2.2

Variables

A = 1000;

x=x+1;

A hast he value of 1000

x new = x old + 1

x=x+y

is no mathematical equation but an assignment.

It

means: new value of x is calculated by adding

y

to the old value of x.

Sprachsyntax von C/C++

Variables

Seite 10/166

2.2.1 Expressions

Pi=3.1415;

result = (10+Pi)*5.8;

2.2.2 Operators

2.2.2.1 Arithmetic Operators

// result has the value 76,221.

Operator

Operandentyp (Eingabe)

Ergebnistyp

Beispiel

+

integer, float

integer, float

21 = 10 + 11

-

integer, float

integer, float

8

= 10 – 2

*

integer, float

integer, float

1.21 = 1.1 * 1.1

/

integer, float

integer, float

3

= 38 / 12

%

integer

integer

2

= 38 % 12 (Modulo)

++,--

integer, float

integer

i ++ increase i by 1

+=

integer, float

integer, float

add to

-=

integer, float

integer, float

subtract to

*=

integer, float

integer, float

multiply by

/=

integer, float

integer, float

divide by

Sprachsyntax von C/C++

Variables

Seite 11/166

2.2.2.2 Comparison Operators

Operator

   

Beschreibung

==

 

equal

!=

 

unequal

>

 

biger

<

 

smaler

>=

 

biger or equal

<=

 

smaler or equal

int

a= 3;

int

b= 2;

bool

x = a != b;

// x ist // x ist

true

x = a <

b;

false

2.2.2.3 Logical Bit Operators

Operator

Beschreibung

&

UND

|

ODER

^

Exklusives ODER

~

NICHT

a = 5;

b = 12; c = a &
b = 12;
c = a
&

b;

// Bit Pattern 0000…………….0101

// Bit Pattern 0000…………….1100

// Bit Pattern 0000…………….0100

Sprachsyntax von C/C++

Characters

Seite 12/166

2.3

Characters

Characters are represented by the so called ASCII-Code.

ASCII stands for American Standard Code for Information Interchange. This Code asigns to each character - including all special characers - a value between 0 and 127.

To build an ASCII-character table we execute the following program:

#include <iostream>

using namespace std; void main()

{

for(int cNummber=32;cNummber<128;cNummber++)

{

char character=cNummber; cout<<cNummber<<":"<<character<<" ";

if(cNummber%8==7)cout<<endl;

}; system ("PAUSE"); };

C++ does not distinguish between charackters and numbers - its ASCII-Code.

You can write:

char ch='A'; int i= ch; int j='C'-'A'; bool b='C'>'A'; int k='z'-'a';

// or ch = 65 // now i has the value of 65 // 67-65==2 // gives true //==25,'z' ist he 26. Character of the alphabet

Mostly we find

 

'A'<'B'<'C'<

<'X'<'Y'<'Z'

and

 

'a'<'b'<'c'<

<'x'<'y'<'z'

and

 

'0'<'1'<'2'<

<'7'<'8'<'9'

.

Normally we get

'A' - 'a' = -32.

Sprachsyntax von C/C++

Data Structures

Seite 13/166

Exercise: 3.20-1

Write the following functions:

bool isdigit(char ch)// ch is a number bool isalpha(char ch)// ch is an alphanumeric character bool islower(char ch)// ch is a small letter bool isupper(char ch)// ch is a capital letter char tolower(char ch)// converts capital to small letters

2.4 Data Structures

We can put data together and build a new data type:

#include <iostream>

#include <string> using namespace std; struct Time

{

int hour;

int minute;

};

void main()

{

Time startWorking

;

// new typ of variables used like int or // float Time endWorking;

startWorking.hour=8;

startWorking.minute

 

=30;

endWorking.hour endWorking.minute int workingMinutes

=18;

=15;

=60*(endWorking.hours-\

startWorking.hours)\ +endWorking.minute-startWorking.minute; cout<<workingMinutesn<<" Minutes"<<endl; system ("PAUSE"); };

Similar types:

struct motor

{ char motorTyp; int revolution, supply_voltage;

Sprachsyntax von C/C++

Arrays

Seite 14/166

float normnmomentum; };

struct newDataTyp

{ int x1, x2; float y1,y2,y3;

bool status1, status2; };

Exercise: 3.21-1

Define a data structure for a name list consisting of the first name, second name, birth day, married (yes/no). Use the data structure in a main program and define the variables. Then make an output of the structure elements to the screen. Use string-variables for the names.

#include <iostream> #include <string> using namespace std;

#include <string> …. string myName="xyz";

2.5

Arrays

An Array is a data structure with equal type elements. An array is a list if values which are addressed by numbers. The single values are addressed by consecutive numbers. The first value of the array in C++ is always numbered by 0.

2.5.1 Array Definition

int days[12];

float measurementValues[1000];

char titel[8];

You can define the values of the array while defining the array:

char titel[5]={'B','e','g','i','n'};

int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};

To access a single element:

measurementValues[10] =12.98; measurementValues[11]=13.02;

cout<<days[1]; // output: 28

Sprachsyntax von C/C++

Arrays

Seite 15/166

Note: -> days[i]:

i

-------------------------------------------------------------

5

¦0

¦

1

¦

2

¦

3

¦

4

¦

¦

6

¦

6

¦

8

¦

9

¦

10

¦

11 ¦

days¦31 ¦28 ¦ 31 ¦ 30 ¦ 31 ¦ 30 ¦ 31 ¦ 31 ¦
days¦31 ¦28 ¦ 31 ¦ 30 ¦ 31 ¦
30
¦
31
¦
31
¦
30
¦
31
¦
30
¦
The dimension of an array has to be constant!

31 ¦

That works:

const int Years=5; double monthlyStatement[Years*12];

That doesn’t:

int years cin>>years; double monthlyStatement[years*12];

2.5.2 Array Initializing

int A[100]={0};

Exercise: 3.22-1

The last numerical of a number z can be detected by z%10. With the algorithm for prime numbers we should detect within an interval the number of prime numbers which end with 0, 1, 2 …. 9. The respective number should be stored in an array int prims[10].

Modify the main program so that you can change the interval (first and last number).

Does the occurrence frequency change with increasing numbers?

Exercise: 3.22-2

Calculate the powers in a main module:

x 3 for x=1 to x=10.000,

and store the number of powers that end with 0, 1, 2 etc. in an array:

int anzahl[10] .

Sprachsyntax von C/C++

Arrays

Seite 16/166

Exercise: 3.22-3

The following program should calculate the angel between two arbitrary vectors defined by the user of the program. To do so, you need the subroutine scalarProduct and norm which calculates the length of a vector. Complete the functions below accordingly.

#include <iostream> #include <math.h> #include <cstdlib> using namespace std;

float

 

scalarProduct(float a[3],float b[3]);

float

norm( float a[3]);

norm(float a[3]);

void main()

{ float a[3],b[3]; //Initializing of the vectors a and b int i; cout<<"Input Vector a: "<<endl;

for (i=0;i<3;i++)

//Inpu vector a

{ cout<<"a("<<i<<"): "; cin>>a[i]; }

cout<<"Input of Vector b: "<<endl;

for (i=0;i<3;i++)

//Input vector b

{ cout<<"b("<<i<<"): "; cin>>b[i]; }

float angel=acos(scalarProduct(a,b)/norm(a)/norm(b))\ *180/3.14; //Calculation of the angel between a and b cout<<"The angel between a and b has the value: "<<angel<<endl; system ("PAUSE");

}

Sprachsyntax von C/C++

Arrays

Seite 17/166

2.5.3 Multidimensional Arrays

Arrays can be defined multidimensional:

Arrays Arrays can be defined multidimensional: chessboard [8][8]; That is equal to chesboard [64]; At the

chessboard[8][8];

That is equal to

chesboard [64];

At the beginning the king is at the position

chesboard [0][3];

2.5.4 Initializing of multidimensional Arrays

To initialize multidimensional arrays we proceed like with an one-dimensional array:

int theMatrix [5][3] = { {0},{0},{0},{0},{0} };

or simpler:

int theMatrix [5][3] ={0};

To assign special values to each element we write:

theMatrix [5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };

one has to assign a value to the elements with the least indices while the higher indices remain constant. We look at an example:

the higher indices remain constant. We look at an example: int theMatrix[5][3]; The matrix should have

int theMatrix[5][3];

The matrix should have a zero in the first 3 elements, the next 3 elements should be assigned a value 1 and so on:

Zur Initialisierung des Array schreibt man

Diese Anweisung lässt sich übersichtlicher darstellen, wenn man die einzelnen Initialisierun-

Sprachsyntax von C/C++

Arrays

Seite 18/166

gen mit geschweiften Klammern gruppiert:

int dieMatrix [5][3] =

{ {1,2,3}, {4,5,6},
{
{1,2,3},
{4,5,6},

{7,8,9},

{10,11,12}, {13,14,15} };
{10,11,12},
{13,14,15} };

Die inneren geschweiften Klammern ignoriert der Compiler - sie dienen lediglich dem Pro- grammierer zur übersichtlichen Gruppierung der Zahlen.

Die Werte sind durch Kommata zu trennen, unabhängig von eventuell vorhandenen Klam- mern. Die gesamte Initialisierungsliste ist in geschweifte Klammern einzuschließen und muss mit einem Semikolon enden.

Will man nur einzelne Matrixelemente initialisieren, so ergibt sich z.B.

int dieMatrix [5][3] = { {1},{2},{3},{4},{5} };

eine Matrix mit den Elementen

{ {1,0,0},{2,0,0},{3,0,0},{4,0,0},{5,0,0} };
{
{1,0,0},{2,0,0},{3,0,0},{4,0,0},{5,0,0} };

Setzt man die Werte alle auf Null, so wird die mehrdimensionale Matrix mit Nullen vorbe- setzt:

Ein Beispiel soll die Nutzung von 2-dimensionalen Arrays veranschaulichen:

Sprachsyntax von C/C++

Arrays

Seite 19/166

#include <iostream>

#include <cstdlib> using namespace std; void main()

{

int dieMatrix [5][2] = { {0,0}, {1,2}, {2,4}, {3,6}, {4,8}}; for (int i = 0; i<5; i++) for (int j=0; j<2; j++)

{

cout << " dieMatrix [" << i << "][" << j << "]: "; cout << dieMatrix [i][j]<< endl; }; system ("PAUSE"); };

Das Programm liefert dann die Ausgabe:

dieMatrix [0][0]: 0 dieMatrix [0][1]: 0 dieMatrix [1][0]: 1 dieMatrix [1][1]: 2 dieMatrix [2][0]: 2 dieMatrix [2][1]: 4 dieMatrix [3][0]: 3 dieMatrix [3][1]: 6 dieMatrix [4][0]: 4 dieMatrix [4][1]: 8

Übung: 3.22-4

Definieren Sie mittel zweier verschachtelter Schleifen eine 10x10 Einheitsmatrix.

Übung: 3.22-5

Programmieren Sie den Algorithmus zur allgemeinen Multiplikation zweier Matrizen, und probieren sie ihn in einem Beispielprogramm, das zwei 2x2 Matrizen einliest, aus.

Sprachsyntax von C/C++

Arrays

Seite 20/166

Sprachsyntax von C/C++

Arrays

Seite 21/166

2.5.5 Arrays als Funktionsparameter

Arrays können Funktionen als Parameter übergeben werden. Dazu muss der Funktionn aber die Größe des Arrays bekannt gemacht werden. Dies gibt Ntürlich auch für mehrdimensionale Arrays. Hierzu ein Beispiel:

#include <iostream> #include<string>

using namespace std; void tabellenAusgabe( float

{

for(int i=0;i<size_tabelle;i++) cout<<tabelle[i]<<endl; }; int main( )

tabelle[], int size_tabelle)

{

 

float vektor[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

tabellenAusgabe(vektor,10);

system ("PAUSE"); return 0;

}

Bei

Typdefinition gehört:

mehrdimensionalen Feldern

muss man einen Parameter fest mitangeben, da er zur

#include <iostream> #include<string> using namespace std;

void tabellenAusgabe( float tabelle[], int size_tabelle)

{

for(int i=0;i<size_tabelle;i++) cout<<tabelle[i]<<endl; };

void tabellenAusgabe(

{

}; void tabellenAusgabe( { float tabelle[][5], int size_tabelle) for ( int

float tabelle[][5], int size_tabelle)

for(int i=0;i<size_tabelle;i++) {for (int j=0; j<5;j++) cout<<tabelle[i][j]<<endl; cout<<endl;

};}; int main( )

{

float vektor_1[4]={1, 1/2. , 1/3. ,1/4.}; float vektor[2][5]={{1, 2, 3, 4, 5},{ 6, 7, 8, 9, 10}};

tabellenAusgabe(vektor_1,4);

tabellenAusgabe(vektor,2);

system ("PAUSE"); return 0;

}

Sprachsyntax von C/C++

Arrays

Seite 22/166

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 23/166

2.6 Mathematische Funktionen

Mit Vektoren wir im Allgemeinen gerechnet. Die vier Grundrechenarten sind dabei schon öfter aufgetaucht und als Standardoperatoren +, -, * und / hinterlegt. Komplexere mathemati-

sche Operationen wie sin(x),

C++-Version unter <cmath> verfügbar.

e etc. sind durch die Headerdatei <math.h> bzw. in der

x ,
x
,

x

Um die Länge eines Vektor zu berechnen, kann man nun unter Nutzung der schreiben:

<math.h>

#include<cmath>

laenge = sqrt(x*x+y*y).

Übung: 3.23-1

1. Schauen Sie in der Visual Studio Hilf unter “cmath” oder " Floating-Point Support“ nach.

2. Machen Sie sich anhand einiger Standardfunktionen die Funktionsweise der Biblio- thekselemente klar.

Übung: 3.23-2

3. Berechnen Sie aus einem 3-dimensionalen Vektor, den Sie als float-Array initialisie- ren mit den Werten (10,15,20) den Betrag und den Winkel zur x-y-Ebene in °.

z
z
L φ
L
φ

Vektor (10,15,20)

y x
y
x

Die wichtigsten Funktionen, die in der math.h

bzw cmath implementiert sind, finden sie in

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 24/166

der untenstehenden Tabelle 3-12 bzw. 3-13.

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 25/166

#include <math.h>

namespace std { using ::abs; using ::acos; using ::acosf; using ::acosl; using ::asin; using ::asinf; using ::asinl; using ::atan; using ::atan2; using ::atan2f; using ::atan2l; using ::atanf; using ::atanl; using ::ceil; using ::ceilf; using ::ceill; using ::cos; using ::cosf; using ::cosh; using ::coshf; using ::coshl; using ::cosl; using ::exp; using ::expf; using ::expl; using ::fabs; using ::fabsf; using ::fabsl; using ::floor; using ::floorf; using ::floorl; using ::fmod; using ::fmodf; using ::fmodl; using ::frexp; using ::frexpf; using ::frexpl; using ::ldexp; using ::ldexpf; using ::ldexpl; using ::log; using ::log10; using ::log10f; using ::log10l; using ::logf; using ::logl; using ::modf; using ::modff; using ::modfl; using ::pow; using ::powf; using ::powl; using ::sin; using ::sinf; using ::sinh; using ::sinhf; using ::sinhl; using ::sinl; using ::sqrt; using ::sqrtf; using ::sqrtl; using ::tan; using ::tanf; using ::tanh; using ::tanhf;

Durch das Einbinden des cmath-Headers werden die Namen der mathematischen Funktionen im Standard Namespace definiert und dadurch zugänglich. Die Funktionen selber sind in der Standard C++-Library implementiert.

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 26/166

using ::tanhl;

using ::tanl; }#endif Viel Run-time Bibliotheken benötigen sog. Floating Point Support entweder von einem Math- Coprozessor oder in Form von speziellen Bibliotheken, die der Compiler zur Verfügung stellt(s.cmath). Die folgende Tabelle stellt die entsprechenden Funktionen und ihr Äquivalent in der .NET Framework Umgebung (s. Kapitel Fehler! Verweisquelle konnte nicht gefun- den werden.) zusammen.

Tabelle 3-12 : cmath-Header

Routine

Use

.NET Framework equivalent

abs

Return absolute value of int

System::Math::Abs

acos, acosf

Calculate arccosine

System::Math::Acos

asin, asinf

Calculate arcsine

System::Math::Asin

atan, atanf, atan2, atan2f

Calculate arctangent

System::Math::Atan, Sys-

tem::Math::Atan2

atof, _atof_l, _wtof,

Convert character string to

System::Convert::ToSingle, Sys-

_wtof_l

double-precision

floating -
floating
-

tem::Convert::ToDouble

point
point

value

Bessel functions

Calculate Bessel functions _j0, _j1, _jn, _y0, _y1, _yn

Not applicable. To call the standard C function, use PInvoke. For more information, see Platform Invoke Examples.

_cabs

Find absolute value of complex number

Not applicable.

ceil, ceilf

Find integer ceiling

System::Math::Ceiling

_chgsign, _chgsignl

Reverse sign of double-

Not applicable.

precision

floating - point
floating
-
point

or

long double-precision

floating - point
floating
-
point

argument

_clear87, _clearfp

Get and clear status word

floating - point
floating
-
point

Not applicable.

_control87, _controlfp,

Get old

floating - point
floating
-
point

Not applicable.

control87_2,

control word and set new

_controlfp_s

control-word value

_copysign, _copysignl

Return one value with sign of another

Not applicable.

cos, cosf, cosh, coshf

Calculate cosine

System::Math::Cos, Sys- tem::Math::Cosh

difftime

Compute difference between two specified time values

System::DateTime::Subtract

div

Divide one integer by another, returning quotient and remainder

Not applicable.

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 27/166

_ecvt, _ecvt_s

Convert double to charac- ter string of specified length

System::Convert::ToString

exp, expf

Calculate exponential

System::Math::Exp

function

fabs, fabsf

Find absolute value

System::Math::Abs

_fcvt, _fcvt_s

Convert double to string with specified number of digits following decimal

System::Convert::ToString

point
point

_finite

Determine whether given

System::Double::IsInfinity

double-precision

floating -
floating
-
point
point

value is finite

floor, floorf

Find largest integer less than or equal to argument

System::Math::Floor

fmod, fmodf

Find

floating - point
floating
-
point

remain-

System::Math::IEEERemainder

der

_fpclass

Return status word contain-

System::Double::IsInfinity, Sys-

ing information on

floating -
floating
-

tem::Double::IsNegativeInfinity, System::Double::IsPositiveInfinity, System::Double::IsNan

point
point

class

_fpieee_flt

Invoke user-defined trap

Not applicable.

handler for IEEE

floating -
floating
-
point
point

exceptions

_fpreset

Reinitialize

floating - point
floating
-
point
 

math package

frexp

Calculate exponential value

Not applicable.

_gcvt, _gcvt_s

Convert

floating - point
floating
-
point

System::Convert::ToString

value to character string

_hypot, hypotf

Calculate hypotenuse of right triangle

Not applicable.

_isnan

Check given double-

System::Double::IsNan

precision

floating - point
floating
-
point

value for not a number (NaN)

labs

Return absolute value of long

System::Math::Abs

ldexp

Calculate product of argument and 2 to speci- fied power

System::Math::Pow

ldiv

Divide one long integer by another, returning quotient and remainder

Not applicable.

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 28/166

log, logf, log10, log10f

Calculate natural or base- 10 logarithm.

System::Math::Log, Sys-

tem::Math::Log10

_logb

Extract exponential value of

Not applicable.

double-precision

floating -
floating
-
point
point

argument

_lrotl, _lrotr

Shift unsigned long int left (_lrotl) or right (_lrotr)

Not applicable.

_matherr

Handle math errors

 

Not applicable.

max

Return larger of two values

System::Math::Max

min

Return smaller of two values

System::Math::Min

modf, modff

Split argument into integer and fractional parts

Not applicable.

_nextafter

Return next representable neighbor

Not applicable.

pow, powf

Calculate value raised to a power

System::Math::Pow

printf, _printf_l, wprintf, _wprintf_l, printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

Write data to stdout according to specified format

System::Console::Write, Sys- tem::Console::WriteLine

rand, rand_s

Get pseudorandom number

System::Random Class

_rotl, _rotr

Shift unsigned int left (_rotl) or right (_rotr)

Not applicable.

_scalb

Scale argument by power of 2

Not applicable.

scanf, wscanf, scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Read data from stdin according to specified format and write data to specified location

System::Console::Read, Sys- tem::Console::ReadLine

_set_controlfp

set new control-word value

Not applicable.

sin, sinf, sinh, sinhf

Calculate sine or hyperbolic sine

System::Math::Sin, Sys- tem::Math::Sinh

sqrt

Find square root

 

System::Math::Sqrt

srand

Initialize pseudorandom series

System::Random Class

_status87, _statusfp,

Get

floating - point
floating
-
point

status

Not applicable.

_statusfp2

word

strtod, _strtod_l, wcstod, _wcstod_l

Convert character string to double-precision value

System::Convert::ToDouble

Sprachsyntax von C/C++

Mathematische Funktionen

Seite 29/166

tan, tanf, tanh, tanhf

Calculate tangent or hyperbolic tangent

System::Math::Tan, Sys- tem::Math::Tanh

Tabelle 3-13 : Mathematische Funktionen (Floating-Point Support) der C++ Standard Library.

Sprachsyntax von C/C++

Zeiger

Seite 30/166

2.7

Zeiger

Der Speicher des Computers ist in Bytes aufgeteilt. Jedes dieser Bytes hat eine eindeutige Adresse, durch die es angesprochen werden kann. Die Adresse ist eigentlich nichts anderes, als eine ganze Zahl, wird vom Compiler aber ein wenig anders behandelt. Belegt eine Variable nur ein Byte, dann ist die Adresse dieser Variablen die Adresse dieses Bytes. Belegt eine Variable mehr als ein Byte, dann ist die Adresse dieser Variablen die Adresse des ersten Bytes, das von dieser Variablen belegt wird.

An die Adresse einer Variablen kommt man, indem man vor die Variable den

Adreßoperator &

schreibt. Eine Adresse kann man dann in eine andere Variable speichern. Diese andere Vari- able ist dann ein Zeiger.

Hat man z.B. eine Variable vom Typ int, so kann man deren Adresse in einer Variablen vom Typ "Zeiger auf int" speichern. Sie zeigt auf einen int. Zeiger heißt auf Englisch pointer, und um Zeigervariablen von normalen zu unterscheiden, wird oft ein kleines p vorne angehängt.

Ein Zeiger wird deklariert, indem vor dem Bezeichner ein Sternchen

(*pointer = &adresse)

steht.

In Bild 3-15 ist dieser Zusammenhang graphischn dargestellt.

Der Zeiger *px enthält die Adresse der Variable x (hier im Beispiel 0xFF1A, z.B über die Zuweisung *px=&x). Über diese Adresse kann man auf den Inhalt der Speicherzelle, die den Namen x trägt zugrei- fen. Man sagt auch, dass der Zeiger *px auf x zeigt. Um auf den Inhalt zuzugreifen, auf den ein Zeiger zeigt, schreibt man vor den Zeiger auch ein Sternchen.

Variable Speicherzellenin- Adresse halt x 100 0xFF1A *px 0xFF1A 0xFF1C
Variable
Speicherzellenin-
Adresse
halt
x
100
0xFF1A
*px
0xFF1A
0xFF1C

Bild 3-15: Zeiger und Zelleninhalt

Man kann auch Zeiger auf Zeiger auf Zeiger

bringt nur Fehler, weil das sehr schnell sehr kompliziert wird.

erzeugen, aber das ist meistens unsinnig und

Sprachsyntax von C/C++

Zeiger

Seite 31/166

Zeiger sind immer dann notwendig, wenn der Platzbedarf der zu verarbeitenden Daten zur Compilezeit nicht feststeht (s. weiter unten “new“) oder man aus Funktionen heraus auf Vari- able anderer Funktionen und Blöcke zugreifen möchte.

Mit Zeigern lassen sich auch sehr schön Beziehungen zwischen Objekten beschreiben. So könnten z.B. Personen, die einen Stammbaum darstellen, so organisiert sein, dass jede Person noch je einen Zeiger auf Vater und Mutter hat. Solche Datenstrukturen heißen dynamische Datenstrukturen, weil sie erst zur Laufzeit erzeugt werden.

Im Folgenden sind einige Beispiele zur Verwendung von Zeigern dargestellt.

#include <iostream>

using namespace std; void main()

{

 

int a=5; cout<<a<<endl; int *pa=&a;

// int a ist 5 // Ausgabe: 5 // int Zeiger pa ist Adresse von a

*pa=6;

// Inhalt von pa ist 6

cout<<a<<endl;

// Ausgabe: 6

a=7;

// a ist 7

cout<<*pa<<endl; int b=8; int *pb=pa;

// Ausgabe: 7 // int b ist 8 // int Zeiger pb ist pa, pb zeigt jetzt

cout<<*pb<<endl;

// auch auf a // Ausgabe: 7

int **ppa=&pa; // int Zeiger Zeiger ppa = Adresse von pa; cout<<**ppa<<endl; // Ausgabe: 7

ppa=&pb;

// Inhalt von ppa ist Adresse von pb;

cout<<**ppa<<endl; // Ausgabe: 7

pb=&b;

// pb ist Adresse von b

cout<<**ppa<<endl; // Ausgabe: 8 system ("PAUSE")

};

Sprachsyntax von C/C++

Call-by-reference

Seite 32/166

2.8

Call-by-reference

Zeiger werden insbesondere dann gebraucht, wenn man über die Definitionsgrenzen und Gültigkeitsgrenzen von Variablen hinweg auf diese sozusagen „von außen“ zugreifen will. Als Beispiel dient der sogenannte Dreieckstausch. Die Werte zweier Variablen sollen miteinander vertauscht werden:

#include <iostream>

#include <cstdlib> using namespace std; void main()

{

int a=1;

int b=2;

{

int tmp=a;

// tmp=1

a=b;

// a=2

b=tmp;

// b=1

}; cout<<"a: "<<a<<endl; cout<<"b: "<<b<<endl; system("PAUSE");

};

Dieses Verfahren, zwei Variablen unter Zuhilfenahme einer dritten zu vertauschen nennt man Dreieckstausch.

Zu beachten ist, dass die dritte Variable nur temporär gebraucht wurde. Deshalb wird für sie eigens ein Block aufgemacht. Nach dem Schließen des Blocks ist sie wieder verschwunden.

Um einen solchen Dreieckstausch mehrfach in einem Programm zu verwenden, sollte man sie in eine Funktion auslagern:

#include <iostream> #include <cstdlib> using namespace std;

void swap(

int a,int b)

{

int tmp=a;

a=b;

b=tmp;

};

void main()

{

Sprachsyntax von C/C++

Call-by-reference

Seite 33/166

int a=1;

int b=2; swap(a,b);
int b=2;
swap(a,b);

cout<<"a: "<<a<<endl; cout<<"b: "<<b<<endl; system("PAUSE");

};

Der Typ der Funktion swap ist void. Das heißt, sie gibt keinen Wert zurück.

Es fällt auf, dass die beiden Werte NICHT vertauscht wurden. Das liegt daran, dass beim Aufruf von swap nur die beiden Werte der Variablen in die entsprechenden Variablen der Funktion kopiert wurden, nicht aber irgendwelche Adressen.

Die Funktion erhält nur die Werte der Variablen (“call-by-value“).

Innerhalb der Funktion wurde mit den Werten der Variablen gearbeitet, ohne dass dies die Variablen im Hauptprogramm selbst beeinflusst. Beim Verlassen der Funktion wird die lokale Variable tmp einfach weggeworfen.

lokal. An den Argumenten

Die an eine Funktion übergebenen Argumente sind zur Funktion

vorgenommene Änderungen beeinflussen nicht die Werte in der aufrufenden Funktion. Dieses Verhalten, dass von einer Funktion nur die Werte übernommen werden, nennt man call-by- value. Das bedeutet, dass die Funktion von jedem Argument eine lokale Kopie anlegt.

Die lokalen Kopien lassen sich wie andere lokale Variable behandeln.

Kopien lassen sich wie andere lokale Variable behandeln. Call-by-value ist deshalb sehr schön, weil man si

Call-by-value ist deshalb sehr schön, weil man sich als Programmierer darauf verlassen kann, dass innerhalb einer Funktion, die man aufruft, die übergebenen Variablen nicht verändert werden können. Falls man also einmal einen Fehler entdeckt, bei dem eine Variable einen Wert hat, den sie nicht haben sollte, dann brauche man nicht in allen Funktionen, die man verwendet nachzuschauen, ob irgend etwas fehlerhaft ist. Nur im Hauptprogramm kann der Fehler liegen. Das verkürzt die Fehlersuche ungemein.

Um die beiden Variablen zu vertauschen, ohne bloß Werte zu übergeben, muss man Zeiger auf die Elemente verwenden.

Man übergibt statt der Werte die Adressen der beiden Variablen (call-by-reference) und vertauscht die Inhalte, auf die die beiden Adressen hinzeigen.

#include <iostream> #include <cstdlib> using namespace std;

void swap(int

<cstdlib> using namespace std; void swap( int *pa, int *pb) //int Zeiger pa auf eine int

*pa,int

using namespace std; void swap( int *pa, int *pb) //int Zeiger pa auf eine int Variable

*pb)

//int Zeiger pa auf eine int Variable a //int Zeiger pb auf eine int Variable b

{

int tmp=*pa;

// int temp ist Inhalt von a

Sprachsyntax von C/C++

Call-by-reference

Seite 34/166

*pa=*pb;

// Inhalt von a ist Inhalt von b

*pb=tmp;

// Inhalt von b ist temp

// Inhalte von a und b sind getauscht

};

void main()

{

int a=1;

int b=2;

b sind getauscht }; void main() { int a= 1 ; int b= 2 ; swap(&a,&b);
b sind getauscht }; void main() { int a= 1 ; int b= 2 ; swap(&a,&b);

swap(&a,&b); // Adressen von a und b werden übergeben

cout<<"a: "<<a<<endl; cout<<"b: "<<b<<endl; system("PAUSE"); };

Man kann im Hauptprogramm an den Adressoperatoren leicht erkennen, dass die Funktion beabsichtigt, die Werte der Variablen zu verändern.

Einige Besonderheiten :

int* v[10]

int * v[10] int (*z) [10] oder einfacher nur z int * z, i // Vektor

int (*z) [10]

oder einfacher nur z int* z, i

// Vektor der Länge 10 bestehend aus Zeigern

// Zeiger auf den

Vektor z
Vektor z

der Länge 10

/* gleichbedeutend mit int* z, int i *- und &-Operatoren hinter einer Typdefinition gel- ten nur für das erste Element Um Missverständnissen vorzubeugen, sollte man Deklarationen von Zeigern und Referenzen niemals zusammenfassen */

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 35/166

2.9 Adressierung von Arrays

Wie oben erwähnt zeigt der Pointer int *meinArray[n] auf ein Array mit n int-Werten.

In C++ ist ein Array-Name ein konstanter Zeiger auf das erste Element des Arrays.

In der Deklaration

int meinArray[50];

ist meinArray demzufolge ein Zeiger auf das Element &meinArray[0] - also die Adresse des ersten Array-Elements von meinArray.

Es ist zulässig, Array-Namen als konstante Zeiger - und konstante Zeiger als Array- Namen - zu verwenden.

Demzufolge kann man mit

Der Compiler führt die korrekten Berechnungen aus, wenn man Zeiger addiert, inkrementiert oder dekrementiert. Die Adresse für den Ausdruck meinArray + 4 liegt nämlich nicht einfach 4 Byte, sondern 4 Objekte hinter der Adresse von meinArray.

Hat jedes Objekt eine Länge von 4 Byte, bedeutet meinArray + 4 eine Adressverschie- bung von 16 Byte.

meinArray + 4

auf die Daten in meinArray[4] zugreifen.

Die Adressierung von Arrays über Zeiger wird auch bei Funktionsaufrufen genutzt (s. Kapi- tel 2.5.5). Man kann als anstatt das Array direkt aufzurufen auch mit Zeigern operieren:

#include <iostream> #include<string>

using namespace std; void tabellenAusgabe( float

*tabelle, int size_tabelle) int size_tabelle)

{

for(int i=0;i<size_tabelle;i++) cout<<*(tabelle+i)<<endl; };

void tabellenAusgabe( float

{

(*tabelle)[5], int size_tabelle)

for(int i=0;i<size_tabelle;i++) {for (int j=0; j<5;j++) cout<<tabelle[i][j]<<endl; cout<<endl;

}}; int main( )

{

cout<<endl; }}; int main( ) { Vietnam German University C++ Programming Prof. Dr.-Ing.

Vietnam German University

C++ Programming Prof. Dr.-Ing. Hans-Werner Dorschner WS 2010/11

}}; int main( ) { Vietnam German University C++ Programming Prof. Dr.-Ing. Hans-Werner Dorschner WS 2010/11

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 36/166

float vektor_1[4]={1, 1/2. , 1/3. ,1/4.}; float vektor[2][5]={{1, 2, 3, 4, 5},{ 6, 7, 8, 9, 10}};

tabellenAusgabe(vektor_1,2);

tabellenAusgabe(vektor,2);

system ("PAUSE"); return 0; }

Übung: 3.26-1

Schreiben sie eine Funktion, die drei Zahlen a, b und c sortiert.

void main()

{

int a=3;

int b=5;

int c=2;

sort(&a,&b,&c);

cout<<a<<endl;// Ausgabe: 2 cout<<b<<endl;// Ausgabe: 3 cout<<c<<endl;// Ausgabe: 5

};

Übung: 3.26-2

Programmieren Sie eine Funktion, die die quadratische Gleichung

löst. Bekanntlich ist die Lösung der quadratischen Gleichung gegeben durch:

2

ax ax a

1

23

x 01,02

 a a 2  4 aa 2 2 13 . 2 a 1
 a
a
2  4
aa
2
2
13
.
2 a
1

0

Die Lösungsfunktion hat das Aussehen bool quadGl(double*a, double*x).

Ist die Lösung der quadratischen Gleichung reell, so gibt die Funktion ‘true‘ zurück andernfalls ‘false‘. Die Lösungswerte stehen im reellen Fall unter der Adresse von x. Im komplexen Fall muss der Lösungsvektor zu Null gesetzt werden. Die Parameter a i sind unter der Adresse von a abgelegt und werden der Funktion über- geben.

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 37/166

Übung: 3.26-3

Welchen Ausdruck erhält man durch folgenden Code und was bedeuten die einzelnen Zeilen?

#include<iostream>

using namespace std; void main( )

{

int a[3]= {1, 2, 3}; cout<< "Adresse von a= "<<a<< endl; cout<<"a+2= "<< a+2 << '\t'<<"*(a+2)= "<<*(a+2)<<endl; cout<<"a[2]= "<<a[2]<<endl; int *p =a; cout<<"p[2]= "<<p[2]; system("PAUSE");;

};

Übung: 3.26-4

Was druckt das folgende Programm auf dem Bildschirm aus?

#include <iostream> #include <cmath> #include<cstdlib>

using namespace std; int main()

{

int a,*b,**c;

a=1000;

b=&a; c=&b; cout<<a<<endl; cout<<*b<<endl; cout<<b<<endl; cout<<c<<endl; cout<<*c<<endl; cout<<**c<<endl;

**c=2000;

cout<<a<<endl;

cout<<*b<<endl;

cout<<**c<<endl;

system("PAUSE");

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 38/166

};

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 39/166

Übung: 3.26-5

Was gibt das nachfolgende Programm aus?

Welche Reaktion vom Betriebssystem erwarten Sie außer der Ausgabe des Vektors?

#include <iostream> #include <cstdlib> #include<cmath>

using namespace std; void main ()

{ float v[10]={1,2,3,4,5,6,7,8,9,10}; float *zv=v+5; for (int i=0; i<10; i++)

*(zv+i)=pow(1.0+i,-2);

for (int i=0;i<10;i++)

{

cout<<endl; cout<<"v["<<i<<"]= "<<v[i]; if (i%3==0)cout<<endl;

};

system("PAUSE");

};

Übung: 3.26-6

Programmieren Sie eine Funktion bool rechtEck, die die Koordinaten der Rechteckpunkte im Array int koordinaten findet und daraus den Flächeninhalt und den Umfang des Rechteckes berechnet, die über den Vektor float ergebnisse an das aufrufende Programm zurückgegeben werden. Wenn der Flächeninhalt Null ist, dann gibt die Funktion ‘false‘ zurück sonst ‘true‘.

Beachten Sie, dass ein Flächeninhalt und eine Strecke nie negativ sein kann!

Der Kopf der zu schreibenden Funktion sieht folgendermaßen aus:

bool rechteck(float *koordinaten,float *ergebnisse)

Annahme :

koordinaten [4]={x1, x2, y1, y2}

y y 2 y 1 x x x C++ Programming Prof. Dr.-Ing. Hans-Werner Dorschner WS
y
y
2
y
1
x
x
x
C++ Programming
Prof. Dr.-Ing. Hans-Werner Dorschner
WS 2010/11
1
2
Vietnam German University

Sprachsyntax von C/C++

Adressierung von Arrays

Seite 40/166

Übung: 3.26-7

Was gibt dieses Programm aus?

#include<iostream> #include<cmath> using namespace std; void main()

{

float x[5]={1,2,3,4,5}; float *zeiger=x+1; cout<<zeiger<<endl; cout<<*(zeiger +2)<<endl; for(int i=0;i<3;i++) zeiger+=i;

{

x[i]=pow(*zeiger*1.0,-1);

cout<<x[i]<<endl; }; system("PAUSE"); };

Übung: 3.26-8

Was gibt das untenstehende Programm aus?

#include <iostream> #include <cstdlib> using namespace std; int myFunction(int *a,int *b);

void main()

{

int x1=3, x2=17, *p1, *p2; p1=&x1; p2=&x2; cout<<"Ergebnis = "<<myFunction(p1,p2)<<endl; p1=&x2; p2=&x1; cout<<"Ergebnis = "<<myFunction(p1,p2)<<endl; system("PAUSE");

};

int myFunction(int *a,int *b)

{

if(*a<*b)return *b%*a; else return *b**a;