5)L'affichage – La saisie L'affichage d'une valeur (variable ou constante) se fait en utilisant la fonction "printf()" qui signifie "print formating"
Cette fonction s'utilise de la manière suivante :
Premier argument et le plus complexe : Message à afficher. Ce message, encadré par des " (double guillemets) constitue en fait tout le texte que le programmeur désire afficher. A chaque position du texte où il désire que soit reporté une variable ou une valeur d'expression, il doit l'indiquer en positionnant un signe "%" (pour cent) suivi d'un caractère indiquant la manière dont il désire afficher ladite valeur.
Autres arguments : Expressions et variables dont on désire afficher la valeur.
Exemple :
main() { int a=5; int b=6; printf("Le résultat de %d ajouté à %d plus 1 est %d", a, b, a + b + 1); }
La saisie d'une variable se fait en utilisant la fonction "scanf()" qui signifie "scan formating"
Cette fonction s'utilise de la manière suivante :
Premier argument et le plus complexe : Masque de saisie. Ce masque, encadré par des " (double guillemets) constitue en fait tout ce que devra taper l'utilisateur quand il saisira ses variables. A chaque position du texte où le programmeur désire que soit reporté une variable à saisir, il doit l'indiquer en positionnant un caractère "%" (pour cent) suivi d'un caractère indiquant la manière dont il désire que soit saisie ladite valeur. Bien souvent, il n'y a aucun masque de saisie car c'est très contraignant.
Autres arguments : Variables à saisir, chacune précédée du caractère "&"
Exemple :
main() { int jj; int mm; int aa; printf("Saisissez une date sous la forme jj/mm/aa :\n"); scanf("%d/%d/%d", &jj, &mm, &aa); }
Erreur fréquente :
main() { int i;
scanf("Saisissez un nombre : %d", &i); // Erreur => scanf n'affiche rien
// Une invite s'affiche avec "printf" /* Il faut écrire : printf(" Saisissez un nombre :\n"); scanf("%d", &i); */ }
L'ensemble des options de saisie et d'affichage sont mises en annexe.
6)La conversion de type (casting) a)Généralités Lorsque le langage doit faire un calcul avec des valeurs numériques ; ce calcul se fait dans la plus grande précision des nombres intervenants ; et non dans la précision du résultat attendu.
Exemple : float f=20 / 7;
Résultat :"f" vaut "2.0000" alors qu'il était sûrement attendu "2,8571". Mais "20" et "7" étant une écriture typique de nombres au format "int", le calcul a été entièrement fait en codage "int". Pour obtenir le bon résultat, il aurait fallu écrire aumoins une des deux constante dans une notation en virgule flottante en écrivant par exemple "float f = 20.0 / 7" ou bien "float f = 20 / 7e0".
b)Conversions de type explicites Le problème précédent reste le même si on opère avec des variables de type "int" pour mettre le résultat dans un "float". Le résultat récupéré dans le "float" ne correspondra pas à la valeur attendue.
Exemple : int a=20, b=7; float f=a / b; La seule façon d'avoir un résultat dans "f" correct est de forcer au moins une des deux variables à être considérée comme un "float". Cette opération se nomme "casting" (du verbe anglais "to cast" qui signifie "jouer un rôle").
On crée un "casting" sur une variable en indiquant, avant la variable et entre parenthèses, dans quel type elle doit être considérée.
Exemple :
int a=20; int b=7; float f;
f=(float)a / b; // Le calcul est effectué en considérant "a" comme un "float" f=a / (float)b; // Le calcul est effectué en considérant "b" comme un "float" f=(float)a / (float)b; // Les deux variables "a" et "b" sont considérées comme des "float" // Dans ces trois écritures, on aura bien "f=2,8571"
c)Conversions de type implicites Les conversions de type implicites se font de façon naturelle chaque fois que des variables de types différents sont utilisées dans une opération. A ce moment là, la variable de type le plus "étroit" est convertie dans la variable de type le plus "large" et le "cast" n'est pas nécessaire.
int a=20; float b=7.0; double f=a / b; // Conversion implicite de "a" en "float"
On peut aussi copier une variables d'un type dans une variable d'un autre type. Mais si la variable réceptrice est plus "étroite", il y a perte de données. Conversion automatique sans perte de précision et sans perte de signe
-
char
|
| int
| le caractère est placé dans l'octet le moins significatif
| short
|
| long
| expansion du signe
| int
|
| float
| pas de problème
| float
|
| double
| pas de problème
|
Conversions automatiques avec perte de précision
-
int
|
| char
| perte des octets les plus significatifs
| long
|
| short
| perte des octets les plus significatifs
| float
|
| int
| perte de la partie décimale
| double
|
| float
| perte de précision
| |