Auteur : Ov6rMinD
MAJ : 10/09/2006
Imprimer

TP

Les cours et TP ont été donné par M. NOEL, professeur de Mathématiques et Info dans la prépa de l'ISEP/ISEN B. Les corrections ont été rédigées par des élèves.

Sujet

Pour des raisons de lisibilité, le sujet n'est disponnible qu'en format PDF :
Voir le sujet du TP1 sur le language C

Correction

La correction en PDF sera disponnible sous peu.

Exercice 1

Certain doivent être tentés de faire x=y; y=x; mais avec ce code, x prend la valeur de y puis y celle de x, c'est a dire y=x or, ce n'est pas ce que l'on veut Il faut donc stocker temporairement x ou y dans une autre variable, ici z :

main(b) {
int x,y,z;
x=2;
y=3;

z=y;
y=x;
x=z;
}

Code allégé :

main(b) {
int x=2,y=3,z ;
z=y; y=x; x=z;
}

Exercice 2

Prévu pour les SUPs de l'ISEP/ISEN

Exercice 3

Il faut savoir que les fonctions incluant des scanf, printf etc ont pour argument "void", a la différence des autres fonctions retournant des int ou float

int Demande(void) {
int x; /*On définit l'entier x */
printf("Veuillez entrer un entier ..."); /*Affichage du message de demande */
scanf("%d",&x); /*On attend que l'utilisateur entre une valeur, qui sera mise dans x */
return x; /*On retourne x */
}

Rq : On utilisera cette fonction dans la fonction main() de l'exercice 4

Exercice 4

Ici, a et b étant des entiers, meme en définissant leur division comme un réel, la valeur retournée serait un entier, d'ou la division par 2.0 (considéré comme un réel) et non 2 (entier)

float Moyenne(int a, int b) {
float c;
c=(a+b)/2.0;
return c;
}

/* Utilisation dans le main() : */
main(b) {
int x, y;
float z;

x = Demande();
y = Demande();
z = Moyenne(x,y);
printf("La moyenne de %d et %d est %f \n", x, y, z);
}

Info : le "\n" signifie un retour a la ligne
On peut alléger :

main(b) {
int x = Demande();
int y = Demande();
float z = Moyenne(x,y);

printf("La moyenne de %d et %d est %f \n",x,y,z);
}

 

Exercice 5

C'est des maths et de la logique pour la définition des vars :
ax + b = 0 <=> x = -b / a
avec a et b réel, on a donc :

float Resoudre(float a,float b) {
float c ;
c = -b/a ;
return c ;
}

Exercice 6

Ici, il suffi d'écrire n! pour voir a peu prés comment faire :
n! = 1*2*3 .... *n
On va donc avoir une boucle for allant de 1 jusqu'a n :

float Facto(int n) {
int c,b; //Définition des var f/
c = 1; /*1er terme de n!, ici on ne peut pas prendre 0 car 0*x =0 notre résultat serait alors nul quelque soit n*/
for (b=1; b <= n; b++) { /*On part de 1, tout le tps que b <= n la boucle 'tourne' a chaque fin de boucle, on incrémente b de 1, c'est a dire que l'on augmente b de 1 (b=b+1) */
c = c*b; //On multiplie c par b, ce qui correspond au n! : 1*2*3 ... *n f/
}
return c;
}

/* et un main() du style : */
main(b)
{
float x;
int n;
printf("Entrez un entier n pour calculer n! \n");
scanf("%d",&n);
x = Facto(n);
printf("Ca donne : %d\n",x);
}

Exercice 7

Pour cet exo, nous avons le droit d'utiliser la fonction facto, ce qui simplifie les choses ;)
Il suffit juste d'appliquer une somme :
Par exemple, pour k=2, on a : 1/1! + 1/2!

float Expo(int n) {
int loop;
float c=0,fac;

for(loop=0; loop <= n; loop++) {
fac=Facto(loop);
c=c+(1/fac);
}
return c;
}

Exercice 8

Cet exercice est comme le précédent, mais sans utiliser la fonction facto Pour voir a peu prés comment faire, on écrit quelques exemples :
Pour n=1, on a : 1/1 + 1/1 = 2
Pour n=2, on a : 1/1 + 1/1 + 1/2 = 5/2
Pour n=3, on a : 1/1 + 1/1 + 1/2 + 1/(2*3) = 2 + 1/2 + 1/6 = 8/3
On remarque que le dénominateur peut s'écire sous la forme d'une somme :
1 1 2 6 ...
De plus, nous avons besoin du dernier terme du dénominateur pour calculer le terme suivant.
On obtient donc la meme boucle 'for' que la fonction facto, a laquelle vient s'ajouter l'opération somme.

Nb : Pour ceux qui n'auraient pas compris un point, n'hésitez pas a poster sur le forum :)

float Expo2(int n) {
int b;
float somme=0,facto=1;
for(b=1; b <= n; b++) {
facto = facto*b;
somme = somme + (1/facto);
}
return somme;
}

Exercice 9

U(n) est définie comme un quotient de 2 suites arythmétiques, de raison 2 et 1, on a donc U(n+1) = (U(0) + 2n) / (U(0) +n) avec U(0) = 1

float SA(int n) {
float c;
c = ((1.0+2*n) / (1.0+n));
return c;
}

Exercice 10

Pour cette suite, afin de calculer U(n), il nous faut U(n-1) et U(n-2), on va donc devoir avoir tout le temps ces deux dernier termes, en les stockant dans des variables. Ici, la var 'U' sera U(n-2) et la var 'V' sera U(n-1), et 'W' U(n), aprés un calcul de W, il faudra donc attribuer la valeur de V a U et celle de W a V De plus, la boucle 'for' commence a 2 étant donné que dans l'énonncé, on a n >= 2, en effet, si n < 2, nous n'avons pas U(n-1) et U(n-2)

int Fibo(int n) {
int b,U,V,W;
U=1; V=1;

for(b=2; b <= n; b++) {
W=U+V;
U=V;
V=W;
}
return W;
}

Fin des corrigés de ce TP, merci aux SUPs de l'école !

Commentaires :
Soyez le premier à réagir !
PCréation.fr - 2012