# L3S5 MATH - INFORMATIQUE S5 — UNIVERSITÉ DE STRASBOURG
## TP 2 — Les fonctions en C++

**Exercice 1 :** Écrire une fonction `distance` qui a comme paramètres 4 doubles `xa`, `ya` et `xb`, `yb` (représentant les coordonnées de deux points A et B du plan) et qui renvoie par un `return` la distance euclidienne $||AB||$. Tester cette fonction.

**Exercice 2 :** Écrire une fonction `isPrime` ayant comme paramètre un entier `n` et qui renvoie, par un `return`, un booléen : `true` si l'entier est premier, et `false` sinon. Tester cette fonction.

**Exercice 3 :** Écrire une fonction ayant comme paramètres un tableau `tab` d'entiers de taille **quelconque** et un entier N représentant sa taille. Cette fonction renvoie la somme de tous les éléments de `tab`. Tester la fonction avec un entier N et en prenant `tab` comme la liste des entiers de 1 à N. Que s'attend-on à obtenir ? Surcharger ensuite la fonction pour traiter un tableau de type `double`.

**Exercice 4 :** On souhaite calculer la valeur de $f(x) = \sqrt{(x - 1)(2 - x)}$ et savoir si x est dans le domaine de définition de f. Pour cela, écrire une fonction f :

- ayant comme paramètres un `double` x et un `bool` `test` **passé par référence** (dont la valeur initiale importe peu),
- qui renvoie par un `return` la racine carrée de $(x - 1) * (2 - x)$,
- et qui modifie `test` pour qu'il prenne la valeur `true` si la fonction est définie au point x, `false` sinon.

*Note : on rappelle qu'une fonction en C++ ne peut renvoyer qu'une seule variable avec un `return`. Pour retourner tout de même plusieurs valeurs, on peut fournir un paramètre supplémentaire en entrée, passé par référence, qui sera modifié par la fonction.*

Tester cette fonction.

**Exercice 5 :** Écrire une fonction `swap` qui a comme paramètres deux entiers a et b. Cette fonction ne doit rien renvoyer, mais doit échanger les valeurs des paramètres a et b. Créer une version utilisant des pointeurs et une autre utilisant des références, et tester ces deux versions.

**Exercice 6 :** Écrire une fonction ayant comme paramètres un tableau `tab` d'entiers de taille quelconque et un entier n indiquant la taille du tableau. La fonction possède un autre paramètre entier v passé par référence. Elle doit renvoyer par un `return` un booléen b indiquant si le tableau `tab` contient une valeur comprise entre 1 et 10. Si la fonction renvoie `true`, v est alors égal à l'indice de la première case du tableau comprise entre 1 et 10. Tester cette fonction.

**Exercice 7 – Échantillonnage :** On souhaite écrire une fonction renvoyant l'évaluation d'une autre fonction sur un intervalle donné.

(a) Écrire une fonction `linspace` qui permet de discrétiser un intervalle fermé de $\mathbb{R}$ avec N points équipartis. Cette fonction prend deux paramètres de type `double` (valeur xmin et xmax de l'intervalle) et un paramètre N de type `int` pour le nombre de points échantillonnés (ce paramètre doit être $\ge 2$). Cette fonction renvoie ensuite un tableau contenant les coordonnées des N points. *La ressemblance avec la fonction `np.linspace` en Python est complètement voulue !*

(b) En utilisant `linspace`, écrire une fonction qui va évaluer la fonction `cos` sur chaque point de l'intervalle $[xmin, xmax]$ discrétisé par `linspace`. Cette fonction prend trois arguments : xmin, xmax et N.

(c) Étendre la fonction ci-dessus en ajoutant un quatrième argument de type pointeur de fonction, dans le but d'échantillonner d'autres types de fonctions que `cos`.

**Exercice 8 :** On considère la suite de Syracuse :

$$
\begin{cases}
u_0 = a & \text{avec } a \in \mathbb{N}, \\
u_{n+1} = u_n / 2 & \text{si } u_n \text{ pair}, \\
u_{n+1} = 3u_n + 1 & \text{si } u_n \text{ impair}.
\end{cases}
$$

**Conjecture admise** : $\forall a \in \mathbb{N}^*$, il existe un entier $N$ tel que $u_N = 1$. *Cette conjecture, portant sur un objet mathématique pourtant simple, reste un problème ouvert… Elle a été vérifiée informatiquement jusqu'à $a = 2^{68} \simeq 3 \times 10^{20}$ !*

(a) Écrire un programme qui demande à l'utilisateur d'entrer la valeur d'un entier $a$ et qui affiche les valeurs de la suite $u_n$ pour $n$ compris entre 1 et $N$ (inclus).

(b) Écrire un programme qui demande à l'utilisateur d'entrer la valeur d'un entier $M$ puis qui cherche la valeur de $a$ comprise entre 2 et $M$ tel que $N$ soit maximal. On appelle $A$ cette valeur. Le programme doit afficher la valeur de $A$ et la valeur de $N$ correspondante.

**Exercice 9 – Tri par sélection :**

(a) Écrire un programme qui demande à l'utilisateur d'entrer 5 entiers qui seront stockés dans un tableau `tab`, qui trie le tableau au moyen d'une fonction `selection_sort` à écrire, puis qui affiche le contenu du tableau trié. On suggère l'algorithme de tri par sélection :

- chercher l'indice du plus petit élément parmi les indices de 0 à 4 et échanger cet élément avec `tab[0]` ;
- chercher l'indice du plus petit élément parmi les indices de 1 à 4 et échanger cet élément avec `tab[1]` ;
- chercher l'indice du plus petit élément parmi les indices de 2 à 4 et échanger cet élément avec `tab[2]` ;
- chercher l'indice du plus petit élément parmi les indices de 3 à 4 et échanger cet élément avec `tab[3]`.

(b) Étendre ensuite le programme pour un tableau de taille quelconque.
