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:

  1. 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).
  2. Copiez le fichier first vers second et ajoutez la ligne « Retirer » à second.
  3. Comment pourriez-vous afficher la taille des fichiers avec ls(1)?
  4. Concaténez first et second dans un nouveau fichier third (sans utiliser la commande echo(1))
  5. Utilisez grep(1) pour afficher le numéro de la ligne sur laquelle se trouve le mot « Retirer » dans second.
  6. Retournez dans le répertoire parent de my_dir et copiez le dossier complet my_dir dans my_dir_2.
  7. 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.

  1. Calcul de la valeur absolue d’une entier: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_absolute_value

  2. Calcul de la factorielle d’un nombre entier: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_factorial

  3. Recherche d’un élément dans un tableau d’entiers: https://inginious.info.ucl.ac.be/course/LEPL1503/s1_tab_find

  4. 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();
    }
    
  5. Expliquez à quoi sert l’option -Werror de gcc. Regardez la manpage (gcc(1)).

  6. 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 ?

  7. (bonus) Comment se fait-il que gcc compilait sans problème au point 4?

  8. 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
    
  9. Expliquez à quoi sert l’option -Wall de gcc.

  10. 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 ?

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

Vérifiez vos réponses