Exercice langage C : Plusieurs Fonctions

1. Soit la fonction C suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int decimale( char t[10], int n)

{ int exposant=0;

int puissance=1;

int j;

int q = n;

if ( n == 0 )

{ t[0]=0;

return 1;

}else

{ while ( puissance<= n )

{ puissance = puissance? 10;

exposant = exposant + 1;

}for (j=0; jexposant; j = j + 1)

{ t[j] =0+ (q % 10);

q=q/10;

}return (exposant);

}

}

 

(a) Quels sont les arguments de la fonction? Identi?ez leurs rôles.

(b) Quelle est la spéci?cité du passage de tableau comme paramètre d’une fonction.

(c) Quel est le résultat de la fonction? Quelle est la signi?cation du contenu du tableaut?

(d) Donnez la signi?cation et le rôle des variables suivantes :q ,puissance et exposant.

(e) Complétez l’écriture de la fonction avec des commentaires a?n de la rendre claire.

2. (a) Ecrivez une fonction imprime(t,i) qui a?che sur une même ligne

Les i premiers caractères du tableau t. Son prototype est :

int imprime ( char t[], int i);

(b) A l’aide des fonctions décimale (t,n) et imprime(t,i), concevez un programme C qui demande à l’utilisateur de saisir un entier positif et qui a?che ses chi?res (dans son écriture décimale) dans l’ordre inverse.

Exemple d’exécution :

Entrez un entier positif : 12345

54321

(c) Modi?ez la fonction décimale(t,n) pour écrire une fonction hexadécimale(t,n). Son prototype est :

int hexadécimale ( char t[], int i);

Ses arguments sont, un tableau de char de taille 10, et un entier Positif n. Elle place dans t les caractères chi?res de son écriture en base 16 et retourne le nombre de chi?res dans son ´ecriture en base 16.

Rappel : Les caractères chi?res en base 16 sont :

’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’A’ (10), ’B’ (11), ’C’ (12),

’D’ (13), ’E’ (14), ’F’ (15).

Exemple d’exécution :

Entrez un entier positif : 3081

90C


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include
#include
/? decimale( t,n) remplit le tableau de caract`eres t en t[0], t[1], ... t[e?1]
et renvoie e, tels que n= t 0?10ˆ0 + a 1?10ˆ1 + ... + a (e?1)?10ˆ(e?1)?/
int decimale( char t[10], int n);
/? a?che sur une mˆeme ligne les k premiers caract`eres du tableau t ?/
int imprime (char t[10], int k);
/? hexadecimale( t,n) remplit le tableau de caract`eres t en t[0], t[1], ... t[e?1]
et renvoie e, tels que n= t 0?16ˆ0 + a 1?16ˆ1 + ... + a (e?1)?16ˆ(e?1)?/
int hexadecimale( char t[10], int n);
int main (){
// insert code here...
char ch[10];
int n,e;
/? saisit un entier n et a?che sa representation d´ecimale t[0], t[1], t[e?1]?/
/? rang´ee dans le tableau t.
On a ainsi n= t 0?10ˆ0 + a 1?10ˆ1 + ... + a (e?1)?10ˆ(e?1)?/
printf(” nombre\n”);
scanf(%d”,&n);
e=decimale(ch,n);
printf(”premier exposant e tel que 10ˆe> %d est %d\n”, n, e);
printf(”repr´esentation d´ecimale de %d en a 0?10ˆ10 + a 1?10ˆ1 + ...\n”);
imprime(ch,e);
e=hexadecimale(ch,n);
printf(”premier exposant e tel que 16ˆe> %d est %d\n”, n, e);
printf(”repr´esentation hexad´ecimale de %d en a 0?16ˆ10 + a 1?16ˆ1 + ...\n”);

imprime(ch,e);
return EXIT SUCCESS;
}
/? decimale( t,n) remplit le tableau de caract`eres t en t[0], t[1], ... t[e?1]
et renvoie e, tels que n= t 0?10ˆ0 + a 1?10ˆ1 + ... + a (e?1)?10ˆ(e?1)?/
int decimale( char t[10], int n)
{ /? On cherche le plus petit exposant e tel que puissance = 10ˆe> n?/
/? Dans ce cas on peut ´ecrire
n= t 0?10ˆ0 + a 1?10ˆ1 + ... + a (e?1)?10ˆ(e?1) )?/
/? on ´ecrit les coee?cients a 0, ... , a (e?1)
dans le tableau de caract`eres t[0], ..., t[e?1]?/
int exposant=0;
int puissance=1;
int j;
int q = n;
if ( n == 0 )
{ t[0]=0; /? 0= 0?10ˆ0?/
return 1; /? 10ˆ0 = 1> 0?/
}else
{ /? on cherche puissance et exposant tels que
puissance=10ˆexposant> n?/
while ( puissance<= n )
{ puissance = puissance? 10;
exposant = exposant + 1;
}/? On ´ecrit les a j de la repr´esentation dans t
(entre 0 et exposant?1) :?/
/? par exemple : 153 % 10 = 3 et 153 / 10 = 15 puis
15 % 10 = 5 et 15 /10 = 1
puis 1 % 10 = 1 et 1 / 10 = 0 ===> t= 3 5 1?/
for (j=0; jexposant; j = j + 1)
{ t[j] =0+ (q % 10);
q=q/10;
}return (exposant);
}
}int imprime (char t[10], int k){
int j;
for (j=0; jk; j = j + 1)
{ printf(%c ”, t[j]);
}

printf(”\n”);
return 0; /? valeur de retour `a ignorer?/
}/? hexadecimale( t,n) remplit le tableau de caract`eres t en t[0], t[1], ... t[e?1]
et renvoie e, tels que n= t 0?16ˆ0 + a 1?16ˆ1 + ... + a (e?1)?16ˆ(e?1)?/
int hexadecimale( char t[10], int n)
{ /? On cherche le plus petit exposant e tel que puissance = 16ˆe> n?/
/? Dans ce cas on peut ´ecrire
n= t 0?16ˆ0 + a 1?16ˆ1 + ... + a (e?1)?16ˆ(e?1) )?/
/? on ´ecrit les coee?cients a 0, ... , a (e?1)
dans le tableau de caract`eres t[0], ..., t[e?1]?/
int exposant=0;
int puissance=1;
int j;
char tab[16] =”0123456789ABCDEF” ;
int q = n;
if ( n == 0 )
{ t[0]=0; /? 0= 0?16ˆ0?/
return 1; /? 16ˆ0 = 1> 0?/
}else
{ /? on cherche puissance et exposant tels que
puissance=16ˆexposant> n?/
while ( puissance<= n )
{ puissance = puissance? 16;
exposant = exposant + 1;
}/? On ´ecrit les a j de la repr´esentation dans t
(entre 0 et exposant?1) :?/
for (j=0; jexposant; j = j + 1)
{ t[j] = tab[q % 16];
q=q/16;
}return (exposant);
}
}
//nombre
//3081
//premier exposant e tel que 10ˆe> 3081 est 4
//repr´esentation d´ecimale de 0 en a 0?10ˆ10 + a 1?10ˆ1 + ...
//1 8 0 3
//premier exposant e tel que 16ˆe> 3081 est 3
//repr´esentation hexad´ecimale de 0 en a 0?16ˆ10 + a 1?16ˆ1 + ...
//9 0 C