OFPPT Office de la Formation Professionnelle et de la Pr o m o t i o n d u Tr a v a i l
Projets : Fi F i l i è r e
: TDI : Gr B & C
Du D u r é e Fo F o r m a t eu r
: 1 mois :AHBOUZ Mustapha Documents : autorisés
Modules : Technique & Langage de program mation structurée (Langage C)
Projet 1:
Cahier de charge1:
Petit avant goût de ce qui pourrait être demandé à l'examen: le logiciel fourni ne peut pas être installé sur un ordinateur, il faut donc analyser la l a situation.Un collège doit réaliser un programme simple: une calculatrice, écrite en langage C, qui permet d'effectuer les quatre opérations (addition, soustraction, division et
multiplication) sur deux nombres entier introduit par l'utilisateur. Part one:
Votre travail consiste à: à: - rechercher les différentes fonctions fonctions définies dans le programme Calculette.c - dessiner le programme sous forme de schéma, en représentant les fonctions à l'aide de blocs . De placer les variables aux endroits adéquat. - A l'aide du schéma, sc héma, déterminez les variables locales à chacune des fonctions, ainsi que les variables globales ? Correction: //Calculette.c //Calculette.c #include static float résultat ; // résultat est une variable globale int main( ) {
int a, b; // a et b sont des variables locale à la fonction main() menu(); printf("Entrer la premiere valeur "); scanf(« %d »,&a ); printf ("Entrer la seconde valeur "); scanf(« %d »,&b ); calculer(); afficher();
return 0 ; } void calculer() { char opération ; // opération est une variable locale à la fonction calculer() switch (opération) { case '+' : résultat = a + b ;break ; case '-' : résultat = a - b ;break ; case '/' : résultat = a / b ;break ; case '*' : résultat = a * b ;break ; } } void afficher() { char opération ; //opération est une variable locale à la fonction afficher() printf (" %d %c %d =%f\n ",a, opération,b, résultat); } void menu()
{
char opération; // opération est printf ("Je sais printf (" + pour printf (" - pour printf (" * pour printf (" / pour printf (" (+, -,
une variable locale à la fonction menu() compter, entrez l'opération choisie") ; additionner ") ; soustraire ") ; multiplier ") ; diviser ") ; *, /) ? : ") ;
scanf(« %c »,&opération ); }
Questions: Après exécution de la fonction menu( ) et lecture des deux valeurs
numériques a et b, la fonction calculer ( ) peut-elle réaliser l'opération demandée? Pourquoi? Part two:
Pour corriger le programme Calculette.c, nous supposons à présent que les variables résultat et opérations sont déclarées en tant que variables globales et non plus localement aux fonction afficher() et menu(). Questions: quelle technique devez vous utiliser pour que les fonctions calculer() et afficher() connaissent le contenu des variables a et b, afin d'effectuer ensuite les instructions qui les composent? c omposent? Écrivez les fonctions en utilisant cette technique… Nous supposons que le programme calculette ne contienne plus de variable globales. Les variables résultat et opération opér ation sont maintenant déclarées localement aux fonctions qui les utilisent. 1. Quelles sont les conséquences de cette nouvelle hypothèse sur le résultat du programme? 2. Comment la fonction Calculer( ) peut-elle connaître l'opérateur choisi par l'utilisateur dans la fonction menu( )? 3. Transformez la fonction menu() de telle sorte que l'opérateur soit transmis à la fonction main( ). 4. Modifier la fonction calculer() de sorte à lui transmettre l'opérateur fourni par la fonction menu(). 5. Comment la fonction afficher() peut-elle p eut-elle connaître le résultat de la fonction calculer? 6. Transformez la fonction calculer() de telle façon que le résultat soit transmis à la fonction main().
7. Enfin, modifiez la fonction afficher() de sorte à lui transmettre le résultat fourni par la fonction calculer().
FIN Projet 2:
Pour mettre en application se que nous avons vu en cours, je vous propose d’étudier le projet : MAAC MAAC (Machine (Machine Automatique A Coca, ça nous changera du café..). Pour réaliser ce projet nous devons construire une boucle do..while, mais nous aurons aussi a compter et a accumuler des valeurs. Il faut dire que le comptage des valeurs, qu’elles qu’elles soient, tiennent une grande place dans les listings informatiques. Il existe au moins deux méthodes : - La comptage d’un certain nombre de valeurs. (On compte le nombre de notes obtenues par un étudiant). - L’accumulation de valeurs (les notes de l’étudiant sont ajoutées les unes aux autres). Ainsi le calcul de la moyenne des notes d’un étudiant s’effectue en divisant l’accumulation des notes par le nombre (ou comptage) des notes obtenues. Notre objectif : construire une machine virtuelle qui simulerait de façon simplifiée un distributeur automatique de coca.
Cahier de charge2:
Pour obtenir une canette, l’utilisateur doit fournir le montant indiqué en introduisant un certain nombre de pièces de monnaie dans le distributeur. Celui ci n’accepte que les pièces de (5, 10, 20 cents d’euro). Au fur et à mesure de l’introduction des pièces le distributeur affiche la valeur totale engagée, ainsi que le nombre de pièces par catégorie (nombres de pièces de 5, 10…) Le distributeur déclenche l’ouverture de la trappe à canette dès que le montant atteint (ou dépasse, car elle rend la monnaie) le prix indiqué, à savoir 45 cents1 d’euro (Prix d’ami). Voilà, il ne vous reste plus qu’a faire le programme…ma p rogramme…mais is non je plaisante, nous allons le faire ensemble. D’abord analysons ce cahier des charges. Le processus se déroule en trois étapes : - 1. Introduire une à une des pièces dans le distributeur. - 2. Pour chaque pièce engagée, il faut calculer et afficher : - 2.1. le nombre de pièce de 20, 10 et 5 cents. - 2.2. la somme totale actuellement engagée. - 3. Le prix fixé est il atteint ou dépassé ? - 3.1. Non et dans ce cas on revient à la première ligne d’instruction - 3.2. Oui, alors on libère la trappe, on distribue la canette et on rend la monnaie si il y a lieu. Tous les grands stratèges vous le diront : « Il faut diviser, pour régner ! » traduit dans le monde informatique cela revient à dire qu’il faut essayer de résoudre les petits problèmes qui constituent le grand ! Et c’est ce que nous allons faire fai re en essayant de trouver une solution pour chacun c hacun des points précédents. Premièrement : Construction de la boucle et introduction des pièces.
En pratique, les points 1 et 3.1 décrivent une structure de boucle. L’introduction L’ introduction des pièces dans la fente du distributeur est une opération répétitive, qui ne s’arrête que lorsque l’utilisateur à engagé suffisamment de pièces dans l’appareil (c a d
quand le montant du prix est atteint ou dépassé), on peut donc écrire l’algorithme suivant : Début répéter
Entrer une pièce de monnaie Compter la somme engagée Tant que la somme engagée ne dépasse pas 45 cents, retourner à Début répéter. Essayons de le traduire en langage C : do // c’est le Début répéter { // Entrer une pièce de monnaie monnaie // Compter la somme engagée engagée } while (somme engagée < 45) ; // et fin de la boucle Ici, nous avons respecté l’algorithme, on ne sort de la boucle que lorsque le montant de 45 cents est atteint, ensuite pour simuler l’introduction des pièces par l’utilisateur, notre programme demandera une saisie au clavier. Nous pouvons écrire par exemple : printf (« montant de votre pièce : « ) ; scanf(« %d »,&pièce) ;
Deuxièmement : compter le nombre de pièces et faire la somme totale Pour compter le nombre de pièces, notre programme doit pouvoir faire la distinction entre les différentes catégories de pièces. On va donc déclarer autant de variables qu’il y a de catégorie : short nbPièce20c = 0, nbPièce10c = 0, nbPièce5c = 0, pièce, totalReçu = 0 ; On à aussi déclarer une variable « pièce » qui accueil la valeur saisie au clavier ainsi qu ‘une variable « totalReçu » qui représente la somme totale engagée en cours d’exécution de la boucle. On sait que ces valeurs ne dépasserons pas 127 donc on leurs affecte un type short. Pour arriver à nos fins, compter séparément les pièces de monnaies par catégories, la meilleur méthode consiste à placer dans la boucle do..while une structure switch qui distinguera 4 cas : switch (pièce) { case 5 : // Compter les pièces de 5 cents break ; case 10 :
// Compter les pièces de 10 cents break ; case 20 : // Compter les pièces de 20 cents break ; default : printf (« Votre pièce n’est pas autorisée : « ) ; }
Suivant la valeur de la pièce engagée, le programme compte le nombre de pièce pour chacune des catégories en utilisant une instruction du type :
a = a+1 ;
Où a représente l’objet à compter. Si la variable e est initialisée à 0, la nouvelle valeur de a, après affectation, vaut 1. Placé dans une structure répétitive, le nombre d’objet représenté par a augmente de 1 à chaque tour de boucle. En jargon informatique on dit que a est incrémenté de 1. Dans notre problème, pour compter le nombre de pièces, il suffit de remplacer la variable a par : nbPièce20c, nbPièce10c ou nbPièce5c, nous obtenons alors : nbPièce20c = nbPièce20c + 1 ; nbPièce10c = nbPièce10c + 1 ; nbPièce5c = nbPièce5c + 1 ;
Il ne nous reste rest e plus ensuite qu’a copier ces instruction i nstruction dans les étiquettes « Compter les pièces » de la structure switch Pour calculer la somme totale engagée à chaque pièce introduite, la technique est un peu différente de la précédente. En effet, la somme engagée doit être augmentée non plus du nombre de pièces introduite, mais de la valeur de la pièce. L’incrément lui aussi n’est plus de 1 mais correspond à la valeur de la pièce. L’instruction d’accumulation est la suivante : TotalReçu = TotalReçu + pièce ;
C’est ainsi que la variable totalReçu, initialisée à zéro, augmente progressivement de la valeur de chaque pièce engagée, par accumulation de la valeur précédente de totalReçu avec la valeur de la pièce entrée. Constat : ce calcul est réalisé r éalisé quelle que soit la valeur de la pièce, du coup, on placera l’instruction en dehors de la structure swich, mais à l’intérieur de la boucle. Mais attention, pour éviter d’accumuler dans totalReçu la valeur d’une pièce non autorisée, il nous faut modifier la valeur de la pièce dans l’étiquette default de la structure switch par l’instruction : Default : Pièce = 0 ; printf (« pièce interdite « ) ;
Ainsi lorsqu’une « mauvaise » pièce est e st introduite, la variable pièce prend la valeur 0 afin de ne pas modifier indûment la variable totalReçu. On viens de faire le plus difficile, reste a afficher les différentes valeurs correspondantes au nombre de pièces comptées et au montant total calculé. On utilisera des instructions du genre : printf printf printf printf printf
(« vous avez entré : « ) ; («%d pièce(s) de 5 cents \n», nbPièce5c) ; («%d pièce(s) de 10 cents \n », nbPièce10c) ; («%d pièce(s) de 20 cents \n », nbPièce20c) ; (« soit au total : %d cents \n », totalReçu) ;
Question : est où place t’on ces instructions ? Avant le test de sortie de la boucle,
bien sûr ! (Puisque les valeurs calculées sont à afficher, chaque fois que l’utilisateur entre une pièce.) Troisièmement : Le prix fixé est il atteint ou dépassé
Quand le montant du prix est atteint, le programme le signale par l’instruction : printf (« Merci, je vous donne votre boisson ! ») ;
Enfin il nous reste un dernier détail à régler, la détection du trop perçu : on test si la variable totalReçu dépasse 45, et si tel est le cas, on calcul la monnaie à rendre : If (totalReçu > 45) printf (« et je vous rends %d-45 cents\n », totalReçu) ;
Voilà, c’est ici que je vous quitte. J’ai fait le gros de l’analyse et je vous laisse le soin de réaliser le programme complet…que nous appellerons CompteurMonnaie.c (par exemple).
FIN