32
1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

Embed Size (px)

Citation preview

Page 1: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

1

CSI 1500Lab #8 – 4 novembre 2004

Daniel Amyot et Alan Williams

Page 2: 1 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)

Page 3: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 4: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 5: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 6: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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!

Page 7: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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.

Page 8: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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)

Page 9: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 10: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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:

Page 11: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 12: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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.

Page 13: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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.

Page 14: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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)

Page 15: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 16: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 17: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

17

Fin de la correction du midterm

• String vs Char[]• Tableaux en paramètres• Récursivité (premier exemple)

Page 18: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 19: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 20: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 21: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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(…)•…

Page 22: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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.

Page 23: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

23

Recursion – Probleme pratique #1• Ecrire un algorithme recursif qui compte le

nombre de digits (chiffres) dans un entier non negatif N

Page 24: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

24

Recursion – Probleme pratique #1- Solution

DONNEES: N

INTERMEDIAIRES: ResteDeDigits

RESULTAT: Compteur (le nombre de digits dans N)

ENTETE: Compteur NombreDeDigits(N)

Page 25: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

25

Recursion – Probleme pratique #1 - solution – cont.

MODULE:

ResteDeDigits = N / 10

ResteDeDigits = 0 ?

vraie

Compteur 1

fausse

Compteur NombreDeDigits(ResteDeDigits)Compteur Compteur + 1

Page 26: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 27: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 28: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 29: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 30: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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

Page 31: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

31

Implementer cet algorithm en Java

Page 32: 1 CSI 1500 Lab #8 – 4 novembre 2004 Daniel Amyot et Alan Williams

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