Exercices¶
1. Exercices de manipulation du shell¶
Pour rappel, quelques commandes de base dans le shell pour gérer les dossiers et fichiers:
- ls(1) : affiche la liste des fichiers et dossiers du répertoire spécifié
- mv(1) : utilitaire pour renommer ou déplacer un fichier ou dossier
- cp(1) : copie un fichier ou dossier (
-r
pour les dossiers)- rm(1) : efface un fichier ou dossier
- mkdir(1) : crée un répertoire
- rmdir(1) : efface un répertoire vide
- cd(1posix) : change le répertoire courant
- pwd(1) : affiche le répertoire courant
- grep(1) : permet de faire des recherches sur le contenu des fichiers
Pour vous familiariser avec le shell, faites les petits exercices suivants dans le shell:
- Créez, dans un nouveau répertoire
my_dir
le fichier nomméfirst
contenant le texte « Inserer ». Vérifiez chaque étape en utilisant une des commandes ls(1), pwd(1) et cat(1). - Copiez le fichier
first
verssecond
et ajoutez la ligne « Retirer » àsecond
. - Comment pourriez-vous afficher la taille des fichiers avec ls(1)?
- Concaténez
first
etsecond
dans un nouveau fichierthird
(sans utiliser la commande echo(1)) - Utilisez grep(1) pour afficher le numéro de la ligne sur laquelle se trouve le mot « Retirer » dans
second
. - Retournez dans le répertoire parent de
my_dir
et copiez le dossier completmy_dir
dansmy_dir_2
. - Effacez le dossier entier
my_dir
en une seule commande (utilisez rm(1)).
2. Découverte du C¶
Certains côtés du C sont très proches du langage Java que vous connaissez déjà. Ce n’est pas surprenant puisque Java a été conçu avec le langage C comme base. Les inventeurs de Java ont ajouté tout ce qui était nécessaire pour supporter les objets et ont retiré la gestion explicite de la mémoire. Les premiers exercices inginious en C sont très proches de ceux que vous aviez réalisé en Java.
Calcul de la valeur absolue d’une entier: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_absolute_value
Calcul de la factorielle d’un nombre entier: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_factorial
Recherche d’un élément dans un tableau d’entiers: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_tab_find
Compilez et exécutez le code suivant. Expliquez ce que fait l’appel à printf(3).
int f() { int a = 1252; printf("%d\n", a); } int main(int argc, const char *argv[]) { f(); }
Expliquez à quoi sert l’option
-Werror
degcc
. Regardez la manpage (gcc(1)).Recompilez le code du point 4 avec l’option
-Werror
, que se passe-t-il ? Que faut-t-il rajouter dans le code pour qu’il compile sans erreurs ?(bonus) Comment se fait-il que
gcc
compilait sans problème au point 4?Lorsque j’exécute le programme corrigé du point 6 dans une console, j’ai accès à plusieurs variables. L’une d’elles est
$?
qui permet de récupérer la valeur de retour du dernier programme exécuté. Expliquez à quoi sert cette valeur.$ gcc -Werror -std=c99 test.c -o test $ ./test 1252 $ echo $? 0
Expliquez à quoi sert l’option
-Wall
degcc
.Recompilez le code corrigé du point 6 avec les options
-Wall
et-Werror
, que se passe-t-il ? Que faut-il rajouter dans le code pour qu’il compile sans erreurs ?
Ecrivez deux programmes qui réagissent de façon similaire à true(1) et false(1) en utilisant exit(3). Vous pouvez tester le bon fonctionnement de votre programme en exécutant le code suivant dans une console:
$ if ./true; then echo "true fonctionne"; fi true fonctionne $ if ! ./false; then echo "false fonctionne"; fi false fonctionne
Le shell bash(1) permet aussi de faire des
else
. Trouvez comment faire en regardant ce lien.