🕒 : 3 h maximum
Prérequis:
- cours gcc, gdb, structures de contrôles
- lib math.h
But:
- apprendre à coder
- lib math.h
Répertoire:
~/Works/TP4_C
Table de multiplications
répertoire: multiplication , code: multiplication.c
Écrire un programme multiplication.c qui affiche la table de multiplication d’un nombre passé en argument.
Répertoire: multiplication, code : multiplication.c
Exemple d’utilisation :
./multiplication 5
5 x 0 = 0
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
./multiplication
Veuillez me donner une valeur entière comprise entre 1 et 9 uniquement en paramètre.
./multiplication 11
Veuillez me donner une valeur entière comprise entre 1 et 9 uniquement en paramètre.
Affiche la table de 5 jusqu’à 5 x 9. (c’est un exemple)
Vérifiez si argc est correct (sinon, affichez un message d’erreur).
Utilisez argv[1] pour récupérer l’entier.
Avec Monia donner un algorithme et un Pseudo Langage (PL)
Affichez la table avec une boucle for en langage C ansi K&R
Tests :
- Lancez le programme avec différents arguments.
- Utilisez GDB pour vérifier la valeur de
argv[1].
Extraction de racine carré (SQuare Root)
Ce code calcule la racine carrée d’un nombre en utilisant la méthode de Héron (ou méthode babylonienne), un algorithme ancien mais très efficace.
répertoire sqr , code sqr.c
/*
.----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. |
| | _______ | || | ___ | || | _______ | |
| | / ___ | | || | .' '. | || | |_ __ \ | |
| | | (__ \_| | || | / .-. \ | || | | |__) | | |
| | '.___`-. | || | | | | | | || | | __ / | |
| | |`\____) | | || | \ `-' \_ | || | _| | \ \_ | |
| | |_______.' | || | `.___.\__| | || | |____| |___| | |
| | | || | | || | | |
| '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------'
*/
#include <stdio.h>
#include <stdlib.h>
#define nb_estimation 10
int main(int argc, char *argv[])
{
double nombre;
double estimation;
int cpt; /* entier compteur de boucle */
/* il faut au moins un argument */
if (argc != 2)
{
puts("Erreur: Un argument attendu (ex: ./racine 25)");
return EXIT_FAILURE;
}
/* on détermine le nombre en flottant passé en argument */
nombre=atof(argv[1]);
if (nombre < 0)
{
puts("Erreur: Nombre invalide (doit être positif)");
return EXIT_FAILURE;
}
/* estimation de la racine de nombre */
estimation = nombre;
for (cpt = 0; cpt < nb_estimation; cpt++)
{
estimation = (estimation + (nombre / estimation)) / 2.0;
}
printf("Racine de %s = %.5f\n", argv[1], estimation);
return EXIT_SUCCESS;
}
Avec gdb comprendre le fonctionnement du code C de sqr
tester avec 25 par exemple , puis 24
avec Monia donner l’algorithme et le PL du code C de sqr
Saisir ce code et tester
Augmenter le nombre d’estimation
on va modifier le nombre d’estimation à 100 millions , ou 0.1 milliard d’estimation au lieu de 10 , l’ordinateur n’est pas regardant.
#define nb_estimation 100000000
bruno@elliott:~/Works/langage_C/sqr$ gcc sqr.c -o sqr -Wall -ansi -pedantic -g
bruno@elliott:~/Works/langage_C/sqr$ time ./sqr 25
Racine de 25 = 5.00000
real 0m0,007s
user 0m0,001s
sys 0m0,006s
Le temps real (réel) nous intéresse ici .
Combien de temps ?
conclure sur l’extraction de la racine avec la méthode héron
Nombres premiers
répertoire : premier
Définition Mathématique d’un Nombre Premier
Un nombre premier est un entier naturel supérieur ou égal à 2 qui admet exactement deux diviseurs distincts : 1 et lui-même.
Travail final : pour arriver la il faudra faire les versions v1 jusqu’à v3
Écrire un programme premiers.c qui affiche tous les nombres premiers jusqu’à N (passé en argument).
Exemple :
./premiers 20
Résultat attendu:
2, 3, 5, 7, 11, 13, 17, 19
V1 Code Naïf (Tester tous les diviseurs de 2 à n-1)
répetoire : v1 , code premier.c
Vérifiez que n est bien un nombre valide (> 1).
Écrire un programme premier.c qui vérifie si un nombre n est premier en testant tous les diviseurs entre 2 et n-1.
Avec Monia donner l’organigramme et le PL
Traduire le PL en langage C
Code attendu exemple ; premier.c ,prenez le votre c’est préférable .
/*
___. .__ .__ .__
____\_ |__ _____________ ____ _____ |__| ___________ _____|__| _____ ______ | | ____
/ \| __ \ \____ \_ __ \_/ __ \ / \| |/ __ \_ __ \ / ___/ |/ \\____ \| | _/ __ \
| | \ \_\ \ | |_> > | \/\ ___/| Y Y \ \ ___/| | \/ \___ \| | Y Y \ |_> > |_\ ___/
|___| /___ / | __/|__| \___ >__|_| /__|\___ >__| /____ >__|__|_| / __/|____/\___ >
\/ \/ |__| \/ \/ \/ \/ \/|__| \/
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int cpt;
int n;
int est_premier;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <nombre>\n", argv[0]);
return EXIT_FAILURE;
}
n = atoi(argv[1]); /* on récupère la valeur entière passée */
est_premier = 1; /* flag mis */
for (cpt = 2; cpt < n; cpt++)
{
if (n % cpt == 0)
{
est_premier = 0;
break; /* on casse la boucle car pas premier ! */
}
}
if (est_premier)
printf ("%d est premier \n",n);
else
printf ("%d n'est pas premier \n",n);
return EXIT_SUCCESS;
}
Compiler et mesurer le temps d’exécution avec la commande time.
./premier 2147483647
# c'est long !! mais mesurons avec la fonction time
time ./premier 2147483647
Utilisez GDB pour observer comment les boucles s’exécutent.
V2 Implémentez un algorithme simple (testez les diviseurs de 2 à n/2).
répertoire v2 , code: premier.c
Reprendre le code précédent et le modifier
Avec Monia donner l’organigramme et le PL
Compiler et mesurer le temps d’exécution avec la commande time.
Utilisez GDB pour observer comment les boucles s’exécutent.
V3 Implémentez un algorithme simple (testez les diviseurs de 2 à √n).
√N est la vraie optimisation à privilégier pour des performances optimales. tester au dessus de racine de n , ça ne sert à rien.
répertoire v3 , code: premier.c
Reprendre le code précédent et le modifier
on découvre ici sqrt:
En C, la fonction sqrt() (racine carrée) est définie dans la bibliothèque <math.h>. Elle prend un argument de type double et retourne un double.
il faut ajouter l’option -lm lors de la compilation avec gcc , libm est séparée pour des raisons historiques (économiser de la mémoire sur les anciens systèmes).
Exemple extraction de la racine de 25 avec la fonction sqrt de la librairie math.h
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
double racine;
racine= sqrt (25);
printf("La racine de 25 donne : %f \n",racine);
return EXIT_SUCCESS;
}
bruno@elliott:~/Works/langage_C/sqrt$ gcc sqrt.c -o sqrt -lm -ansi -Wall -pedantic -g
bruno@elliott:~/Works/langage_C/sqrt$
bruno@elliott:~/Works/langage_C/sqrt$ ls
sqrt sqrt.c
bruno@elliott:~/Works/langage_C/sqrt$ ./sqrt
La racine de 25 donne : 5.000000
bruno@elliott:~/Works/langage_C/sqrt$
Avec Monia donner l’organigramme et le PL
Compiler et mesurer le temps d’exécution avec la commande time.
Utilisez GDB pour observer comment les boucles s’exécutent.
Expliquer pourquoi la v3 est mieux que les autres versions
Donner la version finale
./premiers 20
2, 3, 5, 7, 11, 13, 17, 19
Organigramme , PL et code C
SUITE de Fibonacci
Répertoire: fibo , code : fibo.c
Définition de la Suite de Fibonacci
La suite de Fibonacci est une séquence de nombres entiers où chaque terme est la somme des deux termes précédents. Elle est définie par récurrence de la manière suivante :
Définition mathématique :
F0​=0, F1​=1, Fn​=Fn−1​+Fn−2​ pourn ≥ 2​
exemple des premiers termes :
0,  1,  1,  2,  3,  5,  8,  13,  21,  34,  55,  89,  144,  …
Lien avec le nombre d’or (φ) :
Le nombre d’or
Le rapportn​​ Fn+1 / Fn​​
converge vers le nombre d’or
Ï•=​​ Fn+1 / Fn​​ ≈1,6180339887 lorsque n tend vers l’infini.
nombre d’or ϕ=(1+sqr (5))/2≈1,6180339887
avec Monia donner l’algorithme et le PL de code C
Traduire en C le PL
Proposer votre solution , compiler et tester
➜ fibo ./fibo 20
Suite de Fibonacci:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
Estimation de phi (nombre d'or): 1.618034055727554
Valeur theorique de phi: 1.618033988749895
tester la valeur 1000
➜ fibo ./fibo 1000





