IUP 2

Examen d'informatique

Première session 1997 (29/5)

Durée 3h, documents autorisés : cours manuscrit et documents fournis en cours, tout autre étant interdit.


Partie A : transcodage de fichiers

Comme je l'ai dit en cours, des systèmes différents vont coder de manière différente une même information, et ce même pour un caractère (en particulier les caractères accentués). On désire créer des petits programmes utilitaires permettant de passer d'un codage à un autre.

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
'â'
"â"
'ä'
"ä"
'à'
"à"
'<'
"&lt;"
'>'
"&gt;"
'ç'
"&ccedil;"
'é'
"&eacute;"
'ê'
"&ecirc;"
'ë'
"&euml;"
'è'
"&egrave;"
'î'
"&icirc;"
'ï'
"&iuml;"
'ô'
"&ocirc;"
'ö'
"&ouml;"
'û'
"&ucirc;"
'ü'
"&uuml;"
'ù'
"&ugrave;"
autre caractère de code <=127
le même caractère
autre caractère de code >127
'#'

Faites un programme qui :

Question A2 : MS DOS et Windows ne codent pas non plus les caractères de la même manière. En fait les 128 premiers caractères (code 0 à 127) sont identiques, les 128 suivants se ressemblent mais ne sont pas classés dans le même ordre. Par exemple, un 'é' sous MSDOS a pour code 130 (en décimal, 0x82 en hexa), alors que sous Windows le 'é' existe également, mais avec le code 233 (0xE9). Ecrire la fonction ayant pour entête :
    char dos_to_win(char c)
qui admet en entrée un caractère codé entre 0 et 255 (supposé être codé en MSDOS), et doit retourner le code du caractère correspondant en Windows : si (c <= 127) on retourne le même, sinon on retourne le code du caractère équivalent en utilisant le tableau dos_to_win_codes.

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:

dos_to_win_codes[0] contenant le code du caractère windows équivalent au caractère de code 128
dos_to_win_codes[1] contenant le code du caractère windows équivalent au caractère de code 129
dos_to_win_codes[2] contenant le code du caractère windows équivalent au caractère de code 130
---- etc ----

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.

Partie B : analyse d'une maintenance

On désire faire des statistiques sur la maintenance d'un petit parc machines. Chaque machine est définie par un numéro (entier, positif). Pour chaque panne, on note : la date de l'intervention (entier, positif, voir plus loin), la durée en heure (flottant, positif) et un petit texte de description de la panne.

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 :
    void lecture (void)
qui lit dans un fichier les pannes déjà saisies, les met (proprement) dans tableau, et met à jour nb_reel. (vous n'avez pas à l'écrire ici, vous pouvez l'utiliser), et la fonction :
    void ecriture(void)
qui sauve les pannes actuellement en mémoire dans un fichier

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