Tour de PLaTon pour le C
Nicolas Borie, 07 February 2020
Voici un petit tour des contenus opérationnels pour le langage C. Ces exercices de programmation ont déjà été utilisés pour renforcer les acquis des élèves en programmation C. Ce sont principalement des exercices utilisant un grader opérant une série de tests du type (arguments du programme + entrée standard) –> (sortie standard).
Les sorties standards sont auto-générées par un code source secret établit par l’enseignant éditeur de l’exercice. À chaque soumission d’élève, le code proposé est compilé puis exécuté si possible pour faire une comparaison des sorties standards générés par le code de élève comparé à celui du prof. Le test est valide si les sorties sont exactement les mêmes (attention comparaison au retour chariot près ‘\n’).
Les exercices qui suivent ont été utilisés uniquement en autonomie mais pour des élèves relativement avancés (en BAC+3). Ce sont des élèves qui ont déjà un peu appris à apprendre. Les exercices sont classé par thème, du plus simple au plus avancé. Les premiers exercices sont triviaux, les derniers exercices sont relativement difficiles.
Pour toute précision facilitant ré-utilisation, mutualisation, correction (énoncé, orthographe, …), le mieux est encore de me joindre par mail à prénom point nom arobase u-pem point fr ou d’aller directement corriger les ressources dans l’éditeur de PLaTon.
Nicolas Borie.
Premier programme, notion de programme C
- Premier programme C, ça commence par un “Hello World”.
- Ordonner quelques appels de fonctions dans un main.
- Les étapes de compilation durant un appel à gcc.
- Assembler deux fonctions pour en fabriquer une troisième.
- Les caractéristiques du langage C.
- Écrire un programme qui affiche ses arguments.
Les variables en C
- Les caractéristiques des variables en langage C.
- Identifier les identificateurs légaux pour des variables en C.
- Identifier des right values (valeur stockable) en C.
- Identifier des left values (conteneur affectable) en C.
- Ordonner quelques taille mémoire de variables.
- Associer variable et objet modélisé.
Les types de base
- Lecture de quelques types de base.
- Ordonner les tailles mémoires des types entiers basiques.
- Corriger une erreur de type 1.
- Corriger une erreur de type 2.
- Corriger une erreur de type 3.
- Articulation entiers caractères pour les valeurs ASCII en C.
Écrire des fonctions en C
- Écrire une fonction mettant au cube un entier passé par adresse.
- Écrire une fonction calculant un polynôme aléatoire (tirage dans une liste finie hardcodée).
- Rechercher la première voyelle dans une chaîne de caractère.
- Écrire une fonction qui opère un incrément (en argument) sur une variable entière passée par adresse.
- Écrire une fonction qui dessine un triangle en ASCII art à partir d’une taille donné.
- Écrire une fonction qui retourne le maximum de trois entiers.
- Écrire une fonction qui retourne le minimum de trois entiers.
- Écrire une fonction qui retourne la moyenne de trois entiers.
- Associer prototypes et fonctionnalités sur quelques exemples.
- Écrire une fonction qui calcule des puissances entières.
Notion de tableaux
- Appliquer un traitement (mettre au carré) sur toutes les entrées d’un tableau.
- Calculer la moyenne des éléments d’un tableau d’entiers.
- Écrire une fonction qui affiche un tableau d’entiers.
- Écrire une fonction qui recherche l’index de la première occurrence d’un élément dans un tableau.
- Écrire une fonction qui initialise un tableau à deux dimension (tableau statique, non alloué dynamiquement et à tailles connues).
- Écrire une fonction qui initialise avec les premiers carrés parfaits un tableau d’entiers.
- Écrire une fonction qui calcule la somme des éléments positifs d’un tableau.
Chaînes de caractères
- Écrire une fonction qui calcule la longueur d’une chaîne de caractères.
- Écrire une fonction qui compte les occurrences d’un caractère donné dans une chaîne.
- Écrire une fonction qui compte le nombre de lettres minuscules dans une chaîne de caractères.
- Écrire une fonction qui encadre avec des dièses une chaîne de caractères.
- Écrire une fonction qui détecte une sous-chaîne dans une chaîne.
- Écrire une fonction qui détecte si une chaîne représente un nombre entier relatif.
- Écrire un programme qui détecte le plus long de ses arguments.
- Écrire une fonction qui met en majuscules toutes les lettres d’une chaîne.
Définir et utiliser des structures
- Définir une structure pour des points entiers en dimension 2.
- Définir une structure modélisant une personne.
- Définir une structure modélisant un plateau de jeu rectangulaire.
- Écrire une fonction calculant le produit scalaire de deux vecteurs en dimension 3.
- Définir une structure modélisant les jours de la semaine.
- Définir une structure d’énumération pour des valeurs précisées.
- Définir une structure pour modéliser une couleur avec sa fonction d’allocation.
- Exercice où l’on définit deux structures simples emboîtées.
- Définir un tableau de structures simples.
Les macros et directives préprocesseur
- Manipuler la macro prédéfinie DATE pour faire une fonction qui affiche la date de compilation dans un programme.
- Établir quelques macros constantes pour un interface graphique.
- Définir une macro à paramètre calculant un carré.
- Mettre une macro de sécurisation pour éviter des appels multiples.
- Définir une macro à paramètres qui se substitue au minimum des deux arguments.
- Écrire une macro à paramètre utilisant l’opérateur transformant en chaîne un paramètre de macro.
Notions d’entrées/sorties
- Faire un programme qui calcule la somme de deux entiers entrés au clavier.
- Faire un programme qui récupère puis affiche une ligne complète de l’entrée standard.
- Faire un programme qui retourne une nouvelle structure à partir d’information lu sur l’entrée standard.
- Faire un programme qui affiche le produit de tous ses arguments flottants.
- Faire un programme qui affiche le nombre d’entiers non nuls apparaissant sur l’entrée standard durant son exécution.
- Écrire un programme qui calcule le nombre de caractères sur l’entrée standard.
- Écrire un programme qui affiche tous les mots reçus sur l’entrée standard de manière triée.
Récursivité en C
- Calculer la factorielle d’un entier.
- Calculer la suite de Fibonacci récursivement.
- Implémenter une fonction qui calcule les valeurs d’Ackermann.
- Calculer les nombres binomiaux récursivement.
- Calculer la somme des chiffres apparaissant dans un nombre.
- Implémenter un critère de divisibilité par 7.
- Faire un égrenage récursif des nombres entiers.
- Calculer des puissances entières via l’exponentiation rapide.
- Implémenter un algorithme calculant le PGCD de deux entiers seulement avec des soustractions et des divisions par deux (algo logarithmique comme Euclide).
- Algorithme déterminant une zone contiguë dans un tableau à deux dimensions (algo similaire à la coloration de zone).
- Coder le problème du sac à dos en langage C.
- Coder un tri récursif non rapide mais mieux que quadratique.
Allocation dynamique
- Procéder à une allocation simple de tableau à une dimension.
- Déterminer le nombre d’appels à malloc à procéder suivant les situations.
- Rappel des règles d’or d’usage de malloc à Marne-la-Vallée (L3 et ESIPE à minima pour du C ansi).
- Déterminer quand doit-on raisonnablement utiliser malloc.
- Allouer correctement une structure à deux chaînes de caractères.
- Écrire une fonction d’allocation de cellule pour liste chaînée de double.
- Écrire une fonction d’allocation pour liste chaînée de mots.
- Écrire une fonction d’allocation pour matrice carrée d’entiers.
- Allouer un tableau de chaînes de caractères lues au clavier.
Les opérateurs bit à bit
- Coder une fonction comptant le nombre de bits à 1 dans une zone mémoire.
- Coder une fonction faisant un miroir binaire dans un octet.
- Coder une fonction déterminant la taille du paquet de bits à 1 de poids faible dans un octet.
- Écrire une fonction comptant le nombre d’alternances de bits dans un entier long positif.
- Écrire une fonction qui détecte le motif 1101 dans la donnée binaire d’un entier long positif.
- Écrire une fonction qui détermine la taille du plus grand paquet de bits consécutifs de même valeur dans une zone mémoire.
- Écrire une fonction qui opère un miroir binaire dans une zone mémoire.