Année 2014–2015 Aix-Marseille Université — IUT RT 1A
TD1
Bases de la Programmation II
Eric Würbel
Exercice 1
Question 1
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.
Question 2
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
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
jlire()
mlire()
alire()
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 1et j31)
K2 (m=4 ou m=6 ou m=9 ou m=11) et (j 1et j30)
K3 m = 2 et Bet j1et j29
K4 m = 2 et non Bet j1et j28
1
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
Même remarque que précédemment.
Saisie avec répétition
idem.
Exercice 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.
Correction
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 aet baprès exécution ? Même question pour
int a,b;
b=10;
a=b++*10;
Correction
Dans le premier cas, bvaut 11 et avaut 110. Pourquoi? La première affectation initialise bà 10.
La seconde affectation se passe de la façon suivante :
évaluation de ++b :bvaut maintenant 11.
évaluation de la multiplication : comme bvaut 11 on obtient 110.
Dans le second cas , bvaut 11 et avaut 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é, bvaut maintenant 11.
Ce qu’il faut retenir :
La post-incrémentation (b++) renvoie la valaur de bà l’expression englobante, puis l’incrémen-
tation est effectuée.
La pré-incrémentation (++b) effectue l’incrémentation, plus renvoie la valeur de bà l’expression
englobante.
Question 2
++ 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");
3
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, bvaudra 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
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.
Question 2 : affichage complexe
Modifiez le programme précédent pour qu’il affiche la somme. Exemple de déroulement du pro-
gramme :
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
source java disponible en dehors de ce document.
Exercice 6 : calcul de PGCD
En considérant deux nombres entiers positifs stockés dans deux variables aet b, écrire un pro-
gramme calculant le PGCD de aet b.
Utilisez l’algorithe d’Euclides qui dit que :
pgcb(a, b) = (asi b= 0
pgcd(b, amodb)sinon
4
correction
algorithme PGCD
données :
a, b, r, tmp : entier
Ecrire("Entier a :")
aLire()
Ecrire("Entier b :")
bLire()
si a<balors
tmp a
ab
btmp
fin si
ramod b
tant que r6= 0 faire
ab
br
ramod b
fin tant que
Ecrire("pgcd=", b)
fin algorithme
Exercice 7 : conversion Farenheit-Centigrades
Écrivez un programme qui convertit des degrés Farenheit en degrés centigrades :
θC=5
9(θF32)
Exercice 8 : volume d’une sphère
Écrivez un programme qui calcule le volume d’une sphère étant donné son rayon.
V=4
3πR3
Exercice 9 : conversion kilomètres–miles
Écrivez un programme qui convertit les kilomètres en miles.
1 mile = 1.609 km
Exercice 10 : notes
Un professeur note les résultats d’un test portant sur 50 questions en utilisant la table suivante :
bonnes réponses 0-10 11-20 21–30 31–40 41-50
note E D C B A
Ecrivez un programme qui donne la note, étant donné le nombre de réponses.
5
Correction
Voir le programme java dans l’archive des fichiers source.
Exercice 11 : table de Pythagore
Écrivez un programme qui affiche la table de Pythagore :
12345678910
112345678910
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 9 18 27 36 45 54 63 72 81 90
10 10 20 30 40 50 60 70 80 90 100
Correction
voir l’archive des fichiers source.
Exercice 12 : nombre de bits à 1
Écrire un programme qui affiche le nombre de bits à 1 d’un entier (on utilisera un entier de type
int).
Correction
Voir l’archive des fichiers source.
Exercice 13 : codage d’un entier
Écrire un programme qui affiche le codage d’un entier quelconque.
Correction
Voir l’archive des fichiers source.
Exercice 14 : racine carrée
Écrivez un programme qui détermine la racine carrée d’un nombre réel positif en utilisant l’algo-
rithme de Newton. Le principe de cet algorithme est que la suite définie par
u0= 1
un+1 =un+a
un
2
converge vers a.
6
Exercice 15 : puissance entière
Écrivez un programme qui calcule anavec aréel et nentier.
7
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !