TP ‐ Processus - vbridonneau/CoursSysteme GitHub Wiki

TP Processus

Un peu de topologie

Plus grande voyelle dans un fichier

Dans l'exercice qui suit, notre but est de compter les voyelles présentes dans dans des fichiers et, pour chacun, de dire quelle est la voyelle la plus représentée. Pour ce faire, nous allons créer un programme qui prend en argument les fichiers à traiter et qui, pour chacun, crée un nouveau processus (via fork), appelle un fonction pour compter le nombre de voyelle dans le fichier et renvoie, par le status (argument de exit) la voyelle avec la plus grande occurence. Commençons par la fonction qui compte les voyelles.

  1. Créez une fonction compterVoyelle permettant, pour un fichier donné, de retourner la voyelle de plus grande occurence qu'il contient. Voici son prototype :
char compterVoyelle(const char *nomFichier);

Il ne nous reste plus qu'à utiliser cette fonction et fork pour compter les voyelles par fichier. Pour ce faire, notre programme comportera deux boucles : une pour créer les processus et une pour les attendres afin de d'afficher le résultat.

  1. Codez la boucle for permettant la création des processus. Pour chaque processus créé, le père mémorise le pid de son fils dans un tableau et le fils lui, exécute la fonction puis sort du programme en passant en status la voyelle de plus grande occurence du fichier traité.

  2. Codez la boucle for permettant d'attendre les processus et d'afficher, pour chaque fichier, la voyelle de plus grande occurence.

Nombre de noeud d'un arbre

Pour cet exercice, notre but est de compter le nombre de noeud que possède un arbre binaire d'une certaine hauteur h. Pour ce faire, nous allons implémenter une fonction récursive arbre dont le but est de créer les processus via des appels à fork, puis de récupérer via le status et la fonction wait le nombre de noeud créé par les processus fils. La fonction que l'on va créer aura le prototype suivant :

void arbre(int hauteur);

Note : Comme cette fonction se contente de sortir du programme sans retourner de valeur, son type de retour est void. Dans un premier temps, nous allons commencer par écrire le code de la fonction main qui va appeler arbre en lui passant en paramètre une valeur entière lu depuis depuis les arguments du programme. Même si on ne connaît pas encore le contenu de la fonction arbre, on connaît néanmoins son comportement. On va donc pouvoir l'utiliser pour récupérer le nombre de noeud d'un arbre binaire de taille h.

  1. Ecrivez le code de la fonction main de telle manière à pouvoir récuperer la nombre de noeud d'un abre de hauteur h.

Avant de coder notre fonction arbre, on peut se demander quel résultat est censé donner une telle fonction :

  • Combien de noeud possède un arbre de hauteur h ?

On va à présent pouvoir écrire le code de la fonction arbre. Etant donné que notre fonction est récursive il va falloir gérer le cas général et le cas terminal.

  1. Commencez par gérer le cas ou la hauteur de l'abre vaut 1.
  2. Écrivez ensuite le cas général. On oubliera pas que notre fonction ne renvoit rien; elle se contente de créer des processus qui vont eux appeler la fonction arbre.

Test

Testez votre programme avec les hauteurs suivantes :

  1. 1, 5, 7, 9. Est-ce que ces valeurs correspondent à la valeur théorique calculée précédement ?
⚠️ **GitHub.com Fallback** ⚠️