• 1. Video

       

       

    • 2. La bibliothèque de fonction math.h

       

      Pour effectuer des calculs avec des logarithmes ou des fonctions trigonométriques, il faut inclure la bibliothèque math.h avec la directive #include <math.h>. Dans cette bibliothèque on trouve les définitions des différentes fonctions mathématiques (cos, sin, tan, exp, pow,…).

      Sous Visual Studio, il faudra ajouter la directive #define _USE_MATH_DEFINES pour avoir accés à π définie par M_PI en C.

      Voici un premier exemple permettant de calculer une formule complexe en C. On retrouve les fonctions sqrt (racine carrée) exp(exponentielle)  et  pow (puissance de) .

      Affichage du résultat du calcul de x

      #include <stdio.h>

      #include <math.h>

      int main(void){

          double x, a = 2, b = 3, c = 1;

          x = (-b - sqrt(b * b - 4 * a * c)) / (2 * a)

              + exp(3) + pow(2, 3);

          printf("x=%lf", x);

          return 0;

      }

      Pour les calculs trigonométriques avec les fonctions  cos sin tan, les calculs se font en radian, on pourra utiliser  M_PI  sous Visual Studio à condition d'ajouter #define _USE_MATH_DEFINES avant #include <math.h>. Ce qui n'est pas le cas avec Code::Blocks ou avec pythontutor qui utilisent le compilateur gcc (Visual Studio utilise le compilateur de Microsoft légèrement différent de gcc). 

      Affichage du résultat du calcul de x

      #include <stdio.h>

      #define _USE_MATH_DEFINES

      #include <math.h>

      int main() {

          double x ;

          x = fabs((cos(3.0 * M_PI / 4.0)))/2.0;

          printf("%lf\n", x);

          return 0;

      }

      Quizz

    • 3. Exercices sur bibliothèque math.h

    • un exercice de calcul avec boucle for du cos ou du sin ou de exp

    • 4. Génération de nombres aléatoires

      Rappelons que le reste d’une division entière d’un nombre compris entre 0 et 65535 divisé par 5 sera compris entre 0 et 4. Ce qui donne pour la division 13/5 un reste égal à 3

      reste de la division entière 13/5=2 et 13%5=3

      Voici le programme de test de ce calcul :

      Extrait de code Résultat

      int quotient = 13 / 5;

      int reste = 13 % 5;

      printf("13/5=%d et le reste de la  division=%d", quotient, reste);

      13/5=2 et le reste de la  division=3

      La fonction rand() définie dans la bibliothèque stdlib.h renvoie une variable aléatoire comprise entre 0 et 65535. Avant tout appel à la fonction rand(), il faudra appeler la fonction srand(time(NULL) pour initialiser le générateur de nombre aléatoire.

      Génération de 5 nombres aléatoires Résultat (change à chaque lancement)

      #include <stdio.h>

      #include <stdlib.h>

      #include <time.h>

      int main(void){

         srand(time(NULL));

         for (int i = 0; i < 5; i++) {

            int valeurAleatoire = rand();

            printf("%d ", valeurAleatoire);

         }

      }

      5855 20242 26610 15955 26594

      Si l’on veut un tirage aléatoire compris entre 0 et N-1, il faudra utiliser le modulo (ou le reste de la division entière) rand()%N.

      srand(time(NULL));
int val = rand() % 5;

      Génération de 5 nombres aléatoires compris entre 1 et 5 Résultat (change à chaque lancement)

      #include <stdio.h>

      #include <stdlib.h>

      #include <time.h>

      int main(void){

         srand(time(NULL));

         for (int i = 0; i < 5; i++) {

            int valeurAleatoire = rand()%5+1;

            printf("%d ", valeurAleatoire);

         }

      }

      3 2 1 5 4
    • 5. Instruction if et if else

      L’instruction if permet d'effectuer ou non une partie des instructions en fonction du résultat d'une condition. Une condition (ou un test) est une expression dont le résultat est vrai ou faux.

      L'instruction if peut être utilisée pour un test simple (sans le else). Notez que l'opérateur qui permet de comparer s'écrit == . Il ne faut pas le confondre avec le signe d'affectation = qui permet de donner une valeur à une variable.

      Tirage aléatoire d'une valeur binaire et test si la valeur est égale à 0 Organigramme

      #include <stdio.h>

      #include <stdlib.h>

      #include <time.h>

      #define _USE_MATH_DEFINES  //pour pouvoir utiliser M_PI

      #include <math.h>

      int main() {

          srand(time(NULL));

          int i = rand()%2;

          if(i == 0){

              printf("OK");

          }

          return 0;

      }

      L'instruction if est en général utilisée avec le else (pour traiter les 2 cas).

      Tirage aléatoire d'une valeur comprise entre 1 et 10 et test si la valeur est supérieure ou égal à 5 Organigramme

      #include <stdio.h>

      #include <stdlib.h>

      #include <time.h>

      #include <math.h>

      int main() {

          srand(time(NULL));

          int valeurEntre1Et10 = rand() % 10 + 1;

          if (valeurEntre1Et10 >= 5) {

             printf("%d >= 5\n", valeurEntre1Et10);

          }

          else {

             printf("%d < 5\n", valeurEntre1Et10);

          }

          return 0;

      }

      En langage C, les opérateurs de comparaisons sont définis dans le tableau ci-dessous

      Opérateur
      Signification
      ==

      Égalité

      !=

      Inégalité

      <

      Strictement inférieur à

      <=

      Inférieur ou égal à

      >

      Strictement supérieur à

      >=

      Supérieur ou égal à

      Voici 2 autres exemples utilisant ces opérateurs de comparaisons entre nombres. Les opérateurs de comparaisons renvoie vrai (1) ou faux (0).

       if (nombre != 2) {

              printf("NON");

       }

      Affiche NON si le nombre est différent de 2

       if (nombre == 2) {

              printf("OUI");

       }

      Affiche OUI si le nombre est  égal à 2

      Quizz

      Comment combiner plusieurs tests de comparaisons ? il faut ajouter 3 symboles supplémentaires spécifiques du langage C.

      Opérateur
      Signification

      &&

      ET

      ||

      OU

      !

      NON

      Ces opérateurs vont permettre de tester comme en math des intersections ou des unions d'ensemble de valeurs.

      Exemple de code
      Signification

       if ((a >= 15) && (a <= 30)) {

         printf("compris entre 15 et 30");

       }

       if (!((a >= 15) && (a <= 30))) {

         printf("non compris entre 15 et 30");

       }

       if (((a < 15) || (a > 30))) {

         printf("non compris entre 15 et 30");

       }

      • En langage C un test de comparaison ne peut se faire qu'entre 2 valeurs ou variables, c'est pour cela que l'on doit ajouter les opérateurs booléens &&, || ou

      if ( 1 < x && x <3 )

           printf("la valeur %d satisfait l'inegalite 1 < x < 3.", x);

      • En python il est possible de définir un intervalle en spécifiant les bornes inférieures et supérieures avec 2 inégalités (Mais ce n'est pas le cas en C) :

      if 1 < x < 3:
             print(f"La valeur {x} satisfait l'inégalité 1 < x < 3.")

      Quizz

      Terminons ce cours avec les erreurs à ne pas faire en C lorsque l'on veut utiliser if et les tests :

      Code avec des erreurs
      Explications

      if (x >= 0) || (x <= 100){

       printf("ok");

      }

      Le test est toujours vrai puisque l'union de x>=0 avec x<=100 recouvre toutes les valeurs

      if (x <= -20) && (x >= 100){

        printf("ok");

      }

      Le test est toujours faux puisqu'il est impossible d'avoir des valeurs <-20 et aussi >100

      if (x == -20) && (x == 100){

        printf("ok");

      }

      Le test est toujours faux, il aurait fallu remplacer && par || pour que cela ait du sens

      if (x = -20){

        printf("ok");

      }

      C'est une erreur classique -> x=-20 est une affectation et non un test, la langage C réagit alors comme si le résultat du test était vrai (sauf si on écrit x=0).
    • 6. Test de fin de Chapitre

    • Ce test aborde la totalité des sujets abordés dans ce chapitre sous forme d'exercices aléatoires, n'hésitez pas à recommencer, c'est la note la plus élevée qui sera celle retenue comme note finale.

      3.1 Bibliothèques de fonctions    
      3.2 Instruction  if