IUT R&T - 1ère année - Informatique
Programmation et algorithmique 1


TD n°4 – Tableaux

Exercice 1
1.1. Ecrire un programme en C qui :
– définit (comme variable globale) un tableau T de k=100 entiers (utiliser #define pour définir k),
– définit une procédure void remplir() qui remplit aléatoirement ce tableau T en utilisant rand(),
– définit une procédure void afficher() qui affiche ce tableau en séparant les valeurs par un espace.
– utilise ces procédures successivement.
1.2. Ecrire un programme en C qui :
– définit deux tableaux T1 et T2 de k=100 entiers chacun,
– définit une procédure void remplir(int X[],int N) qui remplit aléatoirement (par effet de bord) un tableau X de taille N en utilisant rand(),
– définit une procédure void afficher(int X[],int N) qui affiche un tableau X de N entiers en séparant les valeurs par un espace,,
– définit une fonction int comparer(int X,int Y,int N) qui donne le nombre de valeurs identiques (au même indice) dans deux tableaux X et Y de même taille N,
  utilise ces fonctions et procédures pour remplir T1 et T2, les comparer, puis les afficher.

Exercice 2 Calendrier.
On donne les deux algorithmes précisés suivants.
Fonction estBissextile
Entrée : une année A.
Sortie : La réponse à la question "A est-elle bissextile ?".
Retourner ( (A mod 400 = 0) ou ((A mod 4 = 0) et (A mod 100 ≠ 0)) ).

Fonction Quantième
Entrée : une date (Jour,Mois,An).
Sortie : le quantième correspondant à cette date c'est-à-dire son numéro d'ordre dans l'année. (Exemple : Le 7 mars 2018 est le 31+28+0+7=66e jour de l'année 2018)
NJM=[31;28;31;30;31;30;31;31;30;31;30;32] // tableau indicé de 0 à 11.
q← Jour;
Pour i de 0 à mois-2 faire q← q+NJM[i];
Si Mois>2 et estBissextile(An) alors q← q+1; Retourner q.

2.1. De quel type est le retour de la fonction estBissextile ? Construire une phrase simple qui explique clairement l'expression retournée par cette fonction : « Une années est bissextile quand... »
2.2.Dans la fonction Quantième, à quoi correspond le tableau NJM ? Que fait la boucle Pour-i ?
2.3. Traduire ces deux fonctions en C.
2.4. Ecrire en C un programme qui, en utilisant les fonctions précédentes, détermine et affiche le quantième sur une suite de dates entrées au clavier. Comment l'utilisateur indiquera-t-il la fin de sa saisie ?
2.5. On donne le bloc de code C suivant :
q=0;
switch(Mois) {
  case 12 : q=q+NJM[10];
  case 11 : q=q+NJM[9];
  case 10 : q=q+NJM[8];
  case  9 : q=q+NJM[7];
  case  8 : q=q+NJM[6];
  case  7 : q=q+NJM[5];
  case  6 : q=q+NJM[4];
  case  5 : q=q+NJM[3];
  case  4 : q=q+NJM[2];
  case  3 : { q=q+NJM[1]; if (estBissextile(An)) q++; }
  case  2 : q=q+NJM[0];
  default : q=q+Jour;
  }

Que fait ce code pour Mois=1 ? Pour Mois=4 et An=1904 ?
Modifier la fonction Quantième pour qu'elle utilise ce bloc de code et vérifier son bon fonctionnement.

Exercice 3 Suppression d'une valeur.
On donne l'algorithme précisé suivant 
Algorithme Supprimer
Donnée : un tableau T de n valeurs (indicé de 0 à n−1), une valeur x.
Résultat  suppression des p valeurs x présentes dans T, les valeurs restantes étant placées dans les n−p première cases de T.
Pour i de 0 à n−1 faire
Si T[i]=x alors
Pour j de i à n−2 faire T[j]←T[j+1];
n←n−1.
3.1. Pourquoi n'est-ce pas propre d'utiliser un Pour dans cette fonction ? Modifier l'algorithme en utilisant une autre structure de contrôle plus adaptée.
3.2. Traduire la fonction modifiée en C. La fonction prendra en paramètre le tableau et sa taille, qui seront modifiées par effet de bord, et retournera le nombre de valeurs supprimées.
3.3. Réutiliser la fonction de remplissage aléatoire d'un tableau pour tester cette nouvelle fonction ?
3.4. Quel algorithme pourrait-on proposer pour ne conserver dans un tableau qu'un seul exemplaire de chaque valeur initialement présente ?