5. Exemple de notebook avec C¶
5.1. Explications¶
Le kernel C n’est pas installé par défaut avec Jupyter.
Il faut installer jupyter-c-kernel
5.2. Exemples¶
#include <stdio.h>
int main(int argc, char* argv) {
printf("\nHello world from C from Jupyter notebook!");
}
Hello world from C from Jupyter notebook!
5.3. Factorielle¶
Pour calculer la fonction \(n! := 1 \times 2 \times \dots \times n\) (\(n\in\mathbb{N}\)), on peut penser à une solution récursive (qui coutera en espace mémoire à cause de la pile d’appel) et une solution impérative.
#include <stdio.h>
#define MAX_I 15
int factorielle_rec(int n) {
if (n <= 1) {
return 1;
}
else {
return n * factorielle_rec(n - 1);
}
}
int factorielle_imp(int n) {
int f = 1;
for (int i = 1; i <= n; i++) {
f = f * i; /* f *= i aussi possible*/
}
return f;
}
int main(int argc, char* argv) {
for (int i = 1; i <= MAX_I+2; i++) {
printf("\n factorielle_rec(%d) = %d et factorielle_imp(%d) = %d", i, factorielle_rec(i), i, factorielle_imp(i));
if (i == MAX_I) {
printf("\nValeurs fausses après %i", MAX_I);
}
}
}
factorielle_rec(1) = 1
factorielle_rec(2) = 2
factorielle_rec(3) = 6
factorielle_rec(4) = 24
factorielle_rec(5) = 120
factorielle_rec(6) = 720
factorielle_rec(7) = 5040
factorielle_rec(8) = 40320
factorielle_rec(9) = 362880
factorielle_rec(10) = 3628800
factorielle_rec(11) = 39916800
factorielle_rec(12) = 479001600
factorielle_rec(13) = 1932053504
factorielle_rec(14) = 1278945280
factorielle_rec(15) = 2004310016
Valeurs fausses après 15
factorielle_rec(16) = 2004189184
factorielle_rec(17) = -288522240
Comme on le voit, les valeurs deviennent fausses dès que \(i\geq16\).
On peut augmenter la précision en utilisant des long
au lieu d”int
, qui utilisent (sur ma machine) 64 bits au lieu de 32 bits.
Par contre, passer à des long long
n’apporterait rien (sur ma machine).
#include <stdio.h>
#define MAX_I 20
long factorielle_rec(long n) {
if (n <= 1) {
return 1;
}
else {
return n * factorielle_rec(n - 1L);
}
}
long factorielle_imp(long n) {
long f = 1;
for (int i = 1; i <= n; i++) {
f = f * i; /* f *= i aussi possible*/
}
return f;
}
int main(int argc, char* argv) {
for (long i = 1; i <= MAX_I+2; i++) {
printf("\n factorielle_rec(%li) = %li et factorielle_imp(%li) = %li", i, factorielle_rec(i), i, factorielle_imp(i));
if (i == MAX_I) {
printf("\nValeurs fausses après %d", MAX_I);
}
}
}
factorielle_rec(1) = 1 et factorielle_imp(1) = 1
factorielle_rec(2) = 2 et factorielle_imp(2) = 2
factorielle_rec(3) = 6 et factorielle_imp(3) = 6
factorielle_rec(4) = 24 et factorielle_imp(4) = 24
factorielle_rec(5) = 120 et factorielle_imp(5) = 120
factorielle_rec(6) = 720 et factorielle_imp(6) = 720
factorielle_rec(7) = 5040 et factorielle_imp(7) = 5040
factorielle_rec(8) = 40320 et factorielle_imp(8) = 40320
factorielle_rec(9) = 362880 et factorielle_imp(9) = 362880
factorielle_rec(10) = 3628800 et factorielle_imp(10) = 3628800
factorielle_rec(11) = 39916800 et factorielle_imp(11) = 39916800
factorielle_rec(12) = 479001600 et factorielle_imp(12) = 479001600
factorielle_rec(13) = 6227020800 et factorielle_imp(13) = 6227020800
factorielle_rec(14) = 87178291200 et factorielle_imp(14) = 87178291200
factorielle_rec(15) = 1307674368000 et factorielle_imp(15) = 1307674368000
factorielle_rec(16) = 20922789888000 et factorielle_imp(16) = 20922789888000
factorielle_rec(17) = 355687428096000 et factorielle_imp(17) = 355687428096000
factorielle_rec(18) = 6402373705728000 et factorielle_imp(18) = 6402373705728000
factorielle_rec(19) = 121645100408832000 et factorielle_imp(19) = 121645100408832000
factorielle_rec(20) = 2432902008176640000 et factorielle_imp(20) = 2432902008176640000
Valeurs fausses après 20
factorielle_rec(21) = -4249290049419214848 et factorielle_imp(21) = -4249290049419214848
factorielle_rec(22) = -1250660718674968576 et factorielle_imp(22) = -1250660718674968576
5.3.1. D’autres exemples ?¶
TODO: plus tard !
5.4. Pour en apprendre plus¶
Ce petit tutoriel : https://perso.crans.org/besson/apprendre-c.fr.html (sous licence GPLv3) ;
Ce WikiBooks : https://fr.wikibooks.org/wiki/Programmation_C (sous licence libre) ;
Ce cours ArcSys1 de l’ENS Rennes : https://mquinson.frama.io/ensr-arcsys1/ (2020-2021).