Apprentissage du langage c I généralités








télécharger 0.53 Mb.
titreApprentissage du langage c I généralités
page41/41
date de publication07.08.2018
taille0.53 Mb.
typeDocumentos
l.21-bal.com > loi > Documentos
1   ...   33   34   35   36   37   38   39   40   41

2)Options de "printf" et "scanf"


%

Printf

scanf

%c

Affichage au format "char"

Saisie d'un "char"

%d

Affichage au format "int"

Saisie d'un "int"

%hd

Affichage au format "short"

Saisie d'un "short int"

%ld

Affichage au format "long"

Saisie d'un "long"

%lld

Affichage au format "long long"

Saisie d'un "long long"

%u

Affichage au format "unsigned int"

Saisie d'un "unsigned int"

%hu

Affichage au format "unsigned short"

Saisie d'un "unsigned short"

%lu

Affichage au format "unsigned long"

Saisie d'un "unsigned long"

%llu

Affichage au format "unsigned long long"

Saisie d'un "unsigned long long"

%o

Affichage au format "int" en octal

Saisie d'un "int" en octal

%ho

Affichage au format "short" en octal

Saisie d'un "short" en octal

%lo

Affichage au format "long" en octal

Saisie d'un "long" en octal

%llo

Affichage au format "long long" en octal

Saisie d'un "long long" en octal

%x

Affichage au format "int" en hexadécimal

Saisie d'un "int" en hexadécimal

%hx

Affichage au format "short" en hexadécimal

Saisie d'un "short" en hexadécimal

%lx

Affichage au format "long" en hexadécimal

Saisie d'un "long" en hexadécimal

%llx

Affichage au format "long long" en hexadécimal

Saisie d'un "long long" en hexadécimal

%f

Affichage au format "float" en notation "classique"

Saisie d'un "float" en notation "classique"

%lf

Affichage au format "double" en notation "classique"

Saisie d'un "double" en notation "classique"

%Lf

Affichage au format "long double" en notation "classique"

Saisie d'un "long double" en notation "classique"

%e

Affichage au format "float" en notation "scientifique"

Saisie d'un "float" en notation "scientifique"

%le

Affichage au format "double" en notation "scientifique"

Saisie d'un "double" en notation "scientifique"

%Le

Affichage au format "long double" en notation "scientifique"

Saisie d'un "long double" en notation "scientifique"

%g

Affichage au format "float" en notation classique ou scientifique ("printf" choisira l'affichage prenant le moins de place)




%lg

Affichage au format "double" en notation classique ou scientifique ("printf" choisira l'affichage prenant le moins de place)




%Lg

Affichage au format "long double" en notation classique ou scientifique ("printf" choisira l'affichage prenant le moins de place)




%s

Affichage d'une chaîne de caractères

Saisie d'une chaîne de caractères

%r

Affichage au format "chiffres romains" minuscules (option non normalisée)




%R

Affichage au format "chiffres romains majuscules" (option non normalisée)



3)Les problèmes les plus fréquents

a)Mes affichages ne se font pas au bon moment


Voici un exemple de code qui est correct… mais qui présente le léger défaut de ne rien affichar avant qu'on ait saisi la valeur demandée.

#include // I/O bufferisées

main()
{
int i;

printf("Entrez une valeur : ");
scanf(%d", &i).

printf("La valeur que vous avez entré est %d\n", i);
}

Le problème vient de la fonction "printf". Cette fonction est "bufférisée"; c'est à dire qu'elle stocke les données à afficher dans une mémoire (buffer) afin de réduire les requêtes d'entréessorties qui sont (relativement) très longues. Les données ne sont alors réellement affichées (sorties) que dans les cas suivants :

La fonction rencontre un caractère '\n' dans les données à afficher

Le buffer est plein

Le programme se termine

Le buffer est vidé sur demande explicite du programmeur
Si le programmeur désire maîtriser dans son déroulement du programme le moment où seront affichées ses données; il doit provoquer un des cas cidessus. Le plus facile est donc de demander le vidage du buffer en employant la fonction "fflush()" et en lui indiquant qu'il faut vider le buffer de sortie standard "stdout".
Voici le code rectifié…

#include // I/O bufferisées

main()
{
int i;

printf("Entrez une valeur : "); fflush(stdout);
scanf("%d", &i).

printf("La valeur que vous avez entré est %d\n", i);
}

Le problème se présente aussi parfois dans l'écriture d'un fichier avec l'emploi de la fonction "fprintf()". Le fichier ne sera réellement écrit sur disque que dans les cas cidessus ou bien lors de sa fermeture par la fonction "fclose()".

b)Mes saisies se font une fois sur deux


Voici un exemple de code qui a l'air correct… mais qui présente le défaut de ne pas laisser à l'opérateur saisir sa demande de quitter la boucle.

#include // I/O bufferisées

int main(void)
{
int age;
char c;

do {
printf("Age :"); fflush(stdout);
scanf("%d", &age);

printf("Fin (o/n) :"); fflush(stdout);
scanf("%c", &c);

printf("age=<%d>, fin=<%c>\n", age, c);
} while (c != 'o');
}

Le problème vient de la saisie du numérique. Lorsque l'opérateur entre son nombre, il valide sa saisie par l'appui de la touche "Entrée". Or, cette touche envoie elle-aussi un caractère dans le tampon associé au clavier.

Lorsque la fonction "scanf()" extrait le nombre du tampon associé au clavier, elle s'arrête au premier caractère qui n'est plus numérique donc s'arrête à ce fameux caractère "Entrée" qui reste dans le tampon.

Lors de la saisie suivante, la fonction "scanf()" ayant déjà un caractère à traiter ne demande donc rien à l'opérateur.

Pour que le buffer arrive vide à l'entrée de "scanf()", il convient, après la saisie du numérique, d'extraire ce caractère inutile par l'appel d'une fonction appropriée ("getchar()" par exemple).

L'appel à la fonction "fpurge()" est envisageable mais bien inutile du fait de la cause de cette erreur très simple à rectifier.
Voici le code rectifié…

#include // I/O bufferisées

int main(void)
{
int age;
char c;

do {
printf("Age :"); fflush(stdout);
scanf("%d", &age);
getchar();

printf("Fin (o/n) :"); fflush(stdout);
scanf("%c", &c);

printf("age=<%d>, fin=<%c>\n", age, c);
} while (fin != 'o');
}

c)Mes boucles ne s'arrêtent pas


Dans l'emploi des boucles, il faut se méfier de la zone des valeurs possibles des variables qu'on utilise car une variable qui atteint sa valeur limite maximale et qui est incrémentée de "1" repasse à sa valeur minimale sans que le programme ou le compilateur indique une erreur quelconque.

Il en va de même pour une variable qui atteint sa valeur limite minimale et qui est décrémentée de "1". Elle repasse alors à sa valeur limite maximale.

Voici différents exemples de boucles infinies…

char i;
for (i=0; i < 200; i++)
printf("i=%d\n", i);
// Boucle infinie car un "char" (signed) varie de –128 à 127 et sera toujours inférieur à 200
unsigned short i;
for (i=10; i >= 0; i--)
printf("i=%d\n", i);
// Boucle infinie car un "unsigned" est toujours positif ou nul
long i=10;
do {
printf("i=%d\n", i);
i--;
} while (i > 1 >= 0);
// Cette boucle réellement bizarre montre bien qu'en C, on peut écrire vraiment
n'importequoi pourvu que ce soit syntaxiquement correct.
La condition de fin sera évaluée de gauche à droite. On aura donc :
i > 1 (vrai ou faux) => renvoie un nombre "x" différent de 0 ou x=0
x >= 0 sera toujours vrai => Boucle infinie */

d)Les fonctions de la librairie mathématique renvoient des valeurs incohérentes


N'oubliez pas d'inclure les déclarations des fonctions mathématiques "#include " au début de chaque fichier source devant utiliser une fonction de la librairie mathématique.

En effet, lorsque le compilateur arrive sur une fonction non connue (non déclarée), il la déclare automatiquement par défaut en fonction de type "int" (norme ANSI). Ensuite, lors de l'appel au code exécutif de la fonction situé dans la librairie mathématique, le résultat du calcul est transformé dans le type de la fonction (int) et il perd toute sa cohérence.

L'inclusion de "math.h" permet de déclarer au compilateur toutes les fonctions qui seront utilisées.
1   ...   33   34   35   36   37   38   39   40   41

similaire:

Apprentissage du langage c I généralités iconI. apprentissage moteur et concepts associés A. l’apprentissage moteur
«Capacité acquise par apprentissage à atteindre des résultats fixés à l’avance avec un maximum de réussite et souvent un minimum...

Apprentissage du langage c I généralités iconSituation d’apprentissage

Apprentissage du langage c I généralités iconLe contrat d’apprentissage

Apprentissage du langage c I généralités iconAteliers d’apprentissage

Apprentissage du langage c I généralités iconIntroduction à L’Étude du langage

Apprentissage du langage c I généralités iconI generalites

Apprentissage du langage c I généralités iconGeneralites

Apprentissage du langage c I généralités iconL'apprentissage et l'enseignement des langues

Apprentissage du langage c I généralités iconBanque de situations d’apprentissage et d’évaluation compétence 3

Apprentissage du langage c I généralités icon70 Electricité / Généralités








Tous droits réservés. Copyright © 2016
contacts
l.21-bal.com