Daniel Amyot et Alan Williams CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams
Objectifs Solutions de l’examen de mi-session Tableaux en paramètres Récursivité (premier exemple)
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
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
Cet algorithme calcule A = X/Y et B = X%Y 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 0 D X Y ≤ D ? faux vrai D D - Y C C + 1 A C B D Cet algorithme calcule A = X/Y et B = X%Y A = 2, B = 2
Question 2a) X < Length Y ← 0 Y < Length Z ← Z + 1 X ← X + 1 while ( x < length ) { y = 0; if ( y < length ) y = y + 1; } else x = x + 1; z = z + 1; X < Length vrai faux Y ← 0 Y < Length faux vrai Z ← Z + 1 X ← X + 1 Y ← Y + 1 Très brièvement, qu’est-ce qui est incorrect avec cette traduction d’algorithme? La boucle a été traduite par un if..else!
Question 2b) X > 0 ? X ← X - 1 R ← A A < X? A ← A + 5 A ← A + 1 vrai faux X ← X - 1 A < X? R ← A faux vrai A ← A + 5 A ← A + 1 Ce diagramme est incorrect parce que… Structure invalide! On doir boucler à un test. Note: le problème est dans la structure, rien à voir avec le contenu!
Question 3) Traduction en Java DONNÉ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)
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( );
Somme Somme + X[Index] Index Index + 1 Question 3 (suite) MODULE: Index 0 Somme 0 Index < N ET SOMME V? vrai faux Somme Somme + X[Index] Index Index + 1 Excède (Somme > V)
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 );
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.
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.
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)
Question 4) (suite) MODULE: Index 0 Compte 0 Index < NbPersonnes ? faux vrai (Revenu[Index] LimInf) ET (Revenu[Index] < LimSup) ? vrai faux NbPersonnes NbPersonnes + 1 Pourcentage Compte / NbPersonnes x 100 Index Index + 1
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
Fin de la correction du midterm String vs Char[] Tableaux en paramètres Récursivité (premier exemple)
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 ==
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 optionelle String 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 methode str.length( ) //() obligatoire; appel d’une methode
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( );
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(…) …
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 String Exemples: “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.
Recursion – Probleme pratique #1 Ecrire un algorithme recursif qui compte le nombre de digits (chiffres) dans un entier non negatif N
Recursion – Probleme pratique #1- Solution DONNEES: N INTERMEDIAIRES: ResteDeDigits RESULTAT: Compteur (le nombre de digits dans N) ENTETE: Compteur NombreDeDigits(N)
Recursion – Probleme pratique #1 - solution – cont. MODULE: ResteDeDigits = N / 10 ResteDeDigits = 0 ? fausse vraie Compteur NombreDeDigits(ResteDeDigits) Compteur Compteur + 1 Compteur 1
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
Trace, page 2 Compteur NombreDeDigits(ResteDeDigits) Compteur NombreDeDigits(N) 25 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
Trace , page 3 Compteur NombreDeDigits(ResteDeDigits) Compteur NombreDeDigits(N) 1 2 Ligne N ResteDeDigits Compteur Valeurs initiales 2 ? (1) ResteDeDigits = N / 10 (2) ResteDeDigits = 0 ? vraie (5) Compteur 1 1
Trace , page 2 Compteur NombreDeDigits(ResteDeDigits) Compteur NombreDeDigits(N) 2 25 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
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
Implementer cet algorithm en Java
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