Travaux Pratiques Langage C

Eric Lecolinet - Télécom ParisTech - Dpt. INFRES

Pour Commencer

Pour créer un projet compatible avec un Makefile avec QtCreator :

Exercices

1. Bonjour

Créer un fichier "bonjour.c" contenant les lignes suivantes :

int main() {
   printf("Vive le C ! \n");   // ne pas oublier le \n pour passer a la ligne !
}
Le compiler dans le Terminal par: gcc -Wall -o bonjour bonjour.c

Normalement le compilateur doit émettre des "warnings" car le code correct est:

#include <stdio.h>

int main() {
   printf("Vive le C ! \n");
   return 0;
}
Pourquoi faut-il rajouter ces 2 lignes ?


2. Factorielle iterative

Ecrire une fonction qui calcule factorielle N, c'est-à-dire: N! = N * (N-1) * (N-2) * ... * 3 * 2 *1 en utilisant la boucle for.

On écrira ultérieurement (maintenant si vous savez le faire) une version récursive de factorielle

Utiliser un Makefile pour compiler, par exemple celui disponible depuis ce lien (attention, utiliser la commande "Sauvegarder" de votre navigateur : ne pas faire de copié/collé car ce fichier contient des tabulations). Il faut alors adapter ce fichier en changeant les valeurs de : On peut alors compiler dans le terminal en tapant la commande make

Il est également possible de compiler dans QtCreator en cliquant sur le marteau (en bas à gauche) ou en tapant Control-B. Un peu plus haut une barre horizontale indique l'état de la compilation. Si la barre est rouge, un problème est survenu : cliquer sur la barre pour voir les erreurs. En cliquant sur ces dernières, QtCreator fait automatiquement apparaître le code source correspondant.

Noter que vous devrez éventuellement cliquer sur "Liste des Projets" puis selectionner "Fichiers Systeme" pour faire apparaître les fichiers du répertoire de travail (en particulier le fichier Makefile)


3. Calcul de la longueur d'une chaîne de caractères

Compléter le programme suivant en écrivant une fonction slong() qui calcule la longueur d'une chaîne de caractères. On rappelle qu'une chaîne de caractères est une suite de caractères terminée par un zéro (la valeur numérique 0, pas le caractère '0').

Modifiez le Makefile et compilez (remarque: vous pouvez juste mettre à jour le Makefile en changeant les valeurs de PROG et SOURCES. Cependant il est également possible de compiler plusieurs programme en rajoutant des règles dans le Makefile).

#include <stdio.h>

int main() {
  char *s1  = "ceci est litteral";
  char s2[] = "ceci est un tableau";
 
  printf("longueur de %s = %d \n", s1, slong(s1));
  printf("longueur de %s = %d \n", s2, slong(s2));
  return 0;
}
Il existe une fonction de bibliothèque qui fait la même chose. Quel est son nom ? Si vous ne savez pas comment la trouver, tapez: man string (ou cherchez sur Internet).


4. Scanf et ligne de commande

On désire améliorer le programme précédent de telle sorte que l'utilisateur puisse entrer interactivement la chaîne de caractères dont il faut calculer la longueur.

Première méthode : récupérer les arguments de la ligne de commande grace aux aux paramètres argc et argv de la fonction main().

int main(int argc, char *argv[]) {
  ....
}
Attention: le programme précédent nécessite de passer une chaîne de caractères en argument sinon il plante ! Il faut donc tout d'abord vérifier que argc a une valeur appropriée (afficher un message d'erreur dans le cas contraire).

Deuxième méthode : utiliser la fonction scanf() pour entrer interactivement la chaîne de caractères depuis le terminal pendant l'exécution du programme. scanf() ressemble à printf() sauf qu'elle sert à gérer les entrées (lire des données) au lieu de gérer les sorties (afficher les données).

scanf() et printf() s'utilisent de la même maniere dans le cas des chaînes de caractères (attention ce n'est pas vrai pour d'autres types de données, comme nous le verrons plus tard). Notez que le format est %s (pour "string") dans des deux cas.

Pour plus d'informations: tapez: man scanf ou cherchez cette fonction sur le Web avec Google.

Attention: vérifier que la variable destinée à contenir la chaîne est correctement allouée et raisonnablement "grande". Que se passera-t'il si la chaîne entrée est trop grande ? Comment faire pour éviter ce problème ?

5. Calculette

Ecrire un programme calc qui calcule les quatre opérations +, -, *, /. On indiquera l'opération à effectuer sur la ligne de commande comme suit: calc 1 + 2 (noter la présence d'espaces). Le programme affichera le résultat sur le terminal.

Etape préliminaire : Ecrire une fonction s2i() qui transforme une chaîne de caractères représentant un entier (par exemple "123") en un véritable entier (c'est-à-dire un "int" valant 123) de telle sorte qu'on puisse écrire :

  int i = s2i("123");
  printf("valeur de i = %d \ n", i);
Il existe une fonction de bibliothèque qui fait la même chose. Quel est son nom ?

Etape finale : écrire et tester le programme calc. essayer de faire: calc 2 * 2. Quel est le probleme ?

6. Manipulation des éléments d'un tableau

En s'inspirant du cours, compléter le fichier tab1.c en y ajoutant les fonctions suivantes :


7. Matrices

Ecrire un programme permettant de lire, afficher et multiplier des matrices carrées.


8. TP debogueur et exercice sur les tris

Faire le TP sur l'utilisation du debogueur gdb puis réaliser (et finir chez soi) l'exercice figurant à la fin de ce TP.

Remarques:

 

Pour rendre le TP

1) Verifier que votre code compile et s'exécute correctement depuis une salle de TP Unix de l'Ecole. La compilation doit s'effectuer en tapant make dans le Terminal (notez que, tel qu'on l'a utilisé dans ce TP, Qt Creator fait appel à make). Attention: un programme sans Makefile ou qui ne compile pas ou qui plante sur une machine de l'Ecole ne sera pas pas examiné et sera considéré comme non rendu.

2) Ecrire un bref fichier README indiquant les questions traitées et contenant les réponses aux questions et tous les commentaires que vous jugerez utiles. Ce fichier doit être en PDF ou en HTML (en UTF-8) ou au format texte (en UTF-8 également). N'oubliez pas de mettre votre nom (au moins dans le README et de préférence aussi dans les autres fichiers)

3) Créer un fichier zip ou tar.gz (pas d'autre format!) contenant votre README et le code source (ne mettez pas l'executable ni les .o)

4) Aller à l'URL http//services.infres.enst.fr/rendutp/, cliquer (le bon ;-) lien puis entrer votre nom et télécharger le fichier zip ou tar.gz

NB: seule la dernière version téléchargée est prise en compte



Eric Lecolinet - http://www.telecom-paristech.fr/~elc - Telecom ParisTech