Name/Nom : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klasse/Classe: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG Informatique 1 | Informatik 1 Anweisung / Consigne : Lesen Sie die Fragen gut durch und beantworten Sie diese leserlich auf den Aufgabenblättern. Alle Hilfsmittel (Dokumentation, Kurs, etc.) sind erlaubt, jedoch keine elektronischen Hilfen. Tipp : Verlieren Sie bei einzelnen Fragen nicht zu viel Zeit. Beantworten Sie zuerst die Fragen, die Ihnen keine Probleme stellen, und kommen Sie später auf die für Sie schwierigeren Fragen zurück. Die Skala ist unverbindlich Lisez attentivement la donnée et répondez de manière lisible aux questions. Toute documentation est utilisable mais aucun moyen électronique ne l’est. Un conseil : ne restez pas bloqués sur une question. Répondez tout d’abord aux questions avec lesquelles vous êtes à l’aise et revenez ensuite aux questions posant problème. Le barème indiqué est indicatif. Question Points Bonus Short questions 9 0 Conditions 4 0 Random numbers 3 0 Loops analysis 6 0 Function analysis 4 0 Function synthesis 8 0 A christmas tree 5 0 Bisection method 6 0 Total: 45 0 Score This exam has 8 questions, for a total of 45 points. Rev 1.0 – svn 688 P.A. Mudry, P. Roduit Novembre | November 2013 Page 1/12 7.11.2013 Leerseite ¦ Cette page a été laissée vierge intentionnellement Page 2/12 T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG Question 1 – Short questions (9 points) [3 Pt] Diese Frage ist in verschiedene selbständige Aufgaben unterteilt. Die Anzahl Punkte von jeder Aufgabe wird am Rand vermerkt. Cette question est séparée en plusieurs exercices indépendants. Le nombre de point pour chaque exercice est indiqué dans la marge. (a) Gegeben sind die folgenden Deklarationen : | Soient les déclarations suivantes : double foo String bar int foobar long baz = = 2.6; = "2.1f"; = (int) foo; 0xcafe; Geben Sie an, ob die nachstehenden Ausdrücke korrekt sind oder nicht. Wenn sie korrekt sind, bestimmen Sie den Typ und den Wert. Zur Erinnerung, der Wert von ’a’ ist 97. Indiquez si les expressions suivantes sont correctes. Si elles sont correctes, donnez le type et la valeur des expressions suivantes. Pour rappel, la valeur de ’a’ est 97. (a) 3 + bar (a) (b) bar - 2 (b) (c) foo + foobar (c) (d) baz >> 12 << 1 (d) (e) foo > (int) foo ? 1.1f : 0.1f (e) (f) (char)(’a’ + 19 / 12 + 2 * (int) 45 % 4) (f) [4 Pt] (g) Wahr oder falsch ? | Vrai ou faux ? float Zahlen werden nicht binär im Speicher abgespeichert. Les float ne sont pas stockés en binaire dans la mémoire. True False Die Etappe der Kompilation entspricht der Ausführung eines Programms welchen in Maschinensprache geschrieben ist. L’étape de compilation correspond à l’exécution d’un programme écrit en language machine. True False Die Kommentare können sich nur im innern eines Blocks befinden. Les commentaires ne peuvent se trouver qu’à l’intérieur d’un bloc. True False Der Code a = b bedeutet, dass die Variablen a und b der gleichen Variable entsprechen. Le code a = b signifie que les variables a et b correspondent à la même variable. True False Eine explizite Umwandlung bedeutet, dass man explizit der Typ des Resultats der Umwandlung angibt. Une conversion explicite signifie que l’on indique explicitement le type du résultat de la conversion. True False Die Operatoren &&, || und ! können nur für binäre Werte benutzt werden. Les opérateurs &&, || et ! ne peuvent être utilisés que sur des valeurs binaires. True False Page 3/12 7.11.2013 [2 Pt] Wenn die Funktion main leer ist, bringt die Ausführung des Programms nicht. Si la fonction main est vide, l’exécution du programme ne produit rien. True False Ein if benötigt einen Ausdruck vom Typ Ganzzahlen (int, short, . . . ) damit dieser funktioniert. Un if requiert une expression de type entier (int, short, . . . ) pour fonctionner True False (h) Gesucht ist der Wert der folgende Ausdrücke : Donnez la valeur des expressions suivantes : 1) 0xface & 0b0 | 0xbabe - 4 1) 2) ((char)(’z’ - 1) + "e") + ’s’ 2) Question 2 – Conditions (4 points) Schreiben Sie den Code welcher folgenden Bedingungen entspricht : Écrivez le code correspondant aux conditions suivantes : (a) Die Variable bar ist nicht null oder die Variable foo ist null. La variable bar n’est pas nulle ou la variable foo est nulle. (b) Eine Variable vom Typ char namens y entspricht einem Kleinbuchstaben (’a’ bis ’z’). La variable de type char nommée y est une lettre minuscule (de ’a’ à ’z’.) (c) Die Ganzzahl foo ist kein Vielfaches von 23. L’entier foo n’est pas un multiple de 23. (d) Das erste Bit (ganz links, das stärkste Bit) der Variable a vom Typ byte a ist nicht gleich 1. Le premier bit (tout à gauche, le plus fort) de la variable de type byte nommée a n’est pas égal à 1. Question 3 – Random numbers (3 points) Gegeben sei der folgende Prototyp : Soit le prototype suivant : int random(int x) Das ist die Funktion, die eine ganze Zufallszahl zwischen [1 . . . x] zurückgibt. Was ist die Wahrscheinlichkeit, dass der Inhalt des if-Blocks ausgeführt wird ? Il s’agit d’une fonction qui retourne un nombre entier aléatoire compris entre [1 . . . x]. Quelle est la probabilité que l’intérieur du if suivant soit exécuté ? Page 4/12 T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG if(random(x) == a){ ... } (a) wenn x 3 und a 1 ist si x vaut 3 et a vaut 1 (a) (b) wenn x 500 und a 1 ist si x vaut 500 et a vaut 1 (b) (c) wenn x 500 und a 0 ist si x vaut 500 et a vaut 0 (c) Question 4 – Loops analysis (6 points) Welche Resultate werden auf der Konsole angezeigt ? Que vont afficher les boucles suivantes sur la console ? 1 2 3 4 5 6 (a) (b) 1 2 3 4 5 6 7 8 9 10 11 12 (c) Page 5/12 1 2 3 4 5 6 Lösung | Solution : int a = -5; int b = 3; for(int c = a; c < a + b; c++){ System.out.print(c / 2 + "," + b); } char foo = ’a’; System.out.println(foo); Lösung | Solution : do{ if(foo == ’c’){ System.out.println(foo); break; } int bar = foo++; System.out.println(bar); }while(true); int bar = 0xcafe; while(bar != 0){ System.out.print((bar & 0xf) + "/"); bar >>= 4; } Lösung | Solution : 7.11.2013 Question 5 – Function analysis (4 points) Gegeben sind die folgenden Funktionen : Soient les fonctions suivantes : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [1 Pt] public static int foo(int a, int b) { switch (a) { case 0: a++; break; case 1: a += 2; case 2: a++; b++; break; default: b = a; } return a % b; } public static int bar(int b, int a) { while (a > b) { System.out.println(" " + a + " " + b); if (b > 5) b = foo(a, b); else a = foo(b, a); } return a; } Was ist der Wert für : Quelle est la valeur de : (a) bar(3,2) (a) [1 Pt] (b) bar(1,2) (b) [1 Pt] (c) bar(4,5) (c) [1 Pt] (d) bar(6,7) (d) Question 6 – Function synthesis (8 points) [11/2 Pt] (a) Schreiben Sie eine Funktion namens f, welche als Parameter einen double namens x erhählt und die der folgende Wert zurückgibt : f (x) = 3x 2 + si n(x) − 3. Écrivez une fonction nommée f qui prend un double nommé x en paramètre et qui retourne la valeur suivante : f (x) = 3x 2 + si n(x) − 3. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. Page 6/12 T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG [11/2 Pt] (b) Schreiben Sie eine Funktion namens isUpper die als Rückgabewert angibt ob ein Charakter, welcher als Parameter übergeben wird, einem Grossbuchstaben entspricht oder nicht. Tipp : Achten sie sorgfältig auf die ASCII-Tabelle. Écrivez une fonction isUpper qui retourne si un caractère passé en argument est une lettre majuscule ou non. Conseil : observez attentivement la table ASCII. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. [2 Pt] (c) Schreiben Sie eine Funktion namens multiples, welche auf der Konsole alle Zahlen, welche ein Vielfaches von 5 und strikt kleiner als die als Parameter übergeben Zahl sind, anzeigt. Kontrollieren sie, dass die Zahl, welche als Parameter übergeben wird, positiv ist (Wenn nicht, sollen Sie eine Fehlermeldung anzeigen). Écrivez une fonction nommée multiples qui affiche sur la console tous les nombres multiples de 5 plus petits (strictement) qu’un nombre passé en argument. Vérifiez que le nombre soit bien positif (dans le cas contraire, affichez un message d’erreur) ! ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. [3 Pt] (d) Schreiben Sie eine Funktion namens GCD, welche den grössten gemeinsamen Teiler von zwei Zahlen zurückgibt. Die Idee um den grössten gemeinsamen Teiler zu finden ist, dass man von der kleineren der beiden Zahlen anfängt und alle Zahlen absteigend bis 1 testet um die erste Zahl zu finden, welche ein Teiler der beiden als Parameter übergebenen Zahl ist. Diese gefundene Zahl soll anschliessend als Resultat zurückgegeben werden. Achten sie darauf ob ihre Zahlen null sind und das die Zahlen immer positiv sind. Écrivez une fonction nommée GCD qui permettent de retourner le plus grand diviseur commun de deux nombres entiers passés en paramètres. L’idée pour trouver ce plus grand diviseur commun est de partir du plus petit des deux paramètres et de tester tous les nombres en descendant jusqu’à 1 pour trouver le premier nombre qui est un diviseur des deux paramètres et retourner ce nombre. Faites attention aux zéros et considérez que les nombres passés en argument sont toujours positifs ! ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. Page 7/12 7.11.2013 Question 7 – A christmas tree (5 points) BBemerkung : Diese Aufgabe besitzt zwei unabhängige Teilaufgaben (Sie können die zweite Aufgabe lösen, ohne die erste Aufgabe gemacht zu haben). Ein Kunde, welcher das Weihnachtsfest verehrt, bittet euch ein Java Programm zu schreiben, welches erlaubt einen Weihnachtsbaum zu zeichnen. Da Sie noch nicht sehr lange programmieren, schlagen Sie ihrem Kunden vor, den Baum nach folgendem Model in der Konsole zu zeichnen * *** ***** ******* Listing 1: A 4-level tree * *** ***** ******* ********* Listing 2: A 5-level tree BRemarque : Cet exercice comporte deux parties indépendantes (vous pouvez résoudre la seconde sans avoir fait la première). Un client adorant la fête de Noël vient vous demander d’écrire un code Java permettant de dessiner un arbre de Noël. Comme vous ne programmez pas depuis longtemps, vous lui proposez de dessiner un arbre dans la console sur le modèle ci-dessus. [4 Pt] (a) Um diesen Baum zu zeichnen schlagen wir Ihnen vor, eine Funktion mit folgendem Prototyp void xmas(int height) zu schreiben, deren Zweck es ist, solche Bäume zu zeichnen. Beachten sie dazu, dass die Breite des Baumes von der Höhe des Baumes nach folgender Formel abhängig ist : Br ei t e = 1 + 2 ∗ (H öhe–1). Pour dessiner cet arbre, nous vous proposons d’écrire une fonction avec le prototype void xmas(int height) dont le but est d’afficher de tels arbres. Pour ce faire, notez que la largeur de l’arbre est dépendante de sa hauteur selon la formule l ar g eur = 1 + 2 ∗ (haut eur − 1) ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. Page 8/12 T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG [1 Pt] (b) • Sie möchten zusätzlich Weihnachtskugeln in der Zeichnung einfügen. Diese sollten nach dem Zufallsprinzip, wie unten abgebildet, platziert werden. * *x* x**** ******* x******** *****x***** Listing 3: A 5-level tree Vous voulez pouvoir ajouter des boules de Noël sur le dessin. Celles-ci doivent apparaître de manière aléatoire comme illustré ci-dessus. Erklären Sie,ohne es zu implementieren, wie Sie dazu vorgehen würden Expliquez, sans l’implémenter, comment vous pourriez vous y prendre. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. BTurn page → Page 9/12 7.11.2013 Question 8 – Bisection method (6 points) Das Halbierungs-Verfahren wird verwendet, um die Nullstellen einer Funktion zu finden. Das heisst, der Wert für x wo f (x) null gibt. Gegeben ist die Funktion f (x), so funktioniert dieses Verfahren wie folgt : Ausgehend von zwei Startpunkten, a und b , wobei die Werte von f (a) und f (b) entgegengesetzte Vorzeichen besitzen (Die Punkte liegen auf beiden Seiten der Nulllinie), so berechnet das Verfahren den Mittelpunkt c , was dem Mittelwert der beiden Punkte entspricht : c = a+b 2 . Wenn das Vorzeichen von f (c) das gleiche ist wie von f (b), so wird der neue Wert des Halbierungsverfahren zwischen den Punkten a und c berechnet. Ist dies nicht der Fall, wird der neue Mittelpunkt zwischen b und c berechnet. Dies wird solange ausgeführt, bis der Wert von f (c) kleiner ist als die Endpräzision (in unserem Fall 0.001). Abbildung 1 erläutert grafisch, wie diese Funktion funktioniert. BGehen sie für diese Aufgabe davon aus, dass sie eine Funktion double f(double x) zur Verfügung haben, welche das berechnet was sie wollen. F IGURE 1: Bisection method (source : Wikipedia) [5 Pt] La méthode de la bissection permet de trouver le zéro d’une fonction, c’est-à-dire la valeur de x pour laquelle f (x) vaut 0. Étant donné la fonction f (x), cette méthode fonctionne ainsi : partant de deux points de départ, a et b , dont les valeurs f (a) et f (b) sont de signe opposé (points situés de chaque côté de la ligne du zéro), la méthode va calculer le point médian c qui est la moyenne des deux points : c = a+b 2 . Si le signe de f (c) est le même que celui de f (b), on va calculer la valeur de la nouvelle bissectrice entre les points a et c . Si ce n’est pas le cas, le nouveau point moyen est calculé entre c et b . On continue ensuite jusqu’à ce que la valeur de f (c) soit inférieur à précision d’arrêt (0.001 dans notre cas). La figure 1 explique graphiquement comment fonctionne cette méthode BPour cet exercice, partez du principe que vous avez à disposition une fonction double f(double x) à disposition qui calcule ce que vous voulez. (a) Schreiben Sie eine Funktion namens bissection, welche zwei double (a und b ) als Parameter besitzt und einen double zurückgibt, welcher der Nullstelle der Funktion entspricht. Die Funktion soll zu Beginn kontrollieren, dass die Werte für f (a) und f (b) nicht null sind und das sie entgegengesetzte Vorzeichen besitzen. Ist dies nicht der Fall soll die Funktion „Error: f(a) and f(b) must have different signs.“ in der Konsole anzeigen und -1 zurückgeben. Wenn die Parameter a und b korrekt sind, so soll die Funktion die Nullstelle der Funktion mit Hilfe des Halbierungsverfahrens berechnen und der Wert der x-Achse für die Nullstelle mit einer Präzision von 0.001 zurückgeben Écrivez une fonction nommée bissection qui prend deux double en paramètre, a et b , et qui retourne un double qui correspond au zéro de la fonction. La fonction doit commencer par contrôler que les valeurs de f (a) et f (b) soient différentes de zéro et de signe opposé. Si ce n’est pas le cas, la fonction doit afficher "Error : f(a) and f(b) must have different signs." et retourner -1. Si les paramètres a et b sont corrects, la fonction doit calculer le zéro de la fonction en utilisant la méthode de la bissectrice et retourner la valeur de l’axe des x qui correspond à un zéro avec une erreur de 0.001. Page 10/12 T EST INTERMÉDIAIRE – Z WISCHENPRÜFUNG ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. [1 Pt] (b) Schreiben Sie nun ein Programm welches die Nullstelle der Funktion f für die Startwerte 0 und 1 berechnet. Ihr Programm soll der Wert der x-Achse welche der Nullstelle entspricht (c ) sowie auch der endgültige Näherungsfehler ( f (c)) anzeigen. Das angezeigte Resultat sollte dem unten aufgeführten Text entsprechen. Beachten Sie dass es nicht notwendig ist, die Aufgabe 8.a beendet zu haben um diese Aufgabe zu lösen. Sie können annehmen dass die Funktion bissection korrekt funktioniert. Écrivez maintenant un programme qui va calculer la valeur du zéro de la fonction f pour des valeurs de départ de 0 et 1. Le programme devra afficher la valeur de l’axe des x qui correspond au zéro (c ) ainsi que l’erreur final d’approximation du zéro ( f (c)). Le résultat affiché doit correspondre au texte affiché ci-dessous. À noter qu’il n’est pas nécessaire d’avoir terminé la partie précédente pour réaliser cette partie. On peut supposer que la fonction bissection fonctionne. Position of the zero : 0.864013671875 Error for the zero : 1.3997093620154999E-5 ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. ................................................................................................. Page 11/12 7.11.2013 Fin|Ende The end Page 12/12