Coller ici votre
Code à barres
DEVOIR DE SYNTHESE
PECUE : Programmation Structurée II Classe(s) : L1GE-xx
a
Enseignant(s) : K.HAOUET, F.ANNABI, M.BEN KHADIJA Documents autorisés : Non
r
t Date : 08/06/2023 Durée : 01heure30 02 Double Feuilles Calculatrice autorisée : Non
(Première-Suite)
i
e I : Problème (15 points)
/*--------------------------------------------------------------------------------------------------------------------------------------------------------
Le Programme suivant simule le moteur d'un jeu vidéo dont le but est de bombarder des cibles à des positions bien déterminés
comprise entre 0 et MAX_POS, crées aléatoirement par le programme et ayant des valeurs comprises entre deux entiers
MIN_VAL et MAX_VAL.
On se propose d'écrire essentiellement les deux fonctions :
- ajouterCible
- bombarderCible
Le programme principal servira à tester ces deux fonctions d'une façon aléatoire : l'ordinateur va jouer contre lui-même.
Lire attentivement les commentaires du programme suivant et compléter le code manquent pour remplir ce cahier
des charges
---------------------------------------------------------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
/* Question : Déclarer à l'aide de typedef un nouveau Type : Cible ; Cible est une structure caractérisée par :
- Un libellé lib : une chaine de caractères dynamique
- Une position pos : une valeur entière comprise entre MIN_POS , MAX_POS
- Une valeur val : une valeur entière comprise entre MIN_VAL , MAX_VAL
*/
………………………………………………………………. {
………………………………………….; // libellé une chaine de caractères dynamique
………………………………………….; // position valeur comprise entre 0 et 100
………………………………………….; // valeur comprise entre -100 et 100
} …………………………………………………….....;
Nom, prénom et signature
de l’enseignant correcteur
// Déclaration des fonctions :
// On se propose d’implémenter les fonctions suivantes :
// randVal : retourne une valeur entière aléatoire comprise entre i et j deux entiers
int randVal(int i,int j);
// ajouterCible : permet de d'ajouter à une liste de cibles une cible : de position :p, de valeur : v, de libellé : libCible, met à jour
// le nombre total de cibles insérées.
// ajouterCible retourne 1 : si la position de la cible n'existe pas et la cible a été insérée à la liste des cible; sinon : elle retourne
// 0 (Une cible existe déjà dans cette position)
int ajouterCible(Cible* list, int p, int v, char* libCible, int *N);
/* bombarderCible : permet de supprimer une cible de position p, de la liste des cibles, met à jour le nombre de total des
cibles, et cumule le nombre de total des Points en ajoutant à ce compteur la valeur val de la cible bombardée.
Retourne la valeur -1 : si la cible n’a pas été supprimée ; retourne l’indice dans le tableau de la cible supprimée.*/
int bombarderCible(Cible* list, int p, int* N, int* Points);
// recherche : fonction qui permet de rechercher l'index d'une cible dans // la liste des cibles, // paramètres :
// p : position de la cible
// N : le nombre de cibles en cours de la liste des cibles
// valeur de retour : indice dans la liste des Cibles si l'élément existe // sinon : la fonction retourne un indice négatif : -1
int recherche(Cible*, int p, int N);
// Constante entière non signé désignant le nombre MAX_CIBLE servira à déclarer la liste des cibles sous forme d'un tableau
// dont les éléments sont de type Cible ;
#define MAX_CIBLE 50;
// Constante entière non signé désignant le nombre maximum de points qu'on peut obtenir pendant le jeu
#define MAX_POINTS 2000;
// Constante entière non signé désignant la valeur maximale d'une Cible
#define MAX_VAL 500;
// Constante entière désignant la valeur minimale d'une Cible
#define MIN_VAL -50;
// Constante entière non signé désignant la position maximale d'une Cible
#define MAX_POS = 100;
// Constante entière non signé désignant la position minimale d'une Cible
#define MIN_POS = 0;
int main()
{
// Déclarer une variable list de type : Tableau de Cibles // Taille du Tableau : MAX_CIBLE
………………………………………………………………………;
// Déclarer une variable libCible de type tableau de caractères // Taille du tableau de caractères : 80
………………………………………………………………………;
// Déclarer une variable N entière désignant le nombre de Cibles en cours // Initialiser N à zéro
………………………………………………………………………; // Nombre Total de cibles
// Déclarer une variable Points entière désignant le score des points en cours obtenus par le joueur ; variable à
initialiser
………………………………………………………………………;// Total des valeurs des cibles bombardés
int car;
// Déclration de deux variables entières pos,val : non initialisées
………………………………………………………………………;
// Structure time_t pour initialiser le vecteur aléatoire
time_t t;
// appel de srand() pour initialiser le vecteur aléatoire
srand((unsigned) time(&t));
printf("Début du Jeu\n");
do{
// affecter à la variable pos le résultat de retour de la fonction randVal pour obtenir une valeur aléatoire
// entre 0 et MAX_POS
………………………………………………………………………;
// affecter à la variable val le résultat de retour de la fonction randVal pour obtenir une valeur aléatoire entre
// MIN_VAL et MAX_VAL
………………………………………………………………………;
// Instruction qui permet de copier dans la chaine libCible un nom aléatoire de la forme "Cible@%d$%d"
sprintf(libCible,"Cible@%d$%d",pos,val);
printf("%s\n",libCible);
// Appeler la fonction ajouterCible à la position : pos et de valeur : val ;
if (………………………………………………………………………………………………………………………………………………)
………………..………………..…………………..……..……………………..…………….………………………….……...;
else
………………..………………..…………………..……..……………………..…………….………………………….……...;
// affecter à la variable pos le résultat de retour de la fonction randVal pour obtenir une valeur aléatoire
// entre 0 et MAX_POS
………………………………………………………………………;
// Appeler la fonction bombarder : essayer de bombarder la cible à la position pos
if (……………………………………………………………………………………………………………………………………………….)
printf("Cible éliminée");
else
…………………………………………………………………………………………………………………………………;
printf("Cibles : %d , Points %d\n", N, Points);
printf("Tapez une touche pour continuer ou Ctr-Z pour quittez!\n");
}while((car=getchar())!= EOF && Points < MAX_POINTS && N < MAX_CIBLE);
// Si on sort de cette boucle : 03 cas de figure peuvent se présenter
// on est gagnant si les Points cumulés sont supérieur MAX_POINTS
// on est perdant si N est égal MAX_CIBLE
// à défaut l'utilisateur a tapé Ctr-Z pour sortir du programme
if (…………………………………………………………………………………………………………….)
printf("Vous avez Perdu\n");
else
{
if(……………………………………………………………………………………………….)
printf("Vous Avez Gagné\n");
else
printf("Vous allez quittez le jeu!!\n"); // voir Partie II du sujet - fichiers
}
return 0;
}
// rechercher une cible par position ;
int recherche(Cible *list, int p , int N)
{
for(int i=0; i< N ; i++)
if(………………………………………………………………)
return ………………………………;
return -1;
}
// Ajouter une cible à la position p, de valeur v et dont le libellé est : lib
int ajouterCible(Cible *list, int p , int v ,char *lib, int *N)
{
// utiliser la fonction recherche
if (…………………………………………………………………………………………………………………………………………………………….)
{
……………………………………………… = (char*) malloc(………………………………………………………………..);
if(…………………………………………………….!=NULL)
{
strcpy(…………………………………………………...,lib);
…………………………………………………………………………………….;
…………………………………………………………………………………….;
…………………………………………………………………………………….;
return ………………………………..;
}
}
return 0;
}
// bombarder une cible à la position p
int bombarderCible(Cible*list, int pos, int *N, int *Points)
{
int idx;
idx=recherche(………………………………, …………………………………, ……………………….);
if(………………………………………………………………………………)
{
……………………………………………………………………………………………………………………………….;
// Cible existe
…………………………………………………………………………………………………………………………………….;
for(………………………………………………………………………………………………………………………………){
………………………………………………………………………………………………………………………….;
}
…………………………………………………………………………;
return ………………………………………;
}
// Cible inexistante
return …………………………………;
}
int randVal(int i, int j){ // condition : i < j
// int rand(void) : retourne un entier entre 0 et MAX_RAND (Entier MAX Positif)
// int abs (int x); // retourne la valeur absolue d’un entier
return ( i + rand()%(abs(j-i)+1));
}