Champ Valeur
Auteur·e Élise
Édition 2023-10-17
Durée 1 sessions
Taille des équipes 1 personne
Rendu via git, dépôt $YEAR_ep_c2, droits en lecture à delivery_collector

Règlement

La réalisation de cet exercice est assujettie aux règles en vigueur dans l’école en matière de triche et de normalisation. Tricher vous expose à de graves sanctions.

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.

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.

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 fonction autorisées, le cas échéant.

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.

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

Exercices

Nombres pairs et impairs

Fichier·s à rendre : is_even.c, is_even.main.c, is_odd.c, is_odd.main.c Fonction·s autorisée·s : aucune

Écrivez les fonctions is_even (lit. est pair) et is_odd (lit. est impair) qui prennent chacune un paramètre de type int et qui renvoient une valeur de type int.

is_even doit renvoyer 1 lorsque le nombre reçu en paramètre est pair et 0 lorsqu’il ne l’est pas.

is_odd doit renvoyer 1 lorsque le nombre reçu est impair.

Exemple de is_even.main.c :

#include <stdio.h>

int is_even(int);

int main(void)
{
	if (is_even(2) == 1) {
		puts("2 is even!");
	} else {
		puts("this should be impossible! 2 can't be odd");
	}
}

Exécution du test :

$ gcc -Wextra -Wall -Werror is_even.c is_even.main.c
$ ./a.out
2 is even!

Écrire l’alphabet

Fichier·s à rendre : write_alphabet.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez un programme (votre fichier doit donc contenir un main) qui affiche l’alphabet de A à Z suivi par un retour à la ligne.

Impression descendante des chiffres

Fichier·s à rendre : write_desc_digit.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez un programme qui écrit sur la sortie standard les chiffres de 9 à 0, du plus grand au plus petit, suivis d’un retour à la ligne.

Halfabet

Fichier·s à rendre : write_halfabet.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez un programme qui écrit sur la sortie standard l’alphabet en lettres minuscules, en parant de A et en sautant une lettre sur deux, le tout suivi d’un retour à la ligne.

Majuscule

Fichier·s à rendre : capitalise.c, capitalise.main.c Fonction·s autorisée·s : aucune

Écrivez la fonction stu_capitalise qui prend en paramètre une lettre minuscule et renvoie la majuscule correspondante. Si le caractère reçu en paramètre n’est pas une lettre minuscule, renvoyez-le sans transformation.

char stu_capitalise(char letter);

La holà de l’alphabet

Fichier·s à rendre : write_waving_alphabet.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez un programme qui écrit, sur la sortie standard, l’alphabet en capitalisant une lettre sur deux et en commençant par une majuscule, le tout suivi d’un retour à la ligne.

Répéter un caractère

Fichier·s à rendre : repeat_char.c, repeat_char.main.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez une fonction qui affiche un caractère passé en paramètre autant de fois que demandé par le second paramètre.

void stu_repeat_char(char c, int n);

Écrivez également son test dans repeat_char.main.c.

Jet de dés

Fichier·s à rendre : roll_2d6.c Fonction·s autorisée·s : write (pour tc_putchar)

Écrivez un programme qui écrit toutes les combinaisons qu’il est possible d’obtenir en jetant 2d6 (deux dés à six faces). Aucune combinaison ne doit être répétée. Les combinaisons doivent être séparées par un espace. La dernière combinaison doit être immédiatement suivie d’un retour à la ligne.

Les combinaisons doivent apparaître par ordre croissant. Le plus petit nombre de chaque paire doit être affiché en premier de sorte que quelque chose comme “2-1” ne soit jamais affiché.

1-1 1-2 1-3 1-4 1-5 1-6 2-2 [exemple tronqué] 6-6

Puissance

Fichier·s à rendre : pow.c, pow.main.c Fonction·s autorisée·s : aucune

Écrivez une fonction qui prend un nombre de départ et une valeur d’exposant en paramètre. Renvoyez le nombre à la puissance de l’exposant donné.

int stu_pow(int nb, int power);

Exemples de puissances : 22=42^2=4, 216=655362^{16}=65536, 53=1255^3=125

int main(void)
{
	int res;

	res = stu_pow(2, 16);
	if (res == 65536)
		puts("ok");
	else
		puts("nok");	
}

Factorielle

Fichier·s à rendre : fact.c, fact.main.c Fonction·s autorisée·s : aucune

Écrivez une fonction qui renvoie la valeur factorielle du nombre passé en paramètre.

int stu_fact(int nb);

Vous pouvez consulter la page Wikipédia de la factorielle pour plus d’informations, mais voici quelques exemples :

  • 1!=11!=1 ;
  • 2!=2∗1=22!=2*1=2 ;
  • 3!=1∗2∗3=63!=1*2*3=6 ;
  • etc.

Quantité de chiffres dans un nombre

Fichier·s à rendre : nb_len.c, nb_len.main.c Fonction·s autorisée·s : aucune

Écrivez une fonction qui renvoie le nombre de chiffre que comporte un nombre.

int nb_len(int nb);

Exemple : le nombre 1525015250 a 5 chiffres. Le nombre 00 en a 1. Le nombre −124-124 en a 3.

Extraire un chiffre d’un nombre

Fichier·s à rendre : get_digit.c, get_digit.main.c Fonction·s autorisée·s : aucune

Écrivez une fonction qui extrait un chiffre à un nombre en prenant sa position dans le nombre. Pour cet exercice, la position 0 correspond au chiffre le moins fort (le plus à droite).

int get_digit(int nb, int index);

Dans le nombre 25613, les nombres aux différents positions sont :

  • 0 → 3
  • 1 → 1
  • 2 → 6
  • 3 → 5
  • 4 → 2

Imprimer un nombre en base 10

Fichier·s à rendre : print_base10.c, print_base10.main.c Fonction·s autorisée·s : write (pour tc_putchar)

Vous devez implémenter la fonction suivante :

int print_base10(int nb);

Elle prend en paramètre le nombre à imprimer et elle renvoie le nombre de caractères écrits, y compris le signe du nombre s’il était négatif.

Pensez à comment afficher les nombres positifs, négatifs ou nuls.

Évaluation – section en chantier

Les exercices de ce chapitre permettent de valider les compétences suivantes du module :

  • N1 compiler un programme, avec les drapeaux d’avertissements
  • N6 écrire une fonction pure qui admet un paramètre et renvoie une valeur calculée, à partir d’une description en langage naturel
  • N7 écrire une opération de reste de la division euclidienne pour determiner si un nombre est pair ou impair
  • N8 écrire un test si, sinon
  • N9 écrire une condition d’égalité ou de différence
  • N10 écrire un main de test pour une fonction pure qui affiche un message de réussite ou d’échec sur plusieurs cas, grâce à des tests si
  • N11 écrire une boucle qui affecte un index jusqu’à ce qu’il atteigne une certaine valeur littérale
  • N12 arithmétique qui à partir d’un caractère comme une lettre nous permet d’obtenir le suivant ou l’énième suivant
  • N13 écrire une boucle avec un caractère pour indice, ou un indice utilisé dans une opération avec un caractère
  • N14 écrire une condition qui compare une variable de type caractère à un littéral
  • N15 arithmétique qui à partir d’un caractère comme un chiffre nous permet d’obtenir le précédent ou l’énième précédent.
  • WIP

Ce barème est un témoin à but informatif de votre compréhension du chapitre, il était utilisé par le passé et est conservé comme référence :

Critère Points
Nombres pairs et impairs 1
Écrire l’alphabet 1
Impression descendante des chiffres 1
Halfabet 1
Majuscule 1
La holà de l’alphabet 2
Répéter un caractère 1
Jets de dés 3
Puissance 2
Factorielle 1
Quantité de chiffres 1
Extraire un chiffre 1
Imprimer un nombre en base 10 4
Total des critères 20
Malus par ligne en faute de norme -0,5
Malus dépôt sale -5