Cours n°8 : révisions

Transcription

Cours n°8 : révisions
Introduction à l’informatique et à la programmation - UFR Sciences, Aix-Marseille, 2015-2016
Cours n°8 : révisions
Exercice 1 : compréhension d’un programme
Soit t un tableau de 8 nombres entiers, initialisé avec les valeurs suivantes :
2 8 0 5 1 9 9 8
On suppose que :
- la fonction afficher(t,n) affiche sur une même ligne les n éléments du tableau t séparés par un espace,
et passe à la ligne suivante ;
- la fonction permuter(t,i,j) permute les éléments d’indices i et j du tableau t ;
- les variables i et j représentent des nombres entiers.
Ecrire les affichages produits à l’écran lorsque l’on exécute les instructions suivantes :
afficher(t,8) ;
for (i=0 ; i<8 ; i++)
t[i] = t[i] % 3 ;
afficher(t,8) ;
for (i=0 ; i<=3 ; i++)
{
j = 7 - i ;
permuter(t,i,j);
afficher(t,8) ;
}
j = 0 ;
for (i=0 ; i<8 ; i++)
{
if (t[i] != 2)
{
t[j] = t[i] ;
j++ ;
}
}
afficher(t,j) ;
Exercice 2 : Un programme pour faire des paris sur des courses de chevaux
On désire écrire un programme qui simule le jeu du tiercé, où l’on fait des paris sur des courses de
chevaux. Les chevaux qui participent à la course sont numérotés de 1 à N. N est une constante du
programme.
Chaque pari est un pronostic sur trois chevaux. Un pari est donc formé d’une suite ordonnée de trois
entiers différents de [1,N].
Pour chaque course :
a. Le parieur donne son pronostic, c’est-à-dire la suite des trois numéros qu’il a choisis ; et il donne
également le montant de sa mise (la somme qu’il souhaite parier). La mise est un nombre entier.
b. Le programme simule la course et en affiche le résultat : les numéros des trois chevaux arrivés en
tête, dans leur ordre d’arrivée.
c. Le programme annonce ensuite le gain éventuel du parieur :
- Si le pronostic du parieur est identique au résultat de la course, le parieur a gagné dans l’ordre. Dans
ce cas, il gagne dix fois sa mise.
- Si le pronostic contient les mêmes éléments que le résultat de la course, mais pas dans le bon ordre,
le parieur gagne dans le désordre. Dans ce cas, il gagne deux fois sa mise.
- Si le parieur ne gagne ni dans l’ordre ni dans le désordre, il perd sa mise.
d. Le programme propose ensuite au parieur de recommencer à jouer, sur une autre course.
Voici un exemple d’exécution du programme :
Donnez votre pronostic :
1e place : 13
2e place : 11
3e place : 19
Quel est le montant de votre mise ? 200
Voici le resultat de la course : 13
11
19
Bravo, vous avez gagné dans l’ordre ! vous gagnez 10 fois votre mise : 2000
Souhaitez-vous recommencer (oui:1/non:0) ? 1
Donnez votre pronostic :
1e place : 13
2e place : 1
3e place : 3
Quel est le montant de votre mise ? 100
Voici le resultat de la course : 3
2
1
Vous avez perdu ! vous perdez votre mise : 100
Souhaitez-vous recommencer (oui:1/non:0) ? 0
On utilise des tableaux de trois entiers pour enregistrer le pari du joueur et le résultat de la course.
1) Ecrivez la fonction int TroisDifferents(int t[ ]) qui prend en argument un tableau t de trois
entiers et qui renvoie 1 si ces trois entiers sont tous différents, et 0 sinon.
2) On vous donne ci-dessous la fonction void SaisirPari(int p[ ]) qui demande au parieur de donner
son pronostic (trois numéros de chevaux) et remplit le tableau p, qui est un tableau de trois entiers.
Etudiez le corps de cette fonction, et expliquez les points suivants :
- lors de l’exécution de l’instruction if ((test1 == 1) && (test2 == 1)) ok = 1; else ok = 0 ;, dans
quels cas test1 vaut-il 0 et dans quels cas vaut-il 1 ? même question pour test2, et pour ok.
- à quoi sert la boucle do...while ?
void SaisirPari (int p[ ])
{
int i, ok , test1, test2 ;
do
{
test1 = 1 ;
test2 = 1 ;
printf("Donnez votre pronostic :\n") ;
for (i=0; i<3; i++)
{
printf("%d e place : ", i+1);
scanf("%d", &p[i]);
if ( (p[i] < 1) || (p[i] > N))
test1 = 0 ;
}
if (test1 == 1)
test2 = TroisDifferents(p) ;
if ( (test1 == 1) && (test2 == 1) )
ok = 1;
else ok = 0 ;
if (ok == 0)
printf("Erreur, il faut 3 numeros differents, et dans [1,%d], recommencez \n", N );
}
while (ok == 0) ;
return ;
}
3) Ecrivez la fonction int Contient(int t[ ], int n, int v) qui renvoie 1 si le tableau t de n entiers
contient la valeur v, et 0 sinon.
4) Ecrivez la fonction void ResultatCourse(int r[ ]), qui simule la course en tirant aléatoirement
trois entiers différents de [1,N], et qui place le résultat dans le tableau r de trois entiers.
5) Ecrivez la fonction int GagneDansOrdre(int p[ ], int r[ ]) qui renvoie 1 si le parieur a trouvé le
tiercé dans le bon ordre, et 0 sinon. Cette fonction prend en argument deux tableaux de trois éléments :
le tableau p contient le pari du joueur et r contient le résultat de la course.
6) Ecrivez la fonction int GagneDansDesordre(int p[ ], int r[ ]) qui prend en argument le pari p
du joueur et le résultat r de la course, et qui renvoie 1 si le parieur a trouvé le tiercé dans le désordre,
et 0 sinon. Pour faire ce calcul, utilisez la fonction Contient.
Pour simplifier, la fonction GagneDansDesordre renvoie également 1 si le parieur a trouvé le tiercé dans
l’ordre.
7) Ecrivez la fonction main qui orchestre l’ensemble du programme.
8) Question bonus
On voudrait généraliser le programme à des paris sur n chevaux, avec 3 < n < 10 (par exemple, pour le
quarté n = 4 et pour le quinté n = 5). Un pari est donc composé de n entiers différents de [1,N].
Il est nécessaire d’écrire une fonction int TousDifferents(int t[ ], int n) qui généralise à un tableau t de n éléments la fonction int TroisDifferents(int t[ ]) de la question 1 : elle renvoie 1 si les
éléments de t sont tous différents, et 0 sinon.
Pour faire ce calcul, on peut utiliser plusieurs méthodes. Décrivez (en français) un algorithme qui permet de faire ce calcul pour n éléments, puis écrivez la fonction int TousDifferents(int t[ ], int n)
qui correspond.