Travaux Pratiques Langage C

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


Pour Commencer

Pour créer un projet compatible avec un Makefile avec QtCreator Ceci va créer un fichier qui a le nom du projet avec l'extension .creator. Ce fichier permettra de réouvrir votre projet en cliquant sur "Ouvrir un fichier ou projet..." dans le menu "Fichier" (double-cliquer le fichier .creator peut également suffire).

 

1. Bonjour

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

int main() {
   printf("Vive le C ! \n");
}

Compilez le fichier dans le Terminal en tapant : gcc -Wall -o bonjour bonjour.c.

Attention : N'oubliez pas le \n : il permet de vider le buffer et de passer à la ligne (sinon ça risque de ne rien afficher).

Suivant la version du compilateur vous obtiendrez une erreur de compilation ou 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.

Créer un sous-répertoire dans inf720, ainsi qu'un fichier 'main.c'. Afin de simplifier la compilation, copiez ce fichier Makefile dans le répertoire. Attention:

On peut alors compiler dans le terminal en tapant la commande make ou, si vous avez utilisé QtCreator, en cliquant sur le marteau (en bas à gauche) ou en tapant Control-B.

Avec QtCreator, au dessus du marteau une barre horizontale indique l'état de la compilation. Si la barre est verte tout est bon ! Si elle est rouge, un problème est survenu : cliquer sur alors la barre pour voir les erreurs. En cliquant sur une erreur, QtCreator fait alors apparaître le code source correspondant (ce qui est très pratique pour déboguer !)

Note : avec QtCreator vous devrez cliquer sur "Liste des Projets" puis selectionner "Fichiers Système" 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 qui est ajouté automatique par le compilateur (Note : il s'agit de la valeur numérique 0, également notée '\0', et non du caractère '0').

De même que précédemment il est conseillé de créer un nouveau sous-répertoire, d'y copier le Makefile fourni à la question précédente, puis de l'adapter.

#include <stdio.h>

int main() {
  char str[] = "Ma chaîne rêvée";
  printf("longueur de la chaîne = %d \n", slong(str));
  return 0;
}

Quel est la valeur affichée par le programme ? Celle-ci est-elle exactement le nombre de caractères ? Pourquoi ?

Dans l'exercice précédent, 'str' est un tableau qui contient les caractères. Il est également possible de définir une chaîne de caractères comme suit:

char* str2 = "Ma chaîne rêvée";
ou (mieux) :

const char* str2 = "Ma chaîne rêvée";

'str2' est un pointeur qui pointe sur un littéral, c'est-à-dire une suite non modifiable de caractères (c'est pour cela que c'est mieux de mettre le mot-clé const, qui veut dire "constant"). Complétez votre programme pour appliquer votre fonction 'slong' à 'str2'. Que constate-t'on ?

Remarques :

4. Scanf

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 on veut calculer la longueur.

Utiliser la fonction scanf() pour lire la chaîne de caractères interactivement depuis le terminal pendant l'exécution du programme. scanf() ressemble à printf() sauf qu'elle sert à lire des données au lieu de les afficher. Tapez: man scanf (ou cherchez sur Internet) pour voir comment utiliser cette fonction.

Remarques :

5. Calculette

On souhaite écrire un programme qui lit une chaîne de caractères représentant un calcul à effectuer (par exemple 10 + 20, avec des espaces autour de l'opérande) et qui affiche le résultat sur le terminal, ou un message d'erreur si la chaîne est incorrecte. Le programme prendra en compte les quatre opérations de base.

Utilisez scanf() pour extraire l'opérande et les deux opérateurs, écrivez le code qui fait l'opération, puis affichez le résultat.

Remarque : bien que l'opérateur soit un unique caractère, il est plus simple de lire une chaîne de caractères et de ne considérer que son premier caractère (la lecture d'un seul caractère est problématique du fait des espaces, des retours chariots, etc.)

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

Compléter le fichier tab1.c en y ajoutant les fonctions suivantes :

7. 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:

8. Matrices

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

Idéalement, votre programme sera capable de traiter des matrices de n'importe quelle taille, ce qui nécessitera d'utiliser de la mémoire dynamique. De même, il pourra lire ou écrire une matrice depuis un fichier.

Cependant, vous pourrez, surtout si vous êtes peu expérimenté(e) en C, vous limiter à une implémentation avec des matrices de taille fixe, et sans lecture/écritre depuis un fichier.

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) Déposer votre fichier sur la page eCampus de l'UE

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



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