Travaux pratiques 01 2015 2016 1 Poste de travail 1.1 Connection Les logins et mots de passe sont les mêmes que l année dernière. 1.2 Le terminal Pour ouvrir un terminal, allez dans le menu en bas à gauche et cherchez konsole. Alternativement, vous pouvez y accéder avec un clic droit de la souris sur le fond de l écran. Quand vous l ouvrez, une fenêtre apparaît, avec une ligne ressemblant à : On peut taper des commandes directement. Les commandes sont effectuées dans un répertoire. Le répertoire est, au départ, votre répertoire maison. Il est noté. Le répertoire parent du répertoire courant est noté... pwd cd <dir> ls mkdir <dir> emacs/kate more (less) vi Quelques commandes Unix utiles : permet de savoir dans quel répertoire on se trouve permet d aller dans le répertoire <dir> permet d afficher la liste des fichiers et sous-répertoires du répertoire courant permet de créer un nouveau répertoire permet de lancer l éditeur de texte Emacs à partir du répertoire courant affiche dans le terminal le contenu d un fichier édition d un fichier dans le terminal (beep mode) À partir du répertoire courant Variable. désigne le répertoire courant CWD.. désigne le répertoire parent du répertoire courant désigne le répertoire de base de l utilisateur courant HOME / désigne la racine du système Table 1 Organisation des répertoires 1
I Exercice : Création de répertoires Créer des répertoires pour avoir dans votre compte 1 : Documents src TP1. bin TP12 lib include Quand vous avez fini, tapez cd (pour revenir à la racine de votre compte), puis ls -R (pour afficher Récursivement le contenu de tous les répertoires) pour vérifier que tout a bien marché. Pour connaître toutes les options des commandes, il existe un manuel accessible par la commande man. Par exemple, pour connaître les (très) nombres options de ls, on peut taper : man ls On peut aussi utiliser cette commande pour les fonctions déjà définies de C (essayez avec cfunprintf). 1.2.1 La fenêtre shell konsole est une application qui fait tourner une autre application, le shell, qui est l application qui lit les commandes et affiche leur résultat. On peut connaî tre quel shell on utilise avec la commande : echo $SHELL SHELL est une variable qui contient le nom du shell utilisé, $SHELL permet d en obtenir le contenu, et echo affiche cette valeur. Lorsqu on veut lancer un programme, le shell regarde s il existe dans la variable $PATH, qui contient la liste des répertoires à chercher séparés par des double-points. II Exercice : Modification de la variable $PATH. Ouvrez le fichier ~ /.bashrc dans Emacs, et ajoutez à la fin du fichier la ligne : export PATH=".: /bin:$path" 1. Si vous n êtes pas sur votre compte, créez un seul répertoire ~ /Documents/src/TP1 2
Sauvegardez, et ouvrez un nouveau terminal pour voir si le changement a bien été pris en compte. III Exercice : Utilisation de Emacs pour programmer en C Après avoir éditer et sauvegarder un programme C dans fichiersource.c, on compile le programme en utilisant le terminal et en tapant : gcc -g -Wall -o prog fichiersource.c L option -g signifie que l on veut pouvoir utiliser ensuite le débuggueur. On peut vérifier que le programme gcc est bien dans le $PATH en tapant which gcc. On obtient ainsi une application appelée prog. Les programmes qu on compile ne sont en général pas dans un répertoire du PATH. Il faut alors soit les copier dans /bin (qui est maintenant dans le PATH), soit donner le chemin vers le programme. Dans ce cas, on lance l application obtenue en tapant, toujours dans le terminal :./prog Avant de continuer, allez dans le répertoire TP1 que vous avez créé, et lancez Emacs. (a) Tapez le programme suivant, compilez-le et lancez-le. Programme 1 Un premier programme / Une f o i s que l e f i c h i e r e x o 1. c e s t o u v e r t, on l e s a u v e ( dans k a t e ) Quand l e f i c h i e r e s t s a u v é, on l e c o m p i l e dans l a c o n s o l e en t a p a n t : $ g c c e x o 1. c ou $ gcc Wall g o exo1 exo1. c ( l e s y m b o l e $ s e r t j u s t e à i n d i q u e r que c e s t une commande à é c r i r e dans l a c o n s o l e ). La d i f f é r e n c e e n t r e l e s 2 commandes s o n t d e s o p t i o n s q u i sont donn é es à gcc pour changer son comportement : Wall l u i demande de nous a v e r t i r de t o u t c e q u i p a r a i t s u s p e c t, même s i c e s t du C c o r r e c t g permet e n s u i t e d u t i l i s e r un d é b o g u e u r q u i e x é c u t e l e programme p a s à p a s o e x o 1 demande à g c c d é c r i r e l e programme c o m p i l é dans l e f i c h i e r e x o 1 p l u t ô t que dans l e f i c h i e r a. o u t. Enfin, on p e u t e x é c u t e r l e programme en é c r i v a n t dans l a c o n s o l e : $. / a. o u t / #include <s t d i o. h> int main ( int a r g c, char argv [ ] ) { p r i n t f ( Bonjour! \ n ) ; return 0 ; } (b) Tapez le programme 2, compilez-le et exécutez-le. Lorsqu on demande à printf d afficher une chaîne de caractères qui contient %s, il va chercher après cette chaîne une valeur à insérer. On va utiliser cela pour afficher des arguments. Exécuter en ajoutant d autres mots après le nom du programme, en en mettant plus ou moins que 3. Par exemple : 3
./exo2 trois deux un./exo2 trois./exo2 trois a b c d e Programme 2 Code de l exercice II-(b) / Tous l e s programmes qu on e c r i t p e u v e n t a v o i r d e s o p t i o n s ( d h a b i t u d e, de l a forme <une l e t t r e > ou <un mot> s o u s Unix e t /<une l e t t r e > s o u s Windows ) e t d e s a r g u m e n t s. Au d emarrage d un programme, i l n y a p a s de d i f f e r e n c e s e n t r e o p t i o n s e t a r g u m e n t s. Pour l a i s s e r l e maximum de l i b e r t e au programme, l o r s q u i l e s t l a n c e par l a c o n s o l e, e l l e l u i i n d i q u e t o u t c e q u i a e t e t a p e par l u t i l i s a t e u r. La m e t h o d e e s t l a s u i v a n t e. La c o n s o l e l i t ce q u i a e t e t a p e pour l a n c e l e programme, par e x e m p l e ( c f. e x e r c i c e pr ec e d e n t ) g c c Wall g o exo1 exo1. c Pour c h a q u e r e p e r t o i r e D dans l a v a r i a b l e PATH ( c f. enonc e ), e l l e c h e r c h e s i l e x i s t e un f i c h i e r D/ g c c. Le p r e m i e r qu e l l e va t r o u v e r s e r a l e f i c h i e r e x e c u t e. E n s u i t e, l a c o n s o l e coupe c e q u i a e t e e c r i t pour l a n c e l e programme en s u i v a n t l e s e s p a c e, pour o b t e n i r une s e q u e n c e de mots, q u i s o n t e n r e g i s t r e s comme d e s cha ˆ i n e s de c a r a c t e r e s ( a v e c d e s g u i l l e m e t s au d e b u t e t a l a f i n ). Dans l e x e m p l e pr e c e d e n t, c e t t e s e q u e n c e e s t : g c c Wall g o e x o 1 e x o 1. c l e nombre de mots dans c e t t e s e q u e n c e e s t mis dans l a v a r i a b l e a r g c ( un e n t i e r q u i v a u t 6 dans l e x e m p l e ) l e s mots s o n t mis dans un t a b l e a u ( en C, on l e s rep e r e par l e s c r o c h e t s [ ] ) de cha ˆ i n e s de caract e r e s ( qui ont l e type C char ) argv L e x e c u t i o n d un programme C c o n s i s t e a f a i r e t o u t c e q u i e s t e c r i t dans l a f o n c t i o n main q u i e s t e x e c u t e e a v e c c e s a r g u m e n t s. L o r s q u e l e programme a t e r m i n e, i l r e n v o i e a l a c o n s o l e un e n t i e r q u i i n d i q u e s i t o u t s e s t b i e n p a s s e ou s i l y a eu une e r r e u r. Par c o n v e n t i o n ( r e s p e c t e e par t o u t e s l e s c o n s o l e s Unix ) : s i l e programme a r e n v o y e 0, i l n y a p a s eu d e r r e u r s s i l e programme r e n v o i e un e n t i e r d i f f e r e n t de 0, i l y a eu une e r r e u r. S i l y a p l u s i e u r s e r r e u r s p o s s i b l e s, on p e u t r e n v o y e r d e s e n t i e r s d i f f e r e n t s pour l e s d i s t i n g u e r. / Note : l e s f i c h i e r s e c r i t s en C ne d e v r a i e n t p a s c o n t e n i r de l e t t r e a c c e n t u e e ou m o d i f i e e. En g en e r a l, c e n e s t p a s g ˆ e n a n t de m e t t r e de t e l l e s l e t t r e s dans l e s commentaires, mais c e l a p e r t u r b e ddd ( l e d e b o g u e u r ), d o u l e c r i t u r e b i z a r r e de ce commentaire. #include <s t d i o. h> int main ( int a r g c, char argv [ ] ) { p r i n t f ( argv [ 0 ] = %s \n, argv [ 0 ] ) ; p r i n t f ( argv [ 1 ] = %s \n, argv [ 1 ] ) ; p r i n t f ( argv [ 2 ] = %s \n, argv [ 2 ] ) ; p r i n t f ( argv [ 3 ] = %s \n, argv [ 3 ] ) ; return 0 ; } (c) À partir du terminal, lancer l application ddd avec comme argument le nom de ce programme. Cette application sert à examiner le fonctionnement d un programme. On va en voir les fonctions les plus utiles. 1. Cliquez sur le bouton Run. que se passe-t il? 2. Lancez Program Run en donnant des arguments. Même question. Réessayez avec le bouton Run. Même question. 3. Mettez des break (3ème bouton en partant de la gauche) devant chaque assignation et chaque printf. Démarrez l exécution du programme avec Run, et avancez avec step. Profitez-en pour mettre le curseur sur les variables afin de voir leur valeur. 4. Next est utile seulement lorsqu on utilise d autres fonctions qu on a écrite, parce qu il rentre dans l appel au lieu de passer directement à la suite. (d) Modifiez le programme précédent pour qu il affiche tous ses arguments, un par ligne, sauf le premier (son nom). 4
IV Exercice : Création d un Makefile La commande make lit un fichier qui s appelle par défaut Makefile est exécute des commandes shell en fonction des tâches décrites dans le Makefile. Par exemple, pour obtenir le programme exo2, on a utilisé la commande : gcc -g -o exo2 exo2.c Dans la traduction make, on a une tâche dont le but est d obtenir le fichier exo2. Pour faire cette tâche, on utilise la commande gcc -g -o exo2 exo2.c. (a) Toujours dans le répertoire /Documents/src/TP1/, ouvrez un fichier Makefile dans emacs, et écrivez la tâche : exo2: } {{ } gcc -g -o exo2 exo2.c Sauvegardez, et tapez dans le terminal make. (b) On veut maintenant que le programme exo2 ne soit pas recompilé si on n a pas changé exo2.c. Pour cela, on précise que la tâche dépend uniquement du fichier exo2.c en changeant la règle en : exo2: exo2.c } {{ } gcc -g -o exo2 exo2.c Vérifier que cela marche en tapant dans le terminal make, avant et après avoir modifié un peu le fichier exo2.c. (c) On veut pouvoir directement lancer les 3 tests. Pour cela, modifier le Makefile avec une règle :.PHONY: test2 test2: exo2 } {{ }./exo2 un deux trois } {{ }./exo2 trois } {{ }./exo2 trois a b c d e 5
V Exercice : Convertisseur euros/dollars La fonction scanf La fonction scanf fait le contraire de la fonction printf : elle attend des valeurs qui doivent être données par l utilisateur du programme. Comme la fonction printf, la fonction scanf prend en argument : 1. une chaîne de format, par exemple %d %c ; 2. une liste de variables avec un & devant chaque nom de variables, par exemple &i, &c. (a) Tapez, compilez et testez un programme qui demande à l utilisateur une somme en euros (type float ), et qui en donne l équivalent en dollars. Le taux de change sera 1.3291. 6