Durée 3h, documents autorisés : cours manuscrit et documents fournis en cours, tout autre étant interdit.
Question A1 : On veut transformer un texte (écrit sous MS-DOS) en HTML (format utilisé pour visualiser les documents sur Internet). Certains caractères sont identique, d'autres sont codés différement (sur plusieurs caractères en HTML). En se limitant aux cas les plus courants, on doit traduire :
caractère initial
|
chaîne
à mettre à la place
|
'â'
|
"â"
|
'ä'
|
"ä"
|
'à'
|
"à"
|
'<'
|
"<"
|
'>'
|
">"
|
'ç'
|
"ç"
|
'é'
|
"é"
|
'ê'
|
"ê"
|
'ë'
|
"ë"
|
'è'
|
"è"
|
'î'
|
"î"
|
'ï'
|
"ï"
|
'ô'
|
"ô"
|
'ö'
|
"ö"
|
'û'
|
"û"
|
'ü'
|
"ü"
|
'ù'
|
"ù"
|
autre
caractère de code <=127
|
le
même caractère
|
autre
caractère de code >127
|
'#'
|
Faites un programme qui :
Le tableau dos_to_win_codes est un tableau déclaré et
initialisé dans un fichier nommé "dostowin.h" qu'il suffit
d'inclure pour s'en servir. Cest un tableau de 127 char, avec:
Le but est de faire la fonction la plus rapide possible (pour traiter rapidement de gros fichiers) Vous ne devez écrire que la fonction, pas le programme qui s'en sert. Plus la fonction est courte, mieux c'est.
La date est stockée sous forme d'un entier : numéro de mois*100 + numéro de jour. Donc le 29/5 sera codé 529. On se limite à un traitement annuel, l'année n'est donc pas stockée.
Le texte descriptif peut être de longueur assez variable suivant les pannes, mais une fois saisi une fois, il ne sera qu'exceptionellement modifié.
Soient les déclarations globales :
#define DIM 500 typedef struct { int num_machine; /* numéro de la mchine en panne */ int date; /* date de la réparation */ float duree; /* durée de la réparation */ char * descr; /* adresse du début du texte de descrition, il sera fini par un 0 */ }panne; panne tableau[DIM]; /* pas plus de 500 pannes dans l'année */ int nb_reel; /* nombres réel de pannes, <DIM */On dispose d'une fonction dont l'entête (prototype) est :
Question B1 : écrire une fonction qui demande à l'utilisateur du programme une date (jour, mois), et qui retourne l'entier correspondant.
Question B2 : écrire une fonction qui demande à l'utilisateur un texte, réserve (malloc) la quantité de mémoire nécessaire (pas plus), y copie le texte, et retourne l'adresse de ce bloc de mémoire. On peut, si vous le désirez, supposer que les textes ne dépasseront jamais 1000 caractères. L'entête de cette fonction sera : char * saisie_texte(void)
Question B3 : écrire une fonction void ajoute(void) qui permet de rajouter une panne dans tableau (à la suite de celles qui y sont déjà), et incrémente nb_reel. Les informations nécessaires sont demandées à l'utilisateur du programme. On utilisera si possible les deux fonctions demandées aux questions précédentes (même si on n'a pas répondu aux dites questions).
Question B4 : écrire une fonction qui trie les pannes par durée de réparation décroissante (et affiche le résultat).
Question B5 : écrire le programme principal : il apelle lecture, puis permet (autant de fois que l'on veut) d'ajouter une nouvelle panne, ou trier (dans un cas réel on proposerait d'autres options comme lister, supprimer, modifier, ...). Quand on quitte le programme, si on a au moins ajouté une panne, il doit demander si on veut sauver les pannes sur ficher (et le faire si la réponse est oui).
Remarques : Vous pouvez traiter les questions dans l'ordre qui vous convient. Dans la partie B, vous pouvez utiliser dans un question le résultat d'une question précédente, même si vous ne l'avez pas encore traitée.
pour voir les réponses, cliquez ici
pour voir l'histogramme des notes obtenues à cet examen, cliquez ici
pour calculer la note que vous auriez obtenue, cliquez ici.
pour retourner au sommaire des sujets d'examen, cliquez ici
Patrick TRAU, ULP - IPST 4/6/97