• Aucun résultat trouvé

Exercice 2 : Fonctions

N/A
N/A
Protected

Academic year: 2022

Partager "Exercice 2 : Fonctions"

Copied!
7
0
0

Texte intégral

(1)

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) {

(2)

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

(3)

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.

(4)

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;

} }

(5)

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) {

(6)

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)

(7)

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));}

}

Références

Documents relatifs

- les amplitudes relatives des différents oscillateurs sont liées au mode propre considéré, - deux oscillateurs quelconques du système oscillent, soit en phase, soit en opposition

La courbe Γ est appelée cissoïde

Montrer que la fonction sh g ◦g est solution dans ] − ∞, 0[ d'une équation diéren- tielle linéaire du premier ordre à préciser.. Deuxième partie : divers

La fonction a même sens de variation que la fonction valeur absolue car 2 est

[r]

[r]

[r]

La croissance du bénéfice ralentit lorsque sa dérivée devient décroissante, ce qui correspond au premier point d’inflexion de la courbe d’abscisse x 1 avec x 1