Licence Informatique 1ère année
Algorithmique et Programmation Examen – 18/05/2020 - 1h30
Les notes de cours, TD et TP sont (forcément) autorisées.
Exercice 1 (10 points) : les hôpitaux veulent un logiciel pour gérer les patients aux urgences. Chaque patient est décrit par son numéro de sécurité sociale (chaine de caractères), son âge, et un indice ESI (Emergency Severity Index) qui indique à quel point le cas du patient est urgent. L'ESI va de 1 (urgence absolue) à 5 (pas urgent).
a- Écrire la déclaration d'un enregistrement pour représenter les patients dans le logiciel. (1 point) b- Écrire un programme qui crée un tableau de 100 enregistrements représentant des patients, avec pour numéro de sécurité aléatoire "n1", "n2", ..., "n100", un âge aléatoire compris entre 0 et 120 et un ESI aléatoire entre 1 et 5. On suppose qu'il existe une fonction entier random(entier e) qui renvoie un entier entre 0 et e inclus. (2 points)
c- Écrire une fonction qui prend en paramètre un tableau de patients et un indice ESI (entier) et renvoie le numéro de sécurité sociale du patient le plus agé ayant cet indice. Si aucun patient n'a cet indice, la fonction renvoie une chaine vide. (3,5 points)
d- Le patient à traiter en priorité est, parmi ceux qui ont l'indice ESI le moins élevé, celui qui est le plus vieux. Écrire une fonction qui prend en paramètre un tableau de patients et renvoie le numéro de sécu du patient à traiter en priorité. (3,5 points)
Exercice 2 (10 points) : dans un autre logiciel, qui gère les sorties de l'hôpital, on a un tableau d'entiers représentant les motifs de sortie des patients, avec 3 valeurs possibles :
0 : le patient est mort, 1 : le patient a guéri avec des séquelles, 2 : le patient a guéri sans séquelle On veut trier le tableau d'entiers de la façon suivante : on commence par compter le nombre de 0, de 1 et de 2 dans le tableau. Puis on remplit le tableau avec autant de 0, puis de 1, puis de 2 qu'on en a trouvés en comptant. Par exemple, si le tableau est [0,2,1,1,2,0,1,2,0,2], on compte trois 0, trois 1 et quatre 2, et on remplit le tableau ainsi [0,0,0,1,1,1,2,2,2,2].
a- Écrire une fonction qui prend en paramètre un tableau d'entiers entre 0 et 2 et le tri par cette méthode. (5 points)
b- Donner le paramètre de complexité de la fonction. Indiquer quel est le cas au pire s'il existe.
Calculez la complexité de l'algorithme, dans le cas au pire s'il existe, dans le cas général sinon. Le calcul de la complexité doit être justifié, sinon il ne sera pas pris en compte. (4 points)
c- Si, au lieu d'avoir 3 valeurs possibles dans le tableau (0,1 et 2), on avait toutes les valeurs possibles entre 0 et un entier x donné, quelle serait la complexité ? (1 point)
CO RR
EC TIO N
Exercice 1
enregistrement Patient chaine secu;
entier age, ESI;
finenregistrement programme P
Patient t[100];
entier i;
début
pour (i allant de 0 à 99 pas de 1) faire t[i].secu <- "n"+i;
t[i].age <- random(120);
t[i].ESI <- 1+random(4);
fin pour fin
fonction avec retour chaine plusVieux(Patient t[], entier taille, entier esi) entier age, i, n;
début
age <- -1;
pour (i allant de 0 à taille-1 pas de 1) faire si (t[i].ESI=esi ET t[i].age>age) alors
n <- i;
age <- t[i].age;
finsi finpour
si (age=-1) retourne "";
sinon retourne t[n].secu;
fin
fonction avec retour chaine prioritaire(Patient t[], entier taille) entier i,esiMin;
début
esiMin <- 5;
pour (i allant de 0 à taille-1 pas de 1) faire si (t[i].ESI<esiMin) alors
esiMin <- t[i].ESI;
finsi finpour
retourne plusVieux(t,taille,esiMin);
fin
Exercice 2
fonction sans retour tri(entier t[], entier taille) entier i,j,k;
entier nb[3];
début
nb <- {0,0,0};
pour (i allant de 0 à taille-1 pas de 1) faire nb[t[i]] <- nb[t[i]]+1;
finpour k <- 0;
pour (i allant de 0 à 2 pas de 1) faire
pour (j allant de 0 à nb[i]-1 pas de 1) faire t[k] <- i;
k <- k+1;
finpour finpour
fin
CO RR
EC TIO N
Le paramètre de complexité est la taille du tableau. Il n'y a pas de cas au pire. La première boucle pour s'exécute en temps linéaire (O(n)). Au premier tour de la deuxième, on fera un nombre de tours de la boucle égal au nombre de 0, puis un nombre de tours de boucles égal au nombre de 1, puis au nombre de 2. Comme il n'y a que des 0, 1 et 2 dans le tableau, le nombre total de tours de boucles de la boucle interne sera égal à la taille du tableau. Ce tri est donc linéaire.
Ce raisonnement vaut si on augmente le nombre de valeurs possibles, donc ce tri est toujours linéaire.