• 1. Video

       

       

    • 2. Instructions ou blocs d'instructions

      Il est tout à fait possible d'enlever les accolades après les instructions if, for, while et do while à condition que l’on n’ait pas plus d’une instruction qui suive. Par contre dés que l'on a plus d'une instruction, il faut ajouter les accolades. Pour les débutants, il est préférable d'ajouter les accolades de façon systématique, afin de ne pas avoir de problème de compilation.

      blocs d'instructions

      Exemples de codes
      nombre d'instructions
      peut-on enlever les accolades ?

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

        printf("%d ", i);

      }

      1

                       OUI

      if (n == 0) {

        printf("%d ", n);

        printf("ok");

      }

      2

                       NON

      do {

        printf("entrer une valeur:");

        scanf_s("%d", &n);

      } while (n != 0);

      2

                       NON

      Quizz
    • 3. printf : formatage de l’affichage

      Pour les nombres entiers, l'affichage en colonne est possible en utilisant %3d au lieu de %d (pour un affichage sur 3 caractères).

      Code
      affichage
      Commentaire

      int n1 = 234, n2 = 1, n3 = -1;

      printf("%d | %d | %d\n", n1, n2, n3);

      printf("%d | %d | %d\n", n2, n1, n3);

      234 | 1 | -1
1 | 234 | -1 affichage non formaté (%d) : les barres verticales sont décalées

      printf("%3d | %3d | %3d\n", n1, n2, n3);

      printf("%3d | %3d | %3d\n", n2, n1, n3);

      234 |   1  | -1
    1 | 234| -1 affichage formatée (%3d) : quel que soit la valeur de n1,n2,,n3 comprises entre -99 et 999 les chiffres sont affichés en colonne.

      Pour les nombres réels, il existe 2 types d'affichage %lf et %lg et il est aussi possible de choisir le nombre de caractères à afficher (%5lg) ou le nombre de chiffres aprés la virgule (%.2lf).

      Code
      affichage
      Commentaire

      double d1 = 23.4, d2 = 0.12, d3 = 123;

      printf("%lf | %lf | %lf \n", d1, d2, d3);

      l'affichage %lf affiche les nombres avec 6 chiffres aprés la virgule.

      printf("%lg | %lg | %lg \n", d1, d2, d3);

      L'affichage %lg permet d'afficher au mieux (comme une machine à calculer)

      printf("%5lg | %5lg | %5lg\n", d1, d2, d3);

      printf("%5lg | %5lg | %5lg\n", d2, d1, d3);

       L'affichage formaté %5lg permet d'afficher 5 caractères même si la valeur affichée demande moins de caractère

      printf("%.2lf | %.3lf  | %.1lf\n", d1, d2,d3);

       

      Il est aussi possible d'afficher avec un nombre fixe de décimales.

      Quizz
    • 4. Les mots clés break et continue

      Le mot clé break permet de casser une structure répétitive (ou un switch, ce que nous allons voir aprés). Ainsi dans l'exemple ci-dessous, la boucle infini est cassée lorsque n==1, ce qui revient au code do while proposé. 

      Remarque : même si le résultat de ces 2 programme est identique, on préfèrera utiliser une structure en do while, bien plus compréhensible qu'une boucle infinie cassée par break.

      Organigramme
      code en do while
      code en utilisant le mot clé break

      int n=1;

      do {

        printf("valeur:");

        scanf_s("%d", &n);

      } while (n != 1);

      int n=1;

      while (1) {

        printf("entrer une valeur:");

        scanf_s("%d", &n);

        if (n == 1)

          break; //quitte la boucle while quand n=1

      }

      Le mot clé continue permet de ne pas exécuter le code qui suit et de revenir au début de la structure répétitive. Dans l'exemple ci-dessous, la valeur 2 n'est pas affichée.

      Code
      Résultat

      int i;

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

        if (i == 2)

          continue;

        printf("%d ", i);

      }

      0 1 3 4

      Récapitulons : le mot clé break permet de casser une structure répétitive et donc de sortie d'une boucle alors que le mot clé continue remonte au début de la structure répétitive sans exécuter le code qui suit.

      Quizz
    • 5. instruction switch

      En langage C, il existe l’instruction switch() case permettant le choix multiple et qui peut remplacer avantageusement l’utilisation de if dans certaines conditions.
      Règles d'écriture d’un switch :
      •    Le switch permet de tester la valeur d’une variable entière par rapport à plusieurs valeurs
      •    après chaque case on trouve l’instruction break
      •    si une instruction break n’est pas placé après un case, le cas suivant sera alors exécuté

      Dans l'exemple  ci-dessous, on peut voir que l'utilisation de switch case permet de simplifier la lecture du code.

      ordinogramme
      utilisation de if() else
      utilisation de switch case

      printf("entrer une valeur : ");

      scanf_s("%d", &valeur);

      if (valeur == 1) 

        printf("c'est 1");

      else {

        if (valeur == 2) 

          printf("c'est 2");

        else {

          if (valeur == 3) {

            printf("c'est 3");

          }

          else

            printf("c'est pas 1 2 3");

        }

      }

      int valeur;

      printf("entrer une valeur entre 1 et 9: ");

      scanf_s("%d", &valeur);

      switch (valeur) {

        case 1: printf("c'est 1"); break;

        case 2: printf("c'est 2"); break;

        case 3: printf("c'est 3"); break;

        default : printf("c'est pas 1 2 3");

      }

      Remarquez dans cet exemple avec switch case que lorsque l'on veut tester plusieurs valeurs (équivalent à || avec le if), il suffit d'écrire plusieurs cases sans utiliser le mot clé break.

      Exemple de code utilisant switch case
       Le même code avec des if else

      int valeur;

      printf("entrer une valeur entre 1 et 9: ");

      scanf_s("%d", &valeur);

      if (valeur >0 && valeur <10) {

        switch (valeur) {

          case 1:case 3: case 5: case 7:

          case 9: printf("impair"); break;

          case 2:printf("valeur=2"); break;

          default: printf("pair et pas 2");

        }

      }

      else {

        printf("valeur n'est pas entre 1 et 9");

      }

      int valeur;

      printf("entrer une valeur entre 1 et 9: ");

      scanf_s("%d", &valeur);

      if (valeur > 0 && valeur < 10) {

        if (valeur == 1 || valeur == 3 ||

        valeur == 5|| valeur == 7 || valeur == 9)

          printf("impair");

        else {

          if (valeur == 2)

            printf("valeur=2");

          else

            printf("pair et pas 2");

        }

      }

      else {

        printf("valeur n'est pas entre 1 et 9");

      }

      En résumé lorsque l'on utilise l'instruction switch :
      1. Cas (case) : Chaque case compare la valeur de l'expression à une valeur spécifique. Si elles sont égales, les instructions associées à ce case sont exécutées (on ne peut utiliser que des nombres entiers).
      2. break : L'instruction break termine le case courant et sort du switch. Sans break, l'exécution continue dans les cas suivants (comportement "fall-through").
      3. default : Le default est optionnel et spécifie les instructions à exécuter si aucune des valeurs des case ne correspond à l'expression. C'est similaire à l'instruction else dans les structures conditionnelles.

      Quizz

    • 6. Exercices switch

      switch ou if il faut choisir...

    • 7. Les constantes

      En programmation on évite d’avoir dans le programme des nombres magiques. On utilisera plutôt des noms de constantes qui seront en majuscules (convention pour les constantes).

      Prenons l'exemple d'un convertisseur euros -> dollars, ce programme a besoin du taux de conversion qui est ici la valeur 1.3009. Pour des soucis de maintenance et de lisibilité du programme, on évitera de placer des valeurs directement dans le programme que l'on placera dans des constantes (avec un nom en majuscule, par exemple ici TAUX)

      #include <stdio.h>

      int main() {

        double euros, dollars;

        printf(" euros -> dollars\n");

        printf("entrer la monnaie en euros >");

        scanf_s("%lg", &euros);

        dollars = euros * 1.3009;;

        printf("en dollars : %lg\n", dollars);

      }

      Il existe 2 façons de définir des constantes :

      • avec les variables associées au mot clé const 
      • en utilisant les directives pre-processeur #define 

      Utilisation du mot clé const (variable de type double)
      utilisation de la directive #define

      #include <stdio.h>

      const double TAUX = 1.3009 ;

      int main() {

        double euros, dollars;

        printf(" euros -> dollars\n");

        printf("entrer la monnaie en euros >");

        scanf_s("%lg", &euros);

        dollars = euros * TAUX;

        printf("en dollars : %lg\n", dollars);

      }

      #include <stdio.h>

      #define TAUX 1.3009 

      int main() {

        double dEuros, dDollars;

        puts(" euros -> dollars");

        printf("entrer la monnaie en euros >");

        scanf_s("%lg", &dEuros);

        dDollars = dEuros * TAUX;

        printf("en dollars : %lg\n", dDollars);

      }

      Quizz
    • 8. gestion des accents en C (Windows)

      Vous avez peut être déjà rencontré le problème de textes intégrant des accents et affichés avec printf sous Windows. Afin de comprendre le problème, nous allons afficher les 3 premières phrases de la fable « La cigogne et le renard »,  d’abord sur https://pythontutor.com/c.html puis sous Code ::Blocks ou Visual Studio (sous Windows). Voici l’extrait du code testé. 
          

      printf("Compère le Renard se mit un jour en frais,\n");

      printf("Et retint à dîner commère la Cigogne.\n");

      printf("Le régal fut petit et sans beaucoup d'apprêts :");

      affichage sous Windows (Codeblocks ou Visual Studio)
      affichage sous Linux (avec pythontutor)

      CompÞre le Renard se mit un jour en frais,

      Et retint Ó d¯ner commÞre la Cigogne.

      Le rÚgal fut petit et sans beaucoup d'apprÛts

      Compère le Renard se mit un jour en frais,

      Et retint à dîner commère la Cigogne.

      Le régal fut petit et sans beaucoup d'apprêts

      Conclusion : un programme compilé sous Linux affiche les accents correctement, ce qui n’est pas le cas sous Windows en programmation console.

      Essayons de comprendre le problème de la mauvaise gestion des accents sous Windows (et pas avec Linux). La raison de ce problème est historique : avant l’arrivée de Windows, le système d’exploitation (OS) qui était utilisé sur les PC étaient le DOS (premier OS de Microsoft en 1980). Il n’y avait à cette époque pas de souris et toutes les commandes se faisaient au clavier. A l’arrivée de Windows 95, l’invite de commande DOS est restée (elle permet d’exécuter des listes de commandes ou batch par les administrateurs systèmes) avec un écueil : sa table de caractères (CP-850) est différente de la table de caractères de Windows (CP-1252 en France). Lorsque vous écrivez un programme sous Windows dans Code ::Blocks, vous utilisez la page de caractères CP-1252 mais le code exécutable est lui affiché dans l’invite de commande DOS(code CP-850).

        Sous Linux il n’y a pas ce problème puisque tous les programmes partagent le même type de codage des caractères UTF8 qui est plus moderne (Linux a été développé en 1990).  

      Remarque : avant l’arrivée des PC, donc avant 1980, la transmission de messages numériques (télégrammes, télex) utilisait le code ASCII qui permet de coder les caractères sur 7 bits. On retrouve dans cette table tous les caractères sans accents et les chiffres. Toutes les tables de caractères CP-850, CP-1252, UTF8,… ont en commun les 128 premiers caractères de la table ASCII et c’est pour cette raison que les caractères sans accent on le même code (codé sur 7 bits) quelle que soit la table de caractères utilisée. C’est après que cela se complique, c’est-à-dire pour les caractères dont le code va de 128 à 255.  

      La table ASCII est constituée de 32 caractères de contrôle (valeurs de 0 à 31) suivi des caractères sans accents (de 32 à 127) suivi des caractères associé au code page (différent selon les pays). Dans le tableau ci-dessous, chaque ligne  est constitué de 16 caractères et donc en comptant les 32 premiers caractères de contrôle on retrouve les codes de 0 à 255 des caractères des tables de caractères DOS et Windows.  

      Code Page CP-850 (DOS latin-1)

      Code Page CP 1252 (Windows-1252)

      valeurs des codes ASCII

      32 caractères de contrôle

        ! " # $ % & ' œuf * + , - . /

      0 1 2 3 4 5 6 7 8 9 : ; < = > ?

      @ A B C D E F G H I J K L M N O

      P Q R S T U V W X Y Z [ \ ] ^ _

      ` a b c d e f g h i j k l m n o

      p q r s t u v w x y z { | } ~ 

      Ç ü é â ä à å ç ê ë è ï î ì Ä Å

      É æ Æ ô ö ò û ù ÿ Ö Ü ø £ Ø × ƒ

      á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « »

      ░ ▒ ▓ │ ┤ Á Â À © ╣ ║ ╗ ╝ ¢ ¥ ┐

      └ ┴ ┬ ├ ─ ┼ ã Ã ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤

      ð Ð Ê Ë È ı Í Î Ï ┘ ┌ █ ▄ ¦ Ì ▀

      Ó ß Ô Ò õ Õ µ þ Þ Ú Û Ù ý Ý ¯ ´

      ­ ± ‗ ¾ ¶ § ÷ ¸ ° ¨ · ¹ ³ ² ■

      32 caractères de contrôle

        ! " # $ % & ' œuf * + , - . /

      0 1 2 3 4 5 6 7 8 9 : ; < = > ?

      @ A B C D E F G H I J K L M N O

      P Q R S T U V W X Y Z [ \ ] ^ _

      ` a b c d e f g h i j k l m n o

      p q r s t u v w x y z { | } ~

      €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž 

       ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ

        ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯

      ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿

      À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï

      Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß

      à á â ã ä å æ ç è é ê ë ì í î ï

      ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ  

        0         à   31 (0x1F) 

       32 (0x20)  à   47 (0x2F) 

       48 (0x30)  à   63 (0x3F) 

       64 (0x40)  à   79 (0x4F) 

       80 (0x50)  à   95 (0x5F) 

       96 (0x60)  à  111 (0x6F) 

      112 (0x70)  à  127 (0x7F) 

      128 (0x80)  à  143 (0x8F) 

      144 (0x90)  à  159 (0x9F) 

      160 (0xA0)  à  175 (0xAF) 

      176 (0xB0)  à  191 (0xBF) 

      192 (0xC0)  à  207 (0xCF) 

      208 (0xD0)  à  223 (0xDF)

      224 (0xE0)  à  239 (0xEF)

      240 (0xF0)  à  255 (0xFF)

      On peut afficher le code ASCII d'un caractère en décimal ou hexadécimal, en utilisant ' ' pour définir le code du caractère à afficher.

      Extrait de code
      Résultat 
      Commentaire

      int valeur = '9';

      printf("%d %x\n", '0', '0');

      printf("%d %x\n", '1','1');

      printf("%d %x\n", '2','2');

      printf("%d %x\n", valeur,valeur);   
      48 30
      49 31
      50 32
      57 39
      affichage en décimal et hexadécimal du code ASCII de '0', '1', '2' et '9'.

      Quizz

      Voici quelques exemples de controle ( les 32 premières valeurs de la table ASCII).

      Exemples de caractères de contrôle

      Signification

      \a

      beep

      \b

      Espacement arrière

      \f

      Saut de page

      \n

      Saut de ligne

      \r

      Retour chariot

      \t

      Tabulation horizontale

      \v

      Tabulation verticale

      Prenons un exemple intégrant des caractères spéciaux (remarquez l'utilisation de '\b' qui permet de revenir en arrière et modifier un mot dans une phrase).

      Programme de test de caractères spéciaux
      Résultat 
      Commentaire

      printf("Compere le Renard se mit un jour en frais");

      for (int i = 0; i < 30; i++)

          printf("\b");

      printf(" Corbeau ");

      printf("\a\n");

      printf("\t Bonjour \t a \t vous\n");

      Compere le  Renard  mit un jour en frais

      Compere le  Corbeau  mit un jour en frais
      (bip)
               Bonjour         a      vous

      en arrière de 30 caractères

      Quizz

      Peut-on afficher des textes intégrant des accents sous Windows dans un programme en C ? 

      Oui, pour cela nous avons besoin de comprendre la fonction system dans stdlib.h.

      La fonction system est définie dans la bibliothèque stdlib.h et permet d’exécuter, dans un programme, des commandes que l’on aurait pu écrire dans l’invite de commande. C’est cette fonction qui va nous permettre de changer la table de caractères de la console DOS pour que celle-ci soit de type CP 1252. Mais avant de voir cette commande, voyons quelques commandes DOS. C'est ce que nous allons voir.

      Avant de changer le code page prenons un exemple pour comprendre l'utilisation des commandes DOS.

      Ouvrir un terminal DOS (invite de commandes) et lancer la commande COLOR 2E qui permet de choisir la couleur du fond et de la police du terminal.

      COLOR 2E

      Grace à la fonction system de stdlib.h, nous pouvons dans un programme C faire appel à la commande COLOR pour modifier la couleur du terminal exécutant le programme C.

      Exemple d'utilisation de la fonction system (stdlib.h>
      Résultat 
      Commentaire

      #include <stdlib.h>

      #include <stdio.h>

      int main() {

          system("COLOR 2E");

          printf("BONJOUR");

          return 0;

      }

      COLOR 2E : permet de changer la couleur du fond (2= VERT) et de la police (E=JAUNE). Le texte BONJOUR est donc en JAUNE sur fond VERT.

      Quizz

      Dans l'invite de commande  il est aussi possible de modifier le CODE PAGE de la console grace à la commande CHCP (CHange Code Page). Ainsi, dans une fenêtre DOS il est possible d'utiliser le CODE PAGE Windows avec la commande 

      CHCP 1252

      Ainsi la commande CHCP 1252 permet de choisir le jeu de caractères Windows-1252 ce qui permet d’afficher les accents sous Windows et la ligne CHCP 1252 > nul permet de ne pas afficher le message de changement de code page dans la console. Ainsi si l'on utilise la fonction system pour modifier le code page, l'affichage des accents devrait être possible.

      Exemple d'utilisation de la fonction system (stdlib.h>
      Résultat (on affiche les accents)

      #include <stdio.h>

      #include <stdlib.h> 

      int main() {

        system("CHCP 1252 > nul"); 

        printf("Compère le Renard se mit un jour en frais,\n");

        printf("Et retint à dîner commère la Cigogne.\n");

        printf("Le régal fut petit et sans beaucoup d'apprêts :");

        return 0;

      }

      Compère le Renard se mit un jour en frais,

      Et retint à dîner commère la Cigogne.

      Le régal fut petit et sans beaucoup d'apprêts

    • 9. 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.

      5.1 Formatter l’affichage
      5.2 Instruction switch
      5.3 instruction ou bloc d’instructions ?    
      5.4 Utilisation de constantes    
      5.5 La gestion des accents en C (sous Windows et Linux) et commande system :