Exam Machine 2
| Champ | Valeur |
|---|---|
| Auteur·e | Élise |
| Édition | 2024-01-31 |
| Durée | 3 heures, sortie autorisée après 1 h 30, sortie impossible pendant les 10 dernières minutes |
| Taille des équipes | 1 personne |
| Rendu | via git, dépôt 2023_exam_2, droits en lecture à delivery_collector |
1. Barème
| Critères | Points |
|---|---|
| Exo 1 : swap_int | 2 |
| Exo 2 : strcpy | 2 |
| Exo 3 : strdup | 2 |
| Exo 4 : array to int | 2 |
| Exo 5 : print_base10 | 4 |
| Exo 6 : print_base | 5 |
| Exo 7 : Tableau d’int | 5 |
| Exo 8 : Foreach | 4 |
| Points accessibles | 26 |
| Malus par ligne contenant une faute de norme | -0,5 |
| Malus dépôt sale (fichier temporaires, compilés, etc.) | -5 |
| Note maximale | 20 |
2. Règlement
Cet examen est à faire strictement seul. La communication et l’accès à internet sont interdits.
Vous avez le droit de vous présenter avec une antisèche manuscrite au recto d’une feuille A5.
Vous devez respecter les règles de normalisation suivantes : https://git.ecole-89.com/eriizu/coding_style/src/branch/main/norm.md
Le non-respect de la norme vous fera perdre une partie ou la totalité des points qui auraient pu être acquis, sur l’ensemble du rendu.
2.a. Instructions de rendu
Respectez à la lettre les noms de fichiers et leur emplacement dans le dépôt de rendu. S’il vous est demandé de rendre un fichier nommé hello.c sans qu’un nom de dossier soit précisé : rendez un fichier hello.c à la racine de votre dépôt.
La présence d’une étoile * signifie que le nom du fichier peut être n’importe lequel dès lors qu’il porte l’extension ou l’affixe (préfixe/suffixe) demandée. Elle signifie aussi qu’il est possible de rendre plusieurs fichiers.
La présence d’une double étoile ** signifie que les fichiers peuvent être placés n’importe où dans un dossier, y compris dans des sous-dossiers.
Pensez à faire des commits et des push fréquemment. Autrement nous ne pouvons pas vous aider à retrouver vos fichiers perdus.
2.b. Fonctions autorisées et interdites
Par défaut, toute fonction système (comme write) ou fonction des bibliothèques (comme printf ou puts) sont interdites.
À chaque exercice vous sera donné une liste de fonctions autorisées, le cas échéant.
2.c. main de test
Chaque fois que vous devez rendre une fonction, vous devez aussi rendre un fichier *.main.c. Il s’agit du fichier qui doit contenir votre main de test.
Vous devez écrire des tests pour voir si votre fonction à le bon comportement.
2.d. Correction du code source en C
Tout le code source sera compilé avec les drapeaux suivants :
-Wall -Wextra -Werror
Testez votre code avec ces drapeaux pour que le compilateur vous informe de tout ce qui peut poser problème avec votre programme avant de le rendre.
Pour tester qu’un fichier sans main compile, vous devez le compiler contre un second fichier qui lui contient un main.
gcc -Wall -Wextra -Werror example.c example.main.c
3. Resource : putchar
Si dans un exercice vous avez le droit à write, vous avez le droit d’y recopier la fonction suivante qui est capable d’afficher un caractère :
#include <unistd.h>
void tc_putchar(char c)
{
write(1, &c, 1;
}
Exercice 1 : swap int
Fichier·s à rendre : exam.h, swap_int.c, swap_int.main.c
Fonction·s autorisée·s : aucune
Écrivez la fonction swap_int. Elle doit prendre en paramètre deux pointeurs sur int. Elle ne renvoie rien.
Son métier est d’intervertir les valeurs des deux nombres pointés.
int a;
int b;
a = 12;
b = 113;
swap_int(&a, &b);
// a vaut maintenant 113 et b 12.
Écrivez le main test de cette fonction dans swap_int.main.c.
Créez le fichier exam.h. Il doit contenir un ifndef/define/endif ainsi que le prototype de votre fonction swap_int.
Exercice 2 : strcpy
Fichier·s à rendre : exam.h, strcpy.c, strcpy.main.c
Fonction·s autorisée·s : aucune
Écrivez la fonction stu_strcpy qui se comporte comme la strcpy de la bibliothèque standard. Elle copie la chaîne en deuxième argument, caractères par caractères, dans la zone mémoire reçue en premier argument. Elle renvoie le premier argument.
La zone mémoire du premier argument doit être suffisamment grande pour accueillir la copie, dont le terminateur nul.
C’est à la fonction appelante de s’assurer qu’il y a suffisamment de mémoire allouée.
Ajoutez son prototype de votre fonction dans exam.h.
Écrivez le main test de cette fonction dans strcpy.main.c.
Exercice 3 : strdup
Fichier·s à rendre : exam.h, strdup.c, strdup.main.c
Fonction·s autorisée·s : malloc
Écrivez la fonction stu_strdup. Elle prend un paramètre la chaîne à copier.
Son métier est le même que la fonction strdup originale dont vous pouvez tester le comportement. Vous pouvez aussi consulter sa page de manuel.
stu_strdup renvoie une chaîne de caractères nouvellement allouée et qui est une copie de la chaîne reçue en argument.
Écrivez le main test de cette fonction dans strdup.main.c.
Exercice 4 : array to int
Fichier·s à rendre : exam.h, atoi.c, atoi.main.c
Fonction·s autorisée·s : Aucune
Écrivez la fonction stu_atoi. Elle doit prendre une chaîne de caractères en paramètre et renvoyer un nombre entier.
Son métier est d’extraire un nombre contenu dans la partie initiale de la chaîne :
- “123abc” donne ;
- “-4” donne ;
- “789” donne ;
- etc.
Écrivez le main de test de cette fonction dans atoi.main.c.
Ajoutez le prototype de votre fonction dans exam.h.
Exercice 5 : print_base10
Fichier·s à rendre : exam.h, print_base10.c, print_base10.main.c
Fonction·s autorisée·s : write
Écrivez la fonction print_base10. Elle prend un nombre entier en paramètre et elle renvoie le nombre de caractères qu’elle a imprimé.
Son métier est d’afficher sur la sortie standard le nombre passé en paramètre (avec son signe s’il est négatif).
Écrivez le main de test de cette fonction dans print_base10.main.c. Vous ne pouvez pas facilement vérifier ce que la fonction a écrit sur la sortie standard, mais vous pouvez vérifier le nombre de caractères qu’elle a réussi a imprimer.
Ajoutez le prototype de votre fonction dans exam.h.
Exercice 6 : print_base
Fichier·s à rendre : exam.h, print_base.c, print_base.main.c
Fonction·s autorisée·s : write
Écrivez la fonction print_base. Elle a deux paramètres :
- un nombre entier à afficher,
- une chaîne de caractères représentant la base.
Son métier est d’afficher sur la sortie standard le nombre passé en paramètre (avec son signe s’il est négatif) en utilisant les caractères de la base reçue en argument pour l’affichage.
Écrivez le main de test de cette fonction dans print_base.main.c. Vous ne pouvez pas facilement vérifier ce que la fonction a écrit sur la sortie standard, mais vous pouvez vérifier le nombre de caractères qu’elle a réussi a imprimer.
Ajoutez le prototype de votre fonction dans exam.h.
Exemples :
print_base(123, "0123456789")afficheprint_base(123, "zABCDEFGHI")affiche “ABC”print_base(5, "01")affiche “101”print_base(123, "01")affiche “1111011”print_base(15, "0123456789ABCDEF")affiche “F”print_base(255, "0123456789ABCDEF")affiche “FF”print_base(89, "0123456789ABCDEF")affiche “59”
Exercice 7 : Tableau d’int
Fichier·s à rendre : intarr.h, intarr.c, intarr.main.c
Fonctions autorisée·s : malloc, free.
Créez une structure intarr dans votre intarr.h avec les champs suivants :
- un pointeur sur
intpour les données du tableau ; - un entier non signé qui représente la taille utilisée du tableau ;
- un entier non signé qui représente la capacité allouée du tableau.
Implémentez la fonction intarr_create. Elle prend en paramètre la capacité initiale avec laquelle elle doit allouer le tableau. Elle doit renvoyer un pointeur sur struct intarr avec à l’intérieur un tableau alloué et les deux entiers non signés inutilisés correctement.
Implémentez la fonction intarr_delete. Elle prend en paramètre un pointeur sur structure intarr. Elle libère la mémoire allouée pour le tableau d’int et pour l’instance de la structure tels que vous les avez alloué dans intarr_create.
Implémentez la fonction intarr_push. Elle prend en paramètre un pointeur sur structure intarr et un nombre entier. Elle renvoie un nombre entier.
S’il y a de la place dans le tableau (la taille n’a pas atteint la capacité), ajoutez l’élément à la suite et renvoyez 1. Si la taille est égale à la capacité, refusez d’ajouter l’élément et renvoyez 0.
Implémentez la fonction intarr_sum. Elle prend en paramètre un pointeur sur structure intarr et elle renvoie le somme de tous les nombres stockés.
Implémentez la fonction intarr_avg. Même signature que sum mais elle renvoie moyenne de tous les nombres stockés. Attention aux divisions par 0.
Écrivez les tests de toutes les fonctions implémentées dans intarr.main.c.
Exercice 8 : Foreach
Fichier·s à rendre : intarr.h, intarr_foreach.c, intarr_foreach.main.c
Fonctions autorisée·s : Aucune
Implémentez la fonction intarr_foreach. Elle prends en paramètre :
- un pointeur sur structure
intarr; et - un pointeur sur fonction qui renvoie
voidet admet uninten paramètre.
intarr_foreach doit appeler la fonction pointée pour chaque élément du tableau.
Vous avez bien lu, votre fonction doit pouvoir recevoir en argument l’adresse d’une autre fonction et pour ce faire, vous aller découvrir une nouvelle syntaxe.
On peut déclarer une variable ou un paramètre comme étant un pointeur sur fonction avec la syntaxe suivante :
type_de_renvoi (*nom_de_la_variable)(paramètres_admis)
Prenons l’exemple d’une fonction add
int add(int a, int b)
{
return a + b;
}
Si on veut stocker son adresse dans une variable on doit le faire ainsi :
int main(void)
{
int (*op_fptr)(int a, int b);
int op_res;
op_fptr = add;
op_res = op_fptr(100, 13);
printf("%d\n", op_res);
}
Fin : avant de partir
Avant de sortir de la salle d’examen :
- vérifiez bien avoir
add,commitetpushvos exercices et leurmainde test ; - assurez-vous de ne pas avoir rendu de fichiers temporaires
#*#,*~ou de fichier compilésa.out,*.o,*.gch, etc. ; - vérifiez que votre code respecte bien la norme ;
- vérifiez ne pas avoir rendu de fonctions interdites.
Pour sortir de la salle avant la fin de l’épreuve, levez la main et demandez la permission de le faire. Les sorties sont se font en volontairement en canon pour éviter de déranger les étudiants qui n’ont pas fini l’épreuve. La sortie anticipée n’est plus possible dans les 10 dernières minutes, pour la même raison.