Vous êtes sur la page 1sur 54

② +1/1/60+ ②

QCM 1 - Technique de programmation

Durée : 14 minutes.
Aucun document n’est autorisé.
Une seule réponse par question, pas de point négatif en cas de mauvaise réponse.
Noircir les cases pour la reconnaissance optique (Ne pas cocher mais remplir la
case!). En cas d’erreur, entourer d’un cercle la case noircie correcte.
L’ordre et la dificulté des questions/réponses sont aléatoires.

Question 1 Quelle est la sortie du programme?

int i=1, j=4;


float a,b,c,d;

a=i/j; b=1.0*(i/j); c=(1.0*i)/j; d=1.0*((float)(i/j));


printf("%f %f %f %f",a,b,c,d);

A 0 0 0.25 0 D 0 0 0 0
B 0.25 0.25 0.25 0.25 E 0 0 0.25 0.25
C 0 0.25 0.25 0.25

Question 2 Quel est le test correct pour vérifier que r est diviseur commun de a et b ?

A if ( (!(a%r)) || (!(b%r))) C if ( (a%r) || (b%r))


printf("r divise a et b"); printf("r divise a et b");
B if ( (!(a%r)) && (!(b%r)) ) D if ( (a%r) && (b%r))
printf("r divise a et b"); printf("r divise a et b");

Question 3 Quelle est la sortie/affichage de ce programme ?


int i=10;
while(i>0)
{ i=i-4;
printf("%d",i);
}

A 6 2 0 B 10 6 2 C 10 6 0 D 6 2 -2

Question 4 Soit un tableau défini par double tab[6], que représente alors l’expression
*(tab+2)+1 ?

A tab[3] D &tab[2]+1
B tab[1]+1 E &tab[3]
C tab[2]+1

Question 5 La fonction fun() est appellée combien de fois dans les boucles imbriquées suivantes
:

for(i=0;i<3;i++)
for(j=i;j>0;j--)
{ fun(); }

A 6 B 3 C 4 D 5 E 2

② ②
② +1/2/59+ ②

Question 6 Quelle est la sortie du programme suivant :


int a=1,b=2;

if (a != 0)
printf("e");
else if ((a==1) || (b==2))
printf("f");
else if (b==2)
printf("g");
else
{ /*no instruction*/};

A f B e C efg D ef E (aucun affichage)

Question 7 Que vaut sum à la fin de ce code ?


int i,sum=0;
int tab[5]={1,2,4,6};
for (i=0 ; i<5; i++)
{
sum=sum+tab[i];
if (sum==5)
{break;}
}

A 6 B 0 C 8 D 13 E 5

Question 8 Quel est l’affichage plausible du programme suivant ?

int n=4;
int *p_n=&n;

printf("[%d] %d %d %d", &n, &p_n, p_n,*p_n);

A [1123] 1123 1123 4 D [1123] Impossible à prédir 4 1123


B [1123] Impossible à prédire 1123 4 E [1123] 4 4 1123
C [1123] 4 Impossible à prédire 4

② ②
② +1/3/58+ ②

Question 9 Quel est l’affichage correspondant au code ci-dessous ?


int a=1;
int b=2;
int *p1=&a, *p2=&b;

*p2 = 4;
p2 = p1;
a = 3;
*p1 = *p2+1;

printf("%d %d %d %d ", a, b, *p1, *p2);

A 2 3 1 4 D 4 4 4 4
B 4 3 3 4 E 2 4 2 2
C 3 2 3 3

Question 10 Quelle est la sortie/affichage du programme suivant :


int main()
{ int i;
printf("%d\n", i);
return 0; }

A une valeur aléatoire B Erreur de compilation C 0 D -1

Question 11 Combien de fois la fonction fun() est-elle appelée dans le code suivant ?

i=0;
do
{ i++;
fun(); }
while (i<0);

A 3 B 2 C 1 D une infinité E 0

Question 12
Quel est le code correct pour définir un tableau de 3 float et accèder au dernier élément du tableau
?

A float tab[2]; C float tab[2];


x=tab[3]; x=tab[2];
B float tab[3]; D float tab[3];
x=tab[2]; x=tab[3];

Question 13
L’instruction malloc(11*sizeof(int)) réserve ?

A de la mémoire contiguë pour stocker 11 entiers.


B de la mémoire contiguë pour stocker 1 entier codé sur 11 octets.
C de la mémoire pas nécessairement contiguë pour stocker 1 entier codé sur 11 octets.
D de la mémoire pas nécessairement contiguëe pour stocker 11 entiers.

② ②
② +1/4/57+ ②

② ②
② +1/5/56+ ②

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 8 : A B C D E
Question 2 : A B C D Question 9 : A B C D E
Question 3 : A B C D
Question 10 : A B C D
Question 4 : A B C D E
Question 11 : A B C D E
Question 5 : A B C D E
Question 6 : A B C D E Question 12 : A B C D

Question 7 : A B C D E Question 13 : A B C D

② ②
Correction

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 8 : A B C D E
Question 2 : A B C D Question 9 : A B C D E
Question 3 : A B C D
Question 10 : A B C D
Question 4 : A B C D E
Question 11 : A B C D E
Question 5 : A B C D E
Question 6 : A B C D E Question 12 : A B C D

Question 7 : A B C D E Question 13 : A B C D
② +1/1/60+ ②

QCM 2 - Technique de programmation

Durée : 12 minutes.
Aucun document n’est autorisé.
Une seule réponse par question, pas de point négatif en cas de mauvaise réponse.
Noircir les cases pour la reconnaissance optique (Ne pas cocher mais remplir la
case!). En cas d’erreur, entourer d’un cercle la case noircie correcte.

Question 1
Quelle est la sortie du programme suivant:

int gg ( int i ) A 1 2
{ int k=1; B 0 1
return i+k ; }
C 1 1
void hh ( int i , int ∗ j ) D 1 0
{ i ++; E 0 0
∗ j=i +1; }

int main ( )
{ int a=0, b=0;
gg ( a ) ;
hh ( a ,&b ) ;
b=gg ( a ) ;
p r i n t f ( "%d␣%d" , a , b ) ;
return 0 ; }

Question 2
Quel est le test correct pour tester la présence d’un caractère dans une chaîne str[20]?

A while ( str[i] != "c") C while ( str != "c")


B while ( strcmp(str, ’c’) D while ( str[i] != ’c’)

Question 3
Qu’affiche le programme suivant?

void t r i o ( int a , int b , int c ) A 1 2 3


{ a = b + c; B 5 4 3
b = c + a;
c = a + b; } C 3 6 9
D un warning et erreur de segmentation
int main ( void ) E 1 3 6
{ int a = 1 , b = 2 , c = 3 ;
trio (a , b , c );
p r i n t f ( "%d␣%d␣%d\n" , a , b , c ) ;
return 0 ; }

② ②
② +1/2/59+ ②

Question 4
Qu’affiche le code suivant ?
char t e x t [ ] = " t h e ␣ w o r s t ␣ t h i n g s \n␣come␣ f r e e ␣ t o ␣ us " ;
t e x t [ 2 3 ] = ’ \0 ’ ;

p r i n t f ( "%s " , t e x t ) ; /∗ ou p u t s ( t e s t ) ; ∗/

A the worst things


come
B the worst things
come free0to us
C the worst things
come free to us
D the worst things\n come free to us

Question 5

int a [ ] = { 1 , 2 , 3 } ; A &a[1] 2
int b [ ] = { 4 , 5 } ; B &b[0] 2
int ∗ c [ 2 ] = { a , b } ; C 5 &b[1]

Que valent *(c+1) (ou c[1]) et c[0][1] avec D &a[0] 5


les déclarations suivantes ? E &b[1] 2

Question 6
Quels sont la fonction et l’appel correct permettant de récupérer une durée en heures+minutes à
partir d’un nombre de minutes ?

A void convert(int *h, int *min) C void convert(int *h, int *min)
{ *h = *min/60; { h = min/60;
*min = *min%60;} min = min%60;}
et et
int hour, minutes; int hour, minutes;
convert (hour, minutes); convert (&hour, &minutes);

B void convert(int *h, int *min) D void convert(int *h, int *min)
{ *h = *min/60; { *h = min/60;
*min = *min%60;} *min = min%60;}
et et
int hour, minutes; int hour, minutes;
convert (&hour, &minutes); convert (*hour, *minutes);

② ②
② +1/3/58+ ②

Question 7
La valeur affichée par le programme est ?

void f o n c t i o n ( int ∗a ) A 3
{ a [1]=4; }
B 4
int main ( )
C 1
{ int T[ 3 ] = { 1 , 2 , 3 } ;
f o n c t i o n (T ) ; D 2
p r i n t f ( "%d" ,T [ 1 ] ) ;
return 0 ; } E aucun: erreur de compilation

Question 8
Qu’affiche le programme suivant?

void t r i o ( int ∗a , int ∗b , int ∗ c ) A 5 4 3


{ ∗a = ∗b + ∗c ; B un warning et erreur de segmentation
∗b = ∗ c + ∗a ;
∗ c = ∗a + ∗b ; } C 1 3 6
D 3 6 9
int main ( void ) E 1 2 3
{ int a = 1 , b = 2 , c = 3 ;
trio (a , b , c ); /∗ ? ! ∗/
p r i n t f ( "%d␣%d␣%d\n" , a , b , c ) ;
return 0 ; }

Question 9
Où est l’erreur ?
1 char ∗ v i l l e ;
2 ∗ v i l l e =(char ∗ ) m a l l o c ( 3 0 ∗ s i z e o f ( char ) ) ;
3
4 p r i n t f ( " C a p i t a l e ␣du␣ Burundi ? " ) ;
5 s c a n f ( "%s " , v i l l e ) ;
6 p r i n t f ( " Votre ␣ r e p o n s e : ␣%s " , v i l l e ) ;

A Ligne 6: il manque un & devant ville C Ligne 6: il manque un * devant ville


B Ligne 5: il manque un & devant ville D Ligne 2: il y a un * en trop devant ville

Question 10
Que teste le code suivant ?
char s t r [ 2 0 ] = " o i s e a u " ;
i f ( s t r==" c h e v a l " )
{

A si la chaine est de même longueur que la longueur du mot "cheval"


B si le mot contenu dans la chaine est égal au mot cheval
C si l’adresse de la chaine est égale à l’adresse mémoire de la chaine "cheval"
D si le premier caractère de la chaîne est égal au premier caractère du mot "cheval"

② ②
② +1/4/57+ ②

② ②
② +1/5/56+ ②

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 6 : A B C D
Question 2 : A B C D Question 7 : A B C D E
Question 3 : A B C D E Question 8 : A B C D E
Question 4 : A B C D Question 9 : A B C D
Question 5 : A B C D E Question 10 : A B C D

② ②
Correction

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 6 : A B C D
Question 2 : A B C D Question 7 : A B C D E
Question 3 : A B C D E Question 8 : A B C D E
Question 4 : A B C D Question 9 : A B C D
Question 5 : A B C D E Question 10 : A B C D
② +1/1/60+ ②

QCM 3 Techniques de Programmation


Durée : 30 minutes.
Aucun document n’est autorisé.

Les questions n’attendent qu’une seule réponse, sauf une question avec mention contraire.
Pas de point négatif en cas de mauvaise réponse.

Chaque sujet est unique et associé à une feuille réponse unique en fin de document.
Indiquez votre numéro de table et nom sur cette feuille réponse, qui est la seule à rendre.

Question 1

Soit un fichier texte contenant le nom d’un objet Quelle instruction est à utiliser pour le lire ?
stellaire et sa magnitude: double i;
char str[40];

andromede 12.2 A fscanf(F, "%s %lf ", &str, &i)


13423451 3.2 B fscanf(F, "%c %lf ", &str, &i)
pegase 16.1
11223344 4.41 C fscanf(F, "%s %lf ", str, &i)
D fscanf(F, "%c %lf ", &str, i)
E fscanf(F, "%c %lf ", &str, i)

Question 2
Que teste le code suivant ?
char s t r [ 2 0 ] = " o i s e a u " ;
i f ( s t r==" c h e v a l " ) {

A si l’adresse de la chaine est égale à l’adresse mémoire de la chaine "cheval"


B si le mot contenu dans la chaine est égal au mot cheval
C si le premier caractère de la chaîne est égal au premier caractère du mot "cheval"
D si la chaine est de même longueur que la longueur du mot "cheval"

Question 3

int i=1,j=2; Quelle est la sortie du programme :

if (i != 0) A a
printf("a");
else if (i==1) B bc
printf("b");
C b
else if (j==2)
printf("c"); D ad
else
printf("d"); E bd

② ②
② +1/2/59+ ②

Question 4

Quelle est la sortie du programme? A 0 0 0 0


int i=1, j=2;
float a,b,c,d; B 0 0.5 0.5 0.5

a=i/j; C 0.5 0.5 0.5 0.5


b=1.0*(i/j);
c=(1.0*i)/j; D 0 0 0.5 0.5
d=((float)i)/j;
printf("%f %f %f %f",a,b,c,d); E 0 0 0.5 0

Question 5

Combien de fois est exécutée la fonction corps() A 6 fois


dans la double boucle suivante ?
B 3 fois
f o r ( i =0; i <4; i ++)
{ f o r ( j=i ; j >0; j −−) C 8 fois
{ corps ( ) ; } D 12 fois
}
E 4 fois

Question 6

Pour lire au clavier 2 caractères à placer dans A scanf("%c %c", *t, *(t+1));
les éléments t[0] et t[1] d’un tableau, on peut B scanf("%c %c", *t, *(t)+1);
écrire:
C scanf("%c %c", t, t+1);
D scanf("%c %c", t);
E scanf("%c %c", t[0], t[1]);

Question 7

Soit le code suivant pour modéliser une machine Que vaut alors *(enigma[1]) ?
enigma:
A &roue2[0]
char r o u e 1 [ 9 ] = " e i x b c p o a " ;
char r o u e 2 [ 9 ] = "uvdwrmnf" ; B roue1[1]
char r o u e 3 [ 9 ] = " g j s q h t k l " ; C roue1

char∗ enigma [ 3 ] = D roue2[0]


{ roue1 , roue2 , r o u e 3 } ; E &roue1[0]

② ②
② +1/3/58+ ②

Question 8

Quelle erreur s’est glissée dans le programme A Il manque un & devant pointeur dans la
suivant ? ligne du free.
int ∗ p o i n t e u r=NULL;
B Il manque une * devant le pointeur dans
p o i n t e u r =( int ∗ ) m a l l o c ( s i z e o f ( int ) ) ; la ligne du test if.
i f ( p o i n t e u r == NULL) { return ( −1);}
C Il y a une * en trop devant pointeur dans
p r i n t f ( " Quel ␣ age ␣ avez−vous ␣ ? ␣ " ) ; la ligne du printf.
s c a n f ( "%d" , &p o i n t e u r ) ;
D Il manque une * devant le pointeur dans
p r i n t f ( "Vous␣ avez ␣%d␣ ans \n" , la ligne malloc.
∗ pointeur ) ;
E Il y a un & en trop devant pointeur dans
f re e ( pointeur ) ; la ligne du scanf.

Question 9

int nombre =4; A 0x10 4


int ∗ p o i n t e u r= &nombre ;
B 4 0x252
p r i n t f ( "%p␣%d" ,
pointeur , ∗ pointeur ) ; C 0x10 0x252

Si on suppose que la variable nombre est stockée D [impossible à prédire] 4


à l’adresse mémoire 0x10 et pointeur à l’adresse
0x252, quel sera l’afichage ? E 0x252 0x10

Question 10

Quelle est la sortie du programme suivant ? A 1 1 1


int g=0; 1 2 2
B 1 1 1
void f(void) 1 1 3
{ int i=0; C 1 1 1
static int j=0; 1 2 1

i++; j++; g++; D 1 1 1


printf("%d %d %d\n", i, j, g); } 2 2 2
E 1 1 1
int main() 1 2 3
{ f();
g--; /* ! */
f();
return 0; }

② ②
② +1/4/57+ ②

Question 11
La date de dernière modification des fichiers permet de savoir quels fichiers ont été modifiés depuis la
dernière compilation et donc ceux à prendre en compte pour mettre à jour le programme (méthode
employée par l’utilitaire make). D’aprés le détail des fichiers du répertoire suivant, quel est alors
le jeu minimum d’opérations à réaliser pour mettre à jour l’exécutable program?

Name last modification time A gcc -c calcul.c -o calcul.o


program 10:00 today gcc calcul.o prog.o -o program
calcul.c 11:24 today
B gcc -c calcul.c -o calcul.o
calcul.o 10:00 today
gcc calcul.o -o program
prog.c 09:57 today
prog.o 10:00 today C gcc calcul.o -o program
D gcc -c prog.c -o prog.o
gcc calcul.o prog.o -o program
E gcc -c prog.c -o prog.o
gcc prog.o -o program

Question 12

void swap1 ( int i , int j ) L’affiche de ce programme est :


{ int tmp=3;
tmp=i ; A 2 2
i=j ; B 1 2
j=tmp ; }
C 3 1
void swap2 ( int ∗ i , int j ) D 2 3
{ int tmp ; E 2 1
tmp=∗ i ;
∗ i=j ;
j=tmp ; }

int main ( )
{ int a=1, b=2;

swap1 ( a , b ) ;
swap2 ( &a , b ) ;
p r i n t f ( "%d␣%d\n" , a , b ) ;

return 0 ; }

Question 13

Soit la structure suivante définie en début de Comment déclarez-vous dans une fonction 2
fichier source (pas de typedef): stuctures afin de stocker le nom et la note de
2 étudiants ?
struct s t u d e n t {
char name [ 3 0 ] ; A struct {} student1, student2;
char n o t e ;
/∗un e n t i e r −128< <127∗/ B struct student{} student1, student2;
}; C student student1, student2;
D struct student1, student2;
E struct student student1, student2;

② ②
② +1/5/56+ ②

Question 14

Quelle est la syntaxe correcte pour accéder au A (*student1).note = 18;


champ de student1? B student1.note = 18;
(A noter que (&student1) -> note = 18;
est une autre solution mais pas recommandée.) C student1->note = 18;
D (*student1)->note = 18;

Question 15 ♣

Soit un pointeur sur une structure : A strcpy(p_student->name, "gerard");


p_student = &s t u d e n t 1 ; B strcpy(p_student->&name, "gerard");
/∗ ou p_student= C strcpy( *(p_student).name, "gerard");
m a l l o c (1∗ s i z e o f ( s t r u c t s t u d e n t ) ) ; ∗/
D strcpy( p_student.*name, "gerard");
Quelles sont les 2 syntaxes correctes pour ac- E strcpy(p_student->name, "gerard");
céder au champ name ?
F strcpy((*p_student).name, "gerard");

② ②
② +1/6/55+ ②

Question 16 Afin de simplifier l’écriture, on ajoute au fichier un nouveau type (eleve) pour
la structure avec:
typedef struct s t u d e n t eleve ;
et on définit une liste avec eleve promo[101];.
Quelle défintion de fonction correspondrait à l’appel ci-dessous pour afficher la liste d’élèves ?
int n=58;
a f f i c h e _ l i s t e ( promo , n ) ;

A
void a f f i c h e _ l i s t e ( e l e v e l i s t , int n )
{ int i ;
f o r ( i =0; i <n ; i ++)
{ p r i n t f ( "%s ␣%d\n" , &( l i s t [ i ] . name ) , l i s t [ i ] . n o t e ) ; } }

B
void a f f i c h e _ l i s t e ( e l e v e ∗ l i s t , int n )
{ int i ;
f o r ( i =0; i <n ; i ++)
{ p r i n t f ( "%s ␣%d\n" , &( l i s t [ i ]−>name ) , l i s t [ i ]−>n o t e ) ; } }

C
void a f f i c h e _ l i s t e ( e l e v e l i s t , int n )
{ int i ;
f o r ( i =0; i <n ; i ++)
{ p r i n t f ( "%s ␣%d\n" , l i s t [ i ]−>name , l i s t [ i ]−>n o t e ) ; } }

D
void a f f i c h e _ l i s t e ( e l e v e ∗ l i s t , int n )
{ int i ;
f o r ( i =0; i <n ; i ++)
{ p r i n t f ( "%s ␣%d\n" , l i s t [ i ]−>name , l i s t [ i ]−>n o t e ) ; } }

E
void a f f i c h e _ l i s t e ( e l e v e ∗ l i s t , int n )
{ int i ;
f o r ( i =0; i <n ; i ++)
{ p r i n t f ( "%s ␣%d\n" , l i s t [ i ] . name , l i s t [ i ] . n o t e ) ; }
}

② ②
② +1/7/54+ ②

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 9 : A B C D E
Question 2 : A B C D Question 10 : A B C D E
Question 3 : A B C D E Question 11 : A B C D E
Question 4 : A B C D E Question 12 : A B C D E
Question 5 : A B C D E Question 13 : A B C D E
Question 6 : A B C D E Question 14 : A B C D
Question 7 : A B C D E Question 15 : A B C D E F
Question 8 : A B C D E Question 16 : A B C D E

② ②
Correction

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D E Question 9 : A B C D E
Question 2 : A B C D Question 10 : A B C D E
Question 3 : A B C D E Question 11 : A B C D E
Question 4 : A B C D E Question 12 : A B C D E
Question 5 : A B C D E Question 13 : A B C D E
Question 6 : A B C D E Question 14 : A B C D
Question 7 : A B C D E Question 15 : A B C D E F
Question 8 : A B C D E Question 16 : A B C D E
② +1/1/60+ ②

QCM Final Techniques de Programmation


Question 1

La notation int *p=&x; est équivalente à : A int *p; p=&x;


B int p; *p=&x;
C int *p; p=x;
D int *p; *p=&x;

Question 2 Quand a lieu l’édition de liens et quelle est l’utilité de l’éditeur de liens ?

A A lieu après la compilation. Crée l’exécutable en regroupant le code machine des fonctions
issues des fichiers sources et des bibliothèques utilisées.
B A lieu après la compilation. Crée l’exécutable en regroupant le code source des fonctions
issues des fichiers sources et des bibliothèques utilisées.
C A lieu avant la compilation. Crée l’exécutable en regroupant le code machine des fonctions
issues des fichiers sources et des bibliothèques utilisées.
D A lieu avant la compilation. Crée l’exécutable en regroupant le code source des fonctions
issues des fichiers sources et des bibliothèques utilisées.

Question 3
Quelle déclaration au sujet du langage C est vraie ?

A aucune des déclarations ci-jointes


B Des bons commentaires dans le code peuvent améliorer le temps d’exécution.
C Un éditeur de lien est utilisé pour traduire un langage haut-niveau (tel le C) en langage
machine.
D Les lignes commençant avec un # sont traitées au moment de l’exécution.

Question 4

Quel est le problème dans le programme suiv- A ligne 7: déclaration incorrecte du pointeur
ant? B ligne 8 et 9: le pointeur utilisé n’est pas
1 void main ( ) initialisé (segfault)
2 { C ligne 8: l’opérateur -> est incorrect pour
3 struct xx
accéder au champ de s
4 { int x ;
5 char name [ 2 0 ] ; D ligne 9: l’opérateur -> est incorrect pour
6 }; accéder au champ de s
7 struct xx ∗ s ;
8 p r i n t f ( "%d" , s−>x ) ;
9 p r i n t f ( "%s " , s−>name ) ;
10 }

② ②
② +1/2/59+ ②

Question 5

Quelle est la sortie/affichage de ce programme ? A 10 6 2


int i=10;
B 6 2 -2
while(i>0)
{ i=i-4; C 10 6
printf("%d",i);
} D 6 2

Question 6

Si p pointe sur un tableau de double (ou si p A double * p[]


est utilisé pour l’allocation d’un tableau) alors p B double *p
peut s’écrire :
C double (*p)[]
D double **p

Question 7

Dans la déclaration int table [2][3] = A aucun des éléments est initialisé à 0.
{{0}, {0}}; , B seule la premère colonne est initialisée à 0.
C tous les éléments sont initialisés à 0.
D seuls les 2 premiers éléments de la première
ligne sont initialisés à 0.
E seule la dernière colonne est initialisée 0.
(Faire l’analogie avec le cas d’un tableau simple
lorsque int t[3] = {0}; /*!*/ )

Question 8

Pour disposer dans une fonction f d’une variable A static int i; à l’extérieur de f
i dont B int i; à l’extérieur de f
• la valeur est préservée entre chaque appel C static int i; à l’intérieur de f
• et qui ne soit pas visibe de l’extérieur de D int i; à l’intérieur de f
la fonction f, E private int i; à l’intérieur de f
il faut la définir en tant que:

Question 9 Que fait l’opération malloc( 25 * sizeof(int)) ; ?


A Cela réserve 25 octets au total de mémoire et retourne l’adresse du premier octet réservé.
B Cela réserve 100 octets au total de mémoire et retourne l’adresse du premier octet réservé.
C Cela réserve 25 octets au total de mémoire et retourne la valeur du premier octet réservé.
D Cela réserve 100 octets au total de mémoire et retourne la valeur du premier octet réservé.

② ②
② +1/3/58+ ②

Question 10

int x [ ] = { 1 , 2 , 3 , 4 , 5 } ; Par quelle instruction faut il remplacer ????


int u ; dans le code précédent pour que le programme
affiche 1-2-3-10-5- ?
????
f o r ( u=0; u<5; u++) A *(ptr[3]) =10;
{ B *ptr[3] =10;
p r i n t f ( "%d−" , x [ u ] ) ; }
C (*ptr)[3] =10;
D *ptr +3 =10;
E *(ptr+3)=10;

Question 11

Qu’affichera le code suivant ? A A


int N=65; B erreur à l’exécution
char l e t t r e = N; C N
p r i n t f ( "%d" , l e t t r e ) ; D 65

Question 12

Si p pointe sur un tableau de pointeurs, eux A double **p


même pointant sur des tableaux de double alors B double ***p
p peut s’écrire :
C double (* (*p)[])[]
D double [][] *p

Question 13

int c a r r e ( int j ) Affiche à l’exécution :


{ A >4>4
j ∗= j ; B >2>4
p r i n t f ( ">%d" , j ) ;
C >4>2
return j ; }
D >2>2
int main ( )
{
int n=2;
carre (n ) ;
p r i n t f ( ">%d" , n ) ;
return 0 ; }

Question 14

Quel est le résultat de l’expression A 8


(10/3)*3 + 5%3 ? B 10
/*!*/
C 12
D 2
E 11

② ②
② +1/4/57+ ②

Question 15

int f u n c t i o n ( int ∗ i , int j ) Qu’affiche ce code ?


{ A 11
∗ i=j ; B 01
j ++;
C 00
return j ; }
D 12
int main ( ) E 10
{ int x=0, y=0;

f u n c t i o n (&x , y ) ;
p r i n t f ( "%i ␣%i " , x , y ) ;
return 0 ; }

Question 16

Quelle est la directive de prépocesseur nécessaire A #include <malloc.h>


à l’usage de la fonction malloc() ? B #include <stdio.h>
C #include "stdlib.h"
D #include "malloc.h"
E #include <stdlib.h>

Question 17

int c a r r e ( int ∗ j ) Affiche à l’exécution :


{ A >2>2
( ∗ j ) ∗= ∗ j ; B >4>4
p r i n t f ( ">%d" , ∗ j ) ;
C >2>4
return j ; }
D >4>2
int main ( )
{
int n=2;
c a r r e (&n ) ;
p r i n t f ( ">%d" , n ) ;
return 0 ; }

Question 18

Le corps() de la boucle suivante s’exécute : A une boucle infinie


int i =9; B 0 fois
do C 1 fois
{ D 2 fois
corps ( ) ; (Rappel: si préfixée, l’incrémentation est effec-
} while (++i <10); tuée avant évaluation de l’expression)

② ②
② +1/5/56+ ②

Question 19

void myfunc ( int x ) Qu’affiche alors un appel à la fonction récursive


{ myfunc(3); ?
i f ( x>0)
{ x−−; A 1, 2,
myfunc ( x ) ; } B 0, 1, 2,
p r i n t f ( "%d , ␣ " , x ) ;
C 0, 0, 1, 2,
}
D 2, 1, 0, 0,

Question 20

Quel est le problème du programme suivant ? A un tableau de char ne peut être initialisé
int main ( ) comme fait dans ce programme.
{ char m1[ 9 ] = " message1 " ; B les tableaux sont trop petits.
char m2[ 9 ] = " message2 " ; C un tableau statique ne peut être à gauche
de l’affectation (=) hors une initialisation.
m2 = m1 ; D un tableau de char ne peut être affiché
p r i n t f ( "msg␣ i s ␣%s " , m1 ) ; avec un printf.
return 0 ; }

Question 21

Le corps() de la boucle suivante s’exécute : A 6 fois


f o r ( i =0 ; i <3 ; i ++) B 5 fois
f o r ( j =0; j<=i ; j ++) C une boucle infinie
corps ( ) ; D 3 fois
E 10 fois

Question 22

On souhaite manipuler une matrice 2D avec Le prototype d’une fonction typique pour ma-
une notation de la forme M[i][j] et pouvoir la nipuler M est alors :
passer facilement à une fonction. A f( int *m, int L*C)
B f( int m[], int L, int C);
Le C ne laisse pas d’autre alternative que
C f( int* m, int L, int C);
d’utiliser un tableau de pointeur (alloué dy-
namiquement ou statiquement). D f( int m[], int L, int C);
E f( int **m, int L, int C);

Question 23

Si a est une variable entière et p est un pointeur Que vaut p ?


défini par: A 3
int *p; B [indéterminé avec les infos disponibles]
p=&a;
C 0xF3C8
Et si printf("%i %p", a, &a) ; D NULL
affiche 3 0xF3C8 . E 0

② ②
② +1/6/55+ ②

Question 24

Toujours d’après la question précédente, que A 3


vaut *p ? B [indéterminé avec les infos disponibles]
C NULL
D 0
E 0xF3C8

Question 25

Toujours d’après la question précédente, que A 0


vaut &p ? B [indéterminé avec les infos disponibles]
C 3
D 0xF3C8
E NULL

Question 26

do
A while ( i <3) { y++;
{ y++;
i ++; }
i ++; }
while ( i <2);
B y++;
est équivalent à : i ++;
while ( i <1) { y++;
i ++; }

C while ( i <2) { y++;


i ++; }

D y++;
i ++;
while ( i <2) { y++;
i ++; }

Question 27

Si une fonction a pour prototype void fn A fn(&x) avec x défini par int *x;
(int*); , laquelle de ces expressions est correcte B fn(*x) avec x défini par int *x;
pour appeler la fonction ?
C fn(x) avec x défini par int *x;
D fn(x) avec x défini par int x;

② ②
② +1/7/54+ ②

Question 28

Pour saisir et afficher une chaîne de caractères A scanf("%s", name);


char name[9]; on utilise : printf("%s", *name);
B scanf("%s", *name);
printf("%s", *name);
C scanf("%s", &name);
printf("%s", &name);
D scanf("%s", &name);
printf("%s", *name);
E scanf("%s", name);
printf("%s", name);

Question 29

Soit un fichier ouvert dans le mode suivant : A Le fichier est ouvert en lecture.
B un 2ème fichier result.txt est créé à côté
FILE *F; du premier dans le répertoire courant.
F=fopen("result.txt","w"); C On a une erreur à la compilation.
Si le fichier "result.txt" existe déjà, que se D Le contenu du fichier sera écrasé avec les
passe-t’il (qu’avez-vous constaté en TP)? nouvelles écritures.
E F prend la valeur NULL.

Question 30 ♣

struct s t r _ p e o p l e {
A ( ∗ j d o e)−>age
char name [ 2 0 ] ;
int age ; };
B j_doe . age
struct s t r _ p e o p l e j_doe ;
L’accès au champ age de la variable j_doe est C (&j_doe)−>age
possible avec les 2 syntaxes suivantes:
D j_doe−>age

E (&j_doe ) . age

Question 31

Soit un fichier texte contenant le nom d’un objet A while(


stellaire et sa magnitude: fscanf(F, "%s %lf", &str, &i)=EOF)
B while(
andromede 12.2
fscanf(F, "%s %lf", &str, i)!=EOF)
13423451 3.2
pegase 16.1 C while(
11223344 4.41 fscanf(F, "%s %lf", &str, &i)!=EOF)
Quelle instruction est à utiliser pour le lire ? D while(
double i; fscanf(F, "%s %lf", str, &i)=EOF)
char str[40]; E while(
fscanf(F, "%s %lf", str, &i)!=EOF)

② ②
② +1/8/53+ ②

Question 32

Si x est le nom d’un tableau 1D, quelle proposi- A *(x+i) équivaut à &x[i]
tion est correcte ? B *(x+i) équivaut à x[i]+1
C *(x+i) équivaut à *x[i]
D x+i équivaut à &x[i]

Question 33

Quel est le test correct pour tester la présence A char c="k";


du caractère alphabétique k dans une chaîne while ( str[i] != c){
str[20]? B char c=k;
while ( str[i] != c){
C char c=’k’;
while ( str[i] != c){
D char k;
while ( str[i] != c){

Question 34 ♣

Sélectionnner 2 couples prototype/appel com- A int sum(int *tab, int n);


patibles avec une fonction qui somme les élé- Appel: sum(&vec,3);
ments d’un tableau : B int sum(int tab[], int n);
Appel: sum(vec[0],3);
C int sum(int *tab, int n);
Appel: sum(*vec,3);
D int sum(int tab[], int n);
Appel: sum(&vec[0],3);
E int sum(int *tab, int n);
Appel: sum(vec,3);

Question 35
La valeur affichée par le programme est ?

void f o n c t i o n ( int ∗a ) A 4
{ a [1]=4; }
B 2
int main ( )
C aucun: erreur de compilation
{ int T[ 3 ] = { 1 , 2 , 3 } ;
f o n c t i o n (T ) ; D 1
p r i n t f ( "%d" ,T [ 1 ] ) ;
return 0 ; } E 3

Question 36

Que vaut t[1][2] avec t défini par int A 4


t[2][3]= { {1,2,3},{4,5,6}} : B 6
C 5
D 2
E 1

② ②
② +1/9/52+ ②

Question 37

Quelle expression est équivalente à if (n != A if ( !(n = 8)) /*! simple= */


8) en C ? B if ( n < 8 && n > 8)
C if (n-8)

Question 38 ♣

Quelles sont les 2 syntaxes correctes pour ac- A item_t[1].name


céder au 2ième élément d’une liste définie par B liste[1].name
:
C (item_t+1)->name
struct item_t D (liste+1).name
{ int quantity;
E (liste+1)->name
char name[30]; };

struct item_t liste[2]=


{ {1,"corde"},
{10, "bougie"} };

Question 39

Quelle est la manière correcte d’allouer une ma- A mat=malloc(3*sizeof(int**));


trice 2x3 (2 lignes, 3 colonnes) via un tableau de for (j=0 ;j<3 ;j++)
pointeurs ? mat[j]=malloc(2*sizeof(int*));

B mat=malloc(2*sizeof(int**));
for (j=0 ;j<2 ;j++)
mat[j]=malloc(3*sizeof(int));

C mat=malloc(3*sizeof(int*));
for (j=0 ;j<3 ;j++)
mat[j]=malloc(2*sizeof(int));

D mat=malloc(2*sizeof(int*));
for (j=0 ;j<2 ;j++)
mat[j]=malloc(3*sizeof(int));

Question 40

char i , n= ’ n ’ ; Quelle est la boucle équivalente à ce code ?


f o r ( i =0; i <8; i ++)
A f o r ( i =0; ( i <8) | | ( n != ’ y ’ ) ; i ++)
{ n=g e t c h a r ( ) ;
{ n=g e t c h a r ( ) ; }
i f ( n==’ y ’ )
break ;
} B f o r ( i =0; ( i <8) | | ( n ==’ y ’ ) ; i ++)
{ n=g e t c h a r ( ) ; }

C f o r ( i =0; ( i <8) && ( n != ’ y ’ ) ; i ++)


{ n=g e t c h a r ( ) ; }

D f o r ( i =0; ( i <8) && ( n ==’ y ’ ) ; i ++)


{ n=g e t c h a r ( ) ; }

② ②
② +1/10/51+ ②

Question 41

Quelle est la sortie du programme suivant? A ti


int main() B Aucun affichage
{ int x=2, y=5; C tati

if( 0<(y-x) ) D ta
{ return y; } /*!*/
else
{ printf("ta"); }

printf("ti");
return x;
}

Question 42

int a = 0 , b=1; Quelle est la sortie (affichage) du programmme


int ∗p2 , ∗ p1 ; ?
A 2 3 4 4
p1=&a ; B 2 4 2 2
p2=&b ;
C 4 2 4 4
∗p1=∗p2 +1; D 4 4 2 2
∗p2 =4; E 3 3 4 4
p2=p1 ;

p r i n t f ( "%d␣%d␣%d␣%d" , a , b , ∗p1 , ∗p2 ) ;

② ②
② +1/12/49+ ②

Ne pas retourner tant que le top


départ de l’épreuve n’a pas été
donné.
Durée : 60 minutes.
Aucun document n’est autorisé.

Les 40 exercices n’attendent qu’une seule réponse, sauf mention contraire (♣).
Pas de point négatif en cas de mauvaise réponse.
Note: sizeof(int) vaut 4 pour tout le sujet.
/*!*/ indique qu’il faut y réfléchir à 2 fois.

Chaque sujet est unique et associé à une feuille réponse unique en fin de document.
Indiquez votre numéro de table et nom sur la grille réponse, qui est la seule à rendre.

② ②
Correction

0 0 0 ←− codez votre numéro de table (ex:


007, 017, 102 avec un chiffre par colonne)
1 1 1
et inscrivez votre nom et prénom ci-dessous.
2 2 2 Nom et prénom :
3 3 3
...........................................
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9

Les réponses aux questions sont à donner exclusivement sur cette feuille. NE PAS
COCHER LES REPONSES MAIS NOIRCIR LES CASES.

Question 1 : A B C D Question 22 : A B C D E
Question 2 : A B C D Question 23 : A B C D E
Question 3 : A B C D Question 24 : A B C D E
Question 4 : A B C D Question 25 : A B C D E
Question 5 : A B C D Question 26 : A B C D
Question 6 : A B C D Question 27 : A B C D
Question 7 : A B C D E Question 28 : A B C D E
Question 8 : A B C D E Question 29 : A B C D E
Question 9 : A B C D Question 30 : A B C D E
Question 10 : A B C D E Question 31 : A B C D E
Question 11 : A B C D Question 32 : A B C D
Question 12 : A B C D Question 33 : A B C D
Question 13 : A B C D Question 34 : A B C D E
Question 14 : A B C D E Question 35 : A B C D E
Question 15 : A B C D E Question 36 : A B C D E
Question 16 : A B C D E Question 37 : A B C
Question 17 : A B C D Question 38 : A B C D E
Question 18 : A B C D Question 39 : A B C D
Question 19 : A B C D Question 40 : A B C D
Question 20 : A B C D Question 41 : A B C D
Question 21 : A B C D E Question 42 : A B C D E
TPS – 1ère année 2013/2014

Evaluation travaux pratiques de programmation (Groupe 1)

Consignes : Créer un répertoire portant votre nom dans le répertoire d’accueil (/home/examc1/).
Dans ce répertoire portant votre nom, vous créerez vos fichiers sources.

Les pdf du cours et les fichiers nécessaires à l'examen dont un makefile sont disponibles dans le
répertoire en lecture seule /usr/local/tp/examC. Avec l’explorateur, on accède à ce répertoire
par le disque nommé système de fichiers qui représente la racine /.

Les exercices et leurs questions peuvent être traités indépendamment. La répartition des points sera
approximativement de 20% pour l'exercice 1, 40% pour l'exercice 2 et 40% pour l'exercice 3.

• EXERCICE 1 : Chaîne carrée de caractères


On demande un seul fichier source pour l’exercice : exo1.c .

Une chaîne de caractères w est un carré si il existe une chaîne u telle que w=uu. Par exemple,
“chercher“ et “bonbon“ sont des carrés.

Ecrire une fonction qui teste si la chaîne passée en argument est un carrée.
Suivant la valeur retournée par la fonction, la fonction main affichera si la chaîne est carrée ou non.

• EXERCICE 2 : SPEEDI, le réseau japonais de surveillance de la radioactivité


On demande un fichier source par question intermédiaire : exo2_1.c, exo2_2.c, ...
Pour chaque question, la fonction main()effectuera un test rapide de la fonction.

Le réseau SPEEDI est composé de stations identifiées par un code numérique. Chaque station mesure
quotidiennement la dose de radiation effective dans l'air exprimée en nanoSievert par heure (nS/h).

1 - Ecrire une fonction float nSh_to_mSa(float ...) qui retourne la dose de radiation
effective en milliSievert par an (mS/a) pour une radiation exprimée en nS/h. Une année comptera
toujours 365 jours.

2- Ajouter une fonction radiation_stats(...) qui pour un tableau 1D de type float []


contenant des doses de radiations quotidiennes retourne la dose maximale, la dose minimale et la dose
moyenne.
Note: On peut initialiser les valeurs du tableau dans la fonction main pour éviter une saisie au clavier.

Travaux Pratiques Info 1


TPS – 1ère année 2013/2014

3- Copier le fichier data1.txt de /usr/local/tp/examC dans votre répertoire.


Chacune des 365 lignes du fichier correspond à une mesure quotidienne à partir du 1er mars 2011, 10
jours avant l'incident de Fukushima. On peut ouvrir le fichier avec l'éditeur de texte: une ligne
comprend l'identifiant de la station (toujours le même ici) suivi d'un espace blanc et d'un taux de
radiation en nS/h.

Modifier votre code pour lire ce fichier et mémoriser les doses quotidiennes. Finalement, afficher à
l'écran l'identifiant de la station et sa dose minimale, maximale et moyenne après conversion en mS/a
par le biais des fonctions écrites précédemment.

Remarque: La dose de radiation moyenne dans l'air au japon était de 0,4 mS/a avant l’incident.

• EXERCICE 3 : Somme et produit de matrices carrées


On demande un fichier source par question : exo3_1.c et exo3_2.c.

1- Ecrire une fonction m_sum(...)qui retourne la matrice somme de 2 des matrices d'entiers carrées
passées en paramètres. La fonction doit fonctionner quelque soit la dimension NxN des matrices. La
matrice résultante sera affichée par la fonction main().

On privilégiera l'utilisation de tableaux de pointeurs alloués dynamiquement (tableaux dynamiques


2D) pour obtenir le maximum de points. Mais en cas de difficulté, on pourra utiliser des tableaux 1D
avec une allocation dynamique ou à défaut statique pour stocker les matrices.
Note: On peut initialiser directement les valeurs des 2 matrices opérandes dans le code et ceci pour
une dimension faible N=2, afin de valider les fonctions.

2- Ajouter une fonction m_product(...)qui retourne le produit matriciel entre 2 matrices carrées
entières passées en paramètres. La matrice résultante sera affichée par la fonction main().

Une fois le produit validé, ajouter une fonction m_alloc() - si ce n'est déjà fait - qui prend en
charge l'allocation dynamique de mémoire pour une matrice nxm (allocation via un tableau de
pointeurs ou un tableau 1D ). La fonction retournera alors un pointeur.
Modifier votre programme pour utiliser cette fonction afin d'allouer la mémoire de vos matrices.

Travaux Pratiques Info 2


�����������������������������������������������������������
����������� ������������������������
���������������������
����������������������
����
����
������� ���������� �����
�����
������� ��
������ ������������������
���� ������ ��
�����
�������� ������� ������������������
����� �� ������������������������������
����� ������ ��
�����
����������� ��
������
�����
�����
�������� ������
������
�����
��������� ������������������
�����
������� �������������
���������������������
�����
����������� ��
������
�����

�����
�������������������������������������������������������������
����������� ������������������������
���������������������
����������������������
����
��������� ���������������� ����
�����
���������� ���������������
�����
����
����
��������� ���������������������� ���� ������ ���� ����� ����� ������ ������� ��
������
�������� ��
�����
�����������������
�����������������
�����
�������� �������������
������
������� �������������
����� ������������
������� �������������
����� ������������
������������������
������
�����
�����
�����������������
������
�����
�����
��������� ���������������� ��� ����� �����
������
�����
������� ��������������������������
����� �����������������������
�����
�����
������� ��������������������������
����� ��������������������
�����
�����
������� ��������������������������
����� ���������������������������
�����
������
�����
�����
�������� ������
������
���������� ���������������������
���������� ���� ���� ����
��������� �������������������
�������� ����
��������� �������
���������� ��
���������� ������
�����
�������������������������������� ����������������
�����
�����
�����������������������������������
�����
�����������������������������
�����
�����
�����
������������������������������
�����
���������� ���������������������������� ������
������
�����
�������������������������������������������������������������
����������� ������������������������
������������������
���������
������
�����
�����
�������������������������������������������
�����
������������������������������������������������������������������������������������
�����
�����
����������� ��
������
�����

�����
�������������������������������������������������������������
����������� ������������������������
���������������������
������������ ����������
����
�������� ����������� ��������� �� ����� �� ��� ��
�����
������� ����
����
������� �������������
���� ����������������
������
����� ��������������������������
�����
������
�����
�����
������
�����
�����
��������� ������������ ��������� �� ����� �� ��� ��
������
�������� ������
�����
�������� �������������
����� ����������������
������
����� ������������
����� ��� �������������
����� ���������������������������
�����
������
�����
�����
������
�����
�����
�������� ������
������
�����
�������� ����
�������� ����
�����
�������� ���� ���� ����
�����
������� ������� �����������������������
������� ������� �����������������������
������� ������� �����������������������
�����
�������� ����� ��������
������
���������������� ����������������������
���������������� ����������������������
���������������� ����������������������
�����
������
�����
�����������������������������������������������������������������������������������
���������������������
�����
���������������
���������������
���������������
���������������
���������������
���������������
���������������
���������������
�����
�����
���������������������
�����
�����
�������������������������������������������������������������
����������� ������������������������
�������� �������������
������
����� ����������������
����� ����������������������
����� �������������
������
�����
����������� ��
������
�����
�����

�����
 
TPS – 1ère année 2014/2015

Evaluation TP de programmation C (groupe1 - 1h50)

Consignes :
Créer un répertoire portant votre nom dans le répertoire d’accueil (/home/examc1/). Dans
ce répertoire portant votre nom, vous créerez vos fichiers sources.

Les pdf du cours et les fichiers nécessaires à l'examen dont un makefile sont disponibles
dans le répertoire en lecture seule /usr/local/tp/examC. Avec l’explorateur, on accède à ce
répertoire par le disque nommé système de fichiers qui représente la racine /.
On peut compiler, exécuter ses fichiers avec make exo1, make exo2_1, puis ./exo1, ./...

Les 2 exercices sont à traiter dans l'ordre de votre choix et sont indépendants. Penser aux exemples de
lecture de fichiers et définition de structures disponibles dans le cours.

• EXERCICE 1 : Constante de Hubble (≈10 points)


On demande un fichier source: exo1.c

La mesure du décalage vers le rouge du spectre des galaxies, z (sans unité), permet une mesure de leur
vitesse de fuite v, vue de la terre: v = zc avec c la vitesse de la lumière.

En 1929, Edwin Hubble a corroborer la théorie de l'expansion de l'univers en identifiant une relation
constante entre la vitesse des galaxies et leur distance (plus elle est éloignée, plus vite elle s'éloigne):

v = H0 d avec d, la distance de la galaxie en Mpc (Mega parsec = 106 parsec)


v, sa vitesse en km/s
et H0, la constante de Hubble (typiquement 60< <600 km.s-1.Mpc-1)

On propose de recalculer cette constante à partir de données astronomiques et d'en déterminer l'âge de
l'univers.

1. Ecrire une fonction de prototype double z_to_v(double z); qui retourne la vitesse en
km.s-1 pour un décalage vers le rouge z.
La vitesse de la lumière est c= 299 792 km.s-1.

2. Ecrire alors une fonction main() qui lit le fichier humason1936.txt, disponible dans
/usr/local/tp/examC pour stocker dans un tableau (alloué via malloc() de
préférence) les distances des galaxies en Mpc et dans un autre leur vitesse en km/s via la
fonction précédente.
Le fichier est composé de 21 lignes contenant chacune le nom de la galaxie (une
chaîne de caractères), son décalage en z et sa distance d en Mpc séparés d'un espace:
[nom z distance(Mpc)]
soit Virgo 0.0029 1.6
Leo 0.065 35.1
...

On rappelle que %lf est à utiliser lors de la lecture (pas l'écriture) d'un double avec fscanf() ou
scanf().

Note: Si on ne parvient pas à lire le fichier, on continuera l'exercice en copiant les valeurs des
5 premières lignes du fichier humason1936.txt dans le code source.

Travaux Pratiques Info 1


TPS – 1ère année 2014/2015

3. Afin d'évaluer la constante de Hubble H0, on cherche à identifier le coefficient directeur a de


la droite qui modélise au mieux les données telle que : v = a × d + b.
Ecrire une fonction reg_lin() qui retourne via des paramètres de types pointeurs les
coefficients a et b par régression linéaire pour les 2 tableaux en paramètres (cf Annexe 1).
Afficher alors la valeur de H0 obtenue dans la fonction main().

Note: N'hésitez pas à valider votre fonction reg_lin() avec un jeu test de 2 ou 3 points
particuliers.

4. Ajouter une fonction univers_an() qui retourne l'âge de l'univers en années à partir du
paramètre H0. Afficher le résultat (pas plus de quelques milliards d'année.).

L’âge de l'univers en seconde est donné par age_seconde= 1/H0


avec H0 (km.s-1.Mpc-1) à exprimer en s-1 considérant que 1 Mpc=3.085 1019 km .
Note: une année = 365.25 jours.

5. Finalement ajouter à la fin du programme la sauvegarde dans un fichier "resultat.txt" du


résultat obtenu avec le format suivant pour la ligne :
[nom_du_fichier_de_données_source valeur_de_ H0_obtenue]

Annexe 1 : Régression linéaire


A partir de deux ensembles de données {y1, y2, …, yn} et {x1, x2,…, xn} obtenus par des mesures
d’un phénomène, on parle de régression linéaire si on recherche une relation de la forme y = a x + b
avec

! ! ! On conseille de définir et calculer les


! !!! !! !! ! − ! !!! !! ! !!! !!
!= variables intermédiaires suivantes :
! !!!! !!! − ( !!!! !! )!
! ! sumx : Σ xi , somme des xi
1 1
!= !! − ! !! sumy : Σ yi , somme des yi
! ! sumx2 : 2
Σ xi , somme des xi
2
!!! !!!
sumxy : Σ xiyi , somme des xiyi

Travaux Pratiques Info 2


TPS – 1ère année 2014/2015

• EXERCICE 2 : Manipulation de polynômes (≈ 6 points + 7 points )

On choisit de représenter un polynôme par un vecteur ou tableau de ses coefficients. Les


coefficients sont rangés arbitrairement par puissance croissante :

a0 + a1 x +... + an-1 xn-1 + an xn est représenté par le tableau [a0 a1 .. an-1 an]

Pour simplifier l'exercice, on travaille avec des tableaux de taille 6, nous limitant donc aux
polynômes de degré 5.

Exemple : Pa=1+2x+5x3 est représenté par le tableau [1 2 0 5 0 0]


Pb=3x+2x2 est représenté par le tableau [0 3 2 0 0 0]

Partie 1: polynômes à coefficients réels


On demande un fichier source pour cette partie : exo2_1.c
On utilisera des boucles pour écrire les fonctions.

1. Ecrire une fonction polyAffiche( P ) qui affiche le polynôme P (stocké dans un


tableau à 6 éléments) à l'écran sous le format vectoriel : [aO a1 .... an].

2. Ecrire une fonction polyAdd( P, P1 , P2 ) qui retourne via P le résultat de


l'addition P1 + P2 .

3. Ecrire de même une fonction polyMult( P, P1, P2 ) qui retourne via P le


résultat de la multiplication (P1).(P2) .

Lors de la multiplication, les coefficients P[i] de P sont obtenus par la convolution des 2
tableaux de coefficients de P1 et P2, soit :

!!! ! = !!1[!]!!2[! − !]
!!!

Note: Cette formule est valable car P1 et P2 sont des tableaux de même taille et le résultat P
tient aussi dans un tableau de même taille.

4. Finalement, écrire une fonction main() qui définie les polynômes P1=x+1
P2=2x+2
P3=x2+3x+1
et des polynômes pour les calculs intermédiaires, afin de calculer et afficher le résultat de
(P1+P2).P3 .

Travaux Pratiques Info 3


TPS – 1ère année 2014/2015

Partie 2 : polynômes à coefficients complexes


On demande un fichier source pour cette partie : exo2_2.c
On utilisera des boucles pour écrire les fonctions.

On souhaite manipuler des polynômes à coefficients complexes.

1. Définir d'abord une structure iNum (avec ou sans typedef) qui permet de décrire un
nombre complexe avec sa partie réel et sa partie imaginaire.
Les polynômes sont alors décrits par des tableaux de iNum.

2. Réécrire alors les fonctions polyAffiche(), polyAdd(), polyMult() pour des


polynômes à coefficients complexes.

Ceci implique de définir d'abord des fonctions pour l'addition et la multiplication de nombres
complexes. Afin de pouvoir écrire des instructions telles que c=iAdd(a,b), on pourra écrire
(si iNum est défini via un typedef ) :

iNum iAdd(iNum a, iNum b)


{ iNum res;
/* ... */
return res; }

Mais on peut aussi choisir de passer le résultat via un pointeur en paramètre.


Rappel: on peut passer/retourner par valeur une structure (taille mémoire constante)
contrairement à un tableau (taille variable).

3. Ecrire une fonction main() qui alloue (de préférence via malloc()) les polynômes
P1=x+i
P2=(2+i)x+2
P3=x2+1
et affiche le résultat de P1.P2 puis (P1.P2)+P3.

4. Finalement écrire une fonction evalPoly( P, x) qui permet de calculer la valeur


numérique de P(x) pour un polynôme à coefficients complexes et un nombre x.

Travaux Pratiques Info 4


���������������������������������������������������������
����������� ������������������������
������������ ���������
����
����������� ������� ��
����
����
����
���������� ������������� ��
�����
���� ������ ���������
������
�����
�����
����������� ����������������� ���
������
����� ������������������������������������
����� �����������������������������������������������������������
�����
����� ������ ������������� ������� ����� ������ � ���������������������������
����������
�����
������
�����
�����
�������������������������������������������
����������������������������������������������������������
�����������������������������������������
��������� ������������� ��� �������� � ������� �������� ��� ��� ��
������
����� ��� ��
����� ������ ������� �������� ������� ��������
�����
����� ��� �������������
����� �
����� �����������
����� �����������
����� �����������������
����� �����������������
����� �
�����
����� �� � ����������������������������������������
����� �� � ������������ � ����������������� � �������������������������������
���������
������
�����
�����
�����
�������� ������
������
�����
����� ���� ���
����� ��� ��
����� ������ ����������� ������������
����� ������ ����������� �������������
����� ������ ����� �������������������
����� ���� ��������
�����
�����
����� �������������������������������
����� �� ���������
����� �
����� ����������������������������
����� ������ �� �
����� �
�����
�����
����� ��� �������������������
����� �
����� ���������������������������������������
����� ������������������ �������������������������
����� �
�����
���������������������������������������������������������
����������� ������������������������
�����
�����
����� ���������������������������
�����
�����
����� ������������������������������
�����
����� ��������������������������������� ����������������
����� ���������������������������������������������� ��������������������
�����
����� ����������
�����
�����
����� ������������������������
����� ����������������������������
����� �� ���������
����� �
����� ����������������������������������
����� ������ ���
����� �
�����
����� ���������������������
����� ����������
�����
����� ������ ��
������
�����

�����
�����������������������������������������������������������
����������� ������������������������
������������ ���������
����
����������� ���� � �����������������������������
����
����
�������� ������������������� � �
�����
���� ��� ��
���� ������������
����� �������������������
����� � ������������������� �
����� ������������
�����
������
�����
��������� ��������������� �� ������� ��� ������ ����
������
����� ��� ��
����� �������������������
����� � ����������������� �
������
�����
��������� ���������������� �� ������� ��� ������� ���
������
����� ��� �� ��
����� ��� ���������������� ��������������������������
����� ��� ����� ���� ����� ��������������������������������������
����� � ��������� � �������������� �
������
�����
�����
�����
�������� ������
������
����� ������ ����������������������� �������
����� ������ �����������������������
����� ������ �����������������������
����� ������ ����������� �����������
�����
����� ��������������������
�����
����� �����������������
����� ������������������
����� �������������
�����
����� �����������������������
�����
����� ����������������������
����� ������������������
����� �������������
�����
����� ������ ��
������
�����

�����
�����������������������������������������������������������
����������� ������������������������
������������ ���������
����
����������� ���� � �����������������������������
����
����������� ������ ������� ����� ������ ��� � �����
����
����
�������� ��������� �� ���� ��
�����
����� ���� ����
����� �����������������������
����� �����������������
����� ������ ����
������
�����
�����
��������� ���������� �� ���� ��
������
����� ���� ����
����� ��������� ������������� � ����������
����� ������������������ � ������������
����� ������ ����
������
�����
�����
��������������������������������������������������������������
��������������������������������������������������������������������
�����
�����
��������� ����������������� � �
������
����� ��� ��
����� ������������
����� �������������������
����� � ��������������������������������� �������� � � ����������������������������
�����������������
����� ������������
�����
������
�����
��������� ������������� �� ����� ��� ���� ����
������
����� ��� ��
����� �������������������
����� � ����������������������� �
������
�����
��������� �������������� �� ����� ��� ����� ���
������
����� ��� �� ��
����� ��� ���������������� ��������������������������
����� ��� ����� ���� ����� ��������������������������������������
����� � ��������� ������ ���������������������� �
������
�����
�����
�����
�������� ������
������
����� ���� ���������� ������ ������ ������ ������ ������ ����� ��
����� ���� ���������� ������ ������ ������ ������ ������ ����� ��
����� ���� ���������� ������ ������ ������ ������ ������ ����� ��
����� ���� ����������� �����������
�����
�����
����� ���������������������
����� ������������������
����� �������������
�����
����� ����������������������
�����
�����������������������������������������������������������
����������� ������������������������
�����
����� �����������������������
����� ������������������
����� �������������
�����
����� ������ ��
������
�����

�����
 
TPS – 1ère année 2015/2016

Evaluation TP de programmation C (groupe1 - 1h50)

Consignes :
Créer un répertoire portant votre NOM dans le répertoire d’accueil (/home/examc1/).
Dans ce répertoire portant votre nom (exemple : DUPONT), vous créerez vos fichiers sources.

Les pdf du cours et les fichiers nécessaires à l'examen sont disponibles dans le répertoire en
lecture seule /usr/local/tp/examC. Avec l’explorateur, on accède à ce répertoire par le disque
nommé système de fichiers qui représente la racine /.

Le manuel est accessible avec la commande man ( man 3 strlen ) et se quitte avec la touche [q].

On compilera avec le makefile ou gcc sans omettre les options :


gcc –Wall –ansi –pedantic-errors exo1.c –o exo1

Les 3 exercices sont à traiter dans l'ordre de votre choix et sont indépendants.

• EXERCICE 1: livre sterling  euro et centimes d’euros (≈3 points)


On demande un fichier source pour cet exercice: exo1.c

La monnaie de l’écosse est la livre sterling (GBP).


Le taux de change est actuellement de 1GBP = 1.4168 EUR.

Ecrire une fonction GBPtoEUR() qui pour une valeur décimale en livre (GBP) retourne 2 entiers:
• la partie entière de la valeur en euros après application du taux de change
(int)value donne la partie entière du nombre décimale value

• et les centimes d’euros de la valeur après application du taux de change


(int)((value–(int)value)*100) devrait donner le nombre de centièmes

Exemple : pour 2,0 (GBP), la fonction doit retourner 2 (EUR) et 83 (EUR centimes).
Pour ce faire, on utilisera de préférence ni structure, ni tableau mais deux pointeurs pour
« retourner » les 2 entiers.

Tester la fonction avec un main() minimaliste.

• EXERCICE 2 : Palindrome (≈ 4,5 points)


On demande un fichier source pour cette exercice: exo2.c

GLENELG n’est pas qu’un petit village des Highlands écossais avec un ferry vers l’île de Skye,
c’est aussi un palindrome.
Un palindrome est un mot dont l'ordre des lettres reste le même qu'on le lise de gauche à droite ou
de droite à gauche. Autres palindromes: anna, radar, kayak, ressasser, ABBA(le groupe)…

Ecrire une fonction int is_palindrome(…) qui retourne vrai ou faux si le mot passé en
paramètre est un palindrome. On peut ou pas se servir de la fonction strlen().
La tester avec un main() minimaliste.

Travaux Pratiques Info 1


TPS – 1ère année 2015/2016

[Brouillon]

Travaux Pratiques Info 2


TPS – 1ère année 2015/2016

• EXERCICE 3 : Validité du Code ISBN-10 (≈ 15 points)


On demande un fichier source par question : exo31.c et exo32.c.

Le code ISBN-10, au dos mon guide de l’Ecosse, identifie de manière unique le livre par 10 chiffres:
- les 9 premiers chiffres du code, compris entre 0 et 9, identifient le livre ;
- le 10ème chiffre sert à contrôler la validité du code ISBN. Ce 10ème chiffre est soit entre 0 et 9,
soit est le « chiffre » X (majuscule) qui a la valeur numérique 10 ;

L’algorithme pour tester la validité du code ISBN est simple. On calcule 2 sommes : s1 et s2.
Le code ISBN est valide si la valeur de s2 est divisible par 11 (voir le reste de la division entière).

Exemple :
1) on calcule et stocke les sommes partielles s1 de l’ISBN 013162959X comme illustré ci-dessous.
ISBN-10 0 1 3 1 6 2 9 5 9 X
s1 0 1 4 5 11 13 22 27 36 46

2) Le calcul de s2 se fait en sommant les sommes partielles de s1 :


s2=0+1+4+5+11+13+22+27+36+46=165. 3) Or 165 est divisible par 11  code valide.

1. A) Ecrire un main() qui :


• saisie au clavier une chaîne de caractères correspondant à un code ISBN;
• convertit les caractères alphanumériques (chiffres (’0’ à ’9’) et alphabétique ’X’) en entiers de
valeur numérique correspondante ;
Note: hors ’X’, on pourra s’éviter une multitude de tests en utilisant habilement le code ASCII (pdf cours n°1, slide 21).
’0’ est codé par la valeur numérique 48, ’1’ par 49, ’2’ par 50 …
Donc un caractère chiffre c peut être converti en l’entier i correspondant par la formule i=c-’0’.

• calcule les sommes s1 et s2;


• affiche le résultat du test de validité du code ISBN (modifier un des chiffres de l’ISBN ci-dessus
pour tester avec un contre-exemple).

B) Mettre votre test sous forme d’une fonction checkISBN() qui prend en paramètre le tableau
de caractères contenant le code ISBN et retourne en résultat si le code est valide ou non.
Attention checkISBN() doit laisser intact le tableau de char passé par le main().

Tester avec un main().

Travaux Pratiques Info 3


TPS – 1ère année 2015/2016

2. A) Copier le fichier livres.txt dans votre répertoire.


Il contient par ligne : le titre d’un livre (sans espaces, remplacés par des tiret bas ’_’) suivi d’un
espace blanc et finalement de son code ISBN.

Définir alors une structure livre pour stocker au moins le titre (taille < à 50 caractères) et
l’ISBN d’un livre.
Modifier votre main pour lire le fichier, stocker ses informations dans une liste (un tableau de
structures de taille arbitraire défini dans le main()), puis appeler vos fonctions :
• affich(…) qui affiche le nom et ISBN de tous les livres à partir de la liste en argument.
• affich_valid(…)qui parcourt la liste mais n’affiche que ceux dont l’ISBN est valide.
(i.e. les 5 premiers du fichiers, les meilleurs)
Note : Si on ne parvient pas (malgré les exemples dans le cours) à utiliser un tableau de structure, on
pourra simplement lire le fichier et afficher au fur et à mesure les noms et ISBNs des livres qui sont
valides sans les mémoriser dans une liste.

B) Proposer une fonction trie() pour trier la liste de livres par ordre alphabétique des titres.
On propose le tri par sélection et d’utiliser la fonction strcmp qui retourne une valeur négative si
la première chaine est inférieure dans l’ordre alphabétique à la seconde et positive si l’inverse (cf
manuel). Afficher la liste triée.
Rappel : on peut par simple affectation (=) copier le contenu d’une structure dans une autre de même type.

Annexe : tri par sélection de N données


• On recherche le plus petit élément de l’ensemble A[0 … N-1]
• On le place en première position de l’ensemble (par échange du premier avec le plus petit)
• On recommence le même traitement sur l’ensemble A[1 … N-1] .
• Et ainsi de suite…

Travaux Pratiques Info 4

Vous aimerez peut-être aussi