Übungsblatt 1 - fbi.h

Werbung
Dr. Norbert Spangler
Übungsblatt 1
Funktionen, Vektoren, Elementare Programmiertechniken
Erstellen Sie für die vorgestellten Aufgabenstellungen jeweils eine Funktion, welche diese
erfüllt. Erstellen Sie zusätzlich jeweils ein Testprogramm, womit die Funktion getestet werden
kann uns stellen Sie einen dazugehörigen Testplan auf.
1)
nt ggt(int n,int m)
zur Bestimmung des größten gemeinsamen Teilers zweier natürlicher Zahlen n und m.
Hinweis: es ist für n>m : ggt(n,m) = ggt(n-m,m) !!!
2)
int f(double t)
zur Bestimmung des Funktionswerts f(t) der periodischen Funktion f mit Periode 2, die
im Intervall [0,2) wie folgt definiert ist:
f(t) = 1 falls 0 < t < 1, f(t)=0 für t=0,1 und f(t)= -1 falls 1 < t < 2.
Hinweis: der Operator (int) wandelt eine double-Variable in int um durch Abschneiden
der Nachkommastellen, also zb. i=(int)x;
f(t)
1
●
-3
●
-2
●
-1
●
0
1
●
2●
●
3
●
4
t
-1
3)
int fakultaet(int n) oder auch double fakultaet(int n)
zur Berechnung von n! Für unzulässige Werte wird 0 als Ergebnis gesetzt
4)
double potenz (double x,int n)
zur Berechnung von xn . Für unzulässige Werte wird 0 als Ergebnis gesetzt.
5)
void eingabe_vektor(int n, double x[]) bzw. void ausgabe_vektor(int n, double x[])
zur Ein-/Ausgabe der ersten n Komponenten des Vektors x.
6)
double maximum (int n, double y[])
zur Bestimmung des Maximums der Vektorelemente
7)
bool test_sortierung(int n, double z[])
zum Test, ob die ersten n Zahlen des Vektors z aufsteigend sortiert sind
8)
int suche_sequentiell (int n, int vec[], int element)
zur Suche von element im Vektor vec.
Falls element gefunden wird, soll der index der gefundenen Stelle zurückgegeben werden
(d.h. es gilt vec[index] = element ). Falls element nicht gefunden wird soll -1
zurückgegeben werden.
Dr. Norbert Spangler
Fall
1
2
3
4
Beschreibung
Normalfall n>m
Normalfall n<m
Normalfall n=m
Normalfall ggt=1
Funktion ggt
Eingabedaten
n
m
18
12
12
18
15
15
27
16
Fehlerfälle
nicht vorgesehen
int ggt(int n, int m)
{
while ( n!=m )
{
if ( n<m )
{//vertauschen
int h=n;
n=m;
m=h;
}
n=n-m;
}
return n;
}
erwartetes Ergebnis
6
6
15
1
Dr. Norbert Spangler
Funktion f(t)
Fall
Beschreibung
Eingabe t
1
Normalfall [0,2]-ganzzahlig
0
2
Normalfall [0,2]-ganzzahlig
1
3
Normalfall [0,2]-ganzzahlig
2
4
Normalfall (0,1)
0.5
5
Normalfall (1,2)
1.5
6
Normalfall >2: ganzzahlig gerade
6
7
Normalfall >2: ganzzahlig ungerade
7
8
Normalfall >2: (gerade,ungerade)
6.5
9
Normalfall >2: (ungerade,gerade)
7.5
10 Normalfall <0: ganzzahlig gerade
-2
11 Normalfall <0: ganzzahlig ungerade
-3
12 Normalfall <0: (gerade,ungerade)
-3.5
13 Normalfall <0: (ungerade,gerade)
-2.5
int f(double t)
{
//negative t
bool negativ=false;
if ( t<0 )
{
negativ=true;
t=-t;
}
// Periode
int h=(int)t;
double s=t-h;//Nachkommastellen
if ( h%2==1 )
s=s+1;//Intervall 1-2
double wert=0;
if ( 0<s && s < 1 )
wert=1;
else if ( 1<s && s<2 )
wert=-1;
if (negativ)
wert=-wert;
return wert;
}
Erw. Ergebnis f(t)
0
0
0
1
-1
0
0
1
-1
0
0
1
-1
Dr. Norbert Spangler
Fall
1
2
3
4
5
6
Beschreibung
n=0
n=1
Normalfall
Grenzfall große Zahl
Fehlerfall große Zahl
Unzulässig
Funktion fakultaet(n)
Eingaben
0
1
5
12
13
-1
int fakultaet(int n)
{
if ( n<0 ) // fuer negative Argumente
return 0;
else if (n == 0 )
return 1;
else
return fakultaet(n-1)*n;
}
Erw. Ergebnis n!
1
1
120
479001600
1932053504
(6227020800 wäre richtig)
0
Dr. Norbert Spangler
Fall
1
2
3
4
5
Beschreibung
x=0 n=0
n=0
n=1
Normalfall
x=1
x negativ
n negativ
Fehlerfall
Funktion potenz
Eingabedaten
x
n
0
0
1
0
1.5
1
1.5
3
1
3
-1
3
0.5
-1
0.5
-3
0
-1
erwartetes Ergebnis
double potenz(double x,int n)
{
if ( n<0 ) // auch fuer negative Argumente
{
if ( x==0.0 )
return 0.0;
else
return 1/potenz(x,-n);
}
else if (n == 0 )
return 1;
else
return x*potenz(x,n-1);
}
1
1
1.5
3.375
1
-1
2
8
0
Dr. Norbert Spangler
Funktion eingabe_vektor/ausgabe_vektor
Fall
Beschreibung
Eingabedaten
erwartetes Ergebnis
n
vec
1
Sonderfall n=0
0
/
/
2
Grenzfall n=1
1
1.5
1.5
3
Normalfall n=4
4
1.2 3.4 5.6 7.8
1.2 3.4 5.6 7.8
void eingabe_vektor(int n, double vec[])
{
cout << n<<" Zahlen eingeben "<<endl;
for ( int i=0;i<n;i++)
cin >>vec[i];
}
void ausgabe_vektor(int n, double vec[])
{
cout << endl<<"Vektorelemente "<<endl;
for ( int i=0;i<n;i++)
cout<<vec[i]<<endl;
}
Dr. Norbert Spangler
Fall
1
2
3
4
5
6
7
Beschreibung
Sonderfall n=0
Grenzfall n=1
Maximum am Anfang
Maximum in der Mitte
Maximum am Ende
2 gleiche als Maximum
Nur negative Zahlen
Funktion maximum
Eingabedaten
n
vec
0
/
1
1.5
5
54321
5
12543
5
12345
5
15354
3
-2 -4 -3
double maximum(int n, double vec[])
{
double h=vec[0];
for ( int i=1;i<n;i++)
if ( vec[i]>h )
h=vec[i];
return h;
}
erwartetes Ergebnis
Nicht definiert
1.5
5
5
5
5
-2
Dr. Norbert Spangler
Funktion test_sortierung
Fall
1
2
3
4
3
4
5
Beschreibung
Sonderfall n=0
Grenzfall n=1
Normalfall -sortiert
Normalfall-zwei gleiche
Normalfall - Fehler am Anfang
Maximum Fehler in der Mitte
Maximum Fehler am Ende
bool test_sortierung(int n, double vec[])
{
// Test ob aufsteigend sortiert
for ( int i=1;i<n;i++)
if ( vec[i] < vec[i-1] )
return false;
return true;
}
n
0
1
5
5
5
5
5
Eingabedaten
vec
/
1.5
12345
12234
21345
12435
12354
erwartetes
Ergebnis
true
true
true
true
false
false
false
Dr. Norbert Spangler
Funktion suche sequenziell
Fall
1
2
3
4
5
6
7
8
Beschreibung
Sonderfall n=0
Grenzfall n=1/gefunden
Grenzfall n=1/nicht gefunden
Normalfall-am Anfang gefunden
Normalfall – in der Mitte gefunden
Normalfall – in der Mitte gefunden/gleiche
Normalfall – am Ende gefunden
Normalfall – nicht gefunden
n
0
1
5
5
5
5
5
5
Eingabedaten
vec
/
1
1
12234
12234
12234
12234
12234
int suche_sequenziell(int n, int vec[], int element)
{
for ( int i=0;i<n;i++)
if ( vec[i] == element )
return i;
return -1;
}
erwartetes
Ergebnis
element
1
2
1
3
2
4
6
-1
0
-1
0
3
1
4
-1
Herunterladen