Vous êtes sur la page 1sur 25

Analyse et programmation 1

Interface utilisateur conversationnelle (mode console ou ligne de commande)

Thmes abords
Comment reprsenter du texte en C ?
Les t types pes caractres et chanes de caractres caractres.

Comment afficher du texte et des valeurs ?


printf et les options de format.

Comment grer la saisie de valeurs ?


scanf et les options de format.

Analyse et programmation 1 - Interface utilisateur conversationnelle

Reprsentation du texte
Le type caractre - principe Convention
Les caractres sont cods p par des entiers 8 bits char
256 caractres possibles.

A une valeur binaire donne est associ un caractre. Une mme valeur binaire dsigne toujours le caractre
indpendamment de la dclaration signed / unsigned

Il existe plusieurs tables de caractres


ASCII : American Standard Code for Information Interchange
trs rpandu, dcrit les caractres 0 127.

EBCDIC : Extended Binary Coded Decimal Interchange Code


Utilis dans lunivers mainframe IBM, caractres 0 255.

Il existe aussi des codages sur 16 bits


Exemple : UNICODE. On utilise alors short pour coder un caractre. Nous ne lutiliserons pas.
Analyse et programmation 1 - Interface utilisateur conversationnelle 2

Reprsentation du texte
Le type caractre le code ASCII les caractres 0 127

Analyse et programmation 1 - Interface utilisateur conversationnelle

Reprsentation du texte
Le type caractre le code ASCII

Les caractres 0 31
Sont non imprimables. imprimables Ils ont un effet
Par exemple : le caractre 13 (CR) fait un retour chariot . Le caractre 10 (LF) fait un saut de ligne (line feed). Le caractre 7 (BEL) fait bip (cloche).

Les caractres 128 255


Ne sont pas normaliss. Sont utiliss de faon spcifique par chaque systme. Exemple
Sous Windows, le caractre 230 affiche Sous Dos, ce caractre affiche

Analyse et programmation 1 - Interface utilisateur conversationnelle

Reprsentation du texte
Le type caractre constantes littrales

Constantes numriques
On pe peut t to tout t simplement utiliser tiliser un n entier po pour r reprsenter le code ASCII dun caractre.
char c = 65; // caractre A

Constantes caractres
char c = 'A'; // caractre A

Analyse et programmation 1 - Interface utilisateur conversationnelle

Reprsentation du texte
Le type caractre constantes littrales particulires Code '\a' '\b' '\t' '\n' '\v' '\f' '\r' '\101' '\x41' '\'' '\\' 39 92 Valeur Description 7 BEL (cloche), (cloche) BIP dalerte sonore 8 BS (Back Space), efface un caractre en arrire 9 10 11 12 13 TAB, Tabulation LF (Line Feed), saut de ligne VT, Tabulation vertical FF (Form Feed), saut de page CR (Carriage Return) retour chariot Caractre de code octal 101 Caractre de code hexa 41 ' le caractre apostrophe \ le caractre back slash
6

Analyse et programmation 1 - Interface utilisateur conversationnelle

Reprsentation du texte
Les chanes de caractre littrales Notion de chane de caractres
Suite de caractres, caractres placs de faon contige dans la mmoire. mmoire Permet dcrire du texte de faon commode.

Syntaxe
// Chane de caractres simple : "Hello World !\n" // Chane de caractres vide : "" // Chane de caractres sur 2 lignes "Ceci n'est \ qu'une seule chaine\n" // Chane de caractres sur 2 lignes "Ceci n'est " "qu'une seule chaine"

Analyse et programmation 1 - Interface utilisateur conversationnelle

Afficher du texte et des valeurs


La fonction printf

Prototype de cette fonction


int printf(const char * format, ...); );

Signification
Le premier paramtre attendu est une chane de caractres. Il peut ensuite y avoir un nombre quelconque de paramtres.
Ils doivent contenir les valeurs spcifies dans le format

printf retourne le nombre de caractres imprims, -1 si erreur.

Exemples
long n; double x; printf("Hello world !\n"); printf("5!=%d\n", 1 * 2 * 3 * 4 * 5); printf("Voici les resultats: n=%ld et x=%lf\n", n, x);

Analyse et programmation 1 - Interface utilisateur conversationnelle

Afficher du texte et des valeurs


Principe de fonctionnement de la console

La console fonctionne comme une machine crire. On O peut t crire i seulement l t


De gauche droite Puis, passer la ligne suivante

Retenez bien que la console ne permet dcrire que de gauche droite et de haut en bas. Il nest pas possible de remonter dune ligne. Il faut donc avoir crit tout le ncessaire sur une ligne avant de passer la suivante.
Analyse et programmation 1 - Interface utilisateur conversationnelle

Afficher du texte et des valeurs


Les chanes de format de printf valeurs entires Format %d %u %x %X %o %i Exemples 123 Affichage

-123 Valeur entire signe en base 10. 456 10f9 10F9 173 Valeur entire non signe en base 10. Valeur entire en hexadcimal. Idem, avec des lettres majuscules. Valeur entire en octal.

Note: Conversion automatique de char et short vers int


Analyse et programmation 1 - Interface utilisateur conversationnelle 10

Afficher du texte et des valeurs


Les chanes de format de printf valeurs entires - modificateurs Modificateur l Exemples %ld %lu %lx %hd %hx %hu Affichage Le paramtre est de type long.

Le paramtre est de type short printf("%hd", 123);

Analyse et programmation 1 - Interface utilisateur conversationnelle

11

Afficher du texte et des valeurs


Les chanes de format de printf valeurs entires - gabarit Modificateur gabarit align droite gabarit align gauche gabarit paramtr Exemples %6d %6x %6lu %-6d %-6x %-6lu Affichage Des espaces sont ajouts devant pour que laffichage occupe 6 caractres. printf("%6d", 123); Des espaces sont ajouts derrire pour que laffichage occupe 6 caractres. printf("%-6d" printf( % 6d , 123); Idem prcdent, mais le nombre de caractres est pass en paramtre. printf("%*d", 6, 123);

%*d

Analyse et programmation 1 - Interface utilisateur conversationnelle

12

Afficher du texte et des valeurs


Les chanes de format de printf valeurs entires - illustration Instruction printf("#%d#", 123); printf("#%6d#", 123); printf("#%-6d#", 123); printf("#%d#", -1); printf("#%*d#" printf( #%*d# , 6, 6 -1); printf("#%hu#", 65536 + 123); printf("#%hu#", -1); printf("#%x#", 159);
Analyse et programmation 1 - Interface utilisateur conversationnelle

Affichage #123# # 123# #

#123 #-1# #

-1#

#123# #65535# #9f#


13

Afficher du texte et des valeurs


Les chanes de format de printf valeurs relles Format %f %e %E %g %G Exemples Affichage

1230.000000 Valeur relle, 6 chiffres aprs la virgule. 1.23e3 1.23E3 1230 1230 Valeur relle en notation scientifique, 6 chiffres aprs la virgule. Idem, avec E majuscule. Affichage optimis, slection auto entre %e et %f et limination li i i des d 0 non significatifs i ifi if aprs la virgule. Idem, mais slection entre %E et %f.

Note: Conversion automatique de float vers double


Analyse et programmation 1 - Interface utilisateur conversationnelle 14

Afficher du texte et des valeurs


Les chanes de format de printf valeurs relles - modificateurs Modificateur l Exemples %lf %le %lg %10.3f %10.3e %-10.3g g %10.*f %*.3f %*.*E Affichage Le paramtre est de type long float ou double. En fait, cest implicite, donc sans effet. Des espaces sont ajouts pour que laffichage occupe 10 caractres et quil y ait 3 dcimales. printf("%10 3f" 123 printf("%10.3f", 123.45678); 45678); Idem prcdent, mais le nombre de caractres est pass en paramtre. printf("%*.*f", 10, 3, 123.45678);
15

gabarit

gabarit paramtr

Analyse et programmation 1 - Interface utilisateur conversationnelle

Afficher du texte et des valeurs


Les chanes de format de printf valeurs relles - illustration Instruction printf("#%f#", 1.23); printf("#%f#", 1.23e4); printf("#%e#", 1.23e4); printf("#%g#", 1.23e4); printf("#%10 printf( #%10.2f# 2f#", 1.23); 1 23); Affichage #1.230000# #12300.000000# #1.230000e+004# #12300# # 1 1.23# 23# 12300.00#

printf("#%10.2f#", 1.23e4); #

printf("#%10.2e#", 1.23e4); # 1.23e+004# printf("#%10.2g#", 1.23e4); #


Analyse et programmation 1 - Interface utilisateur conversationnelle

1.2e+004#
16

Afficher du texte et des valeurs


Les chanes de format de printf autres types de donnes Format %c %5c %*c %s %10s %*s %% Exemples A Affichage Caractre spcifi par son code (ASCII). printf("%c", 65); Chane de caractres. printf("%f %s", 12., "millivolt"); Le caractre pourcent.

millivolt

Analyse et programmation 1 - Interface utilisateur conversationnelle

17

Afficher du texte et des valeurs


Les chanes de format de printf autres types de donnes - illustration Instruction printf("#%c#", 65); printf("#%3c#", 65); printf("#%-3c#", 65); printf("#%s#", "Volt"); printf("#%6s#" printf( #%6s# , "Volt"); Volt ); Affichage #A# # #A A# #

#Volt# # Volt# #

printf("#%*s#",-6, "Volt"); #Volt

Analyse et programmation 1 - Interface utilisateur conversationnelle

18

Afficher du texte et des valeurs


Comportement de printf lorsque les paramtres sont incorrects

Trop de paramtres
printf("Rsultat: %f \n", \n" x, x i i, j); // seul x est affich

Les valeurs additionnelles ne sont pas affiches. Elles nont pas deffet visible.

Pas assez de paramtres


// la valeur non dfinie trouve en mmoire est utilise printf("Rsultat: %d \n");

Valeurs fantaisistes affiches

Mauvaise concordance du type des paramtres


Valeurs fantaisistes affiches
// la valeur trouve en mmoire est mal interprte printf("Rsultat: %d \n" , 3.14);
Analyse et programmation 1 - Interface utilisateur conversationnelle 19

10

Afficher du texte et des valeurs


putchar

Rle
putchar(c) t h ( ) permet dafficher un caractre. caractre Equivalent printf("%c", c) Excution beaucoup plus rapide.

Intrt
A prfrer lorsquun affichage est gnr caractre par caractre.

Analyse et programmation 1 - Interface utilisateur conversationnelle

20

Afficher du texte et des valeurs


Exemples

Affichage dun menu


=== FONCTIONS FINANCIERES ==== ============ Menu ============ 1 - Interets annuels 2 - Conversion EURO --> CHF 3 - Conversion CHF --> EURO 9 - Quitter Choix>

Analyse et programmation 1 - Interface utilisateur conversationnelle

21

11

Afficher du texte et des valeurs


Exemples

Affichage dun tableau de rsultats


----------------------------------------------------------------|Pieces |nombre |prix(pce) |prix total | ----------------------------------------------------------------|Circuit | 2925 | 0.12 | 351.00 | |Diodes | 10 | 0.75 | 7.50 | |Condensateurs | 4 | 1.25 | 5.00 | |Bobines | 2 | 1.10 | 2.20 | |Resistance | 25 | 0.20 | 5.00 | ----------------------------------------------- ----------------|Sous total | | 370.70 | ----------------------------------------------------------------|Total(Tva:7.5) | | 398.50 | -----------------------------------------------------------------

Analyse et programmation 1 - Interface utilisateur conversationnelle

22

Crer ses propres fonctions


Une introduction rapide

But des fonctions


Permettent de dcouper dco per le code en blocs indpendants indpendants. Exemples : printf, scanf, sin,

Comment crer une fonction un exemple simple


void conversion_farenheit_celsius() { double temperature_farenheit, temperature_celsius; printf("Temperature (Farenheit) :"); scanf("%lf", &temperature_farenheit); temperature_celsius = (temperature_farenheit - 32) / 1.8; printf("Temperature : %lg degres Celsius.\n", temperature_celsius); }

Analyse et programmation 1 - Interface utilisateur conversationnelle

23

12

Crer ses propres fonctions


Une introduction rapide
Utilisation des fonctions
int main() { int choix; printf("============ MENU ============\n"); printf("1 - Conversion Farenheit en degre Celsius.\n"); printf("2 - Conversion degre Celsius en Farenheit.\n"); printf("Choix:"); scanf("%d", &choix); if (choix == 1) conversion_farenheit_celsius(); else l if (choix ( h i == 2) conversion_celsius_farenheit(); else printf("Choix incorrect"); system("PAUSE"); }

Analyse et programmation 1 - Interface utilisateur conversationnelle

24

Analyse et programmation 1 - Interface utilisateur conversationnelle

25

13

Saisir des valeurs


La fonction scanf
Prototype de cette fonction
int scanf(const char * format, ...);

Signification
Le premier paramtre attendu est une chane de caractres. Il peut ensuite y avoir un nombre quelconque de paramtres.
Ils doivent contenir ladresse des variables spcifies dans le format

Fonctionnement
scanf attend la saisie de valeurs par lutilisateur. La touche Entre doit tre presse pour que scanf prenne en compte les caractres saisis. scanf retourne le nombre de variables assignes, 0 si aucune.
int i, n; float x; printf("N:"); i = scanf("%d", &n); printf("X:"); scanf("%f", &x);

Exemples

Analyse et programmation 1 - Interface utilisateur conversationnelle

26

Saisir des valeurs


La fonction scanf diffrence importante avec printf Chane de format
Contient des codes de format p pour les variables saisir. Les espaces correspondent la saisie dun nombre quelconque despaces. Pour les autres caractres, ils doivent tre saisis lidentique.
scanf("%d,%d", &i, &j); // saisir 2 entiers spars par ,

Paramtres
Les paramtres de scanf ne doivent contenir que des adresses de variables. Pas dexpressions. Cela na en gnral pas de sens.
scanf("%d", i + 5); // faux, mais accept par le compilateur !!

Comment afficher un libell avant une saisie


Forme incorrecte
scanf("i=%d", &i); // "i=" pas affich, mais devra tre saisi

Forme correcte
printf("i="); scanf("%d", &i);
Analyse et programmation 1 - Interface utilisateur conversationnelle 27

14

Saisir des valeurs


Les chanes de format de scanf valeurs entires Format %d %u %x %o %X %i 123 Saisie Affichage

-123 Valeur entire signe en base 10. 456 10f9 173 Valeur entire non signe en base 10. Valeur entire en hexadcimal. Valeur entire en octal.

Notes: Les champs numriques sautent les espaces prcdant la valeur PAS DE CONVERSION AUTOMATIQUE

Analyse et programmation 1 - Interface utilisateur conversationnelle

28

Saisir des valeurs


Les chanes de format de scanf valeurs entires - modificateurs Modificateur l Exemples %ld %lu %lx %hd %hx %hu %2d Saisie La variable est de type long.

h Longueur maximale Valeur ignore

La variable est de type short Saisie dun entier sur 2 caractres au maximum. Un paramtre entier est attendu, mais il nest affect aucune variable.
29

%*d

Analyse et programmation 1 - Interface utilisateur conversationnelle

15

Saisir des valeurs


Les chanes de format de scanf valeurs relles Format %f %e %E %g %G Saisies 12300.000 12.3e3 123 Affichage

Codes de champs tous quivalents pour la saisie de valeurs relles.

Notes: Les champs numriques sautent les espaces prcdant la valeur PAS DE CONVERSION AUTOMATIQUE

Analyse et programmation 1 - Interface utilisateur conversationnelle

30

Saisir des valeurs


Les chanes de format de scanf valeurs relles - modificateurs Modificateur l Longueur maximale Valeur ignore i Exemples %lf %le %lg %5f %*f Affichage Le paramtre est de type long float ou double. Saisie dun rel sur 5 caractres au maximum. Un paramtre rel est attendu, mais il nest affect aucune variable. variable

Analyse et programmation 1 - Interface utilisateur conversationnelle

31

16

Saisir des valeurs


Les chanes de format de scanf autres types de donnes Format %c %*c %s %10s %*s Saisies A Affichage Lit un seul caractre. Ce caractre peut aussi tre un espace. scanf("%c", &c); Chane de caractres.
scanf("%s", str);

un texte

Analyse et programmation 1 - Interface utilisateur conversationnelle

32

Saisir des valeurs


La fonction scanf rgles pour la saisie

La fonction scanf lit chaque champ caractre par caractre. caractre elle arrte de lire un champ et passe au suivant lorsque
Elle rencontre un espace. La longueur spcifie est atteinte Le caractre suivant ne correspond plus au type du champ.

Il y a arrt prmatur lorsque


Il nest pas possible de lire un champ depuis les caractres saisis. Le caractre suivant est en conflit avec le caractre auquel il doit correspondre.

Analyse et programmation 1 - Interface utilisateur conversationnelle

33

17

Saisir des valeurs


scanf - saisie de plusieurs valeurs

scanf permet de saisir plusieurs valeurs conscutives


Il suffit de spcifier plusieurs codes de champs
long i; double x; scanf("%ld%lf", &i, &x);

Saisie de plusieurs valeurs avec sparateur


Les champs numriques consomment les espaces situs avant. Le scanf ci dessous attend dans lordre :
0, 0 1 ou plusieurs espaces espaces. un entier. 0, 1 ou plusieurs espaces. exactement 1 virgule. 0, 1 ou plusieurs espaces. un rel. scanf("%ld ,%lf", &i, &x);
Analyse et programmation 1 - Interface utilisateur conversationnelle 34

Saisir des valeurs


scanf le tampon dentre

Prcision sur le fonctionnement de scanf


Lorsq Lorsque e l lutilisateur tilisate r presse la to touche che Entre , to tout t le te texte te tap est plac dans une zone de mmoire appele tampon . Ensuite, scanf recherche les champs demands dans cette mmoire tampon.

Le scanf suivant
Recherche les champs demands dans la mmoire tampon. Si la mmoire tampon p est vide, , scanf g gre nouveau la saisie p par lutilisateur.

Analyse et programmation 1 - Interface utilisateur conversationnelle

35

18

Saisir des valeurs


scanf le tampon dentre - consquences

Comportement inattendu du programme ci dessous


int i, i j; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("Somme: %d\n", i + j);

Rsultat de lexcution
i:6 8 j:Somme: 14 Appuyez sur une touche pour continuer...

Parade
fflush(stdin); // vide le tampon d'entre
Analyse et programmation 1 - Interface utilisateur conversationnelle 36

Saisir des valeurs


scanf le tampon dentre - consquences
Comportement incorrect du programme ci dessous
int choix; int saisies_correctes, ok; ok = 0; do { printf("Choix (1-9) >"); saisies_correctes = scanf("%d", &choix); if (saisies_correctes != 1) printf("La printf( La valeur saisie n'est n est pas valide valide.\n \n"); ); else if ((choix < 1) || (choix > 9)) printf("Valeur hors limite.\n"); else ok = 1; } while (!ok);
Analyse et programmation 1 - Interface utilisateur conversationnelle 37

19

Saisir des valeurs


scanf le tampon dentre - consquences
Utilisation de fflush(stdin) pour corriger le problme
int choix; i t saisies_correctes, int i i t ok; k ok = 0; do { printf("Choix (1-9) >"); fflush(stdin); saisies_correctes = scanf("%d", &choix); if (saisies_correctes != 1) printf("La printf( La valeur saisie n'est n est pas valide valide.\n \n"); ); else if ((choix < 1) || (choix > 9)) printf("Valeur hors limite.\n"); else ok = 1; } while (!ok);

Analyse et programmation 1 - Interface utilisateur conversationnelle

38

Saisir des valeurs


Comportement de scanf lorsque les paramtres sont incorrects

Trop de paramtres
scanf("%f", scanf( %f , &x, &y); // seul x est saisi

Les valeurs additionnelles ne sont pas saisies. Elles gardent leur valeur davant lappel scanf.

Pas assez de paramtres


// ladresse non dfinie trouve en mmoire est utilise scanf("%d");

Risque de corruption mmoire, rsultats catastrophiques.

Mauvaise concordance du type des paramtres


Valeurs fantaisistes saisies ou corruption mmoire
float x; scanf("%d" , &x); // la valeur place en mmoire sera mal interprte

Analyse et programmation 1 - Interface utilisateur conversationnelle

39

20

Saisir des valeurs


getchar

Rle
getchar() t h () permet de lire un caractre du tampon dentre. dentre Equivalent scanf("%c", &c) Excution beaucoup plus rapide.

Intrt
A privilgier pour traiter les caractres du tampon dentre un par un.

Analyse et programmation 1 - Interface utilisateur conversationnelle

40

Saisir des valeurs _getch


Prototype
#include <conio.h> <conio h> char _getch ()

Rle
Elle retourne chaque caractre ds quil est tap. Nattend pas que la touche Entre soit presse . Lorsque la touche Entre est presse, retourne \n

Intrt I t t
Permet de crer une interface utilisateur plus ractive.

Analyse et programmation 1 - Interface utilisateur conversationnelle

41

21

Crer ses propres fonctions


Une introduction rapide

But des fonctions


Permettent de dcouper dco per le code en blocs indpendants indpendants. Exemples : printf, scanf, sin,

Comment crer une fonction un exemple simple


void afficher_hauteur_metres(double hauteur) { // possibilit de crer des variables ici printf("hauteur:%g p g metre", hauteur); // autant d'instructions que ncessaire... }

Analyse et programmation 1 - Interface utilisateur conversationnelle

42

Crer ses propres fonctions


Une introduction rapide aux paramtres et aux rsultats

Un exemple qui retourne un rsultat


double hauteur hauteur_batiment(double batiment(double distance, distance double angle_degre) { double angle_radian; double hauteur; angle_radian = angle_degre * M_PI / 180.0; hauteur = distance * tan(angle_radian); return hauteur; }

Analyse et programmation 1 - Interface utilisateur conversationnelle

43

22

Crer ses propres fonctions


Une introduction rapide

Utilisation des fonctions premier exemple


int main() { double h; h = hauteur_batiment(5.0, 60); afficher_hauteur_metres(h); system("PAUSE"); }

Deuxime exemple p
int main() { afficher_hauteur_metres(hauteur_batiment(5.0, 60)); system("PAUSE"); }
Analyse et programmation 1 - Interface utilisateur conversationnelle 44

Mmoriser les codes de champs de scanf et printf


Champs %o %x %d %i %u %c %s %f %e %g
Analyse et programmation 1 - Interface utilisateur conversationnelle 45

Type

Signification

23

Quavons-nous appris ?
Les types de donnes pour reprsenter le texte
Les caractres caractres, le codage ASCII ASCII. Les chanes de caractre

Comment afficher du texte et des valeurs


printf les chanes de format de printf les anomalies de fonctionnement

Comment C t saisir i i d des valeurs l


scanf le tampon dentre les chanes de format de scanf les anomalies de fonctionnement
46

Analyse et programmation 1 - Interface utilisateur conversationnelle

Vos questions

Analyse et programmation 1 - Interface utilisateur conversationnelle

47

24

Analyse et programmation 1 - Interface utilisateur conversationnelle

48

25