Correction du TD n°1
L'algorithme était:
001 action main(args)
002 Données args : tableau de Chaine
003 Locales k, i, j : entier
004 k := -4
005 i := 0
006 tantque k < 0 faire
007 pour j de 1 à -k pas 2 faire
008 i := i + k * j
009 fait
010 k := k + 1
011 fait
012 ecrire(i)
013 fin action
trace de l'exécution de cet algorithme est donnée ci-dessous.
La première colonne indique le numéro de la ligne dans l'algorithme. Les trois autres indiquent les valeurs des variables k, i et j après exécution de cette ligne.
La ligne en grisée est la ligne où le contenu de la variable i est écrit à l'écran
- | Ligne | k | i | j |
1 | 5 | -4 | 0 | - |
2 | 6 | -4 |
0 | - |
3 | 7 | -4 | 0 | 1 |
4 | 8 | -4 | -4 | 1 |
5 | 9 | -4 | -4 | 1 |
6 | 7 | -4 | -4 | 3 |
7 | 8 | -4 | -16 | 3 |
8 | 9 | -4 | -16 | 3 |
9 | 7 | -4 | -16 | 5 |
10 | 10 | -3 | -16 | 5 |
11 | 11 | -3 | -16 | 5 |
12 | 6 | -3 | -16 | 5 |
13 | 7 | -3 | -16 | 1 |
14 | 8 | -3 | -19 | 1 |
15 | 9 | -3 | -19 | 1 |
16 | 7 | -3 | -19 | 3 |
17 | 8 | -3 | -28 | 3 |
18 | 9 | -3 | -28 | 3 |
19 | 7 | -3 | -28 | 3 |
20 | 10 | -2 | -28 | 3 |
21 | 11 | -2 | -28 | 3 |
22 | 6 | -2 | -28 | 3 |
23 | 7 | -2 | -28 | 1 |
24 | 8 | -2 | -30 | 1 |
25 | 9 | -2 | -30 | 1 |
26 | 7 | -2 | -30 | 3 |
27 | 10 | -1 | -30 | 3 |
28 | 11 | -1 | -30 | 3 |
29 | 6 | -1 | -30 | 3 |
30 | 7 | -1 | -30 | 1 |
31 | 8 | -1 | -31 | 1 |
32 | 9 | -1 | -31 | 1 |
33 | 7 | -1 | -31 | 3 |
34 | 10 | 0 | -31 | 3 |
35 | 11 | 0 | -31 | 3 |
36 | 6 | 0 | -31 | 3 |
37 | 12 | 0 | -31 | 3 |
38 | 13 | 0 | -31 | 3 |
001 action parcourt(coteCarre, largeurDamier)
002 Données coteCarre, largeurDamier : entier
003 Locales x, y : entier { Coordonnees du robot }
004 i : entier { Indice de boucle pour }
005 x := lire()
006 y := lire()
007 si x >= 1 et x <= largeurDamier et
008 y >= 1 et y <= largeurDamier et
009 x+coteCarre <= largeurDamier et
010 y-coteCarre >= 1 alors
011 pour i de 1 à coteCarre faire
012 x := x+1
013 ecrire(x,",",y)
014 fait
015 pour i de 1 à coteCarre faire
016 y := y-1
017 ecrire(x,",",y)
018 fait
019 pour i de 1 à coteCarre faire
020 x := x-1
021 ecrire(x,",",y)
022 fait
023 pour i de 1 à coteCarre faire
024 y := y+1
025 ecrire(x,",",y)
026 fait
027 sinon
028 ecrire("erreur")
029 fsi
030 fin action
Le pas des structures "pour" étant égal à 1, il peut ne pas être spécifié explicitement.
Autre solution
001 action parcourt(coteCarre, largeurDamier)
002 Données coteCarre, largeurDamier : entier
003 Locales x, y : entier { Coordonnees du robot }
004 i : entier { Indice de boucle pour }
005 xinc, yinc : entier { Increments elementaires en x et en y }
006 x := lire()
007 y := lire()
008 xinc := 1
009 yinc := 0
010 si x >= 1 et x <= largeurDamier et
011 y >= 1 et y <= largeurDamier et
012 x+coteCarre <= largeurDamier et
013 y-coteCarre >= 1 alors
014 pour i de 1 à 4*coteCarre faire
015 x := x+xinc
016 y := y+yinc
017 ecrire(x,",",y)
018 si i = coteCarre alors
019 xinc := 0
020 yinc := -1
021 fsi
022 si i = coteCarre*2 alors
023 xinc := -1
024 yinc := 0
025 fsi
026 si i = coteCarre*3 alors
027 xinc := 0
028 yinc := 1
029 fsi
030 fait
031 sinon
032 ecrire("erreur")
033 fsi
034 fin action
Dans cette seconde solution, on est parti du principe que, pour parcourir un carré de 4 cellules de coté, il faut réaliser 4x4 déplacements successifs avec un incrément de déplacement en x et un incrément de déplacement en y et que, arrivé à certaines étapes du déplacement, les valeurs d'incrément en x et en y doivent changer.
Auteur: Nicolas JANEY
UFR Sciences et Techniques
Université de Besançon
16 Route de Gray, 25030 Besançon
nicolas.janey@univ-fcomte.fr