Eric Würbel Exercice 1 Exercice 2 Exercice 3 - Aix

publicité
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
Téléchargement