Bases du langage C

  1)PREMIERS PROGRAMMES:
  
           Un programme informatique réalise en général trois choses :
   • Il lit des données en entrée. Le programme doit en effet savoir        à partir de quoi travailler.
    Par exemple, pour utiliser une calculatrice, on doit lui donner          des   nombres
    et lui dire quelles opérations effectuer. Pour cela, on utilise              souvent un clavier,
    mais le programme peut aussi tirer les données d’un disque dur        ou encore d’un
    autre ordinateur via un réseau ou autre.
  • Il effectue des calculs. À partir des données en entrée, le                 programme va appliquer
   automatiquement des méthodes pour traiter ces données et               produire un résultat.
   Les méthodes que sont capables d’effectuer les ordinateurs               s’appellent des algorithmes.
   Par exemple, une calculatrice va appliquer l’algorithme                     d’addition ou de
   multiplication.
  •  Il écrit des données en sortie. Lorsque le programme a obtenu        un résultat, il
    doit écrire ce résultat quelque part pour qu’on puisse l’utiliser.           Par exemple, une
    calculatrice va afficher un résultat à l’écran ou stocker le résultat     en mémoire.
    Le travail d’un programmeur consiste à créer des programmes          informatiques. Le
    programmeur doit pour cela expliquer à l’ordinateur dans un            certain langage, appelé
    langage de programmation, quelles sont les données et quelles          sont les méthodes à
    appliquer pour traiter ces données. Dans ce chapitre, nous               verrons en langage C, les
   premiers exemples permettant :
1. de lire une donnée au clavier avec la fonction scanf ;
2. d’effectuer les calculs les plus simples sur des nombres et de           stocker le résultat
   dans une variable ;
3. d’afficher un texte ou un nombre à l’écran avec la fonction             printf.
   Ce faisant, nous verrons la structure d’un programme C très             simple et quelques
   notions sur la syntaxe du langage. Les notions vues dans ces             exemples seront développées
   dans les chapitres suivants. Une fois que le programmeur a écrit       son programme,
   qui est du texte en langage C, il doit compiler le programme pour     créer un
   fichier exécutable pour qu’un utilisateur du programme puisse          utiliser ce programme.Le processus de compilation est décrit en      annexe.
1.2 )AFFICHER UN MOT
            Voici un programme C qui écrit un message de bienvenue : le mot “Bonjour”.
     #include <stdio.h>
       int main(void)                                   /* programme principal */
      {
              printf("Bonjour !\n");                  /* écriture à l’écran */
      return 0;
¨     }
1.3 LIRE UN NOMBRE
    Voici un programme permettant à l’utilisateur de taper un             nombre au clavier. Ce
   nombre est lu par le programme et mémorisé dans une variable x   qui est un nombre

  réel (type de données float). La variable x est ensuite ré-affichée    par printf.
        #include <stdio.h>                             /* pour pouvoir lire et écrire */
          int main(void)                                   /* programme principal */
        {
           float x;                                             /* déclaration d’une variable x (nombre réel) */
           printf("Veuillez entrer un nombre réel au clavier\n");
          scanf("%f", &x);                                /* lecture au clavier de la valeur de x */
                                                                      /* affichage de x : */
           printf("Vous avez tapé %f, félicitations !", x);
      return 0;
      }



     🔺       Ne pas oublier le & dans le scanf ! Cela provoquerait     une erreur mémoire (ou erreur
  de segmentation) lors de l’exécution du programme, et le                  programme serait

  brutalement interrompu.
1.4 EFFECTUER UN CALCUL ET MÉMORISER

LE RÉSULTAT
          Le programme suivant mémorise le double de x dans une           variable y, par le biais d’une
   affectation. L’affectation (symbole =) permet de stocker le               résultat d’un calcul dans

   une variable.
             #include <stdio.h>                    /* pour pouvoir lire et écrire */
             int main(void)                           /* programme principal */
          {
           float x, y;                                     /* déclaration de deux variables x et y */
            printf("Veuillez entrer un nombre réel au clavier\n");
           scanf("%f", &x) ;                      /* lecture au clavier de la valeur de x */
           y = 2*x;                                      /* on met dans y le double du contenu de x */
          printf("Le double du nombre tapé vaut %f \n", y);
          return 0;

}


     🔺    Le symbole  de l’affectation a une toute autre                                signification que l’égalité mathématique.
             L’affectation signifie qu’une variable prend la valeur du                   résultat d’un calcul.

             Il correspond à une opération de recopie d’une donnée.
     Exercices:
         
            1: (∗) Pour convertir des degrés Fahrenheit en degrés Celsius, on a la formule                           suivante:
                                                          C = 0.55556 × (F − 32)
              où F est une température en degrés Fahrenheit et C la température correspondante en
         degrés Celsius.
     a) Écrire un programme C qui convertit une température entrée au clavier exprimée  en                 degrés Fahrenheit et affiche une valeur approchée de la même température en degrés
            Celsius. Les températures seront exprimées par des nombres réels.
    b) Même question qu’au a) pour la conversion inverse : de degrés Celsius en degrés

            Fahrenheit.
    2 (∗) Lors d’une opération de promotion, un magasin de composants hardware
    applique une réduction de 10% sur tous les composants. Écrire un programme qui
    lit le prix d’un composant au clavier et affiche le prix calculé en tenant compte de la
    réduction.
2.1 (∗∗) Soit la fonction mathématique f définie par f (x) = (2x + 3)(3x² + 2)
      a) Écrire un programme C qui calcule l’image par f d’un nombre saisi au clavier.
      b) Une approximation de la dérivée f ' de la fonction f est donnée en chaque point x,
   pour h assez petit (proche de 0), par :


                   f'(x) =f (x + h) − f (x)/h


      Écrire un programme C qui calcule et affiche une approximation de la dérivée de f

   en un point x entré au clavier. On pourra faire saisir le paramètre h au clavier.
                  Corrigés
1)
a
       int main(void)
       {
          float celsius, fahrenheit;
          printf("Entrez une température en degrés Fahrenheit : ");
         scanf("%f", &fahrenheit);
          celsius = 0.55556 * (fahrenheit - 32.0);
         printf("Température de %f degré Celsius.\n", celsius);
   return 0;

}
b)

     int main(void)
     {
          float celsius, fahrenheit;
          printf("Entrez une température en degrés Celsius : ");
          scanf("%f", &celsius);
          fahrenheit = (celsius / 0.55556) + 32.0;
          printf("Température de %f degré Fahrenheit.\n", fahrenheit);
      return 0;

   }
2.1

    int main(void)
   {
         float prix, prixRemise;
         printf("Entrez un prix : ");
         scanf("%f", &prix);
         prixRemise = 0.9 * prix;
  printf("Le prix avec 10 %% de remise est de %f.\n", prixremise);  
  return 0;
 }
2.1
a)
   int main(void)
  {
      float x, fx;
      printf("Entrez un nombre : ");
      scanf("%f", &x);
      fx = (2.0 * x + 3.0) / (3.0 * x * x + 2.0);
     printf("f(%f) = %f\n", x, fx);
   return 0;
  }
b)
    int main(void)
  {
      float x, h, fx, fx_plus_h, fPrime_x;
      printf("Entrez un nombre : ");
      scanf("%f", &x);
      printf("Entrez un écart h : ");
     scanf("%f", &h);
     fx = (2.0 * x + 3.0) / (3.0 * x * x + 2.0);
     fx_plus_h = (2.0 * (x + h) + 3.0) / (3.0 * (x + h) * (x + h) + 2.0);
     fPrime_x = (fx_plus_h - fx) / h;
    printf("f’(%f) = %f\n", x, fPrime_x);
  return 0;

}
2)TYPES DE DONNÉES:

2.1 VARIABLES ET OPÉRATIONS

          Dans un programme, il apparaît des variables qui permettent      de donner des noms à
    des données. Chaque variable doit avoir un type (nombre entier,      nombre réel, caractère,
    suite de caractères, ou type plus complexe). Chaque variable a          aussi un identificateur
    qui est le nom de la variable. Une déclaration de variable a              toujours la forme :
                          type identificateur;
      ou bien la forme avec l’initialisation (c’est-à-dire que l’on                donne à la variable une valeur initiale) : 
                  type identificateur = valeur;

         On peut aussi déclarer plusieurs variables d’un même type                séparées par des virgules.
2.2 TYPE ENTIER int

         Le type int (abréviation de l’anglais integer) est une                      représentation des nombres
      entiers. Comme toute variable informatique, un int ne peut                prendre qu’un nombre
      fini de valeur. Un int est généralement codé sur 4 octets (32                bits).Dans ce cas, les
       valeurs sont entre −231 et 231 − 1 (ce qui fait bien 232 valeurs          possibles). Notons que
      sur certains vieux systèmes, les int sont codés seulement sur 2           octets.
    Les opérations arithmétiques binaires +, −, ∗, / sont définies sur        les int et donnent
    toujours pour résultat un int.
     #include <stdio.h>
       int main(void)
  {
       int nombre, chiffre;
          puts("Tapez un nombre entier :");
         scanf("%d", &nombre);
         chiffre = nombre%10;
         printf("Le dernier chiffre est : %d", chiffre);
    return 0;
  }
2.3 LES TYPES RÉELS float ET double
         Les types float et double permettent de représenter des            nombres réels avec une certaine précision (suivant une représentation des nombres            appelée virgule flottante   ou nombre flottant).   Un nombre réel tel qu’il est ainsi représenté possède une                 mantisse (des chiffres) et
      un exposant qui correspond à la multiplication par une certaine    puissance de 10. Par
exemple 3.546E − 3 est égal à 3.546 × 10−3, ce qui fait 0.003546.
     Le type double (codé sur 8 octets) est plus précis que le type float (codé sur 4 octets).
La valeur maximale d’un double est d’environ 10308 alors que celle d’un float
est de l’ordre de 1038. (Les valeurs limites exactes sont données par les constantes

DBL_MAX et FLT_MAX de la bibliothèque float.h).
2.4 LE TYPE char
      Le type char (abréviation de l’anglais character) est un type caractère codé sur
1 octet. C’est la plus petite donnée qui puisse être stockée dans une variable. Les
valeurs (de −126 à 125) peuvent réprésenter des caractères conventionnels.
        Par exemple, les caractères alphabétiques majuscules A, B, . . . , Z ont pour valeur
65, 66, . . . , 90 et les minuscules correspondantes a, b, . . . , z ont pour valeurs
97, 98, . . . , 122. On appelle ce codage des caractères le code ASCII.
Une variable de type char peut être considérée soit comme un nombre, soit comme
       un caractère que l’on peut afficher. Dans tous les cas, il s’agit du même type. Pour
désigner par exemple le caractère Z dans un programme, on peut soit écrire ’Z’ (entre
quotes), soit écrire 90 qui est le code ASCII du caractère Z. Dans les deux cas il s’agit
du même caractère et de la même donnée qui peut être stockée dans la même variable

de type char.
2.5 LES TYPES unsigned
     Aux types int et char correspondent des types unsigned int (aussi sur 4 octets) et
unsigned char (aussi sur 1 octet) qui représentent uniquement des valeurs positives.
       Un unsigned int sur 4 octets va de 0 à 232 − 1.

      Un unsigned char sur 1 octet va de 0 à 28 − 1 (c’est-à-dire de 0 à 255).
2.6 AFFECTATIONS ET CONVERSIONS
     Étant données deux variables de même type, on peut recopier le contenu d’une variable
dans l’autre par une affectation (signe =). Plus généralement, on peut copier
dans une variable la valeur de toute une expression.
     Si les deux variables sont de types différents, l’opération d’affectation = va réaliser,
lorsque c’est possible, une conversion. Si la conversion n’est pas possible, le

compilateur affichera un message d’erreur.
Exemple d’affectation
  int var1=0, var2=3;    /* déclarations avec initialisations */

  var1=2*var2+1;    /* affectation : après ceci var1 vaut 7 */
Exemple de conversion d’un float vers un int
int n;
float x=7.6587e2;

n = (int)x; /* après ceci n vaut 765 (arrondi à la partie entière) */
     🔺  Pour le calcul de deuxtiers ci-dessus, écrire                 deuxtiers=n/m ou encore deuxtiers=2/3
   est une grave erreur qui conduit au résultat que deuxtiers      est égal à 0, car le
quotient entre entiers donne une division euclidienne, même lorsqu’on l’affecte

ensuite à un float ou un double.
2.7 LES CONSTANTES ET LE #define
    Une constante est une valeur qui n’est pas susceptible de varier lors de l’exécution
d’un programme. Par exemple, 9.81 est une constante de type float, 1024 est une

constante de type int (qui peut aussi être affectée à une variable de type float).
   Enfin, 65, ou "A" est une constante de type char (qui peut aussi être affectée à un int

ou un float).

      🔺  Ne pas confondre le caractère ’6’, dont le code  ASCII vaut 54, avec le caractère 6,

dont le code ASCII vaut 6, mais qui représente un autre caractère.
2.8 DÉFINIR SES PROPRES TYPES

     En C, le programmeur peut définir ses propres types et donner les noms qu’il veut à
ses types. Pour donner un nom à un type, on utilise typedef. Dans l’exemple suivant,
le programmeur a préféré appeler les nombres entiers Entier plutôt que int.
       #include <stdio.h>
      typedef int Entier;         /* Définition d’un nouveau type Entier */
      int main(void)
      {
          Entier d, n;
          scanf("%d", &n);
           d = 2*n;
         printf("Le double de %d est %d\n", n, d);
       return 0;
     }


      Dans ce cas, le type Entier est simplement sinonyme de int. Nous verrons plus
loin comment définir des types plus compliqués pour représenter des informations de
toutes sortes. Les différents types définis et utilisés dans un programme s’appellent
les structures de données.


Exercices

   3.1 (∗) Sachant que le premier avril 2004 était un jeudi, écrire un programme qui
détermine le jour de la semaine correspondant au 4 mai de la même année. On pourra
représenter les jours de la semaine par des numéros allant de 0 à 6.
   3.2 (∗) Écrire un programme qui lit un nombre au clavier, répond 1 si le nombre est

impair et 0 si le nombre est pair.
Corrigés
3.1
     int main(void)
   {
     int njours;
            /* Convention : 0 <-> lundi, ... 6 <-> Dimanche
         33 jours écoulés entre le 1er avril et le 4 mai */
         njours = (33 + 3) % 7 + 1;
         printf("Le 4 mai était le %d ème jour de la semaine.\n", njours);
      return 0;

    }

3.2
                int main(void)
              {
                   int n, parite;

                   printf("Entrez un nombre : ");
                    scanf("%d", &n);
                     parite = n % 2;
                    printf("La parité du nombre est %d\n", parite);
                   return 0;

                   }

Aucun commentaire:

Enregistrer un commentaire