Isup 1 - Programmation TD no3 Matthieu Journault 19 juin 2020
Exercice 1 : Rappel
Q. 1 Afficher un triangle rectangle avec des ´etoiles ; vous demanderez `a l’utilisateur la hauteur. Par exemple avec une hauteur de 4 :
*
**
***
****
Solution
#include <stdio.h>
int main() { int i ; int j ; int n ;
printf("Entrer la hauteur du triangle : ");
scanf("%d", &n);
for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j <= i ; j ++) {
printf("*");
}
printf("\n");
} }
Q. 2 Mˆeme question avec un ´echiquier de taille 8×8. Pour afficher des cases blanches et noires, vous pouvez utiliser le caract`ere Unicode correspondant, dans notre cas \u25A1 pour une case blanche et
\u25A0 pour une noire.
Solution
#include <stdio.h>
int main() { int i ; int j ; int n ;
printf("Entrer la taille de l'´echiquier : ");
scanf("%d", &n);
for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) {
if ((i + j) % 2 == 0) {
printf("\u25A0");
} else {
printf("\u25A1");
} }
printf("\n");
} }
Exercice 2 : Fonctions
Q. 3Repr´esenter l’´etat de la m´emoire `a chacun des points de programme suivant (1, 2, . . .)
void f(int x) { /* 5 */
int y; /* 6 */
y = 5; /* 7 */
x = x - 1; /* 8 */
return ; }
int g(int u) { /* 3 */
int v = 3; /* 4 */
f(v); /* 9 */
return v;
}
int main() { /* 1 */
int a = 1; /* 2 */
a = g(a); /* 10 */
}
Solution
1. main
2. main a : 1
3.
u : 1 g
a : 1 main
4.
u : 1 v : 3 g
a : 1 main
5.
x : 3 f
u : 1 v : 3 g
a : 1 main
6.
x : 3 y : ? f
u : 1 v : 3 g
a : 1 main
7.
x : 3 y : 5 f
u : 1 v : 3 g
a : 1 main
8.
x : 2 y : 5 f
u : 1 v : 3 g
a : 1 main
9.
u : 1 v : 3 g
a : 1 main
10. main a : 3
Q. 4Ecrire une fonction´ plus 1qui prend en param`etre un entiernet retourne son successeur (toujours un entier).
Solution /* Retourne le successeur de son argument */
int plus_1(int x) { return (x+1);
}
Q. 5 Ecrire une fonction´ plus f qui prend en param`etre deux flottants uet v et retourne le r´esultat de u+v.
Solution /* Retourne la somme de ses deux arguments */
float plus_f(float u, float v) { return (u + v);
}
Q. 6On peut repr´esenter un polynˆome du second degr´eax2+bx+csous la forme d’un triplet de valeurs (a, b, c). ´Ecrire une fonction discriminant qui prend en param`etre trois valeurs enti`eres (a,b, et c) et retourne ∆, le discriminant de l’´equation ax2+bx+c= 0 tel que ∆ =b2−4×a×c
Solution
/* Retourne le discriminant du polyn^ome aX^2 + bX + c */
int discriminant(int a, int b, int c) { return (b * b - 4 * a * c);
}
Q. 7 Ecrire une fonction´ nb solutions qui prend en param`etre trois valeurs enti`eres (a,b, et c) et retourne le nombre de solutions de l’´equation ax2+bx+c= 0. Cette fonction devra utiliser la fonction d´efinie pr´ec´edemment.
Solution
/* Retourne le nombre de solutions r´eels de l'´equation aX^2 + bX + c = 0 */
int nb_solutions(int a, int b, int c) { int x = discriminant(a, b, c);
if (x < 0) { return 0;
} else if (x == 0) { return 1;
} else { return 2;
} }
Q. 8 Ecrire une fonction´ est solution qui prend en param`etre trois valeurs enti`eres (a,b, et c), ainsi qu’une valeur x et retourne 1 si x est une solution deax2+bx+c= 0, et 0 sinon.
Solution
/* Retourne 1 si et seulement si a*x^2 + b*x + c = 0 */
int est_solution(int a, int b, int c, int x) { if (a * x * x + b * x + c == 0) {
return 1;
} else { return 0;
} }
Exercice 3 : Fonctions r´ ecursives
Q. 9Ecrire une fonction´ somme telle que somme(n)retourne la somme des entiers de 1 `a n.
Solution
/* Calcule la somme des entiers inf´erieurs ou ´egaux `a n */
int somme(int n) {
if (n == 0) {return 0;}
else {return n + somme(n-1);}
}
Q. 10Ecrire une fonction´ factorielletelle que factorielle(n)retourne la valeur n!. On rappelle la d´efinition de la fonction factorielle :
n! =
1 si n = 0 n×(n−1)! sinon
Solution /* Calcule n! */
int factorielle(int n) { if (n == 0) {return 1;}
else {return n * factorielle(n-1);}
}
Q. 11Que se passe-t-il si on appelle factorielle(-1)? Comment pourrions-nous y rem´edier ? Solution
La fonction boucle ind´efiniment, on peut y rem´edier en transformant le testn==0enn < 0toutefois l’utilisateur risque de ne pas se rendre compte qu’il a appel´e la fonction avec un mauvais argument et donc il serait pr´ef´erable de cesser l’ex´ecution du programme et de renvoyer un message d’erreur.
Q. 12Ecrire deux fonctions mutuellement r´´ ecursivespair et impair qui s’appellent l’une l’autre pour d´eterminer si un entier n est pair ou impair.
Solution
/* D´eclaration du prototype des deux fonctions pair et impair */
int impair(int n);
int pair(int n);
int pair(int n) {
if (n == 0) {return 1;}
else if (n < 0) {return impair(n+1);}
else {return impair(n-1);}
}
int impair(int n) {
if (n == 0) {return 0;}
else if (n < 0) {return pair(n+1);}
else {return pair(n-1);}
}
Q. 13 Ecrire la fonction´ pgcd telle que pgcd(a,b) retourne le PGCD de a et b. On rappelle que P GCD(a,0) =a et que P GCD(a, b) =P GCD(b, a mod b)1 .
Solution /* Calcule le reste de la division de a par b */
int reste(int a, int b) { if (a < b) {
return a;
} else {
return (reste(a-b, b));
} }
/* Calcule le pgcd de a et b */
int pgcd(int a, int b) { if (b == 0) {return a;}
else {return pgcd(b, reste(a, b));}
}
Q. 14Ecrire une fonction´ fibonaccitelle quefibonacci(n)retourne le n-i`eme de la suite de Fibonacci.
Contrairement `a un exercice semblable du TD pr´ec´edent, votre solution ne devra pas faire intervenir de boucle.
On rappelle la d´efinition de la suite de Fibonacci (not´eeF) : Fn=
0 si n= 0
1 si n= 1
Fn−1+Fn−2 sinon Solution
/* Calcule le n-i`eme terme de la suite de Fibonacci */
int fibonacci(int n) { if (n == 0) {return 0;}
else if (n == 1) {return 1;}
else {return fibonacci(n-1) + fibonacci(n-2);}
}
1. mod´etant le modulo, c’est `a dire le reste de la division euclidienne :a mod b=a−(babc ×b)
Q. 15Observer empiriquement le temps de calcul asymptotique de votre fonction Fibonacci. En utilisant une fonction r´ecursive auxiliairefibonacci auxutilisant 3 arguments entiers, proposer une implantation de Fibonacci ayant un coˆut lin´eaire en la valeur de son entr´ee plutˆot qu’exponentiel.
Solution int fibonacci_aux(int n, int a, int b) {
if (n == 0) {return a;}
else if (n == 1) {return b;}
else {return fibonacci_aux(n-1, b , a+b);}
}
int fibonacci2(int n) {
return fibonacci_aux(n, 0, 1);
}
Q. 16Proposer une implantation de la fonction d’Ackermann. Cette fonction a deux arguments entiers et satisfait la relation de r´ecurrence :
A(m, n) =
n+ 1 sim = 0
A(m−1,1) si m >0∧n = 0 A(m−1,A(m, n−1)) si m >0∧n >0
Solution /* Calcule ackermann(m, n) */
int ackermann(int m, int n) { if (m == 0) {return n+1;}
else if (n == 0) {return ackermann(m-1,1);}
else {return ackermann(m-1, ackermann(m, n-1));}
}