TP1
Exercice 1 :
Commandes Unix :
Créer le répertoire TP1 :
mkdir TP1
Se placer dans le répertoire TP1 :
cd TP1
Lancer emacs en ouvrant le fichier ex1.c :
emacs ex1.c &
-> ex1.c est créé directement s’il n’existait pas
-> & permet de pouvoir continuer à écrire des commandes Unix tout en gardant emacs ouvert
Compiler le programme C:
gcc -Wall ex1.c
-> -Wall est une option qui permet d’afficher certaines erreurs supplémentaires (Warning)
A utiliser à chaque compilation!
Visualiser le résultat = Afficher la liste des fichiers présents dans le répertoire:
ls
-> résultat = un fichier a.out est créé (en vert)
Exécuter le a.out :
./a.out
Afficher les droits des fichiers :
ls -l
-> résultat = a.out a le droit de lecture, écriture et exécution car c’est un fichier exécutable
Compiler le programme C en donnant un nom au fichier exécutable :
gcc ex1.c -o ex1 -Wall
-> -o est une option qui indique que l’on donne le nom de l’exécutable, le nom donné doit
suivre directement le -o
Remarque : L’ordre des options n’a pas d’importance, on peut avoir : gcc -Wall -o ex1 ex1.c
Exécuter l’éxécutable :
./ex1
Remarques :
-Veillez à bien respecter les espaces lorsqu'il y en a dans les commandes Unix et les
programmes C. En revanche, on peut en rajouter un ou plusieurs pour aérer le code, mais ce
n'est pas obligatoire.
ex: if(a!=0) est équivalent à if ( a != 0 )
-Dans emacs, cocher la première option (Syntax Highlighting) pour avoir le code en couleur.
-Dans la console, utiliser la flèche vers le haut pour avoir les dernières commandes
effectuées.
-Messages d’erreurs :
· Warning -> pas grave mais à corriger si on ne veut pas avoir de surprises…
· Fatal error -> il faut recompiler car l’exécutable n’est pas créé
ex : parse error = erreur de syntaxe ; , }
Quelques commandes supplémentaires :
Se placer dans un répertoire en indiquant son chemin d’accès :
cd ProgC/TP1
Revenir un répertoire en arrière :
cd ..
Revenir à la racine :
cd
Supprimer un fichier :
rm ex1.c
Supprimer un répertoire :
rmdir TP1
Déplacer un fichier dans un répertoire en indiquant son chemin d’accès :
mv ex1.c ProgC/TP1
Changer les droits d’un fichier :
chmod 755 ex1.c
chmod +x ex1.c
-> ajoute le droit d’exécution au fichier
Rappel : -rwxr-xr-x = 755
Afficher des manuels pour la programmation en C :
man printf
...
Debugger un programme avec gdb :
gdb -help -> usage (= comment ça s'utilise)
gcc -g -Wall -o ex1 ex1.c -> compilation
gdb ./ex1 -> exécution
Ensuite pour lancer le programme : run
Pour plus de détails : help (suivi d'une commande dans la liste indiquée)
Pour quitter gdb : quit
Programme C :
ex1.c
/* réalisé par Nom le Date TP1 ex1 / -> commentaire entre /*…*/
#include <stdio.h> -> inclusion de la bibliothèque permettant d’utiliser printf, scanf…
int main(void) { -> fonction principale obligatoire entre accolades
printf(“Bonjour\n ”); -> affichage de ce qui est entre guillemets (\n = retour à la ligne)
return 0; -> retour de la fonction principale de type int
}
Remarque : Chaque instruction se finit par un point-virgule
Exercice 2 :
ex2.1.c
/* TP1 ex2 version 1 * /
#include <stdio.h>
int main(void) {
int a,b; -> déclaration de deux variables entières
a=2; -> affectation d’une variable
b=3;
printf(“Somme=%d\n Différence=%d\n Produit=%d\n Quotient=%d\n”,a+b,a-b,a*b,a/b);
-> %d pour afficher une variable de type int que l’on indique après la virgule
return 0;
}
ex2.2.c
/* TP1 ex2 version 2 */
#include <stdio.h>
int main(void) {
float a; -> déclaration d’une variable réelle
int b;
a=2.5; -> un nombre à virgule s’écrit avec un point
b=3;
printf(“Somme=%f\n Différence=%f\n Produit=%f\n Quotient=%f\n”,a+b,a-b,a*b,a/b);
-> %f pour une variable de type float (la somme d’un entier et d’un réel donne un réel)
return 0;
}
Remarque : Dans le prinft, si on met %.2f -> affiche seulement deux chiffres après la virgule.
ex2.3.c
/* TP1 ex2 version 3 et 4 * /
#include <stdio.h>
int main(void) {
float a;
int b;
scanf(“%f%d”,&a,&b); -> lecture de variables au clavier
printf(“Somme=%f\n Différence=%f\n Produit=%f\n”,a+b,a-b,a*b);
-> affichage dans tous les cas
if(a!=0) printf(“Quotient=%f\n”,a/b); -> teste si a est différent de 0
(a==0 pour tester l’égalité)
else printf(“Division par zéro impossible\n”); -> si le test du if n’est pas vérifié
return 0;
}
Instructions conditionnelles :
if(condition) {
instruction;
}
-> si l’instruction est réduite à une seule ligne, les accolades ne sont pas obligatoires
Exercice 3 : (faire de même pour b)
int a;
scanf(“%d”,&a);
if(a%2==0 && a%3==0) printf(“%d est divisible par 2 et par 3\n”,a);
-> a%2 se lit “a modulo 2” et calcule le reste de la division euclidienne
-> && = et || = ou
else if(a%2==0) printf(“%d est divisible par 2\n”,a);
else if(a%3==0) printf(“%d est divisible par 2\n”,a); -> mettre else devant le if lorsque
l’on est sûr que 2 conditions de peuvent pas être vérifiées en même temps
else printf(“%d n’est divisible ni par 2ni par 3\n”,a); -> pour tous les autres cas
Remarque : Dans le printf, si on met %3d -> affiche le nombre sur au moins 3 caractères en
ajoutant des espaces devant (permet d’aligner les nombres à droite).