Qu’est-ce qu’on apprend
- Créer un tableaux.
- Passer un tableau à une faction.
- Parcourir un tableau pour trouver le maximum et son index.
- Comment utiliser le passage par référence pour permettre à une fonction de modifier une donnée sans passer par la valeur de retour.
Attention: La bibliothèque string.h
fournit un tas de fonctions pour travailler avec les chaînes. Le but de ce TD est de faire ces fonctions à la main, pour comprendre comment ça marche sous le capot. Donc, merci de ne pas utiliser les fonctions de string.h
(strstr
,strcmp
,…), puisque sinon les exercices perdraient leur intérêt.
Lecture…
Tableaux :
- Chapitre 11 du poly ou le notebook IN102-08
-
Addendum: L'utilisation de tableaux à longeur variable (chapitre 11.2) est déconseillé, voir les explication ici.
Fonctions et passage par référence :
- Chapitre 7 du poly ou le notebook IN102-05
Au boulot…
Anecdote: Maintenant vous savez que les chaînes sont des tableaux de carctères et que C ne vérifie pas les dépassements d’accès à un tableau. Un tel dépassement nonvérifié a été la source d’une vulnerabilité logicielle majeure en 2011, le bug Heartbleed. Regardez une petite bd qui l’explique ici. Entre autres, 4.5 million de dossiers médicaux confidentielles ont été volés en exploitant cette vulnerabilité.
IMPORTANT: Donnez votre prénom et nom au début du fichier de réponse, sous forme de commentaire. Ajoutez également les réponses aux questions dans votre programme, sous forme de commentaires. Exemple:
/* Jeanne LAGAFFE */
#include <stdio.h>
int main () {
printf("Hello World !!\n");
}
/*
Q1: Ceci est la réponse à la question 1.
Q2: Voilà la réponse à la question 2.
*/
Q1:
Ecrire un programme qui crée un tableaux T de n=20 entiers (le programme doit toujours marcher si on modifie n) et les remplit avec les règles suivantes (la suite de Collatz) :
- Pour i = 0, on a
T[i] = 3
. - Si
T[i-1]
est pair,T[i] = T[i-1]/2
(divison entière), sinonT[i] = 3*T[i-1]+1.
Q2:
Ecrivez une fonction
void affichage(int* X, int n)
qui affiche les n éléments du tableaux X, séparés par un virgule et suivis par un retour à la ligne. Testez la fonction en l’appelant depuis main() pour afficher T.
Par exemple, T s’affiche comme
3,10,5,16,8,4,2,1,4,2,1,4,2,1,4,2,1,4,2,1
Q3:
Ecrivez une fonction
int compter_nombre(int* X, int n, int y)
qui prend en entrée un tableau X de taille n et un nombre y et qui donne le nombre d’occurences de y. Testez la fonction en l’appelant depuis main() selon les exemples suivants.
Exemples:*
compter_nombre(T,20,1)
donne 5compter_nombre(T,20,3)
donne 1compter_nombre(T,20,6)
donne 0
Q4:
Ecrivez une fonction
int trouver_max(int* X, int n)
qui prend en entrée un tableau X de taille n>0 et qui donne l’élément le plus grand. Testez la fonction en l’appelant depuis main() selon les exemples suivants.
Exemples:
trouver_max(T,3)
donne 10trouver_max(T,5)
donne 16trouver_max(T,20)
donne 16
Q5:
Ecrivez une fonction max_idx
qui trouve le plus grand élément et qui donne aussi l’index de cet élément. Comment faire passer l’index, si on passe l’élément le plus grand par la valeur de retour?
Rappel: Comment peut-une fonction modifier une variable définie ailleurs?
Exemple: L’élément maximal du tableau T est 16 et il se trouve à l’index 3.
Q6:
Ecrivez une fonction neg_max
qui non trouve le plus grand élément et change le signe de cet élément (16 devient -16). Passez à neg_max
que les arguments qui sont indispensables. Est-ce que neg_max
doit donner une valeur de retour? Affichez le tableau après l’appel à neg_max
pour vérifier que cette fonction marche.
Exemple: Le tableau T devient
3,10,5,-16,8,4,2,1,4,2,1,4,2,1,4,2,1,4,2,1
Validez:
Nommez le fichier T03b.c
et envoyez-le à votre chargé de TD