Premiers pas en C


Cliquez ici pour retirer la feuille de style si vous souhaitez imprimer ce document (ou en cas de problème d'affichage).
Notes :
  • N'utilisez pas de navigateur de fichier ! Apprenez à ne vous servir que du terminal.

Compilation (rappels)

  • Créez un répertoire dans lequel vous placerez tous vos TP de C
  • Créez un sous-répertoire dans lequel vous placerez tous vos exercices d'aujourd'hui
  • Pour chaque exercice, vous créerez un sous répertoire
  • Pour compiler un fichier "exo.c", il faut executer la commande :
    gcc -ansi -pedantic -Wall exo.c -o executable
    en remplacant "exo.c" par votre fichier et "executable" par le nom du fichier executable que vous voulez creer. Si vous ne mettez pas "-o executable", le fichier produit s'appelera "a.out"

Fonctions

Pour cet exercice, vous mettrez toutes vos fonctions dans le même fichier. Pour tester chaque fonction, vous l'appellerez dans une fonction main(). Quand vous passez à la fonction suivante, vous pouvez commenter l'appel de la fonction précédente (vous rajouter "/*" avant et "*/" après)
  • Écrivez une fonction add qui prend en paramètre deux entiers et retourne leur somme
  • Écrivez une procedure add_and_print qui prend en paramètre deux entiers et affiche leur somme
  • Écrivez une fonction fact qui prend en paramètre un entier et qui retourne la factorielle de cet entier (Rappel : fact(n) = n * (n-1) * ... * 3 * 2 * 1). Pour cela vous utilisez le concept d'appel de fonction récursive
  • Suivant le même principe, écrivez une fonction exp qui prend en paramètre deux entiers et retourne le premier nombre puissance le second (essayer sans regarder le td2!)
  • La fonction pyra()
    • Écrivez une fonction récursive print_n_char() qui prend en paramètre un caractère (char c) et un entier non signé (unsigned int n). Cette fonction affiche n fois le caractère c. Pour ceux qui ne savent pas, "char" est un type du C, comme "int". Il represente un nombre entier, codé sur 1 seul octet. Il est donc utilisé en général pour coder les caractères par leur code ASCII (valeurs comprises entre -127 et 127, sur un octet). De plus la valeur du code ASCII de la lettre a (par exemple) s'écrit 'a'. On peut donc écrire : char c = 'a';
    • Écrivez la fonction récursive pyra() qui prend en paramètre un entier et qui affiche une demi pyramide renversée dont le nombre de niveau est cet entier. Par exemple pyra(4); affiche :
      ****
      ***
      **
      *
      
      Utilisez votre fonction print_n_char() pour afficher une ligne. Pour passer à la ligne suivante, utilisez l'instruction printf("\n");
    • Modifiez la fonction pyra() pour afficher la pyramide à l'endroit (très simple - sinon c'est que vous vous trompez).
    • Modifiez la fonction pyra() pour afficher une pyramide complète. Par exemple pyra(4); affiche :
         *
        ***
       *****
      *******
      
      Pour cela, demandez vous d'abord combien il y a d'étoiles sur la ligne i, puis posez vous la même question pour le nombre d'espaces. Si la taille de la pyramide apparait dans l'une des formules, vous pouvez rajouter un deuxième paramètre à la fonction (ex. pyra(4,4);) Pour afficher un espace, vous pouvez utiliser votre fonction print_n_char() : par exemple print_n_char(' ', 3); affiche 3 espaces.
    • finalement, pour éviter d'avoir à écrire dans le main() pyra(4,4); renommer votre fonction pyra_rec(), et ajouter une fonction pyra() qui ne prend qu'un seul argument et qui appelle pyra_rec().

Les boucles

Tout ce qui peut s'écrire en programmation récurssive peut s'écrire en programmation itérative, et vice versa. Il y a équivalence stricte entre ce qui est programmable en récurssif, et ce qui est programmable en itératif.
  • Après avoir ecouter les explications du chargé de td sur la boucle "for", refaites les fonctions précédantes sans utiliser la récurcivité.