Cours C
Pôle Informatique 1A
ENS Mines Saint-Etienne
responsable : O. Boissier
Intervenants :  S. Albin, O. Boissier, M. Bratu, JP Farrugia, S. Hadjab, M. Morge, T. Murgue, X. Serpaggi, L. Vercouter
(Les documents ci-dessous sont issus de contributions de F. Aguiar, G. Mounier, S. Albin, J.M. Moreau, O. Boissier)


 

Aide sur l'utilisation du logiciel DJGPP

Aide sur le langage C (Syntaxe du langage)

Liens et documentations disponibles

Exercices d'apprentissage du langage C

    1. Séance 1: Syntaxe de base, notion de programme, types de base, variable, constantes littérales, opérateurs, structures de contrôle.
    2. Séance 2 : fonctions, passage par valeur, passage par référence, pointeur, structures, énumérations.
    3. Séance 3 : Tableaux à une ou plusieurs dimensions, récursivité
    4. Séance 4 : Allocation dynamique, Structuration des programmes, Fichiers, Instructions du préprocesseur

Séance 1 (7/12) :

Syntaxe de base, notion de programme, types de base, variable, constantes littérales, opérateurs, structures de contrôle.

Exemples de programmes, illustrations du cours :

  1. Télécharger ce fichier, debut.c, le compiler, l'exécuter.
  2. Télécharger ce fichier, analyse.c, le compiler, l'exécuter. Editer ce fichier et analyser le code source en essayant d'identifier les différents éléments syntaxiques (instructions, variables, commentaires, ...)
  3. Télécharger ce fichier, overwrite.c, le compiler, l'exécuter, comprendre les raisons des différents affichages que vous obtenez. Ce programme illustre les problèmes liés à l'affectation d'un flottant dans un entier.
  4. Télécharger ce fichier, var-init.c, le compiler, l'exécuter, comprendre les raisons des différents affichages que vous obtenez. Ce programme illustre les problèmes d'initialisation et de non-initialisation de variables.
  5. Télécharger ce fichier, aff-equal.c, le compiler, l'exécuter, comprendre les raisons des différents affichages que vous obtenez. Ce programme illustre les problèmes liés à la confusion entre test d'égalité (if (i == 3)) et une affectation (i = 3)).

Exercices avec leur solution :

  1. Utilisation de l'instruction conditionnelle. Télécharger le fichier suivant condition.c.
    1. Ajouter les instructions nécessaires pour que ce bout de code devienne un programme compilable et exécutable,
    2. Reformater correctement à l'aide de tabulations le code pour qu'il soit lisible et que l'on voit apparaître clairement les différentes conditions.
    3. Pour quelles valeurs de A et de B obtient-on les résultats : premier choix, deuxième choix, ... sur l'écran ? Pour quelles valeurs de A et de B n'obtient-on pas de réponse sur l'écran ?
    4. Compiler, exécuter le programme et vérifier vos réponses.
    5. Fichier solution condition.c
  2. Calcul de la valeur absolue d'une expression, solution : fabs.c
  3. Affichage des plus grand et plus petit entiers représentables en machine (regarder limits.h) par un int, solution : min-max-int.c
  4. Ecrire un programme qui lit trois valeurs entières au clavier et qui affiche la plus grande des trois valeurs. Plusieurs solutions sont possibles :
    1. if - else avec une variable d'aide "max", solution max.c,
    2. if - else if - ... - else sans variable d'aide, solution max.c,
    3. opérateur conditionnel et une variable d'aide "max", solution max.c,
    4. opérateur conditionnel sans variable d'aide, solution max.c.
  5. Ecrire un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe du produit de A et B sans faire la multiplication, solution mul.c.
  6. Ecrire un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe de la somme de A et B sans faire l'addition. Utiliser la fonction fabs de la bibliothèque standard déclarée dans <math.h>, solution somme.c.
  7. Ecrire un programme qui lit N nombres entiers au clavier et qui affiche leur somme, leur produit et leur moyenne. Le nombre N est à entrer au clavier. Choisir la structure itérative la plus appropriée pour cet exercice, solution moy1.c.
  8. Réécrire ce programme lorsque le nombre d'entiers entrés au clavier n'est pas spécifié au départ. Par convention lorsque l'utilisateur veut terminer la liste d'entiers considérés, il rentre une valeur négative. Choisir la structure itérative la plus appropriée pour cet exercice, solution moy2.c.

Exercice sans solution :

  1. Trouver les racines réelles d'une équation du second degré. On supposera les données rentrées au clavier avec 3 appels à la fonctions scanf. Penser à distinguer les cas où certaines des valeurs entrées sont nulles. Afficher (fonction printf) les résultats et les messages nécessaires à l'écran.

Séance 2 (12/12) :

fonctions, passage par valeur, passage par référence, pointeur, structures, énumérations.

Exemples de programmes, illustrations du cours :

  1. Enumérations en C, télécharger ce fichier, enum.c, éditer, comprendre, compiler et exécuter.
  2. Variables, pointeurs.
    1. Télécharger ce fichier, varpteur.c, compiler et exécuter. Comprendre les affichages.
    2. Télécharger ce fichier, pteur.c, compiler et exécuter. Comprendre les affichages.

Fonctions.

  1. Déclaration et définition : Télécharger ces fichiers, func1.c et func1bis.c, les compiler et les exécuter. Ces deux fichiers donnent respectivement l'illustration d'une déclaration avancée d'une fonction, avec sa définition, et d'une déclaration et définition de la même fonction.
  2. Passage de paramètre par valeur. Télécharger ce fichier, valeur.c. Le compiler et l'exécuter.
  3. Passage de paramètre par référence. Télécharger ce fichier, ref.c. Le compiler et l'exécuter.
  4. Télécharger ce fichier bswap.c. Normalement ce programme doit inverser les deux valeurs passées en paramètres de la fonction. Compiler, exécuter. Que remarquez vous ? Modifier ce  programme pour qu'il fasse bien ce que l'on veut, solution gswap.c.

Portée et durée de vie d'une variable.

  1. Télécharger, éditer, comprendre, compiler et exécuter les fichiers suivants var1.c, var2.c.

Exercices avec leur solution :

  1. calcul de l'espilon de la machine (i.e. le plus petit double strictement positif représentable, ou quelque chose d'approchant (par exemple par division par 2 jusqu'à arriver à 0)). Ecrire une fonction réalisant ce calcul, solution epsilon.c.
  2. reprendre l'exercice sur le calcul de la moyenne d'un série de valeurs, terminaison par une valeur négative, en introduisant une fonction réalisant le calcul de la moyenne, solution mean.c.
  3. calcul du pgcd de deux nombres, avec analyse de tous les cas possibles (signe et magnitude), solution pgcd.c: .
  4. lecture d'un flot de caractères supposés représenter un entier et le transforme en entier, solution readint.c.
  5. compte le nombre de caractères, d'espaces et de lignes dans le "flot d'entrée" (lecture au clavier terminé par CTRL-Z), solution count.c.

Exercices sans solution :

  1. Utiliser la méthode de Newton pour calculer une approximation de la racine carrée d'un réel positif a donné au clavier.

Séance 3 (14/12)

Tableaux à une ou plusieurs dimensions, récursivité

Tableau d'entier, initialisation et parcours

  1. Télécharger le fichier suivant entier2.c. Ce programme prend en entrée une série de nombres entiers (par convention, la saisie s'arrête dès que le nombre maximal d'entiers fixé par l'utilisateur est dépassé. Cette valeur doit être inférieure à la taille fixée par le tableau), les range dans un tableau et les affiche en ordre inverse (on commence par le dernier élément et on termine par le premier).
  2. Télécharger le fichier suivant entier.c, pour avoir une autre version dans laquelle le programme prend en entrée une série de nombres entiers (par convention, la saisie s'arrête dès que l'entier nul est saisi ou que le nombre maximal d'entiers (10) est dépassé.), les range dans un tableau et les affiche en ordre inverse (on commence par le dernier élément et on termine par le premier).
  3. Dépassement de la taille d'un tableau : overflow.c, illustration de ce qui se passe lorsqu'on accès au-delà des limites d'un tableau... (débordement et écrasement des variables qui "suivent").

Exercices avec leur solution sur les tableaux à une dimension :

  1. Calcul de la longueur d'une chaîne de caractères (illustration de la déclaration de tableau en paramètre d'une fonction), strlen.c. Une version de cette fonction est disponible dans la bibliothèque standard du langage C. Tout comme plusieurs fonctions de manipulation de chaînes de caractères, cette fonction est déclarée dans le fichier "string.h". Télécharger ce fichier pour en voir une illustration, str.c.
  2. Inversion d'un tableau chaîne de caractères (hello devient olleh). Une première méthode, mirror.c, et une deuxième méthode (pour le fun), mirror2.c.
  3. Un mot donné est-il un palindrome (lisible dans les deux sens, comme rotor, radar, ...), palind.c.
  4. Lecture d'une chaîne de caractères et un nombre k (supposé positif, mais si négatif ou nul: aucun effet!...), et effectue une rotation circulaire  vers la droite de k positions. Exemple: abcdefg 2 donnera fgabcde. solution : rots.c.
  5. Lecture d'une chaîne de caractères et en retirer les 'e' minuscules ou majuscules : "elementaire" deviendra "lmntair", solution noe.c.
  6. Lecture d'une chaîne de caractères et liste les caractères qui la composent par fréquences (nombres d'occurrences) décroissantes (mais strictement positives!), solution freq.c.
  7.  Crible d'ératosthène: lister tous les nombres premiers entre 1 et n fixé (à la compilation). Le crible d'ératosthène est une technique vieille comme le monde consistant à mettre tous les  entiers entre 1 et n (donné) dans un tableau. Ce tableau contient à  la fin tous les premiers entre 1 et n. Chaque fois qu'un nombre est découvert comme composite (non premier) il est rayé de la liste (par exemple, on le remplace par -1 ou autre chose): au début, on raye de la liste 0 et 1 (pourquoi ?). Ensuite on raye tous les multiples de 2 (sauf 2) jusqu'à dépasser n, puis tous ceux de 3 sauf trois, puis tous ceux du prochain premier (5),  etc Solution eratos.c.

Tableaux de dimensions supérieures :

  1. Manipulation de tableaux de dimensions supérieures, matrix.c (Initialisation d'une matrice, fonction qui prend en entrée une matrice de taille quelconque et l'affiche).
  2. Exercice sans solution : calcul du déterminant d'une matrice carrée quelconque.

Récursivité :

  1. Calcul de la factorielle, télécharger le fichier fact.c.
  2. Exercices avec leur solution sur la récursivité :
    1. Exponentiation (ab, avec a flottant, b naturel) par méthode récursive simple, expo.c.Dans le futur, penser à regarder les fonctions mathématiques disponibles dans la bibliothèque standard, qui sont déclarées dans "math.h".
    2. Ecrire un programme (solution fibo.c) qui calcule un nombre de Fibonacci définit par la relation de récurrence suivante :
                                                    Fn = Fn-1+Fn-2,    F0=F1=1
    1. étude de la version récursive d'écriture à l'envers du flot d'entrée, solution backwards.c.

Séance 4 (21/12)

Allocation dynamique, Structuration des programmes, Fichiers, Instructions du préprocesseur

Allocation dynamique : Tableau d'entier, initialisation et parcours

  1. Télécharger le fichier suivant entier.c que vous avez réalisé lors de la séance 3. Ce programme prend en entrée une série de nombres entiers (par convention, la saisie s'arrête dès que l'entier nul est saisi ou que le nombre maximal d'entiers (10) est dépassé.), les range dans un tableau et les affiche en ordre inverse (on commence par le dernier élément et on termine par le premier).

  2. Le transformer pour que l'utilisateur puisse donner en entrée le nombre de valeurs à saisir, allouer dynamiquement le tableau correspondant, y ranger les valeurs, le parcourir en sens inverse, désallouer ensuite la mémoire que vous aviez réservée. La correction est disponible dans le fichier edyn.c.

Exercices résolus sur l'allocation dynamique :

  1. reprendre les exercices précédents dans lesquels la taille du tableau était fixée d'avance, les transformer avec des tableaux dynamiques.

Instructions pour le préprocesseur :

  1. macros.c: illustre l'utilisation des macros-définitions (#define etc) en C. Conséquences possibles d'effets de bords

Manipulation de fichiers

  1. Lecture et écriture dans un fichier texte, illustration dans le programme suivant, fichier.c, télécharger les fichiers de test suivants hello, world.

Structuration d'un programme en plusieurs fichiers, construction d'un projet djgpp, variables externes, variables statiques.

  1. Construire un projet djgpp avec deux ou trois fichiers, des fichiers d'entête (.h) associés. Par exemple on va générer n (donné par utilisateur) nombres aléatoires (un fichier pour cette tâche) et on souhaite effectuer des calculs statistiques élémentaires (moyenne, écart-type, etc: un fichier pour ces fonctions). Ne pas oublier le fichier pour le ``main''.

  2. Remarques
    1. Structure générale: les fichiers sont "rand.c", "rand.h" qui inclue <stdlib.h>, "marks.h",  "marks.c",  "main.c" qui inclut "marks.h" et "rand.h"
    2. Pour cet exercice, il faut introduire la notion de nombre (pseudo-)aléatoire, et la fonction rand ainsi que son acolyte srand : faire des essais. Chercher les signatures et utilisations de ces deux fonctions dans l'aide en ligne.
    3. Le calcul de la moyenne se fait en calculant la somme cumulée des valeurs x_i de la variable X, dans une première variable, disons S1.
    4. Pour ce qui est de l'écart-type, il suffit d'utiliser une seconde variable, S2, qui, comme son nom le suggère (?) permet de cumuler la somme des carrés des x_i. En effet, on se souvient des fameuses propriétés suivantes (V(X) désigne la variance de la variable X, Sigma(X) son écart-type, et m = E(X) deux façons de noter son espérance.
    Les solutions sont disponibles dans les fichiers suivants : "rand.c", "rand.h", "marks.h",  "marks.c", "main.c".