Big Tuto : Programmez avec le langage C

De la théorie à la pratique

Chapitre 6 : Utilisation des variables

Tutoriel présenté par : The Ludovyc et Jérémie F. Bellanger (Jay)
 The Ludovyc 
Publication : 8 juin 2014 
Dernière révision : 17 avril 2016

   Dans ce chapitre, nous allons maintenant voir comment utiliser les variables ! Et ce sera donc encore un peu théorique, mais corrigeons d'abord l'exercice défi !

   Défi 1 :

#include <stdio.h>
#include <stdlib.h>
 
int main(){

    printf("char size: %d\n", sizeof(char));
    printf("short size: %d\n", sizeof(short));
    printf("int size: %d\n", sizeof(int));
    printf("long size: %d\n", sizeof(long));
    printf("float size: %d\n", sizeof(float));
    printf("double size: %d\n", sizeof(double));
 
}

Faites des copiers/collers (ctrl+c, ctrl+v), ça ira plus vite ! wink

  Défi 2 :

#include <stdio.h>
#include <stdlib.h>
 
int main(){

 char cs = sizeof(char); //cs pour char size
 printf("char size: %d\n", cs);

 char ss = sizeof(short); //ss pour short size
 printf("short size: %d\n", ss);

 char is = sizeof(int); //vous devriez avoir compris ;)
 printf("int size: %d\n", is);

 char ls = sizeof(long);
 printf("long size: %d\n", ls);

 char fs = sizeof(float);
 printf("float size: %d\n", fs);

 char ds = sizeof(double);
 printf("double size: %d\n", ds);
 
}

   Cette méthode est facile à mettre en place, mais même avec des copiers/collers, c'est fastidieux à coder... frown

  Défi 3 :

#include <stdio.h>
#include <stdlib.h>
 
int main(){

char s = sizeof(char);
printf("char size: %d\n", s);

s = sizeof(short);
printf("short size: %d\n", s);

s = sizeof(int);
printf("int size: %d\n", s);

s = sizeof(long);
printf("long size: %d\n", s);

s = sizeof(float);
printf("float size: %d\n", s);

s = sizeof(double);
printf("double size: %d", s);
 
}

   Cette méthode est plus longue que la première, mais vous avez un plus grand contrôle sur le programme. smiley

Note :
Lorsque l'on programme, plusieurs choix s'offrent à nous :
    - la facilité : Programme avec beaucoup de répétitions de code. Moins bien au niveau de la rapidité et de l'optimisation, mais plus simple à programmer...
    - la rapidité : Programme avec peu de lignes de code, utilisation d'algorithmes simples. Moins bien au niveau du contrôle et de l'optimisation, cependant.
    - le contrôle : Programme où vous savez ce qu'il se passe ligne par ligne, et où la plupart des variables sont clairement définies et stockées. Utilisation d'algorithmes simples. Moins bien au niveau de la rapidité et de l'optimisation, cependant.
   - l'optimisation : Programme avec les meilleurs algorithmes consommant le moins de ressources mémoire et processeur, souvent utilisé pour les systèmes embarqués, peu puissants. Moins bien au niveau de la rapidité. 

   Maintenant, on peut attaquer ce nouveau chapitre ! smiley

   Voici une ébauche de programme :

#include <stdio.h>
#include <stdlib.h>
 
int main(){

char c = 1;
char c1 = 1;

//Les rajouts de code se feront ici pour vos tests

printf("%d", c2);
 
}

 

   Cette ébauche me servira à vous démontrer par la pratique les différentes utilisations possibles des variables que nous avons vues dans le chapitre précédent.
   Toutes les variables contiennent des nombres. Nous pouvons donc faire des additions comme :

char c2 = c + 1;

   A noter que les chiffres ou nombres tels que 1 ci-dessus seront convertis en variables de type pouvant les contenir, ici 1 sera donc un char, ce qui veut dire que l'on peut faire ceci :

char c2 = c + c1;

   Si on peut faire des additions, on peut aussi, bien sûr, faire des soustractions comme :

char c2 = c - 1;

   ou encore :

char c2 = c - c1;

   Puis des multiplications :

char c2 = c * 1;

   Ou :

char c2 = c * c1;

   Et enfin des divisions :

char c2 = c / 1;

   Ou :

char c2 = c / c1;

ATTENTION : La division par 0 provoquera une erreur qui stoppera tout programme en C !

 

   La fonction scanf()

   Là où printf() est une fonction de sortie qui affiche une chaîne de caractères et/ou des variables, scanf() est une fonction d'entrée qui permet de faire une saisie.

Voici un exemple :

float f;
scanf("%f", &f);

 

   La première ligne est la définition d'une variable de type float et qui a pour nom f.
   Sur la deuxième ligne, le premier paramètre de scanf() ressemble à celui de printf(). Le deuxième paramètre correspond à l'adresse de la variable où la saisie sera enregistrée. C'est pour cela que l'on met un "&" devant le "f", mais on reviendra là-dessus plus tard wink.

   Le programme se met en pause lors d'un scanf() en attendant la saisie de l'utilisateur. Celle-ci prendra alors fin lors de l'appui sur la touche "Entrée".

ATTENTION :
Si l'utilisateur fait une saisie qui s'avère plus gourmande en mémoire que le type de variable prédéfini cela provoquera un buffer overflow ou overwriting. Derrière ces termes anglais se cache un grave problème qui peut arriver à votre programme si vous n'y prenez pas garde (il existe heureusement d'autres solutions pour contourner le problème wink). Je vais vous l'expliquer par un exemple.

Exemple

   Voici une mémoire fictive :

1- 0000 0000
2- 0000 0000

   1 et 2 représentent chacun une adresse en mémoire pour plus de lisibilité.

   Voici maintenant un petit programme :

#include <stdio.h>
#include <stdlib.h>
 
int main(){

unsigned char c;
unsigned char c1 = 1;
 
scanf("%d", &c);
 
}

 

   Dans cet exemple, nous dirons que la variable c est enregistrée à l'adresse 1 et la variable c1 en 2.

  Avant le scanf(), nous aurons donc notre mémoire qui ressemblera à ceci :

1- 0000 0000
2- 0000 0001

   Lors du scanf() maintenant, l'utilisateur saisit 256. Comme vous le savez déjà, avec un unsigned char nous ne pouvons compter que de 0 à 255. L'ordinateur fait donc ce que le programme lui demande et enregistre 256 à l'adresse 1 ce qui donne:

1- 0000 0000
2- 1000 0001

   Et maintenant, la variable c vaut toujours 0 alors que c1 vaut désormais 129... L'écriture de la variable 1 trop volumineuse s'est donc déportée sur la variable suivante, changeant par là-même sa valeur, et dans certains cas, le résultat peut s'avérer catastrophique ! Un overwriting est donc clairement à éviter et nous verrons donc plus tard comment faire pour l'éviter. Mais pour l'instant, nous utiliserons donc scanf(), en toute connaissance de cause. wink

 

   Exercice Défi :

   Faire un programme qui additionne, dans une variable resultat, deux variables de type int, saisies par l'utilisateur à l'aide de deux scanf(). Afficher la variable résultat à l'aide de la fonction printf()Attention au type de la variable résultat !

   La correction se fera lors du prochain chapitre ! cool

   D'ici là, vous êtes maintenant capables de faire des petits programmes bien sympathiques tels que le calcul de l'aire d'un cercle, le volume d'un cylindre donné par l'utilisateur, la valeur d'un angle en degrés depuis un radiant, une température en celsius depuis une en farenheit...

   Mais nous verrons au prochain chapitre de quoi faire bien plus ! @ bientôt ! smiley

 

 

Connexion

CoalaWeb Traffic

Today102
Yesterday282
This week896
This month3189
Total1742396

19/04/24