Année 2014–2015 Aix-Marseille Université — IUT RT 1A TD1 Bases de la Programmation II Eric Würbel si K0 et (K1 ou K2 ou K3 ou K4) alors ecrire("Date valide") resultat ← vrai sinon ecrire("Date invalide") fin si renvoyer résultat fin algorithme Première version java : sans saisie. Les versions en java sont disponibles séparément de ce document sous la forme de fichiers source. Deuxième version java : saisie simple Exercice 1 Même remarque que précédemment. Question 1 Saisie avec répétition Ecrire l’algorithme resolvant le problème suivant, puis le traduire en java. Demander un numéro de jour, de mois et d’année à l’utilisateur et déterminer s’il s’agit ou non d’une date valide. Pour rappel, le mois de février compte 28 jours, sauf si l’année est bissextile, auquel cas il en compte 29. L’année est bissextile si elle est divisible par quatre. Toutefois, les années divisibles par 100 ne sont pas bissextiles, mais les années divisibles par 400 le sont. idem. Exercice 2 Question 2 Ecrire un algorithme qui demande un nombre de départ, et qui ensuite affiche les dix nombres suivants. Par exemple, si l’utilisateur entre le nombre 17, le programme affichera les nombres de 18 à 27. Traduire cet algorithme en un programme Java. Modifiez l’algorithme pour pouvoir utiliser le programme jusqu’à ce que l’utilisateur veuille sortir le quitter. Pour cela, après chaque traitement, on demande à l’utilisateur s’il veut sortir, s’il répond par ’O’, on arrête, sinon on recommence la saisie. Complétez votre traduction java. Correction Correction Rappel de l’algorithme algorithme verif_date données : j : entier m : entier a : entier résultat : booléen B, K0, K1, K2, K3, K4 : booleen résultat ← faux j ← lire() m ← lire() a ← lire() B ← ((a K0 ← (année >= 1582) K1 ← (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou m=10 ou m=12) et (j ≥ 1 et j ≤ 31) K2 ← (m=4 ou m=6 ou m=9 ou m=11) et (j ≥ 1 et j ≤ 30) K3 ← m = 2 et B et j ≥ 1 et j ≤ 29 K4 ← m = 2 et non B et j ≥ 1 et j ≤ 28 1 Algorithme algorithme dix_nombres données : nbre : entier cpt : entier Ecrire("Saisissez un entier : ") nbre ← Lire() cpt ← nbre + 1 tant que cpt ≤ (nbre + 10) faire Ecrire(cpt) cpt ← cpt + 1 fin tant que fin algorithme Exercice 3 : post et pre-incrémentation Nous avons vu que Java possède des opérateurs spécifiques pour incrémenter ou décrémenter une variable 1 . L’usage simple de ces opérateurs permet de remplacer l’instruction suivante : a = a + 1; 1. Dans cet exercice, nous nous concentrerons sur ++, l’opérateur d’incrémentation, mais les remarques que nous ferons s’appliquent tout aussi bien à --, l’opérateur de décrémentation. 2 par a++; Mais il faut bien saisir la différence entre les deux. = est une instruction (l’affectation). ++ est un opérateur. Donc, si la première version est bien une instruction, la seconde version est une expression comprise comme une instruction. ++ est très particulier. C’est un opérateur, mais en même temps il modifie la variable sur laquelle il agit. C’est le seul opérateur à faire cela. Question 1 ++ existe en deux versions : pré-incrémentation, comme dans ++a, et post-incrémentation, comme dans a++. Quelle est la différence entre les deux ? Considérez le fragment de programme suivant : int a, b; b = 10; a = ++b * 10; Quelles sont les valeurs de a et b après exécution ? Même question pour int a, b; int a = 1, b = 20; if ((a < 5) && (b++ < 30)) System.out.println("vrai"); else System.out.println("faux"); Ce qu’il faut retenir de tout ça, c’est qu’il faut à tout prix éviter de d’utiliser les opérateurs d’incrémentation et décrémentation dans des conditions, et dans des expressions en général. Il vaut mieux les employer seuls. Correction Il faut se rappeler que les opérateurs || et && ont une propriété dite de court-circuit. Pour ce qui concerne le &&, cette propriété dit que si la première opérande est évaluée à false, la seconde opérande n’est pas évaluée puisque le && ne pourra jamais être vrai. La conséquence de cette propriété est que, dans le cas qui nous occupe, b vaudra 20 à l’issue de l’exécution du premier fragment, car la seconde opérande du && n’est pas exécutée. En revanche, b vaudra 21 à l’issue de l’exécution du second fragment. Exercice 4 : boucle for et affichage b = 10; a = b++ * 10; Question 1 : boucle for Écrire un algorithme — puis un programme utilisant la boucle for — qui demande un nombre entier, puis calcule la somme des entiers jusqu’à ce nombre. Correction Dans le premier cas, b vaut 11 et a vaut 110. Pourquoi ? La première affectation initialise b à 10. La seconde affectation se passe de la façon suivante : — évaluation de ++b : b vaut maintenant 11. — évaluation de la multiplication : comme b vaut 11 on obtient 110. Dans le second cas , b vaut 11 et a vaut 100. Pourquoi ? La première affectation initialise b à 10. La seconde affectation se passe de la façon suivante : — La multiplication est évaluée avec la valeur actuelle de b, soit 10, et le résultat est donc 100. — b++ est effectué, b vaut maintenant 11. Ce qu’il faut retenir : — La post-incrémentation (b++) renvoie la valaur de b à l’expression englobante, puis l’incrémentation est effectuée. — La pré-incrémentation (++b) effectue l’incrémentation, plus renvoie la valeur de b à l’expression englobante. Question 2 : affichage complexe Modifiez le programme précédent pour qu’il affiche la somme. Exemple de déroulement du programme : Saisissez un nombre : 6 1 + 2 + 3 + 4 + 5 + 6 = 21 Exercice 5 : boucle for et dépassement de capacité Écrire un programme qui calcule la factorielle d’un nombre entier positif ou nul (n! = n × (n − 1) × . . . × 1). Que se passe-t-il en cas de dépassement de capacité ? correction Question 2 source java disponible en dehors de ce document. ++ est un opérateur qui peut s’avérer assez farceur, voire dangereux. Quelles sont l’affichage et les valeurs des différentes variables des fragments de programmes ci-dessous après exécution ? int a = 10, b = 20; if ((a < 5) && (b++ < 30)) System.out.println("vrai"); else System.out.println("faux"); Exercice 6 : calcul de PGCD En considérant deux nombres entiers positifs stockés dans deux variables a et b, écrire un programme calculant le PGCD de a et b. Utilisez l’algorithe d’Euclides qui dit que : ( pgcb(a, b) = 3 a si b = 0 pgcd(b, amodb) sinon 4 correction Correction algorithme PGCD données : a, b, r, tmp : entier Ecrire("Entier a :") a ← Lire() Ecrire("Entier b :") b ← Lire() si a < b alors tmp ← a a←b b ← tmp fin si r ← a mod b tant que r 6= 0 faire a←b b←r r ← a mod b fin tant que Ecrire("pgcd=", b) fin algorithme Voir le programme java dans l’archive des fichiers source. Exercice 11 : table de Pythagore Écrivez un programme qui affiche la table de Pythagore : 1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5 10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21 28 35 42 49 56 63 70 8 8 16 24 32 40 48 56 64 72 80 9 10 9 10 18 20 27 30 36 40 45 50 54 60 63 70 72 80 81 90 90 100 Correction voir l’archive des fichiers source. Exercice 7 : conversion Farenheit-Centigrades Exercice 12 : nombre de bits à 1 Écrivez un programme qui convertit des degrés Farenheit en degrés centigrades : θC = Écrire un programme qui affiche le nombre de bits à 1 d’un entier (on utilisera un entier de type int). 5 (θF − 32) 9 Correction Exercice 8 : volume d’une sphère Voir l’archive des fichiers source. Écrivez un programme qui calcule le volume d’une sphère étant donné son rayon. Exercice 13 : codage d’un entier 4 V = πR3 3 Écrire un programme qui affiche le codage d’un entier quelconque. Exercice 9 : conversion kilomètres–miles Correction Écrivez un programme qui convertit les kilomètres en miles. Voir l’archive des fichiers source. 1 mile = 1.609 km Exercice 14 : racine carrée Exercice 10 : notes Un professeur note les résultats d’un test portant sur 50 questions en utilisant la table suivante : bonnes réponses note 0-10 E 11-20 D 21–30 C 31–40 B u0 = 1 41-50 A Ecrivez un programme qui donne la note, étant donné le nombre de réponses. 5 Écrivez un programme qui détermine la racine carrée d’un nombre réel positif en utilisant l’algorithme de Newton. Le principe de cet algorithme est que la suite définie par un+1 = converge vers √ a. 6 un + ua n 2 Exercice 15 : puissance entière Écrivez un programme qui calcule an avec a réel et n entier. 7