Documente Academic
Documente Profesional
Documente Cultură
Contrôle Continu
Date : 27 novembre 2006
Documents et supports de cours autorisés.
Remarques :
* Vous ferez attention à la gestion des erreurs.
* Toutes les questions peuvent être traitées indépendamment, en supposant connues les
fonctions et procédures définies dans les questions précédentes. Vous veillerez d’ailleurs pour
répondre aux questions à utiliser les fonctions ou procédures des questions précédentes, si possible.
* Vous pouvez définir des procédures ou des fonctions qui ne sont pas demandées, mais dont
vous sentez qu’elles sont nécessaires pour répondre proprement à une question.
1 u1(1) =1
1 1
1 2 1 un(i)=un-1(i)+un-1(i-1)=10+10=20
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
int **alloue_triangle(int n)
{
int **triangle=NULL ;
int i ;
triangle=(int**)malloc(n*sizeof(int*)) ;
if(triangle==NULL){
fprintf(stderr, "Erreur d allocation\n") ;
exit(1) ;}
for(i=0 ;i<n ;i++)
1
NB : L’exercice I a été demandé à un étudiant postulant à un stage à la SNCF lors de son entretien d’embauche en 2004
sous la forme « écrire un programme en langage C qui calcule et affiche un triangle de Pascal », sans aucune autre indication.
{
triangle[i]=(int*)malloc((i+1)*sizeof(int)) ;
if(triangle[i]==NULL) ){
fprintf(stderr, "Erreur d allocation\n") ;
exit(1) ;}
}
return triangle ;
void remplit_triangle(int**triangle,int n)
{
int i,k ;
for(i=0 ;i<n ;i++)
{
for(k=0 ;k<i+1 ;k++)
{
if(k==0||k==i) triangle[i][k]=1;
else triangle[i][k]= triangle[i-1][k-1]+
triangle[i-1][k];
}
}
}
void affiche_triangle(int**triangle,int n)
{
int i,k ;
for(i=0 ;i<n ;i++)
{
for(k=0 ;k<i+1 ;k++)
{
printf("%d ",triangle[i][k]);
}
printf("\n");
}
}
void libere_triangle(int**triangle,int n)
{
int i,k ;
for(i=0 ;i<n ;i++) free(triangle[i]) ;
free(triangle) ;
}
5) Ecrire une fonction principale qui demande à l’utilisateur le nombre de lignes qu’il
veut calculer puis qui utilise les fonctions précédentes pour allouer, remplir et afficher
le triangle, et enfin le désallouer.
int main()
{
int n=0 ;
int **triangle==NULL ;
printf("Nb lignes ? ") ;
scanf("%d",&n) ;
triangle=alloue_triangle(n) ;
remplit_triangle(triangle,n) ;
affiche_triangle(triangle,n) ;
libere_triangle(triangle,n) ;
return 0 ;
}
EXERCICE II : Des wagons dans des trains ; Dans cet exercice, nous allons considérer
deux structures imbriquées.
Soit une structure nommée « wagon », contenant deux entiers positifs, « sieges » et
« passagers » qui indiquent respectivement le nombre de sièges et le nombre de passagers
dans le wagon.
WAGON *wagon_init(int n)
{
int i ;
WAGON *wag=(WAGON*)malloc(n*sizeof(WAGON));
if(wag==NULL){
fprintf(stderr, "Erreur d allocation\n");
exit(1);}
for(i=0 ;i<n ;i++)
{
wag[i].sieges=90;
wag[i].passagers=0;
}
return wag ;
}
3) Ecrire une fonction unsigned int wagon_places_dispo(WAGON*) qui
calcule le nombre de places disponibles dans un wagon dont on fait passer l’adresse en
argument d’entrée.
Soit la structure nommée « train » composée de deux champs : le premier sera un entier
positif indiquant le nombre de wagons, et le second, un pointeur sur une structure de type
WAGON.
TRAIN *train_init(int n)
{
TRAIN *tchoutchou=(TRAIN*)malloc(sizeof(TRAIN)) ;
if(tchoutchou==NULL) ){
fprintf(stderr, "Erreur d allocation\n");
exit(1);}
tchoutchou->tab=wagon_init(n) ;
tchoutchou->nb=n ;
return n ;
}
10) Ecrire une procédure void train_tri_wagon(TRAIN*) qui trie les wagons du
train selon l’ordre croissant du nombre de passagers avec la méthode de votre choix.
/* tri à bulle */
void train_tri_wagon(TRAIN *tchoutchou)
{
int permut=1 ;
int i=0, k=tchoutchou->nb-1 ;