===== Raisonner pour programmer =====
Où l'on cherche à exprimer formellement un problème et à établir les liens entre les différentes formes d'énoncés.
==== Quelques problèmes classiques ====
Pour chacun des problèmes suivants :
* Préciser données et résultat
* Écrire un énoncé qui **qualifie** le résultat
* Écrire un énoncé qui **définit** le résultat
* Écrire un **programme impératif** en langage C.
=== (1) ===
== Description ==
Le plus petit nombre (//x//) d'un tableau //t// de //n// nombres.
== données et résultat ==
* données : un tableau de nombres //t// de taille //n//
* résultat : l'élément du tableau //t// de plus faible valeur
== énoncé qualifiant le résultat ==
* \exists j \in \left[\left[0, n-1\right]\right] | t\left[j\right] = x ((\left[\left[0, n-1\right]\right] est la notation choisie pour indiquer les entiers de 0 à n-1 pour éviter confusion avec un intervalle continu fermé, et peut aussi être écrit \left[0.. n-1\right] ))\\ la valeur x est la valeur d'un élément du tableau
* \forall i \in \left[\left[0, n-1\right]\right] | t\left[i\right] \geq x \\ et la plus petite
== énoncé définissant le résultat ==
| x(a) = | a //s'il s'agit d'un tableau à un seul élément// |
| x(a::t) = | x(t) si x(t) < a \\ a sinon |
(( où ''a::t'' est notation empruntée de Caml--je crois--signifiant un élément ''a'' suivi d'un tableau ''t'', qui peut être un seul élément. ))
== énoncé exécutable en C ==
int
min (int *t, int n){
int x=t[0], i;
for (i=1;it[i]) x = t[i];
}
return x;
}
=== (2) ===
== Description ==
Le quotient //q// de la division euclidienne de deux nombres entiers //a// et //b//
== données et résultat ==
* données : deux entiers //a// et //b//, //b// différent de 0 (ou > 0)
* résultat : un entier //q// tel que q * b ≤ a et (q+1)*a > b.
== énoncé qualifiant le résultat ==
* a, q\in \mathbb{N}, b\in \mathbb{N}^+ \quad | \quad \left[q\times b \leq a\right]\& \left[\left(q+1\right)\times b \gt a\right]
== énoncé définissant le résultat ==
| q(a, b) =| 0 si a < b \\ 1 + q(a-b, b) sinon |
== énoncé exécutable en C ==
int quot(int a, int b){
int q = 0;
if (a >= b) q = 1 + quot(a-b, b);
return q;
}
=== (3) ===
== Description ==
Le plus grand diviseur (//p//) d'un tableau //t// de //n// nombres
== données et résultat ==
* données : tableau //t// de //n// nombres entiers
* résultat : un entier //p// tel que
* p divise tous les éléments de t[] (résidus nuls)
* si un entier //q// divise tous les éléments de t[], q ≤ p.
== énoncé qualifiant le résultat ==
* résultat : un entier //p// tel que
* p\in \mathbb{N} : \forall i \in \left[0..n-1\right]\quad p | t\left[i\right]
* \forall q\in \mathbb{N}, \left( \forall i \in \left[0..n-1\right] \; Q | t\left[ i\right]\right) \rightarrow \left[ q \leq p \right]
== énoncé définissant le résultat ==
| p(a) =| a |
| p(a::t) =| pgcd(a, p(t)) |
| pgcd(a, b) =| b : // si a = 0 (ou a = b) //\\ pgcd(a-b, b) : //si a > b // \\ pgcd(b, a) : //si a < b// |
== énoncé exécutable en C ==
int
divComm(int *t, int n){
int i=0, p=t[0];
for (i=1; i< n ; i++) [p = pgcd(p,t[i]);
}
return p;
}
int pgcd(int a, int b){
if (a==0) return b;
if (a>b) return pgcd(a-b, b);
if (b>a) return pgcd(b, a);
}
----
=== (4) : à rendre le 18/02 ===
[[semantics_td_1_4| ma copie (privée)]]
== Description ==
La racine carrée (//r//) d'un nombre carré //n//
== données et résultat ==
== énoncé qualifiant le résultat ==
== énoncé définissant le résultat ==
== énoncé exécutable en C ==
=== (5) ===
== Description ==
Le tri d'un tableau //t// de //n// nombres (on nomme //u// le tableau trié).
== données et résultat ==
== énoncé qualifiant le résultat ==
== énoncé définissant le résultat ==
== énoncé exécutable en C ==
==== "La plus petite somme" ====
Mêmes questions que précédemment pour le problème suivant :
== Description ==
Étant donnée un tableau //t// de //n// nombres, le résultat //s// est la plus petite somme d'éléments consécutifs dans //t//.
Exemple :
^ indice | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
^ élément | 1 | -2 | 3 | -1 |-5 | -4 | 1 | 0 | -2 | 5 | -1 |
^ s = -11 | ^^^ + | + | + | + | + || ||
== données et résultat ==
== énoncé qualifiant le résultat ==
== énoncé définissant le résultat ==
== énoncé exécutable en C ==