Académique Documents
Professionnel Documents
Culture Documents
Examen de Langage C
Vendredi 5 Dcembre 2014
Promotion Le Meur
1i`ere anne
. Salvat
Modalits :
Dure : 2 heures
Seul document autoris : carte de rfrence du C, pas de machine calculer, ni de tlphone.
Toute sortie est dnitive !
Le barme est donn titre indicatif.
Cor
rig
Exercice 1
Par exemple si l'on considre le tableau de notes ci-dessous, le 2i`eme lve a obtenu un 15 au 3i`eme
examen.
12
16
14
11
13
12
10
16
9
15
...
13
17
...
...
16
14
...
...
12
8
1. Dnir la fonction Moyenne_Eleve qui prend en paramtre un tableau d'entiers (les notes) et un
entier x reprsentant le numro de l'lve qui renvoie la moyenne de l'lve (en nombre dcimal).
2. Dnir la fonction Moyennes qui prend en paramtre un tableau d'entiers (les notes) et qui renvoie
un tableau des moyennes (une moyenne par lve) en nombre dcimaux.
Corrig de l'exercice 1.
1. fonction Moyenne_Eleve :
2. fonction Moyennes
float* Moyennes(int notes[M][N])
{
float* moy;
int i;
moy = malloc(M * sizeof(float));
for(i=0 ; i<M ; i++)
{
Exercice 2
int tab[]={1,2,3,4,5,6,7,8,9};
int *p;
p=tab;
Cor
rig
Quelle est la nature (entier ou pointeur ) et la valeur ou l'adresse de chacune des expressions suivantes ?
1. p
2. *(p+5)
3. tab+5
4. &tab[5]-p
Corrig de l'exercice 2.
1.
2.
3.
4.
Exercice 3
Remarque.
Pour mmoire : le code ASCII de 'A' est 65 (et en suivant pour les autres lettres jusqu' 90 pour
'Z'), de mme le code ASCII de 'a' est 97 (et en suivant pour les autres lettres jusqu' 122 pour
'z').
L'oprateur % (modulo) renvoie le reste de la division entire de deux entiers.
Corrig de l'exercice 3.
#include <stdio.h>
char code_lettre(char a_coder, char codage)
{
char base;
int decalage = codage -'a';
result = a_coder + decalage;
/* lettre minuscule */
Cor
rig
/* lettre majuscule */
if ( (fic=fopen(nom_fic,"r")) == NULL)
{
printf("Erreur ouverture du fichier : %s \n",nom_fic);
return(-1);
}
if ( (fic=fopen(fic_sauv,"w+")) == NULL)
{
printf("Erreur ouverture du fichier de sauvegarde \n");
return(-1);
}
while ( !feof(fic))
{
l_lu = fgetc(fic);
if (((l_lu >=65) && (l_lu<=90)) || ( (l_lu>=97) && (l_lu<=122) ) )
l_lu = code_lettre(l_lu, l_code);
fputc(l_lu, sauv);
}
codage(argv[1],argv[2],"message_secret.txt" );
}
return 0;
Co
rrig
if (argc < 3 )
{
printf("Erreur !\nDonner au moins 2 arguments : lettre et nom_fichier.\n");
return(-1);
}
for (numfic=2; numfic < argc; numfic++)
{
sprintf(nom_fic,"message_secret_%d.txt", numfic-1);
codage(argv[1],argv[2],nom_fic );
}
return 0;
Exercice 4
Cor
rig
3. crire la fonction Horaires qui prend en paramtre un nom d'arrt, une ligne de bus et un sens
(aller ou retour) et qui renvoie les horaires de passage des bus cet arrt.
4. crire la fonction Ajoute qui prend en paramtres un nom d'un nouvel arrt, un tableau d'horaires
(du nouvel arrt), un nom d'arrt, une ligne et un sens (aller ou retour), et qui ajoute un nouvel
arrt dans la ligne aprs l'arrt pass en paramtre. On supposera que l'on dispose de la fonction
void Copie_horaires(int origine[15][2], int copie[15][2]) qui recopie le tableau d'horaires origine dans le tableau copie.
5. On souhaite connatre les correspondances entre deux lignes. crire la fonction Correspondances
qui prend en paramtres deux lignes de bus et qui renvoie une liste chane des arrts communs
(mme nom) aux deux lignes.
Si cela est ncessaire on pourra utiliser les fonctions de la bibliothque string, notamment la fonction
strcmp : strcmp(chane1,chane2) renvoie un entier plus petit, gal ou plus grand que 0 si chane1
est respectivement plus petite, gale ou plus grande que chane2 dans l'ordre alphabtique.
Corrig de l'exercice 4.
1. Structure arrt :
2. Structure ligne :
3. Recherche des horaires de passage un arrt donn. On avait le choix de reprsenter le sens comme
on le souhaite : un entier, une seule lettre, ou encore, comme dans ce corrig, avec les mots "aller"
et "retour".
int** Horaires(char* nom_a, s_ligne* lig, char* sens)
{
s_arret cour = NULL;
else {
return(cour->horaires);
printf("Arrt %s introuvable.\n",nom_a);
retrun NULL;
void Ajoute(char* nom_nouv, int horaires_nouv[15][2], char* nom_pred, s_ligne* lig, char* sens)
{
s_arret* nouv=NULL;
s_arret* cour=NULL;
Cor
rig
if (cour==NULL) {
printf("Arret %s introuvable.\n",nom_pred);
(exit(-1);
}
/* insertion de nouv dans la liste chane */
nouv->suiv = cour->suiv;
cour->suiv = nouv;
5. Recherche des noms des arrts permettant une correspondance entre deux lignes. Pour construire
la liste chane des arrts, on peut utiliser la structure dclare la question 1. A noter que les
horaires ne sont pas demands (il faudrait les horaires des 2 lignes...). On pourrait aussi construire
une strucure qui ne contient que les noms des arrts. Enn, pour tre variment prcis, il serait
souhaitable de ne pas mettre des doublons dans cette liste (ce qui n'est pas prcis dans le sujet).
s_arret* Correspondance(s_ligne* L1, sligne* L2)
{
s_arret* retour = NULL; /* la liste chane rsultat */
Cor
rig
}
return retour;
An d'viter les doublons, on pourrait remplacer le code l'intrieur du test if (strcmp(cour1->nom,cour2->nom)
== 0) par l'appel une fonction qui ajoute dans une liste chane un lment que si ncessaire :
s_arret* Ajoute_vrif(s_arret* liste, char* nom_arret)
{
s_arret* cour=NULL;
s_arret* nouv=NULL;
cour=liste;
while ( (cour!=NULL) && (strcmp(cour->nom, nom_arret)!=0)
cour=cour->suiv;
Co
rrig