Veuillez noter qu’à l’intra d’hiver 2004, on ne demande pas de fonction de type void.
Section 1 : Vrai ou Faux (5 questions pour 15 points)
Répondez par Vrai (ou V) si l'énoncé est correct ou par Faux (ou F) si l'énoncé est incorrect. Si votre réponse est Faux et seulement dans ce cas, vous êtes tenu de justifier brièvement en français votre réponse.
1.1) L'exécution des instructions suivantes : int n = 5 ;
switch ( n % 4 ) { case 0 :
case 1 : printf(“Zero, Un”);
case 2 : printf(“Deux”);
default: printf(“Autre”);
}
fait afficher à l’écran : Zero, Un Réponse :
Faux ; pas de break donc : Zero, UnDeuxAutre
1.2) Les bons paramètres d’une fonction permettent, très souvent, d’appliquer le
même traitement (la même logique) avec des données différentes.
Réponse : Vrai
1.3) Avec les déclarations suivantes:
float reel = 12.5;
int entier = 125;
char carac = ‘A’;
l’instruction suivante permet d'afficher correctement les valeurs de ces trois variables:
printf(%c%4d%6.2f\n,reel,entier,carac);
Réponse : Faux : codes de format non appropriés.
1.4) Après l'exécution des instructions suivantes : int n = 5 ;
if ( n > 10)
n++ ;
n += 3 ; la valeur de n est 8 Réponse :
Vrai
1.5) On ne peut pas écrire plus courte avec une autre boucle que while, les instructions
suivantes où n est une variable déclarée de type int : n = 0 ;
while ( n <= 10 )
{ printf(“Bonne chance!\n”);
n = n + 2;
} Réponse :Faux
for(n=0; n<=10;n+=2)
printf(“Bonne chance!\n”);
Section 2 : if vs switch (15 points)
Voici une partie d’un programme qui lit un code tapé au clavier par l’usager et initialise les valeurs entières a et b selon ce code.
int code, a, b;
printf("Entrez le code : ");
scanf("%d", &code);
if(code > 0 && code <= 3) { a=1;
b=0;
}
else if(code > 3 && code <= 6) { a=0;
b=1;
}
else if(code ==7 || code == 8) { a=1;
b=1;
} else
{ a=0;
b=0;
}
Ré-écrivez ces instructions en utilisant le switch plutôt que le
if imbriqué
. Réponse :int code, a, b;
printf("Entrez le code : ");
scanf("%d", &code);
switch(code) {
case 1 : case 2 : case 3 : a=1;
b=0 ; break;
case 4: case 5: case 6: a= 0;
b=1;
break;
case 7: case 8: a=1;
b=1;
break;
default : a=0;
b=0;
}
Section 3 : Les boucles (total de 20 points) 3.1 ( 8 points )
Ré-écrivez l’instruction suivante en remplaçant la boucle for par la boucle do … while . . . :
for( i = 0; i< 20; i = i+2) printf("%2d\n", i);
Réponse :
i = 0;
do{
printf("%2d\n", i);
i += 2;
}while( i < 20 );
3.2 ( 12 points )
On aimerait déterminer et afficher les diviseurs de 15 selon le modèle suivant :
Les diviseurs de 15 : 1) 1
2) 3 3) 5 4) 15
Écrivez une suite d’instructions (pas un programme complet) y compris les déclarations
pour déterminer et afficher les diviseurs de 15 selon le modèle donné ci- dessus.
Réponse :
int n=0, val =15, i;
printf("les diviseurs de %d\n", val);
for( i = 1; i<=val; i++) if(val % i == 0) {
n++;
printf("%d) %2d\n", n, i);
} Note :
L’instruction composée sous if peut être remplacée par une
instruction simple :
printf("%d) %2d\n", ++n, i);
Section 4 : Fonctions (total de 20 points ) 4.1 ( 10 points )
Soit la fonction suivante :
void afficher( int nombre ) { int s = 0, e = 0 ;
printf("%3d", nombre);
do {
s = s + (nombre % 10);
e = (e * 10) + (nombre % 10);
nombre = nombre / 10;
} while ( nombre > 0 );
printf("%4d%4d\nFin", s, e);
}
Que fait afficher l’appel suivant ? : afficher(27);
Réponse : 27 9 72 Fin
4.2 ( 10 points )
Entre 1 et 10 on trouve 6 diviseurs de 30, ce sont 1, 2, 3, 5, 6 et 10.
Entre 1 et 12 on trouve 3 diviseurs de 15, ce sont 1, 3, 5.
a) Complétez la fonction suivante qui permet de compter et de retourner le nombre
de diviseurs du nombre2 entre 1 et le nombre1 : Solution :
int leNombre (int nombre1, int nombre2) {
int i, n = 0;
for(i = 1; i<= nombre1; i++) if(nombre2 % i == 0)
n++;
return n;
}
b) Complétez les appels suivants : Solution :
printf("Entre 1 et 10 on a %d diviseurs de 30\n", leNombre(10,30));
printf("Entre 1 et 49 on a %d diviseurs de 100\n", leNombre(49,100));
Section 5 : Tableaux à un seul indice et statistique de base (total de 30 points )
(vous avez le droit d’utiliser des fonctions mais ce n’est pas du tout une obligation
pour cette section 5).
Note : Pour cette solution, on utilise des fonctions qui n’étaient pas obliggatoires pour l’intra.
5.1) Déclarez les tableaux suivants pour un maximum de 300 familles différentes.
un tableau, nommé salaire, capable de mémoriser les salaires familiaux (des réels) un tableau, nommé nbEnfant, capable de mémoriser le nombre d’enfants (des entiers) un tableau, nommé nbVoiture, capable de mémoriser le nombre de voitures utilisées (des entiers)
Écrivez aussi la déclaration du nombre effectif de familles à traiter : nbFamille.
Réponse :
#define MAX 300 float salaire[MAX];
int nbEnfant[MAX], nbVoiture[MAX];
int nbFamille;
5.2) Supposons qu’on a déjà lu un fichier, rempli les 3 tableaux et compté le nombre effectif de familles à traiter : nbFamille.
a) Écrivez les déclarations et les instructions permettant :
- de calculer et d’afficher le nombre moyenne de voitures chez des familles ayant 5 enfants;
- de calculer et d’afficher le nombre moyenne de voitures chez des familles ayant 3
enfants.
Réponse :
float moyenne (int voiture[], int nbEnfant[], int nbFamille, int borne) { float somme=0;
int i, nombre = 0;
for ( i = 0 ; i < nbFamille ; i++) if(nbEnfant[i] == borne) {
somme += voiture[i];
nombre++;
}
if (nombre > 0)
return somme/nombre ; else
return 0.0 ; }
appels et affichage :
printf("%.1f\n", moyenne (nbVoiture, nbEnfant, nbFamille,5));
printf("%.1f\n", moyenne (nbVoiture, nbEnfant, nbFamille,3));
b) Écrivez les déclarations et les instructions permettant :
- d’afficher les salaires des familles ayant 2 voitures ou plus;
- d’afficher les salaires des familles ayant 4 voitures ou plus.
Réponse :
void affSal(float salaire[], int nbVoiture[],int nbFamille, int borne) { int i, rang = 0;
for(i=0; i< nbFamille; i++) if(nbVoiture[i] >= borne )
printf("%3d) %9.2f\n", ++rang, salaire[i]) ;
if ( rang == 0)
printf("Aucune famille ayant %d voitures ou plus\n", borne) ; }
appels:
affSal(salaire, nbVoiture, nbFamille, 2) ; affSal(salaire, nbVoiture, nbFamille, 4) ;
c) Écrivez les déclarations et les instructions permettant :
- de déterminer et d’afficher le nombre maximum d’enfants dans une famille;
- de déterminer et d’afficher le nombre maximum de voitures dans une famille.
Réponse :
int max(int tab[], int n) {
int leMax = tab[0],i;
for( i =1 ; i<n; i++) if(tab[i] >leMax) leMax = tab[i];
return leMax;
} Appels
printf("le nombre max. d’enfants : %d\n",max(nbEnfant, nbFamille)) ; printf("le nombre max. de voitures : %d\n",max(nbVoiture, nbFamille)) ;