diff --git a/slides/examen.md b/slides/examen.md new file mode 100644 index 0000000000000000000000000000000000000000..e6be7f01589eae178e734ef2256e7c6cc1609320 --- /dev/null +++ b/slides/examen.md @@ -0,0 +1,110 @@ +--- +title: "Précisions pour l'examen" +date: "2024-11-06" +--- + +# Administration + +- L'examen se déroule sur `nexus`. +- L'examen dure au plus 4h (il est prévu pour 3 exceptions jusqu'à 4). +- Votre code devra être dans le répertoire prévu à cet effet. +- Chaque exercice dans un répertoire (`ex1`, `ex2`, `ex3`, ...). +- Chaque exercice doit posséder son propre `Makefile` pour la compilation. + - Il est impératif de compiler avec les warnings. + - Vous devez être capables d'écrire la lifne de compilation de votre code. + +# Documents + +- On fournit: + - Les slides d'algorithmique. + - Les slides de programmation séquentielle. +- Vous pouvez avoir: + - Une feuille A4 recto-verso ***manuscrite***. + +# Les exercices + +- Deux ou trois parties à chaque énoncé: + - Une partie "théorique" qui décrit les structures de données et fonctionnalités. + - Une partie "technique" qui propose un exemple d'exécution de votre programme avec entrées et sorties. + - Une partie "exemple" (pas obligatoire) où d'autres exemples sont donnés afin de tester l'exécution de votre programme. +- Votre code doit avoir **exactement** le comportement des exemples donnés **sous peine de sanctions**. +- Chaque code doit être **dans un unique fichier .c** (`ex1.c`, `ex2.c`, ...). +- Donc **inutile** et **interdit** d'écrire d'autres fichiers + +# Évaluation (technique) + +- L'évaluation se base surtout sur des critères de fonctionnement: + - le code compile-t-il? (on regarde même pas si la réponse est non) + - s'exécute-t-il? (on regarde un peu) + - le code demandé est-il réalisé? + - donne-t-il des résultats corrects? + - votre code possède-t-il des comportements indéfinis? +- Si vous laissez des warnings vous serez pénalisé·e·s. + +# Évaluation (style) + +- Le code est-il joli? + - Présentation (indentation cohérente, variables nommées de façon raisonnable). + - Modularité (utilisation de fonctions). + - Pas de variables globales inutiles. + - Utilisation de boucles, structures de contrôle, struct, ... + - Fonctions récursives, ... + +# Les exemples + +- Chaque exemple contient: + - un input à rentrer à la ligne de commande (on peut copier-coller l'input de l'énoncé). + - un output à écrire dans le terminal (on peut comparer la sortie avec celle de l'énoncé). +- La structure de l'input doit être **exactement** la même que celle décrite dans l'énoncé. +- Pour l'input il faut impérativement utiliser `argc` et `argv[]`. +- L'output de vos exercices doit être celui de l'énoncé. + +Et maintenant place à des exemples (simplifiés)! + +# Exercice 1 + +Ce programme prend en argument deux entiers et affiche +leur somme sur une nouvelle ligne. + +## Exemple + +```bash +./prog 12 19 + +31 +``` + +# Exercice 2 + +\footnotesize + +Ce programme prend en argument un nombre entier `N` puis des nombres à virgule flottante. +Il y aura exactement `N` nombres à virgule flottante. +Ensuite, votre programme multiplie chaque nombre à virgule flottante par deux et affiche la somme +sur une nouvelle ligne suivi de CHF. + +## Exemple + +```bash +./prog 12 12.2 45.5 1.5 65.1 89.4 567.6 112.8 67.0 35.1 112.2 3.3 9.8 + +2243.000000 CHF +``` + +# Exercice 3 + +Ce programme prend en argument 2 chaînes de caractères (longueur max de 80), +les sépare au milieu et retourne les 4 chaînes chacune sur une nouvelle ligne +(si la longueur N est paire on sépare en 2 chaînes de longueur N/2, sinon la première +aura une longueur de N/2 et la seconde N/2+1). + +## Exemple + +```bash +./prog abcdefgh asdfghjkl + +abcd +efgh +asdf +ghjkl +``` diff --git a/slides/ligne_de_commande_c.md b/slides/ligne_de_commande_c.md new file mode 100644 index 0000000000000000000000000000000000000000..053518d0562448aad6f871e0dbe6122b9670c2ae --- /dev/null +++ b/slides/ligne_de_commande_c.md @@ -0,0 +1,95 @@ +--- +title: "La ligne de commande" +date: "2024-11-06" +--- + +# La ligne de commande (1/4) + +* Ou comment passer des arguments à un programme en C. + +## Point d'entrée d'un programme + +- Le point d'entrée est la fonction `main()`{.C}. +- Elle peut être déclarée de 4 façon différentes: + 1. `void main()`{.C}. + 2. `int main()`{.C}. + 3. `void main(int argc, char **argv)`{.C}. + 4. `int main(int argc, char *argv[])`{.C}. + +- `argc`{.C} est le nombre d'arguments passés à la ligne de commande: **le premier est celui du programme lui-même**. +- `argv`{.C} est un tableau de chaînes de caractères passés sur la ligne de commande. + +# La ligne de commande (2/4) + +## Exemple d'utilisation + +Pour la fonction dans le programme `prog` + +```C +int main(int argc, char **argv) +``` + +Pour l'exécution suivante on a + +```bash +./prog -b 50 file.txt +``` + +```C +argc == 4 +argv[0] == "prog" +argv[1] == "-b" +argv[2] == "50" +argv[3] == "file.txt" +``` + +# La ligne de commande (3/4) + +## Conversion des arguments + +- Les arguments sont toujours stockés comme des **chaînes de + caractères**. +- Peu pratique si on veut manipuler des valeurs numériques. +- Fonctions pour faire des conversions: + + ```C + int atoi(const char *nptr); // de la chaîne en entier + double atof(const char *nptr); // de la chaîne en nombre à virgule flottante + int snprintf(char *str, size_t size, + const char *format, ...); + // str: buffer, size: taille en octets max à copier, + // format: cf printf(), ret: nombre de char lus + ``` + +# La ligne de commande (4/4) + +## Exemple d'utilisation + +\footnotesize + +```C +#include <stdio.h> +#include <stdlib.h> +#include <libgen.h> +int main(int argc, char **argv) { + if (argc != 3) { + char *progname = basename(argv[0]); + fprintf(stderr, "usage: %s name age\n", progname); + return EXIT_FAILURE; + } + // argv[0] est le nom du programme on l'ignore + // le 1er argument est une chaîne de caractères (pas de conversion) + char *name = argv[1]; + int age = atoi(argv[2]); // le 2e argument est un entier (conversion) + printf("Hello %s, you are %d years old.\n", name, age); + return EXIT_SUCCESS; +} +``` + +. . . + +```bash +$ ./prog Paul 29 +Hello Paul, you are 29 years old. +``` +