Nom : ...
Réservé à l’administration :Prénom : ...
Date de naissance : ... / ... / ... CODE : ...
Auteur: Mohamed Messabihi
Matière: Programmation et structures de données Date14 juin 2016
Durée1h30
Université Abou Bakr Belkaïd - Tlemcen Faculté des Sciences 1èreAnnée MI Semestre 2
Épreuve de rattrapage
Aucun document n'est autorisé
Les appareils portables doivent être éteints et posés sur le bureau du surveillant
1 Affichage 8 pts. U 20’
Qu’affiche le programme ci-dessous ?
1 void Toto(char *P, char c){
2 while (*P)
3 if (*P==c)
4 strcpy(P, P+1) ;
5 else P++;
6 }
7 void main() 8 {
9 int A[5] = {1, 2, 3, 4};
10 char S[10]=" Loou ", T[10] = " LouLou "; 11 int *P, i=0, l;
12 char *R=S;
13 for (P=A; P<A+5; P++) 14 printf("%d\n", *P);
15 l = strlen(S);
16 for (i=l; i<2*l; i++) 17 *(R+i) = *(R+2*l-i-1) ; 18 printf("S = %s\n", S);
19 Toto (T, 'L');
20 printf("T = %s \n", T);
21 printf(" strchr = %s\n", strchr(R, 'u') );
22 }
1 2 3 4 0
S = LoouuooL
T = ouou
strchr = uuool .
2 Gestion d’un magasin (suite) 12 pts. U 1h10
On souhaite écrire un programme qui permet de gérer un magasin vendant des produits élec- troménagers . Ce programme permet, entre autres, de gérer le catalogue du magasin, de créer des commandes et d’établir des factures.
Le catalogue des différents produits stockés dans le magasin est défini comme suit :
1 typedef struct Produit Produit ; 2 struct Produit {
3 int reference;
4 char designation[30];
5 double prixUnitaire; 6 };
7 typedef struct Catalogue Catalogue; 8 struct Catalogue {
9 int nbrProduits;
10 Produit listeProduits[100];
11 };
1/4
1. Écrire une fonction qui permet d’afficher un produit. 1 pt
Solution
1 void afficher_Produit(Produit p){
2 printf("%d : %s : %.2 f DA\n", p.reference, p.designation, p.prixUnitaire);
3 }
2. Écrire une fonction qui permet d’afficher un catalogue de magasin. 1 pt
Solution
1 void afficher_Catalogue (Catalogue cat){
2 int i;
3 puts(" --- Catalogue ---");
4 for (i=0; i<cat.nbrProduits; i++)
5 afficher_Produit(cat.listeProduits[i]);
6 puts(" ---");
7 }
3. Écrire une fonctionchercher_Referencequi prend en entrée une référence d’un produit et un catalogue et qui affiche le produit correspondant et retourne son indice (position) dans le catalogue. Si le produit n’existe pas dans le catalogue, la fonction affiche "le produit n'existe
pas !"et renvoie -1. 2 pts
Solution
1 int chercher_reference(int ref, Catalogue c){
2 int i=0;
3 while (c.listeProduits[i].reference !=ref && i < c.nbrProduits) i++;
4 if (i < c.nbrProduits) {
5 afficher_Produit(c.listeProduits[i]);
6 return i;
7 }
8 else puts ("Le produit n'existe pas !"); return -1;
9 }
4. Nous définissons la commande d’un client par la structure suivante :
1 typedef struct LigneCommande LigneCommande; 2 struct LigneCommande {
3 int reference; 4 int quantite;
5 };
6 typedef struct Commande Commande; 7 struct Commande {
8 int nbrProduits;
9 LigneCommande lignes[20];
10 };
Écrire une fonction commande_Valide qui renvoie 1 si la la commande est valide et 0 sinon. Une commande est considérée comme valide si tous les produits qu’elle contient existent dans le catalogue et toutes leurs quantités sont supérieurs à zéro. 3 pts
2/4
Solution
1 int commande_Valide(Commande c, Catalogue cat){
2 int i=0;
3 int valide = 1;
4 for (i=0; i<c.nbrProduits; i++)
5 if (chercher_reference(c.lignes[i].reference, cat) == -1 || c.lignes [i].quantite <=0) valide = 0;
6 return valide; 7 }
5. Á l’occasion du mois de Ramadan, le magasin souhaite offrir des promotions à ces clients. Il applique une réduction de -20% sur tous les produit dont le prix est supérieur à 100000DA, et une réduction de -15% sur tous les articles dont le prix est compris entre 50000 et 99999DA.
Écrire une fonctionacher_Facturequi prend en entrée une commande et un catalogue et affiche la facture à l’écran. Pour chaque référence de produit commandé, la fonction af- fiche sa référence, sa désignation, son prix unitaire, sa quantité dans la commande et le prix total de la ligne. A la fin de la facture, la fonction affiche le montant total à payer. 3 pts L’affichage de cette fonction doit ressembler à celui montré ci-dessous :
--- Facture --- Reference Designation Prix Unitaire Quantite Total Remise
45665 Téléviseur 125000DA 1 125000DA -25000DA
12985 Micro-onde 9850DA 3 29550DA 00DA
87653 Réfrigérateur 86000DA 3 258000DA -38700DA
86509 Cafetière 6500DA 4 26000DA 00DA
--- Montant Total = 374850DA
Solution
1 void afficher_Facture (Commande c, Catalogue cat){
2 int i, k;
3 double montantPayer = 0, double prix_final ; 4 Produit p;
5 puts(" --- Facture ---");
6 puts(" Reference Designation PrixUnitaire quantite Total
Remise ");
7 for (i=0; i<c.nbrProduits; i++) {
8 k = chercher_reference(c.lignes[i].reference, cat);
9 p = cat.listeProduits[k];
10 if (p.prixUnitaire >= 100000)
11 prix_final = p.prixUnitaire*0.8;
12 else if (p.prixUnitaire >= 50000 && p.prixUnitaire <99999) 13 prix_final = p.prixUnitaire*0.85;
14 else prix_final = p.prixUnitaire;
15 printf("%d %s %2. fDA %d %2. fDA %2. fDA \n
", p.reference, p.designation, p.prixUnitaire, c.lignes[i].
quantite, c.lignes[i].quantite*p.prixUnitaire, c.lignes[i].
quantite*(prix_final-p.prixUnitaire) );
16 montantPayer = montantPayer + c.lignes[i].quantite*prix_final;
17 }
18 puts(" ---");
19 printf(" Montant Total = %2. f DA", montantPayer);
20 }
3/4
6. Écrire une fonctiontrier_cataloguequi permet de trier le catalogue par ordre croissant des
références des produits. 2pt
Solution
1 double trier_Catalogue(Catalogue *cat) 2 {
3 int i = 0;
4 int j = 0;
5 Produit tmp; 6 double med;
7 for(i=0; i<cat->nbrProduits ; i++) 8 for(j=i; j<cat->nbrProduits; j++)
9 if(cat->listeProduits[j].reference<cat->listeProduits[i].
reference){
10 tmp = cat->listeProduits[i];
11 cat->listeProduits[i] = cat->listeProduits[j];
12 cat->listeProduits[j] = tmp;
13 }
14 }
Bon courage ! »
4/4