Travaux Pratiques Langage C

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

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 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 puis la boucle while.

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


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').

#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


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