Variables, expressions, sélection, etc.

Transcription

Variables, expressions, sélection, etc.
c Fabrice Rossi, 1997-2002
Conditions de distribution et de copie
Cet ouvrage peut être distribué et copié uniquement selon les conditions qui suivent :
1. toute distribution commerciale de l’ouvrage est interdite sans l’accord préalable explicite de
l’auteur. Par distribution commerciale, on entend une distribution de l’ouvrage sous quelque
forme que ce soit en échange d’une contribution financière directe ou indirecte. Il est par
exemple interdit de distribuer cet ouvrage dans le cadre d’une formation payante sans autorisation préalable de l’auteur ;
2. la redistribution gratuite de copies exactes de l’ouvrage sous quelque forme que ce soit est
autorisée selon les conditions qui suivent :
(a) toute copie de l’ouvrage doit impérativement indiquer clairement le nom de l’auteur de
l’ouvrage ;
(b) toute copie de l’ouvrage doit impérativement comporter les conditions de distribution et
de copie ;
(c) toute copie de l’ouvrage doit pouvoir être distribuée et copiée selon les conditions de
distribution et de copie ;
3. la redistribution de versions modifiées de l’ouvrage (sous quelque forme que ce soit) est interdite sans l’accord préalable explicite de l’auteur. La redistribution d’une partie de l’ouvrage
est possible du moment que les conditions du point 2 sont vérifiées ;
4. l’acceptation des conditions de distribution et de copie n’est pas obligatoire. En cas de non
acceptation de ces conditions, les règles du droit d’auteur s’appliquent pleinement à l’ouvrage.
Toute reproduction ou représentation intégrale ou partielle doit être faite avec l’autorisation
de l’auteur. Seules sont autorisées, d’une part, les reproductions strictement réservées à l’usage
privé et non destinées à une utilisation collective, et d’autre part, les courtes citations justifiées
par le caractère scientifique ou d’information de l’oeuvre dans laquelle elles sont incorporées
(loi du 11 mars 1957 et Code pénal art. 425).
Exercices
Fabrice Rossi
24 septembre 2002
1
Forme générale d’un programme
Exercice 1.1 :
Indiquer si les programmes suivants sont corrects. Si ce n’est pas le cas, indiquer la ou les
erreurs.
1. dans le fichier prog.java :
1
2
3
4
5
Prog1
public class Prog1 {
public void static main(String[] args) {
System.out.println("Bonjour");
}
}
2. dans le fichier Prog2.java :
1
2
3
4
5
Prog2
public class Prog2 {
public static void main(String args) {
System.out.println("Bonjour");
}
}
3. dans le fichier Prog3.java :
1
2
3
4
5
2
Prog3
import dauphine.util.*;
public Prog3 class
public static void main(String[] args)
System.out.println("Bonjour")
}};
Identificateurs
Exercice 2.1 :
Indiquer si les propositions d’identificateurs suivantes sont syntaxiquement correctes ou non
(valides en Java) :
compteur
_compteur
1compteur
compteur 2
compteur_3
Compteur@
c_12323
Exercice 2.2 :
Indiquer si les propositions d’identificateurs suivent ou non les conventions portant sur les
noms de variables :
UneNote
Une_Note
compteur
Compteur
uneVariable
une_variable
uneNoteDeMath
uneNotedemath
3
Déclarations
Exercice 3.1 :
Dessiner la mémoire après l’exécution par le processeur abstrait des lignes suivantes (on dessinera la mémoire après chaque ligne) :
double a,b;
int i=3;
a=2.5;
b=3.7;
b=a+5;
i=i+1;
Exercice 3.2 :
Écrire un programme permettant d’obtenir la configuration de la mémoire donnée par la figure 1.
4
Affectations et calculs
Exercice 4.1 :
Indiquer dans le programme suivant quelles sont les affectations correctes et celles qui sont
impossibles (chaque ligne incorrecte est ignorée).
double x;
float y;
int a;
boolean b;
char c;
byte d;
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 3
x
double
2.5
y
float
5.3f
a
truc
machin
int
boolean
true
int
12323
Fig. 1 – Représentation de la mémoire
x
y
a
b
c
d
a
b
x
d
=
=
=
=
=
=
=
=
=
=
12;
-2.343e-10f;
2323232;
2;
’a’;
-324;
2.5;
true;
’r’;
125;
Exercice 4.2 :
Que font les instructions suivantes (on suppose que les variables x et y sont déclarées, de type
double et déjà initialisées) :
x = x + y;
y = x - y;
x = x - y;
Remarque : ne surtout jamais utiliser cette technique dans un véritable programme !
Exercice 4.3 :
On considère que les déclarations suivantes ont été effectuées :
int i=3,j=4;
double x=2,y=3;
boolean v=true;
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 4
Pour chaque expression du tableau suivant, indiquez :
1. le type du résultat ;
2. la valeur du résultat ;
3. si l’affectation de cette valeur à la variable déclarée dans la colonne “variable” du tableau
est possible.
Chaque ligne est indépendante des autres. Faites bien attention de ne pas confondre la lettre
l et le chiffre 1.
Expression
5
type
valeur
variable
possible
i/j-1
int k ;
2-3/i+1
double z ;
(float)2.5
int k ;
3f
double z ;
2+3l
int k ;
1/i/2d
int k ;
2/i/j
double z ;
2f+3l
float u ;
v&&(i-x/y>j)
int k ;
y/x+1
int k ;
Analyse d’expressions
Exercice 5.1 :
Convertir sous forme d’expressions Java les quatre formules suivantes. La valeur de l’expression
une fois calculée par le processeur doit être la plus exacte possible (à cause des arrondis, il est
parfois impossible d’obtenir le résultat exact mathématiquement) :
2+
2.5×1.5
1.2−10.3
2
4
1
−
5 1+
1
2
1+
1
2
2
1+
1
1
2
Exercice 5.2 :
On considère les expressions suivantes :
b && x==y+2d || !(3*x%2>t)
x/(y+d/k)/(1-j)
x%y>y
b || !b
x/y*y+x%y
b || (x/y>x+y && !b)
Quels types peut-on choisir pour les variables qui apparaissent dans les expressions afin que
celles-ci soient correctes ? Quel est alors le type de chacune des expressions ? Peut-on déterminer
la valeur de certaines expressions sans connaı̂tre les valeurs des variables ?
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 5
Exercice 5.3 :
x, y et z désignent des variables de type double. Réécrire les expressions Java suivantes sous
leur forme mathématique usuelle.
3*x - 4*y - x*x
(x + 4)/(x + 1/x)
5 - (1/x + 1/3 + y) / z - 1
3*x + x*x*y*y - 2/x/y
Exercice 5.4 :
On suppose que les déclarations suivantes ont été effectuées :
int n;
double x;
On suppose que n contient la valeur n et x la valeur x. Traduisez les expressions suivantes en
Java, de sorte que le résultat obtenu soit le plus exact possible. On tentera de simplifier les
expressions, en passant éventuellement par des variables intermédiaires.
2n + 1
1 )(1 − 1 )
(1 + n
n
−1 ≤ x ≤ 1
(n pair et n 6= 0)
3x + 12
2
+
3 (x + 1)2
1
3
15
1+ x+
x2 +
x3
n
n(n + 2)
n(n + 2)(n + 4)
6
Expressions booléennes
Exercice 6.1 :
Traduire sous forme d’expression booléenne les propositions suivantes :
1. la variable x contient une valeur numérique comprise au sens large entre 3.5 et 7 ;
2. la variable x contient une valeur négative strictement ou bien une valeur supérieure à 5 ;
3. l’une des deux propositions suivantes est vraie :
– la variable y contient une valeur divisible par 2 ;
– la variable y ne contient pas une valeur divisible par 3.
4. une et une seule des deux propositions suivantes est vraie :
– la variable x n’est pas nulle ;
– la variable z contient la même valeur que la variable x ;
5. soit le contenu de la variable a est divisible par celui de b, soit le contenu de la variable
b est divisible par celui de a.
Exercice 6.2 :
Traduire sous forme d’une phrase en français la plus simple possible chacune des expressions
suivantes (pour la rédaction des réponses, on prendra pour modèle l’exercice précédent) :
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 6
! (
! (
x%3
! (
7
x != 2 && x < 3 )
u > v || u%2 == 0 && u-v > 10 )
== 0 ^ x%4 == 0
x < 3 || x > 5 )
Méthodes de classe
Exercice 7.1 :
Pour chacun des appels suivants, indiquer la signature de l’appel :
A.f(2.5,3)
A.g(true,3f)
A.h(2l,5d)
B.f()
B.g((byte)3)
Exercice 7.2 :
On suppose donnée une méthode f dans une classe A. Quelles sont la (ou les) signature(s)
possible(s) pour f si les deux appels suivants sont acceptés par le compilateur :
A.f(2,3.5)
A.f(3l,4l)
Même question avec g dans la classe A et les appels :
A.g(3f,true)
A.g(4l,false)
Exercice 7.3 :
Indiquer le type du résultat de chacun des appels suivants :
Math.sqrt(-2)
Math.sqrt(4)
Math.sqrt(4l)
Math.sqrt(2f)
Math.max(2l,3)
Math.max(4f,3d)
Math.min(2.5,-3)
Math.abs(-2.5)
Math.abs(-2)
Math.abs((byte)-4)
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 7
8
Saisie et affichage
Exercice 8.1 :
Indiquer si les programmes suivants sont corrects. Si ce n’est pas le cas, indiquer la ou les
erreurs. Pour chaque programme correct, on suppose que l’utilisateur saisit les valeurs 3.4 et
5.2 dans cet ordre. Quel est alors l’affichage produit par le programme ?
1. dans le fichier Saisie1.java :
1
2
3
4
5
6
7
8
9
Saisie1
import dauphine.util.*;
public class Saisie1 {
public static void main(String[] args) {
Console.start();
int x=Console.readDouble();
double y=Console.readInt();
System.out.println(x/y);
}
}
2. dans le fichier Saisie2.java :
1
2
3
4
5
6
7
8
9
Saisie2
import dauphine.util.*;
public class Saisie2 {
public static void main(String[] args) {
Console.start();
int x=Console.readInt();
double y=Console.readDouble();
System.out.println(x/y);
}
}
Exercice 8.2 :
1
2
3
4
5
6
7
8
9
Indiquer l’affichage produit par le programme suivant :
Display
public class Display {
public static void main(String[] args) {
int x=3,y=5/x;
System.out.println("x+y="+x+y);
System.out.println("x+y="+(x+y));
System.out.println("x/y="+x/y);
System.out.println("x/y="+(x/y));
}
}
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 8
9
Sélection
Exercice 9.1 :
On donne le programme suivant :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Selection
import dauphine.util.*;
public class Selection {
public static void main(String[] arg) {
Console.start();
double a=Console.readDouble();
int b=Console.readInt();
if (a>b) {
b=b+1;
}
if (b<4) {
if (a<0) {
a=a-b;
} else {
int
b=b+(int
int)a;
}
System.out.println("moins que 4");
} else {
System.out.println("plus que 4");
b=b-4;
}
System.out.println("a="+a);
System.out.println("b="+b);
}
}
1. Donnez l’organigramme du programme ;
2. Pour chaque couple de valeurs suivant, indiquez l’affichage produit par le programme si
l’utilisateur saisit ces valeurs dans l’ordre :
première valeur seconde valeur
2.3
-2
2.3
3
4
3
-2
5
-2
1
Exercice 9.2 :
Ecrire un programme qui détermine le signe (affiché sour la forme -1, 0 ou 1) et la valeur
absolue d’une valeur réelle saisie au clavier.
Exercice 9.3 :
Ecrire un programme qui saisit trois nombres, puis teste si l’un des trois est égal à la somme
des deux autres.
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 9
Exercice 9.4 :
Ecrire un programme qui demande à l’utilisateur de saisir 2 réels a et b et qui affiche les réels
c et d tels que sin([a, b]) = [c, d].
Exercice 9.5 :
Ecrire un programme qui demande à l’utilisateur les 6 coefficients du système
(
ax + by = c
dx + ey = f
puis qui affiche la solution du système si elle existe.
Exercice 9.6 :
Un examen comporte trois épreuves notées n1, n2, n3, pondérées par trois coefficients c1, c2,
c3, fixés a priori. Ecrire un programme qui saisit au clavier ces trois notes, calcule la moyenne
pondérée de ces trois notes, puis affiche la mention correspondante : Ajourné (n < 10), Passable
(10 ≤ n < 12), ABien (12 ≤ n < 14), Bien (14 ≤ n < 16), TBien(n > 16).
Exercice 9.7 :
Présenter sous forme de menu (permettant le choix de la conversion souhaitée) un utilitaire de
conversion des unités anglo-saxonnes en unités françaises :
– centimètre en inch (1 inch = 2,54 cm),
– mètre en foot (1 foot =30,48 cm),
– mètre en yard (1m = 1,08 yard),
– kilomètre en mile (1 mile = 1609 m).
F. Rossi – 24 septembre 2002 (Version 2.2)
p. 10