info@mp2i-pv
Toutes les semaines, les TP sont à rendre pour le mercredi soir suivant au plus tard, sur cahier-de-prepa.
Chaque TP est composé de deux parties:
Le but de ceux qui choisissent la partie flocon doit être d’arriver petit à petit de plus en plus loin dans la partie première étoile.
Ceux qui choisissent la partie première étoile n’ont pas besoin de faire la partie flocon, et dans l’idéal doivent terminer la partie première étoile.
Les réponses sont à rendre dans un ou plusieurs fichiers sources, en ajoutant en commentaire vos nom et prénom sur la première ligne, la ligne de compilation à utiliser sur la deuxième ligne, et en identifiant de manière claire les numéros d’exercices et de questions.
Pour certains exercices, je fournis un fichier qui contient un
main
avec des tests. À vous de compléter ce fichier en écrivant la
fonction demandée (avant le main
), de le compiler et de
l’exécuter. Pour les exercices consistant à faire des affichages, à
vous d’écrire le main
avec un ou deux exemples pour voir si ce qui
s’affiche est ce qui est attendu.
Comme on n’a pas vu comment fournir un tableau en argument à une fonction, je vous donne les en-têtes de fonctions. Vous ne pouvez pas les comprendre, mais avec la documentation vous pouvez quand même utiliser les paramètres.
Écrire une fonction nombres_positifs
qui prend en argument un
tableau d’entiers et un entier représentant la taille de ce tableau et
renvoie le nombre de cases du tableau dont la valeur est positive ou
nulle.
Écrire une fonction somme
qui prend en argument un
tableau de double et un entier représentant la taille de ce tableau et
renvoie la somme des valeurs des cases de ce tableau.
trouve
qui prend en argument une valeur
entière, un tableau d’entiers et un entier représentant la taille de
ce tableau et renvoie true
si et seulement si la valeur apparaît
dans au moins une case du tableau.L’instruction break
permet de sortir de la boucle dans laquelle elle
est exécutée. Par exemple la suite d’instructions:
int i;
for(i = 0; i<53; i = i+1){
if(i == 27){
break;
}
}
printf("valeur de i à la sortie de la boucle : %d\n", i);
provoque l’affichage suivant:
valeur de i à la sortie de la boucle : 27
trouve
écrit à la question
précédente et faites en sorte de minimiser le nombre d’itérations
dans votre boucle.Écrire une fonction produit_scalaire
qui prend en argument deux
vecteurs de même dimension donnés sous la forme d’un tableau d’entiers
et leur dimension, et renvoie leur produit scalaire.
Écrire et documenter une fonction copie
qui prend en argument deux
tableaux d’entiers de même taille et leur taille, et copie le contenu
du premier tableau dans le deuxième.
Écrire une fonction miroir
qui prend en argument deux
tableaux de booléens de même taille et leur taille, et teste si le
contenu du deuxième tableau est ‘egal au contenu du premier mais dans
l’autre sens.
Écrire une fonction plus_petite_distance
qui prend en argument un tableau de double
supposé trié dans l’ordre croissant (sans avoir à le vérifier) et sa longueur et renvoie la plus petite distance entre deux nombres de ce tableau, sinon la constante INFINITY
définie dans le fichier d’en-tête math.h
.
Écrire une fonction qui prend en argument un tableau d’entiers, sa
taille et un entier p
, et teste si un tableau est p
-périodique
(c’est-à-dire si ses valeurs se répètent toutes les p
cases, on ne
cherche pas à ce que p
soit la plus petite période).
Si je considère un tableaux de valeurs comparables (par exemple des nombres), je peux définir une case comme un maximum local si ses deux voisines ont des valeurs strictement inférieures à elle (une case avec une seule voisine n’est pas un maximum local).
maximum_local
qui prend en argument un tableau d’entiers, sa taille et un indice et teste si la valeur à cet indice est un maximum local.L’instruction break
permet de sortir de la boucle dans laquelle elle
est exécutée. Par exemple la suite d’instructions:
int i;
for(i = 0; i<53; i = i+1){
if(i == 27){
break;
}
}
printf("valeur de i à la sortie de la boucle : %d\n", i);
provoque l’affichage suivant:
valeur de i à la sortie de la boucle : 27
vrai_maximum_local
en adaptant maximum_local
pour que cela tienne compte de cette situation possible : une case est maintenant un maximum local si elle appartient à un plateau qui est encadré de valeurs strictement inférieures.Écrire une fonction complement_a_deux
qui prend en argument un entier supposé compris
entre $-2^7$ et $2^7-1$ (sans avoir à le vérifier) et un tableau
de booléens supposé de taille 8 correspondant et modifie le contenu de ce
tableau de sorte qu’il contienne la représentation en
complément à 2 de l’entier, avec false
représentant un bit à
0 et true
un bit à 1.
Si vous en êtes là, écrivez vos propres tests dans la fonction main
et vos en-têtes de fonction (en vous inspirant des en-têtes dans les
autres exercices).
Écrire une fonction qui prend en argument un tableau d’entiers, sa
taille et renvoie le plus petit entier p
tel que le tableau est
p
-périodique.
Si $n$ est un entier, on peut donner une application ${ 0,\dots, n} \to { 0, \dots,n}$ sous la forme d’un tableau à $n+1$ cases dont la case $i$ contient l’image de l’entier $i$.
Écrire une fonction inverse
qui prend en argument un tableau
représentant une fonction $f : { 0, \dots, n} \to { 0,\dots
n}$, un entier donnant $n$ et un tableau $t$ de taille $n+1$ dont
le comportement est le suivant:
true
est renvoyée,false
est renvoyée.Écrire une fonction nb_de_chiffres
qui prend en argument deux
entiers, n
et b
, où on suppose que b
appartient à $[0,9]$, et
renvoie le chiffre le plus fréquent dans l’écriture de n
en base b
.
Le tri par sélection des éléments d’un tableau peut être fait en place de la manière suivante : on sélectionne le maximum, qu’on met à sa place, on l’oublie et on recommence jusqu’à avoir tout placé. Implémenter un tel tri sur un tableau d’entiers.
Écrire une fonction qui affiche l’encodage d’un décimal en flottant double précision selon la norme IEEE 754.