Vous êtes sur la page 1sur 4

Royaume du Maroc

Agence Nationale de Rglementation des Tlcommunications


Institut National des Postes et Tlcommu nications

Concours d'accs en 1re anne de l'Institut


National des Postes et Tlcommunications
Lundi 16 juillet 2012

Epreuve d'algorithmique et programmation


en Langage C

Recomm andations aux candidats

- L'apprciation des copies tient compte de la rigueur algorithmique, de


la prsentation etde la clart de la rdaction.

- Si, au cours de l'preuve, un candidat repre ce qui lui semble tre une
erreur d'nonc, il le signale sur sa copie, propose une correction et
poursuit l'preuve en consquence.

- L'usage de calculatrices lectroniques n'est pas autoris.

Dure de l'preuve: 1 heure


Problme: Validit des identificateurs d'un langage de programmation
Contexte du problme
Tout langage de programmation permet l'utilisation de chanes de caractres
pour dclarer et identifier les constantes et les variables du programme.
Ces chanes de caractres appels identificateurs doivent respecter un
ensemble de rgles particulires pour chaque langage.
Le problme suivant s'intresse la vrification de la validit d'identificateurs
d'un langage spcifique

Rgles de validit des identificateurs du langage tudier


Soit un langage de programmation qui dfinit, comme suit, les rgles de validit
d'un identificateur:

- Un identificateur est une chane de caractres de longueur infrieure strictement 80

- Un identificateur ne peut contenir que des caractres alphabtiques minuscules


('a', ...,'z') ou majuscules ('A', ...,'Z') ou des chiffres ('0', '1', .., '9').
- Un identificateur ne doit pas commencer par un chiffre ('0', '1', ..., '9').
- Un identificateur ne doit pas tre un des mots cls suivants: if, do, while , for.

Remarques
- Toutes les fonctions demandes seront crites en langage C
- Les questions non traites peuvent tre admises pour aborder les questions
ultrieures
- Toute fonction peut tre dcompose, si ncessaire, en plusieurs fonctions
- Seules les fonctions suivantes dfinies dans la bibliothque du langage C peuvent tre
appeles sans tre dfinies:
- Fonctions dclares dans le fichier string.h
int strlen (const char*) retourne la longueur de la chaine en paramtre
char* strepy (char*, const char*) : copie la 2me chane dans la premire
int strcmp (const char*, const char*) compare les 2 chanes en paramtres et
retourne 0 si elles sont identiques
- Fonction dclare dans le fichier stdlib.h
void free (void*) : libre l'espace dynamique allou
Dans ce problme, il n'est pas demand d'crire la fonction main
Rappel: Les valeurs dcimales des codes ASCII des caractres chiffres, des
caractres alphabtiques majuscules ou miniscules sont indiqus ci-dessous:

caractre
Code ASCII

1/3
1- Vrification de la validit d'un identificateur
-+ Question 1 (5 points) : Ecrire une fonction de prototype int valide (char id[]) qui
retourne 1 si son paramtre id est un identificateur valide ou retourne 0 (zro) sinon.
(Un identificateur est valide s'il respecte les rgles du langage tudier cites plus haut)

Exemple:
Concours, INPT, Max10, MinO sont des identificateurs valides.
3xy, hy*, if ne sont pas des identificateurs valides.

2- Suppression des identificateurs non valides dans un tableau


-+Question 2 (8 points): Soit T un tableau de N (O<N) chanes de caractres dont
les longueurs sont infrieures 80
Ecrire une fonction de prototype: void supprimer(int N, char T[ ][80]) qui
supprime toutes les chanes qui ne correspondent pas des identificateurs valides. Ces
chanes seront remplaces par des chanes vides la fin du tableau (voir exemple)
Exemple
Soit N= 5 et T={"identif1" "4val" "variable" "if' "delta"}
" "
Aprs l'appel de la fonction supprimer(5, T),T={"identif1 ", "variable", "delta","."}

3- Suppression des identificateurs redondants dans une liste chane


On suppose avoir dj cre une liste chane d'identificateurs valides dans la
mmoire dynamique. Cette liste chane est dfinie par le type liste dclar ainsi:
typedef struct tliste
{ char identificateur[80]; /1 reprsente un identificateur
struct tliste *suiv; /1 reprsente l'adresse de l'lment suivant dans la liste
} liste;

-+Question 3 (7 points): Ecrire une fonction de prototype:


void supprimer_redondants(liste *adrDebut) qui permet de supprimer tous les
identificateurs redondants dans une liste chane de type liste dfinie plus haut.
Le paramtre (adrDebut) de cette fonction reprsente l'adresse du premier
lment de cette liste, le dernier lment de cette liste a l'adresse NULL dans son
champ suiv
Dans le cas o n (n>1) identificateurs sont identiques dans la liste chane, on
ne laissera dans la liste que le premier et on supprimera les (n-1) autres (voir exemple)

2/3
Exemple

-Reprsentation de la Liste chane avant la suppression des identificateurs redondants:


adrDebut

Valeur nombre nombre total Valeur X10 total


~ ~ ~ ~ ~ ~
suiv./ suiv ./'
suiv ./ v suiv./ suiv/ su\)v v NULL

-Reprsentation de la liste chane aprs l'appel de la fonction supprimer_redondants(adrDebut)

adrDebut

Valeur nombre total X10


~ ~ t>
suiv./ suiv ./'
suiv./ NULL

/************************************ FIN DEL' EPRE UVE **********************************1

3/3