La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Daniel Amyot et Alan Williams

Présentations similaires


Présentation au sujet: "Daniel Amyot et Alan Williams"— Transcription de la présentation:

1 Daniel Amyot et Alan Williams
CSI 1500 Lab #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) b) c) d) e) 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 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

6 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!

7 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!

8 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)

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 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)

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) 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

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 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

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: 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 String Exemples: “ ”.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 ? fausse vraie Compteur  NombreDeDigits(ResteDeDigits) Compteur  Compteur + 1 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 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

28 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

29 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

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


Télécharger ppt "Daniel Amyot et Alan Williams"

Présentations similaires


Annonces Google