Jean HENRI
Devoir d'algorithmique mardi
1er octobre 2002
STS IG 2 durée
: 2 heures
Calculatrice autorisée, bien
que non indispensable
Décrivez les structures de boucle que vous connaissez et indiquez comment se fait le choix de ces structures.
La police municipale vous demande de rédiger une application permettant de contrôler les véhicules qui stationnent sur un parking avec une durée de stationnement limitée (vous n'avez pas à gérer cette durée).
Le parking contient un nombre limité de places (représenté par la constante NbPlacesMax). L'application doit mémoriser les véhicules stationnés (au moyen de l'immatriculation du véhicule), le numéro de la place utilisée (compris entre 1 et NbPlacesMax) et l'heure de saisie de l'enregistrement par l'agent.
L'agent passe plusieurs fois par jour sur le parking, relève les nouveaux véhicules et contrôle que les autres véhicules n'ont pas dépassé la durée limitée.
Le fonctionnement de l'application commencera toujours par la saisie de la place et de la plaque d'immatriculation. Il y a alors 3 cas possibles :
–le véhicule saisi vient d'arriver dans le parking et occupe une place qui était libre jusqu'à présent. L'application mémorise les informations (y compris l'heure système).
–Le véhicule saisi vient d'arriver dans le parking et occupe une place qui était occupée lors du précédent passage de l'agent. L'information du véhicule précédent est supprimée et remplacée par le nouveau véhicule (vous ne prévoirez aucune historisation des informations), ainsi que l'heure système.
–Le véhicule saisi était déjà présent dans le parking lors du précédent passage de l'agent. L'application indique donc la place et l'heure du précédent enregistrement. Si la place actuelle est différente de la place mémorisée (l'automobiliste a quitté le parking et est revenu entre 2 passages de l'agent), l'information sera simplement mise à jour (y compris l'heure système). Sinon, l'agent décidera de lui-même s'il doit dresser un procès-verbal ou pas (selon que l'horaire est dépassé ou pas) et aucune information ne sera modifiée.
Aucun stockage dans un fichier n'est à prévoir, l'appareil utilisé par l'agent restera allumé tout au long de la journée.
On vous donne les informations suivantes :
T_date est une
structure
Jour, Mois, Annee,
Heure, Minute, Seconde
sont entiers
fin structure
fonction DateSysteme
renvoie un T_date // La valeur renvoyée
correspond
//
à l'heure actuelle de l'appareil.
NbPlacesMax
est une constante entière qui vaut 150
Travail à faire
Rédiger les algorithmes nécessaires pour réaliser cette application. Vous prendrez soin de préciser les hypothèses éventuelles qui vous seraient nécessaires.
Annexes à utiliser : annexes 2 et 3
Le réseau étant devenu opérationnel, Monsieur YBOUX
voudrait connaître la durée pendant laquelle chaque utilisateur du siège
s'est connecté au serveur au cours d’une période donnée. Un utilitaire du
système d'exploitation du réseau alimente un fichier dans lequel les connexions
et les déconnexions des utilisateurs sont enregistrées. Ce fichier possède
une organisation séquentielle. Chaque enregistrement du fichier mentionne
le nom de l'utilisateur (NomUtilisateur), la date (DateCnx), l'heure (HeureCnx) et le type d'événement (TypeCnx) sur un caractère : "C" pour une connexion ou "D"
pour une déconnexion.
L'annexe 2
fournit un exemple commenté de ce fichier.
On fait les hypothèses suivantes sur ce fichier :
·Le fichier commence toujours par l’enregistrement d’une connexion.
·à toute connexion enregistrée correspond toujours une
déconnexion.
·À tout instant, un utilisateur a au plus une connexion en cours (il n'a
jamais plusieurs connexions simultanées).
·Le fichier étant constitué chronologiquement, une déconnexion figure toujours
après la connexion correspondante et avant la connexion suivante du même utilisateur.
·Le nombre d’enregistrements est tel que les constantes MAXLOG et MAXUSER
(voir annexe 3) sont suffisamment
dimensionnées pour permettre le chargement complet des données dans les tableaux
utilisés.
Au regard de ces hypothèses, on suppose que les contrôles
correspondants ne sont pas nécessaires puisque le fichier ne comporte aucune
erreur.
L'algorithme fourni en annexe 3 vise à calculer la durée pendant laquelle chaque utilisateur
s’est connecté au serveur. Vous êtes chargé(e) de le compléter.
Travail à faire
2.1. Étudier la fonction chercher_déconnexion :
a) Expliquer l'initialisation
de la variable locale j.
b) Dire pourquoi on peut
s'abstenir de contrôler un débordement d'indice du tableau tab_connect.
2.2. Expliquer le rôle de la
fonction init_tab, décrire son fonctionnement.
2.3. Rédiger l'algorithme de
la fonction chercher_utilisateur.
ANNEXE 2 : Extrait du fichier
de traces
Extrait du fichier de traces :
MARDUP;12/04/1998;09:20:32;C
BRIMEN;12/04/1998;09:35:12;C
XAVVIR;12/04/1998;10:21:04;C
MARDUP;12/04/1998;10:54:45;D
BARNAB;12/04/1998;11:02:35;C
MARDUP;12/04/1998;11:43:08;C
XAVVIR;12/04/1998;11:48:54;D
BRIMEN;12/04/1998;12:23:05;D
BARNAB;12/04/1998;13:04:35;D
MARDUP;12/04/1998;14:14:56;D
Interprétation de la première ligne :
L'utilisateur MARDUP s'est connecté le
12/04/1998 à 9 heures 20 minutes et 32 secondes.
Interprétation de la quatrième ligne :
L'utilisateur MARDUP s'est déconnecté
le 12/04/1998 à 1O heures 54 minutes et 45 secondes.
Interprétation de la sixième ligne :
L'utilisateur MARDUP s'est connecté le
12/04/1998 à 11 heures 43 minutes et 8 secondes.
Interprétation de la dixième ligne :
L'utilisateur MARDUP s'est déconnecté
le 12/04/1998 à 14 heures 14 minutes et 56 secondes.
Résultat :
l’utilisateur MARDUP a un temps total de connexion de 245 minutes (les secondes
ne sont pas décomptées).
ANNEXE 3 : Algorithme de calcul
des durées de connexion (1/2)
ALGO Statistiques
CONST MAXLOG 1000
CONST MAXUSER 50
structure log
NomUtilisateur : chaîne de caractères
DateCnx : date
HeureCnx : heure
TypeCnx : caractère /* "C" si connexion, "D" si déconnexion */
fin structure
structure durée
Utilisateur : chaîne de caractères
Durée : entier
fin structure
VAR
tab_connect(1:MAXLOG) : tableau de log
tab_durées(1:MAXUSER) : tableau de durée
DÉBUT
VAR x, y, z, temps
: entiers
/* La procédure charge_tab
charge le fichier de traces dans le
tableau tab_connect.
*/
charge_tab(tab_connect)
/* Procédure init_tab */
init_tab(tab_durées)
/* Par hypothèse, le premier enregistrement
est une connexion. */
x <- 1
TANTQUE x < MAXLOG
/* La fonction chercher_déconnexion rend
l'indice qu’a dans
tab_connect la déconnexion correspondant à la connexion
contenue
à l'indice x
*/
y ¬
chercher_déconnexion(x, tab_connect)
/* La fonction calcul_durée fournit la durée
d'une
connexion à partir de la date et de l'heure de
connexion,
ainsi que de la date et de l'heure de déconnexion
trouvées
dans le tableau tab_connect aux indices x et y
*/
temps ¬
calcul_durée(x, y, tab_connect)
/* La procédure
chercher_utilisateur reçoit en paramètre l'indice d'une ligne dans le tableau
tab_connect (paramètre x).
Elle
doit rendre comme résultat l'indice de la ligne du tableau tab_durées correspondant
à l'utilisateur concerné.
*/
z ¬
chercher_utilisateur(x, tab_connect, tab_durées)
tab_durées(z).Durée ¬ tab_durées(z).Durée + temps
/*
La fonction prochaine_connexion
rend l'indice de la connexion
suivante, à traiter dans le tableau tab_connect.
*/
x ¬
prochaine_connexion(x, tab_connect, MAXLOG)
FIN TANT QUE
FIN
ANNEXE 3 : Algorithme de calcul des durées de connexion (2/2)
Fonction chercher_déconnexion(i : entier, tab_connect (1 :MAXLOG) :
tableau de log) : entier
/* Cette procédure
reçoit en paramètre l'indice d'une ligne du tableau tab_connect correspondant
à une connexion.
Elle rend en résultat l'indice de la ligne où on trouve la déconnexion correspondant
à cette connexion. */
DÉBUT
j : entier
j ¬
i+1
TANTQUE tab_connect(j).NomUtilisateur <> tab_connect(i).NomUtilisateur
j ¬ j+1
FTQ
retourner j
FIN
Procédure
init_tab (tab_durée (1:MAXUSER) : tableau de durée)
DÉBUT
i, j, fin_tab_durée
: entiers
User : chaîne
de caractères
Trouvé : booléen
fin_tab_durée ¬ 0
POUR i ¬ 1 A MAXLOG
User
¬ tab_connect(i).NomUtilisateur
j
¬ 0
Trouvé
¬ faux
TANT
QUE j < fin_tab_durée et non trouvé
Si user = tab_durées(j).Utilisateur alors
Trouvé ¬ vrai
Fin si
J ¬ j+ 1
FIN
TANT QUE
SI
non trouvé ALORS
tab_durées(fin_tab_durée).Utilisateur ¬ user
tab_durées(fin_tab_durée).d_durée ¬ 0
fin_tab_durée ¬ fin_tab_durée + 1
FIN
SI
FIN POUR
FIN
Voici un exemple de tableau tab_connect après exécution de la procédure charge_tab :
NomUtilisateur |
DateCnx |
HeureCnx |
TypeCnx |
MARDUP |
12/04/1998 |
09:20:32 |
C |
BRIMEN |
12/04/1998 |
09:35:12 |
C |
XAVVIR |
12/04/1998 |
10:21:04 |
C |
MARDUP |
12/04/1998 |
10:54:45 |
D |
BARNAB |
12/04/1998 |
11:02:35 |
C |
MARDUP |
12/04/1998 |
11:43:08 |
C |
XAVVIR |
12/04/1998 |
11:48:54 |
D |
BRIMEN |
12/04/1998 |
12:23:05 |
D |
BARNAB |
12/04/1998 |
13:04:35 |
D |
MARDUP |
12/04/1998 |
14:14:56 |
D |
Voici le tableau tab_durées après exécution de la procédure init_tab :
Utilisateur |
Durée |
MARDUP |
0 |
BRIMEN |
0 |
XAVVIR |
0 |
BARNAB |
0 |