Champ Valeur
Auteur·e Élise
Édition 2023-12-15
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_1, droits en lecture à delivery_collector

1. Barème

Critères Points
Exo 1: print z 1
Exo 2: sortie 79 1
Exo 3: swap_int 2
Exo 4: save_if_larger 2
Exo 5: strlen 2
Exo 6: structure 3
Exo 7: strcpy 3
Exo 8: strdup 4
Exo 9: atoi 4
Exo 10: print_base10 5
Points accessibles 27
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

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 : print z

Fichier·s à rendre : print_z.c Fonction·s autorisée·s : write

Écrivez un programme qui affiche la lettre z minuscule, suivie d’un retour à la ligne sur la sortie standard.

Exercice 2 : sortie 79

Fichier·s à rendre : exit_79.c Fonction·s autorisée·s : aucune

Écrivez un programme dont le code de sortie est 79.

Exemple de commandes pour tester le code de sortie de votre programme :

gcc -Wall -Wextra -Werror exit_79.c
./a.out
echo $?

Exercice 3 : 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 4 : save if larger

Fichier·s à rendre : exam.h, save_if_larger.c, save_if_larger.main.c Fonction·s autorisée·s : aucune

Écrivez la fonction save_if_larger. Elle doit prendre en paramètre un int et un pointeur sur int.

Si l’int passé en premier paramètre est plus grand que la valeur pointée par le second :

  • remplacez la valeur pointée par la valeur du premier paramètre.
int save;

save = 0;
save_if_larger(12, &save);
// save vaut maintenant 12

save_if_larger(10, &save);
// save vaut toujours 12 après cet appel

save_if_largger(789, &save);
// save vaut maintenant 789

Écrivez le main de test de cette fonction dans save_if_larger.main.c.

Ajoutez le prototype de votre fonction dans exam.h.

Exercice 5 : strlen

Fichier·s à rendre : exam.h, strlen.c, strlen.main.c Fonction·s autorisée·s : aucune

Écrivez la fonction stu_strlen. Elle doit prendre en paramètre une chaîne de caractères terminée par un octet nul et renvoyer sa taille (en excluant le terminateur nul).

const char *str = "toto";

printf("%d\n", stu_strlen(str));
// affiche 4

Écrivez le main de test de cette fonction dans strlen.main.c.

Ajoutez le prototype de votre fonction dans exam.h.

Exercice 6 : structure

Fichier·s à rendre : operation.h Fonction·s autorisée·s : aucune

Écrivez le fichier operation.h. Il doit contenir la structure et l’énumération nécessaires à la compilation de cette fonction :

int run_op(struct operation *op)
{
    int res;

    if (op->kind == OP_ADD) {
        res = op->lhs + op->rhs;
    } else if (op->kind == OP_SUB) {
        res = op->lhs - op->rhs;
    } else if (op->kind == OP_MUL) {
        res = op->lhs * op->rhs;
    } else if (op->kind == OP_DIV) {
        res = op->lhs / op->rhs;
    } else if (op->kind == OP_MOD) {
        res = op->lhs % op->rhs;
    } else {
        res = 0;
    }
    return res;
}

Exercice 7 : strcpy

Fichier·s à rendre : exam.h, strcpy.c, strcpy.main.c Fonction·s autorisée·s : aucune

Écrivez la fonction stu_strcpy. Elle prend deux paramètres :

  • l’adresse destination de la copie ; et
  • une chaîne de caractère à copier.

Écrivez le main de test de cette fonction dans strcpy.main.c.

Ajoutez le prototype de votre fonction dans exam.h.

Exercice 8 : 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 dans une zone mémoire nouvellement allouée.

Écrivez le main de test de cette fonction dans strdup.main.c.

Ajoutez le prototype de votre fonction dans exam.h.

Exercice 9 : 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 123123 ;
  • “-4” donne 4-4 ;
  • “789” donne 789789 ;
  • etc.

Écrivez le main de test de cette fonction dans atoi.main.c.

Ajoutez le prototype de votre fonction dans exam.h.

Exercice 10 : 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.

Fin : avant de partir

Avant de sortir de la salle d’examen :

  • vérifiez bien avoir add, commit et push vos exercices et leur main de test ;
  • assurez-vous de ne pas avoir rendu de fichiers temporaires #*#, *~ ou de fichier compilés a.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.