Post on 04-Apr-2015
1
CSI 1500Lab #8 – 4 novembre 2004
Daniel Amyot et Alan Williams
2
Objectifs• Solutions de l’examen de mi-session• Tableaux en paramètres• Récursivité (premier exemple)
3
Question 1a)Qu’est-ce qui sera affiché par le programme Java suivant? int s; int r; int i;
int [] x = {4, 8, 2, -9, 6}; s = 1; r = 0; i = x.length - 1; while (i > 0) { s = s * -1; i = i - 1; r = r + s * x[i]; } System.out.println(r);
a) -13 b) 20 c) -9 d) -21 e) 11 f) 7
r = -(-9) + 2 – 8 + 4
4
Question 1b)• Le tableau d'entiers "a" (type int) contient
initialement {1, 3, 8}. Une seule des expressions Booléennes suivantes sera évaluée à fausse (faux). Encerclez la lettre correspondant à l’expression qui sera évaluée à fausse.
a) (a[1] < 3) || ( (a[1] / 2) == 1)
b) !( (a[0] % a[2]) == (a[0] % a[1]) )
c) !(!(fausse) && (a[2] < a[1]) )
d) Math.pow(a[1],2) > a[2]
e) Math.abs(a[0] - a[1] + 2) <= 0
5
Question 1c)• Supposons que X et Y soient les données
(entiers), C et D des intermédiaires, et A et B les résultats. Quelles seront les valeurs de A et B si initialement X = 8 et Y = 3?
C 0D X
Y ≤ D ?
faux vrai
D D - YC C + 1
A CB D
Cet algorithme calcule A = X/Y et B = X%Y
A = 2, B = 2
6
Question 2a)while ( x < length )
{
y = 0;
if ( y < length )
{
y = y + 1;
}
else
{
x = x + 1;
}
}
z = z + 1;
Y < Length
Y ← Y + 1X ← X + 1
X < Length
Z ← Z + 1
Y ← 0
vrai
vraifaux
faux
Très brièvement, qu’est-ce qui est incorrect avec cette traduction d’algorithme?
La boucle a été traduite par un if..else!
7
Question 2b)
X > 0 ?
A < X?
A ← A + 1 A ← A + 5
R ← A
X ← X - 1
vraifaux
vraifaux
Ce diagramme est incorrect parce que…
Note: le problème est dans la structure, rien à voir avec le contenu!
Structure invalide! On doir boucler à un test.
8
Question 3) Traduction en JavaDONNÉES: X (tableau d’entiers)
N (nombre d’éléments dans le tableau X)
V (une valeur limite)
INTERMÉDIAIRES:Index (index du tableau X allant de 0 à N-
1)Somme (somme des valeurs du tableau)
RÉSULTAT: Excède (Booléen: Vrai si Somme > V et faux sinon)
EN-TÊTE: Excède SommeExcèdeV(X,N,V)
9
Question 3 (suite)import java.io.* ;
class exam2004Q3{ public static void main( String[] args ) throws IOException { // DÉCLARATIONS DES VARIABLES ET DICTIONNAIRE DE DONNÉES int [] x; // DONNÉE: tableau d'entiers int n; // DONNÉE: nombre d'éléments dans le tableau x int v; // DONNÉE: une valeur limite int index; // INTERMÉDIAIRE: index pour x int somme; // INTERMÉDIAIRE: somme des valeurs du tableau x boolean excède; // RÉSULTAT: vrai si somme > v // LECTURE DES VALEURS DONNÉES System.out.print( "Entrez un tableau de nombres: " ); x = CSI1500.readIntLigne( ); n = x.length;
System.out.print( "Entrez une valeur limite: " ); v = CSI1500.readInt( );
10
Question 3 (suite)
vraifaux
Index < N ET SOMME V?
Somme Somme + X[Index]Index Index + 1
Index 0 Somme 0
Excède (Somme > V)
MODULE:
11
Question 3 (suite) // MODULE DE L’ALGORITHME index = 0; somme = 0;
while( index < n && somme <= v ) { somme = somme + x[index]; index = index + 1; } excède = (somme > v); // AFFICHAGE DES RÉSULTATS ET MODIFIÉES À L'ÉCRAN System.out.println( "Le résultat est: " + excède ); } }
12
Question 3 (suite)• Erreurs fréquentes:
– Commentaires manquants
– au lieu de <= – N, V, X au lieu de n, v, x (déjà utilisés dans le code)– Points-virgules manquants– Utilisation de if..else pour traduire Excède (Somme >
V)– Boolean ou booléen au lieu de boolean – int x []; au lieu de int [] x;– x.length() au lieu de x.length – double v; au lieu de int v;
• Oui, Java supporte les accents sur les variables (excède). Aucun point enlevé ici.
13
Question 4: Algorithme• Le système d’impôt canadien a des tranches
d’imposition (tax brackets en anglais) telles que si le revenu d’une personne est plus grand ou égal à la limite inférieure de la tranche, et qu’il est plus petit que la limite supérieure de la tranche, alors la personne est contenue dans cette tranche d’imposition.
• Supposez que l’on vous donne la limite supérieure et la limite inférieure d’une tranche d’imposition simple pour une année particulière, de même qu’un tableau « Revenu » de longueur « NbPersonnes » où chaque valeur du tableau représente le revenu annuel d’une personne quelconque. Écrivez un algorithme pour déterminer le pourcentage ([0%-100%]) de personnes qui ont un revenu à l’intérieur de cette tranche.
14
Question 4) (suite)DONNÉES: LimInf (Limite inférieure de la tranche)
LimSup (Limite supérieure de la tranche)Revenu (Tableau de revenus) NbPersonnes (Taille du tableau Revenu)
INTERMÉDIAIRES:Index (Index pour tableau Revenu)Compte (Nombre de personnes dans la tranche)
RÉSULTAT: Pourcentage (Pourcentage de personnes dans la tranche d’imposition, [0-100])
EN-TÊTE: Pourcentage PourcentageDansTranche(LimInf, LimSup, Revenu,
NbPersonnes)
15
Question 4) (suite)
Index 0Compte 0
Index < NbPersonnes ?
(Revenu[Index] LimInf) ET (Revenu[Index] < LimSup) ?
NbPersonnes NbPersonnes + 1
vrai
vraifaux
faux
MODULE:
Index Index + 1
Pourcentage Compte / NbPersonnes x 100
16
Question 4 (suite)
• Erreurs fréquentes: au lieu de < pour la limite supérieure– NbPersonnes oublié dans l’en-tête– Noms de variables obscures…– = au lieu de pour l’assignation oublié pour la branche fausse – Branches vraie et fausse mal jointes– x 100 pour le pourcentage– Flèches entre les boîtes de l’algorithme
17
Fin de la correction du midterm
• String vs Char[]• Tableaux en paramètres• Récursivité (premier exemple)
18
String vs. char[]• Ressemblances:
– Tout deux sont des collections de caractères– Tout deux indexés de 0 jusqu’à length - 1– Tout deux sont des variables de référence
• Pas de comparaison ==
19
String vs. char[]• Differences:
– Acces a un seul caractere: str.charAt(i) vs array[i]– Strings ne peut pas être modifié internement apres
qu’ils soient crees• Pad d’equivalent de array[i] = ‘x’
– Les variables String peuvent être assigné a des strings constant ou l’utilisation de new is optionelleString str;str = "abc";str = new String("def" );
– La plupart des operations sur les Strings sont faites avec des methodes.array.length // pas de ( ); non appel d’une
methodestr.length( ) //() obligatoire; appel d’une
methode
20
Conversions: String char[] char[] tableau;
char[] tableau2;
...
// Creer un String venant d’un tableau
String str = new String( tableau );
// Create array from String
tableau2 = str.toCharArray( );
21
Methodes usuelles de String • Informez-vous des méthodes comprises dans la classe String:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html
•charAt(…), indexOf(…), length(…)• toCharArray(…)•equals(…), compareTo(…) •concat(…), subString(…), • toLowerCase(…), toUpperCase(…)•…
22
Exercices sur les String et char[]• Onglet Interactions dans Dr Java
– Utiliser des constantes String de votre choix et essayer d’invoquer les fonctions usuelles de la classe StringExemples:
“012345678”.length()“12345”.charAt(4) puis “12345”.indexOf(‘4’) “minuscule”.toUpperCase()“A”.compareTo(“a”) (et l’inverse?)“joyeuses”.concat(“ ”).concat(“fetes”)
String s1=“ab”; String s2=“ab”; s1.equals(s2) (et s1==s2 ?)String s3=“merci”; char[] tabS3= s3.toCharArray() ; tabS3[0]…
• Ecrire une methode compteMinuscule qui compte le nombre de caracteres minuscules dans un string. Tester le avec l’onglet Interaction.
• (Plus avancé)Ecrire une methode qui prend un String en parametre et qui change les caracteres minuscules en majuscules et reciproquement.
23
Recursion – Probleme pratique #1• Ecrire un algorithme recursif qui compte le
nombre de digits (chiffres) dans un entier non negatif N
24
Recursion – Probleme pratique #1- Solution
DONNEES: N
INTERMEDIAIRES: ResteDeDigits
RESULTAT: Compteur (le nombre de digits dans N)
ENTETE: Compteur NombreDeDigits(N)
25
Recursion – Probleme pratique #1 - solution – cont.
MODULE:
ResteDeDigits = N / 10
ResteDeDigits = 0 ?
vraie
Compteur 1
fausse
Compteur NombreDeDigits(ResteDeDigits)Compteur Compteur + 1
26
Trace for N = 254
Ligne N ResteDeDigits
Compteur
Valeurs initiales 254 ? ?
(1) ResteDeDigits = N / 10 25
(2) ResteDeDigits = 0 ? fausse
(3) Appel Compteur NombreDeDigits(ResteDeDigits)
(4) Compteur Compteur + 1
27
Trace, page 2
Ligne N ResteDeDigits
Compteur
Valeurs initiales 25 ? ?
(1) ResteDeDigits = N / 10 2
(2) ResteDeDigits = 0 ? fausse
(3) Appel Compteur NombreDeDigits(ResteDeDigits)
(4) Compteur Compteur + 1
Compteur NombreDeDigits(ResteDeDigits)
Compteur NombreDeDigits(N)25
28
Trace , page 3
Ligne N ResteDeDigits Compteur
Valeurs initiales 2 ? ?
(1) ResteDeDigits = N / 10 0
(2) ResteDeDigits = 0 ? vraie
(5) Compteur 1 1
Compteur NombreDeDigits(ResteDeDigits)
Compteur NombreDeDigits(N)21
29
Trace , page 2
Ligne N ResteDeDigits
Compteur
Valeurs initiales 25 ? ?
(1) ResteDeDigits = N / 10 2
(2) ResteDeDigits = 0 ? fausse
(3) Appel Compteur NombreDeDigits(ResteDeDigits)
1
(4) Compteur Compteur + 1 2
Compteur NombreDeDigits(ResteDeDigits)
Compteur NombreDeDigits(N)252
30
Trace, page 1
Ligne N ResteDeDigits
Compteur
Valeurs initiales 254 ? ?
(1) ResteDeDigits = N / 10 25
(2) ResteDeDigits = 0 ? fausse
(3) Appel Compteur NombreDeDigits(ResteDeDigits)
2
(4) Compteur Compteur + 1 3
31
Implementer cet algorithm en Java
32
Regardons comment le code roule• Dans votre méthode recursive:• Mettez System.out.println() aux endroits suivants
(affiche la valeur actuelle of n):– Immediatement apres la variable locale des declarations
1: Entrant la methode avec n = 254– Juste avant l’appel de la methode recursive:
2: Appel Recursif venant de n = 254– Juste apres l’appel de la methode recursive:
3: Revenant d’une recursion avec n = 254– Juste avant la commande return
4: Returning from method with n = 254, Compteur = 3– Dans le cas de base
5: Cas de base avec n = 2