Exercices de programmation en C

Olivier Aumage
LIP, ENS Lyon (bureau 302),
46, allée d'Italie, 69364 Lyon Cedex 07
E-mail : Olivier.Aumage@ens-lyon.fr
Web : http://www.ens-lyon.fr/~oaumage/Cours/

Novembre 2001

1   Introduction

Les exercices proposés par la suite constituent une liste d'exercices types faisant appel aux différentes connaissances de base du langage C et de la programmation en langage C. Il est indispensable de savoir écrire les programmes correspondant sans hésitation. Note : le nom des algorithmes fait partie des notions à connaître. Pour chaque section, l'ordre des exercices correspond plus ou moins à un niveau de difficulté croissant.

1.1   Remarques préliminaires

  • Les programmes doivent :
    • être concis ;
    • raisonnablement efficaces ;
    • être écris proprement ;
    • respecter l'énoncé à la lettre ;
    • fonctionner dans les cas limites ;
    • produire des affichages lisibles et de bonne qualité.
  • Toute mention d'un type entier suppose l'utilisation du type int
  • Toute mention d'un type flottant suppose l'utilisation du type double.

2   Fonctionnalités de base

2.1   Programmes élémentaires

  1. Écrivez un programme hello.c qui affiche le message Hello, World! suivi d'un retour à la ligne.
  2. Écrivez un programme carre.c qui demande un entier x et affiche le carré de x.
  3. Écrivez un programme cercle.c qui demande le rayon d'un cercle (flottant) et affiche son diamètre, sa circonférence et sa surface.
  4. Écrivez un programme diag.c qui demande le coté d'un carré (flottant) et affiche la longueur de sa diagonale).

2.2   Tests

  1. Écrivez un programme minmax.c qui demande deux entiers et indique lequel et le plus petit et lequel est le plus grand des deux.
  2. Écrivez un programme parite.c qui demande un entier et indique s'il est pair ou impair.
  3. Écrivez un programme poly_2.c qui demande trois coefficients a, b, c (flottants), indique si le polynôme ax²+bx+c a deux racines réelles, une racine réelle double, ou deux racines complexes et affiche la ou les racines réelles.

2.3   Boucles

  1. Écrivez un programme inc.c qui demande un entier n et affiche tous les entiers de 0 à n.
  2. Écrivez un programme dec.c qui demande un entier n et affiche tous les entiers de n à 0.
  3. Écrivez un programme fact_i.c qui demande un entier n et affiche la factorielle de n.
  4. Écrivez un programme fib_i.c qui demande un entier n et affiche la valeur du n-ième terme de la suite de Fibonacci (avec u0=0 et u1=1).
  5. Écrivez un programme pi_atan.c qui demande un flottant e et détermine une valeur approchée à e près de p en utilisant le développement limité de la fonction arctangente en 1.
  6. Écrivez un programme pi_rmc.c qui demande un entier n et détermine une valeur approchée après n itérations de p en utilisant la méthode de Monte-Carlo.
  7. Écrivez un programme somme.c qui demande un entier n et affiche la somme des chiffres de n.
  8. Écrivez un programme reverse.c qui demande un entier n et affiche n en inversant l'ordre des chiffres.

2.4   Fonctions

  1. Écrivez un programme fcarre.c contenant une fonction carre qui prend un entier n et retourne le carré de n.
  2. Écrivez un programme fpol.c contenant une fonction polaire qui prend des coordonnées x et y flottantes et retourne les coordonnées polaires correspondantes.
  3. Écrivez un programme echange.c contenant une fonction echange qui permet d'échanger le contenu de deux variables. Variante : modifiez la fonction pour que l'échange fonctionne sans variable intermédiaire.
  4. Écrivez un programme fact_r.c contenant une fonction fact qui prend un entier naturel n et calcule la factorielle de n de manière récursive.
  5. Écrivez un programme fibo_r.c contenant une fonction fibo qui prend un entier naturel n et calcule récursivement le terme n de la suite de Fibonacci.
  6. Écrivez un programme pgcd.c contenant une fonction pgcd qui calcule récursivement le pgcd de deux entiers.
  7. Écrivez un programme puis.c contenant une fonction puissance qui calcule itérativement xy par exponentiation dichotomique.
  8. Écrivez un programme hanoi.c qui demande un entier n à l'utilisateur et utilise une fonction récursive pour résoudre le problème des tours de Hanoï au rang n.

2.5   Tableaux

2.5.1   Tableaux non triés

  1. Écrivez un programme tabs.c qui demande un entier n, alloue un tableau de n entiers, remplit le tableau avec des nombres aléatoires et contient les fonctions suivantes :
    • affichage du tableau ;
    • valeur et indice de l'élément minimum ;
    • valeur et indice de l'élément maximum ;
    • échange de deux éléments ;
    • permutation des éléments de i indices (avec i entier relatif) ;
    • inversion de tous les éléments du tableau ;
    • calcul de la somme des éléments ;
    • calcul de la moyenne des éléments ;
    • insertion d'un élément à l'indice i ;
    • suppression de l'élément d'indice i ;
    • tri par insertion ;
    • tri bulle ;
    • tri rapide (quicksort) (avec une fonction récursive) ;
    • tri par tas (heapsort).

  2. Écrivez un programme crible.c qui demande un entier n et affiche les nombres premiers compris entre 1 et n en utilisant la méthode du crible d'Érathostène.
  3. Écrivez un programme pile.c qui utilise un tableau pour représenter une pile d'au plus n éléments, avec les fonctions usuelles push et pop.
  4. Écrivez un programme file.c qui utilise un tableau pour représenter une file d'au plus n éléments, avec les fonctions usuelles enqueue et dequeue.
  5. Écrivez un programme piles.c qui utilise un tableau pour représenter deux piles d'au plus n éléments (au total), avec les fonctions usuelles push et pop.
  6. Écrivez un programme piles2file.c basé sur le précédent qui construit une liste en utilisant les deux piles et leurs fonctions associées.
  7. Écrivez un programme files2pile.c qui construit une pile en utilisant deux files.

2.5.2   Tableaux triés

  1. Écrivez un programme tab_tri.c qui demande un entier n et un entier m, alloue un tableau de n entiers et le remplit avec m entiers de 1 à m ordonnés et contient les fonctions suivantes :
    • ajout d'une valeur au tableau en préservant l'ordre des éléments ;
    • suppression d'un élément du tableau ;
    • recherche linéaire d'une valeur ;
    • recherche dichotomique d'une valeur (version itérative puis récursive).
  2. Écrivez un programme tab_inter.c qui génère deux tableaux triés de taille m et n respectivement, puis interclasse les deux tableaux en un troisième tableau trié.

2.5.3   Tableaux multi-dimensionnels

Bi-dimensionnels rectangles
  1. Écrivez un programme tab_rect.c qui demande deux entiers m et n, alloue un tableau de m*n entiers et contient les fonctions suivantes :
    • lecture de l'élément (x, y) ;
    • modification de l'élément (x, y) ;
    • affichage du tableau sous forme rectangulaire .
    • permutation de deux lignes ;
    • permutation de deux colonnes ;
    • somme des éléments du tableau ;
    • somme des éléments du contour du tableau ;
    • filtrage : t(x,y)=åi=-1,j=-1i=1,j=1t(x+i,y+j).
  2. Écrivez un programme mat_mul.c qui permet de calculer des produits de matrices.
Bi-dimensionnels carrés
  1. Écrivez un programme tab_carre.c qui demande un entier n, alloue un tableau de n*n entiers et contient les fonctions suivantes :
    • lecture de l'élément (x, y) ;
    • modification de l'élément (x, y) ;
    • affichage du tableau sous forme carrée ;
    • calcul de la trace ;
    • transposition ;
    • déterminant (récursif) ;
    • génération d'un carré magique.

2.6   Chaînes de caractères

  1. Écrivez un programme str.c qui contient les fonctions suivantes :
    • saisie d'une chaîne de 20 caractères au plus ;
    • affichage de la chaîne ;
    • calcul de la longueur de la chaîne ;
    • calcul du nombre de voyelles et de consonnes ;
    • passage en majuscules/minuscules ;
    • réduction des espaces multiples à un caractère espace et suppression des espaces en début et fin de chaîne ;
    • décodage/encodage rot13 ;
    • test de palindromie.
  2. Écrivez un programme disp1.c qui demande un entier relatif n, construit la chaîne de caractères représentant n et affiche cette chaîne.
  3. Idem, mais le programme (disp2.c) demande en plus une base b (avec 1<b<=36) et affiche l'entier écrit dans cette base.

2.7   Études de cas

2.7.1   Nombres complexes

Écrivez un programme cmplx.c qui permet de faire les opérations suivantes sur des nombres complexes (à représenter à l'aide d'une structure contenant la partie réelle et la partie imaginaire du nombre complexe) :
  • saisie d'un nombre complexe ;
  • saisie d'un nombre complexe en notation trigonométrique ;
  • affichage d'un nombre complexe ;
  • affichage d'un nombre complexe en notation trigonométrique ;
  • somme, produit ;
  • opposé, conjugué ;
  • ...

2.7.2   Vecteurs

Écrivez un programme vect.c qui demande un entier n et permet de faire les opérations usuelles sur des vecteurs d'un espace vectoriel de dimension n.

2.7.3   Polynômes

Écrivez un programme polys.c qui permet de faire les opérations usuelles sur des polynômes à une seule variable.




-=-=-=-

Ce document a été traduit de LATEX par HEVEA.