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