Voici votre examen de C ZZ1. Lisez tout le sujet avant de commencer : un certain nombre de tests ont été écrits pour être indépendants ou avec peu d'influence sur les autres.
L'épreuve dure 1h50min sans tiers temps. Tous les appareils électroniques sont interdits (sauf le PC devant vous). L'usage de l'IA est également interdit.
Les supports de cours distribués et annotés par vos soins sont autorisés mais pas les photocopies des cours des voisins.
À la fin de l'examen, vous devez transmettre le source/répertoire d'un programme qui compile. Une icône du bureau "Post Exam" permet de choisir et d'envoyer le répertoire. Il est de votre responsabilité de soumettre avant la fin de l'examen.
Le code demandé est à placer dans les deux fichiers code.h et code.c.
Ne changez pas la casse et n'ajoutez pas de fichier, cela casserait la chaine de compilation et engendrerait une note nulle.
Vous pouvez modifier main.c si nécessaire
La ligne de compilation est la suivante :
make
Si besoin, vous pouvez faire un make clean.
Ne jamais recommenter un test qui a réussi. Tous les tests décommentés doivent compiler dans le même temps (sauf mention contraire).
VS Code n'est qu'un éditeur : les erreurs éventuellement affichées ne font pas foi.
Pour garder une trace exécutable de votre programme sans stress supplémentaire :
Bon courage et bonnes courses !!!
Nous voulons faire des courses dans un magasin. Pour cela, nous avons une liste des choses que nous voulons acheter. Le magasin a un certain nombre de produits en stock, ce stock évolue naturellement en fonction des achats.
Un stagiaire s'amuse avec les étiquettes du magasin.
Les étiquettes peuvent mélanger les majuscules et les minuscules, ce qui n'est pas très esthétique.
Vous devez coder pour votre premier test la fonction minuscules() qui tranforme la chaine de caractères donnée en
paramètre en minuscules [MINUSCULES].
Pour cette fonction et uniquement celle-ci, vous ne devez pas utiliser la bibliothèque string.h
Le stagiaire a aussi créé des étiquettes à l'envers. Coder donc une fonction inverser() pour remettre à l'endroit l'étiquette dont le texte est donné en paramètre.
Dans le fichier d'entête, vous trouverez une structure stock_s qui spécife le nombre de produits présents en stock,
ainsi qu'un tableau des produits.
Pour chaque produit, vous disposez d'un nom, d'une description, d'un prix
et d'une quantite.
Les tableaux utilisés ont une taille fixée à la compilation. Pour plus de simplicité, on n'utilise qu'une seule constante symbolique pour les différents tableaux. On fait l'hypothèse que l'on n'est jamais dans une situation où un tableau est trop petit.
La fonction afficher_stock(FILE*) décrit le contenu du stock dans le fichier donné en paramètre.
Il n'est pas nécessaire ni d'ouvrir ni de fermer le fichier dans cette fonction. Le modèle attendu est donné par les tests. Les chaines de format %15s %4d %6.2f permettent respectivement d'afficher une chaine de caractères sur 15 caractères, un entier sur 4 caractères et un nombre réél sur 6 caractères dont 2 pour la partie décimale.
Implémenter la fonction afficher_stock(FILE*) [STOCK1] [STOCK4].
La fonction total_stock() permet d'obtenir le nombre total de produits du stock.
Implémenter total_stock() [STOCK2] [STOCK5]
La fonction valeur_stock() permet d'obtenir la valeur totale des produits du stock.
Implémenter valeur_stock() [STOCK3] [STOCK6]
La fonction ajouter_stock() permet d'ajouter un nouveau produit au stock.
Implémenter ajouter_stock() [AJOUT1] [AJOUT2]
La fonction rechercher_stock() permet de chercher un produit dans le stock.
La fonction renvoie l'adresse de ce produit ou NULL si le produit n'est pas présent.
Implémenter rechercher_stock() [RECHERCHE1] [RECHERCHE2]
Copier-coller la fonction ajouter_stock() pour ne pas perdre votre code avant de modifier la fonction.
La fonction permet d'ajouter un produit même quand il est déjà présent en stock mais sans créer de doublon. Par exemple, si on ajoute 5L de lait alors qu'il y en a déjà 10L en stock, on modifie l'entrée déjà présente pour avoir désormais 15L de lait. Le prix du lait et la description du lait sont mis à jour également en gardant les dernières valeurs données.
Modifier ajouter_stock() [AJOUT3] [AJOUT4]
Copier-coller ENCORE UNE FOIS la fonction ajouter_stock() avant de modifier la fonction.
La liste des produits en stock est triée suivant l'ordre lexicographique des noms de produits.
Modifier ajouter_stock() pour prendre en compte le tri [TRI1] [TRI2]
Pour faire les courses en magasin, il faut une LISTE codée comme il se doit par une chaînée simple à tête réelle.
La fonction afficher_liste() permet d'afficher dans le fichier donné en paramètre, la liste de courses avec les quantités voulues en paramètres.
Implementer afficher_liste() [LISTE1] [LISTE2]
La fonction magasiner() (verbe en bon québecois) permet de faire ses courses. La liste de courses est modifiée en fonction de ce qu'il y a en stock. Le stock est modifié en conséquence. La fonction retourne le coût des courses.
Dans l'exemple, on veut du brocolis mais il n'y en pas en stock : la quantité est mise à zéro dans la liste de courses. On veut également des oeufs mais on en veut plus que ce qu'il y a en stock (et oui, il parait que le marché est en tension actuellement). La liste de courses contient ce que l'on a pu vraiment prendre et le stock est naturellement mis à zéro.
Implémenter magasiner() [LISTE3] [LISTE4]
Comme vous pouvez le lire, les questions précédentes n'utilisaient pas de liste chaînée. Le dernier test corrige cela.
Compléter les fonctions initialiser_liste(), detruire_liste() et inserer_liste() [LISTE5]
Préparation du compte (1 fois, au début) :
git config --global user.name "un_nom"
git config --global user.email "un_mail"
Préparation du répertoire :
git init
À chaque nouveau fichier:
git add fichier
git add *
Sauvegarder / Committer :
git commit -am "commentaire"
git log permet d'avoir la liste des sauvegardes avec un numéro de hachage
Pour revenir en arrière :
git checkout numero_de_hash
OU git revert numero_de_hash