TD03b Les tableaux

Qu’est-ce qu’on apprend

  1. Créer un tableaux.
  2. Passer un tableau à une faction.
  3. Parcourir un tableau pour trouver le maximum et son index.
  4. 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

    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) :

  1. Pour i = 0, on a T[i] = 3.
  2. Si T[i-1] est pair, T[i] = T[i-1]/2 (divison entière), sinon T[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 5
  • compter_nombre(T,20,3) donne 1
  • compter_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 10
  • trouver_max(T,5) donne 16
  • trouver_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