🕒 : 3 h maximum

Prérequis:

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.

wikipédia méthode de Héron

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 

homme de Vitruv

Ï•=​​ 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

Explication du résultat avec 1000