| Corrigé de la séance d'exercices 7, Programmation I |
| Sciences et Technologies du Vivant, Semestre 1 |
#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;
}
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;
}
#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;
}
#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;
}