175 lines
3.9 KiB
Markdown
175 lines
3.9 KiB
Markdown
|
### 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]);`
|
||
|
|
||
|
1. Passage par valeur (`IN`)
|
||
|
2. ... / résultat (ADA)
|
||
|
3. ... / (ALGOLW)
|
||
|
4. ... par référence
|
||
|
5. ... par noms
|
||
|
|
||
|
|
||
|
**Notations:**
|
||
|
|
||
|
* `a := b` notation affectation algo
|
||
|
* `a `$\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
|
||
|
|
||
|
1. Execution de "IN" : Mettre la valeur dans les paramètres formels
|
||
|
* `x `$\leftarrow$` i` (`x `$\leftarrow$` 2`)
|
||
|
* `y `$\leftarrow$` A[2]` (`y `$\leftarrow$` 99`)
|
||
|
2. 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)
|
||
|
|
||
|
1. Calcul d'adressage
|
||
|
* $P_1$ ` = &i`
|
||
|
* $P_2$ ` = &A[i] = &A[2]`
|
||
|
2. Exécution du "IN"
|
||
|
* `x `$\leftarrow$` i` (`x `$\leftarrow$` 2`)
|
||
|
* `y `$\leftarrow$` A[2]` (`y `$\leftarrow$` 99`)
|
||
|
3. Exécution du code
|
||
|
* `z := x` (`z `$\leftarrow$` 2`)
|
||
|
* `x := y` (`x `$\leftarrow$` 99`)
|
||
|
* `y := z` (`y `$\leftarrow$` 2`)
|
||
|
4. 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` de `x`, son emplacement (adresse) _l(eft)_
|
||
|
* `r.value`, la valeur de `x` _r(ight)_
|
||
|
* mémo: `x := 10` (_left_ := _right_)
|
||
|
|
||
|
|
||
|
1. `l.value` de `x` est la même que celle de `i`
|
||
|
* `l.value` de `y` est la même que celle de `A[i]` c'est à dire `A[2]`
|
||
|
2. Exécution du code
|
||
|
* `z := x` (`z `$\leftarrow$` 2`)
|
||
|
* `x := y` (`x `$\leftarrow$` 99`)
|
||
|
* `y := z` (`A[2] `$\leftarrow$` 2`)
|
||
|
* **Conclusion:** `i` et `A[2]` on été permutés
|
||
|
|
||
|
|
||
|
##### 5) Passage pde paramètre par nom
|
||
|
|
||
|
1. 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`
|
||
|
2. 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`)
|
||
|
3. **Conclusion:**
|
||
|
* `i` a été changé
|
||
|
* `A[2]` inchangé mais
|
||
|
* `A[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
|
||
|
|
||
|
1. Exécution du `IN`
|
||
|
* x $\leftarrow$ A[elt] (x $\leftarrow$ A[1] $\leftarrow$ 1)
|
||
|
2. Exécution du code
|
||
|
* A[1] := 6 (A[1] $\leftarrow$ 6)
|
||
|
* elt := 2 (elt $\leftarrow$ 2)
|
||
|
* x := x+3 (x $\leftarrow$ 4)
|
||
|
3. **Conclusion:**
|
||
|
* A[1] $\leftarrow$ 6
|
||
|
* A[2] $\leftarrow$ 2
|
||
|
* elt $\leftarrow$ 2
|
||
|
|
||
|
##### 2) Par valeur/résultat (IN OUT ADA)
|
||
|
|
||
|
1. Calcul d'adressage
|
||
|
* $P_1$ ` = &A[1]`
|
||
|
2. Exécution du `IN`
|
||
|
* x <- A[1] (x <- 1)
|
||
|
3. Exécution du code
|
||
|
* A[1] := 6
|
||
|
* elt := 2
|
||
|
* x := x+3 (x <- 4)
|
||
|
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
|
||
|
|