Corrigé de la séance d'exercices 7, Programmation I
Sciences et Technologies du Vivant, Semestre 1

Exercice 1 - Introduction aux pointeurs

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
  int i = 9;

  cout << "Contenu de i: '" << i << "'" << endl;
  cout << "Adresse de i: '" << (unsigned int)&i << "'" << endl << endl;

  /* On declare un pointeur sur int et on lui
   * affecte l'adresse de i. On dit que p 
   * pointe sur i. */
  int *p = &i;

  cout << "Contenu de p: '" << (unsigned int)p << "'" << endl;
  cout << "Adresse de p: '" << (unsigned int)&p << "'" << endl;
  cout << "Contenu de la variable pointee par p: '" << *p << "'" << endl << endl;

  // On affecte 10 a l'adresse pointee par p.
  *p = 10;

  cout << "Contenu de la variable pointee par p: '" << *p << "'" << endl;
  cout << "Contenu de i: '" << i << "'" << endl;

  // Partie a completer

  // 3.  i incrementee de 10
  cout << "3." << endl;
  *p = *p + 10;
  cout << "Contenu de i: '" << i << "'" << endl;

  // 4.  nouveau pointeur sur i
  cout << "4." << endl;
  int *q = p;
  cout << "Contenu de la variable pointee par q: '" << *q << "'" << endl;

  // 5.  echange
  cout << "5." << endl;
  float f = 5;

  int t = *p;
  *p = int(f);
  f = t;

  cout << "Contenu de i: '" << i << "'" << endl;
  cout << "Contenu de f: '" << f << "'" << endl;

  // 6.  echange (2)
  cout << "6." << endl;
  int j = 8;
  q = &j;

  int k = *q;
  *q = *p;
  *p = k;
  
  cout << "Contenu de i: '" << i << "'" << endl;
  cout << "Contenu de j: '" << j << "'" << endl;

  // Fin de la partie a completer

  return 0;
}

Exercice 2 - Fonctions et tableaux

Au point 2, on remarque que lorsqu'on déclare un tableau de manière statique, il n'est pas initialisé et ses éléments possèdent donc une valeur plus ou moins aléatoire. Au contraire - au point 3 -, lorsqu'on alloue dynamiquement un tableau, la zone mémoire est mise à 0.

Pour le point 5, il faut écrire la fonction statistique en passant une partie des arguments par référence. Cela signifie que, plutôt que de déclarer des arguments de type int ou float, comme on l'a fait jusqu'ici, on va utiliser des pointeurs, de manière à passer non pas la valeur d'une variable à la fonction, mais l'adresse d'une variable.

Puisque la fonction possède l'adresse de la variable, elle peut modifier son contenu d'origine. Ceci n'aurait pas été possible avec un passage par valeur, car dans ce cas, la valeur passée est simplement copiée.

Lorsqu'on appelle la fonction statistique, il ne faut pas lui passer des variables standard, mais bien des adresses. C'est pourquoi on utilise l'opérateur &.

Exemple de passage d'arguments par valeur et par référence:

void passage_valeur(int a) {
  a = 5;
}

void passage_reference(int *b) {
  *b = 5;
}

int main(int argc, char **argv) {
  int c = 0;

  passage_valeur(c);

  passage_reference(&c);

  return 0;
}

Lorsqu'on appelle passage_valeur(c), la valeur de c ne sera pas modifée, alors qu'après l'appel de passage_reference(&c), c sera égal à 5.

#include <iostream>
#include <time.h>

using namespace std;

void affiche(int *T, int n) {
  for (int i=0; i<n; i++)
    cout << T[i] << " ";
  cout << endl;
}

int *alloue_tab(int n) {
  return new int[n];
}

void statistique(int *T, int taille, int *min, int *max, float *moyenne) {
  *moyenne = T[0];
  *min = T[0];
  *max = T[0];
  for (int i=1; i<taille; i++) {
    (*moyenne) += T[i];
    if (T[i] > *max)
      *max = T[i];
    if (T[i] < *min)
      *min = T[i];
  }
  (*moyenne) /= taille;
}

int main(int argc, char **argv) {
  srand(time(0));

  int T[10];

  affiche(T, 10);

  int *T2 = new int[8];

  affiche(T2, 8);

  int *T3 = alloue_tab(12);

  for (int i=0; i<12; i++)
    T3[i] = rand() % 100;

  affiche(T3, 12);

  int min, max;
  float moyenne;
  statistique(T3, 12, &min, &max, &moyenne);

  cout << "Min: " << min << ", max: " << max << ", moyenne: " << moyenne << endl;

  delete [] T2;

  delete [] T3;

  return 0;
}

Exercice 3 - Fonctions et pointeurs

#include <iostream>

using namespace std;

void fonction1(int *p, int v) {
  *p = v;
}

void echange(int *p1, int *p2) {
  int t;
  fonction1(&t, *p1);
  fonction1(p1, *p2);
  fonction1(p2, t);
}

int main(int argc, char **argv) {
  int i = 5;
  int j = 9;

  echange(&i, &j);

  cout << "i = " << i << ", j = " << j << endl;

  return 0;
}

Exercice 4 - Loto$\dag $

#include <iostream>

using namespace std;

int *alloue_tableau(int taille) {
  return new int[taille];
}

int *lire_numeros(void) {
  int *numeros = alloue_tableau(6);
  for (int i=0; i<6; i++) {
    cout << "Numero " << i+1 << ": ";
    do 
      cin >> numeros[i];
    while (numeros[i] < 1 || numeros[i] > 45);
  }

  return numeros;
}

int compte_numeros_corrects(int *t1, int *t2) {
  int matches = 0;
  for (int i=0; i<6; i++)
    for (int j=0; j<6; j++)
      if (t1[i] == t2[j])
        matches++;

  return matches;
}

void stocke_numeros_corrects(int *t1, int *t2, int *c) {
  int index = 0;
  for (int i=0; i<6; i++)
    for (int j=0; j<6; j++)
      if (t1[i] == t2[j]) {
	c[index] = t1[i];
	index++;
      }
}

void affiche_numeros(int *t, int taille) {
  for (int i=0; i<taille; i++)
    cout << t[i] << " ";
  cout << endl;
}

  
int main(int argc, char **argv) {
  cout << "Veuillez entrer le resultat du tirage:" << endl;
  int *tirage = lire_numeros();

  cout << endl << "Veuillez entrer vos numeros:" << endl;
  int *numeros_perso = lire_numeros();

  int nombre_corrects = compte_numeros_corrects(tirage, numeros_perso);

  int *corrects = alloue_tableau(nombre_corrects);

  stocke_numeros_corrects(tirage, numeros_perso, corrects);

  cout << "Vous avez joue " << nombre_corrects << " numero(s) correct(s)." << endl;
  cout << "Numeros du tirage:" <<endl;
  affiche_numeros(tirage, 6);
  cout << endl << "Vos numeros corrects:" << endl;
  affiche_numeros(corrects, nombre_corrects);

  delete [] corrects;
  delete [] numeros_perso;
  delete [] tirage;

  return 0;
}


Retour