3.9 KiB
3.9 KiB
Exercice 1:
Programme xx;
var i : entier init à 0;
A[] : tableau init à 0;
procedure swap(x,y)
var z : entier;
debut
z := x;
x := y;
y := z;
fin
debut
i := 2;
A[2] := 99;
swap(i, A[i]);
fin
Q: Quel est l'effet de l'appel swap(i, A[i]);
- Passage par valeur (
IN
) - ... / résultat (ADA)
- ... / (ALGOLW)
- ... par référence
- ... par noms
Notations:
a := b
notation affectation algoa
\leftarrow
b
notation affectation interne
Opérations d'affectation
i := 2
(i
\leftarrow
2
);
A[2] := 99
(A[2]
\leftarrow
99
)
1) Passage par valeur
- Execution de "IN" : Mettre la valeur dans les paramètres formels
x
\leftarrow
i
(x
\leftarrow
2
)y
\leftarrow
A[2]
(y
\leftarrow
99
)
- Execution du code
z := x;
(z
\leftarrow
2
)x := y;
(x
\leftarrow
99
)y := z;
(y
\leftarrow
2
)
2) Passage par valeur/résultat (IN OUT ADA)
- Calcul d'adressage
P_1
= &i
P_2
= &A[i] = &A[2]
- Exécution du "IN"
x
\leftarrow
i
(x
\leftarrow
2
)y
\leftarrow
A[2]
(y
\leftarrow
99
)
- Exécution du code
z := x
(z
\leftarrow
2
)x := y
(x
\leftarrow
99
)y := z
(y
\leftarrow
2
)
- Exécution du "OUT" : Mettre la valeur des paramètres effectifs
i := 2
(i
\leftarrow
2
)A[2] := 99
(A[2]
\leftarrow
99
)- dans les paramètres effectifs à travers le calcul d'adressage:
P_1 \leftarrow
x
(i
\leftarrow
99
)P_2 \leftarrow
y
(A[2]
\leftarrow
2
)
Conclusion : i
et A[2]
ont été échangés et permutés
3) Passage par valeur/résultat (ALGOLW)
Mêmes étapes que 2)
, mais dans l'ordre suivant : b, c, a, d
4) Passage de paramètre par référence
Notation : Pour une variable x
, on appelle :
l.value
dex
, son emplacement (adresse) l(eft)r.value
, la valeur dex
r(ight)- mémo:
x := 10
(left := right)
l.value
dex
est la même que celle dei
l.value
dey
est la même que celle deA[i]
c'est à direA[2]
- Exécution du code
z := x
(z
\leftarrow
2
)x := y
(x
\leftarrow
99
)y := z
(A[2]
\leftarrow
2
)- Conclusion:
i
etA[2]
on été permutés
5) Passage pde paramètre par nom
- Substitution des paramètres formels par les paramètres effectifs de manière textuelle sans évaluation
z := x
\rightarrow
z
\leftarrow
i
x := y
\rightarrow
i
\leftarrow
A[i]
y := z
\rightarrow
A[i]
\leftarrow
z
- Exécution du code
z := i
(z
\leftarrow
2
i := A[i]
(i
\leftarrow
A[2]
\leftarrow
99
)A[i] := z
(A[99]
\leftarrow
2
)
- Conclusion:
i
a été changéA[2]
inchangé maisA[99]
a été modifié
Exercice 2
Procedure Quelmode(x)
A[1] := 6;
elt := 2;
x := x+3;
- A[1] := 1 (A[1]
\leftarrow
1) - A[2] := 2 (A[2]
\leftarrow
2) - elt := 1 (elt
\leftarrow
1)
1) Appel par valeur
- Exécution du
IN
- x
\leftarrow
A[elt] (x\leftarrow
A[1]\leftarrow
1)
- x
- Exécution du code
- A[1] := 6 (A[1]
\leftarrow
6) - elt := 2 (elt
\leftarrow
2) - x := x+3 (x
\leftarrow
4)
- A[1] := 6 (A[1]
- Conclusion:
- A[1]
\leftarrow
6 - A[2]
\leftarrow
2 - elt
\leftarrow
2
- A[1]
2) Par valeur/résultat (IN OUT ADA)
- Calcul d'adressage
P_1
= &A[1]
- Exécution du
IN
- x <- A[1] (x <- 1)
- Exécution du code
- A[1] := 6
- elt := 2
- x := x+3 (x <- 4)
- Exécution du "OUT" : Mettre la valeur des paramètres effectifs
P_1 \leftarrow
A[1] (A[1] <- 4)
3) Par valeur/résultat (ALGOLW)
Exercice 3:
var elt : entier init à 1;
A[] : tableau d'entiers init à 0;
Procedure quelmdoe(x, y)
debut
elt := elt + 1;
A[x] := 5+elt;
y := y+A[x];
fin
Procedure Inc()
debut
elt := elt + 1;
return(elt);
fin