Uploaded by karimeamine09

C1 Introduction elements de base Entree-sortie

advertisement
Langage C
Prof. Asmaa EL HANNANI
2015/2016
Informations pratiques

Cours: Salle (C1), site ENSAJ
 Rahhal ERRATTAHI
 r.errattahi@gmail.com

TP: salle de TP, site ENSAJ


Mme Fatima zahra SALMAM
Matériel du cours et exercices sous:
http://ensaj.ac.ma/elhannani (Anglet Teaching)
Prof Asmaa El Hannani
2AP-S3
2
Organisation

2 heures de cours



Transparents
Publication des supports sur le site (username et
password communiqués en classe)
2 heures de TD/TP

Correction du TP/TD précédent, explication du TP/TD
courant, travail sur PC
Prof Asmaa El Hannani
2AP-S3
3
Evaluation



Contrôles continus
Evaluation des TPs
1 Examen écrit
Prof Asmaa El Hannani
2AP-S3
4
Objectifs du module

Appréhender le langage C.

Apprendre à traduire un algorithme dans le langage
de programmation C pour produire un programme
exécutable.
Prof Asmaa El Hannani
2AP-S3
5
Références bibliographiques:



Programmer en langage C, Stephen Kochan, ISBN : 2-744-07081-5
Programmer en langage C, Claude Delannoy, ISBN : 2-212-11072-3
Le livre du C premier langage, Claude Delannoy, ISBN : 2-212-11052-9
Prof Asmaa El Hannani
2AP-S3
6
Références webographiques:

http://c.developpez.com/cours

http://www.commentcamarche.net/contents/c/
Prof Asmaa El Hannani
2AP-S3
7
Partie 1
LES BASES DU LANGAGE C
Prof Asmaa El Hannani
2AP-S3
8
Introduction
Histoire du C

Origines
C a trois ancêtres : les langages CPL, BCPL et B.
CPL : (pour Combined Programming Language) a été conçu au début des
années 1960 - universités de Cambridge et de Londres. Fortement
typé mais trop complexe  disparition dans las année 70
BCPL: (pour Basic CPL) Cambridge en 1966 par Martin Richards. Version
siplifiée  Ecriture d’un 1er Compilateur et de divers systèmes
d’exploitations
B:
Ken Thompson vers 1970 dans les laboratoires Bell  Version
simplifiée du BCPL
Prof Asmaa El Hannani
2AP-S3
10
Histoire du C

Le C à été éveloppé par un collègue de Ken Thompson, Dennis Ritchie
en 1972 qui ajouta les tableaux, les pointeurs, les nombres à virgule
flottante, les structures...

En 1973, C fut suffisamment au point pour que 90% de UNIX puisse
être récrit avec.

Une 1ère définition du langage est apparue en 1978 avec l’ouvrage de
Ritchie et Kernighan « The C programming language ».

Son succès international a contribué à sa normalisation:
1. ANSI (American National Standard Institute)
2. ISO (International Standadization Organisation)
3. CEN (Comité Européen de Normalisation) en 1993
Prof Asmaa El Hannani
2AP-S3
11
Introduction au langage C

Le langage C est un langage de bas niveaux, dans le sens où il
permet la manipulation de données que manipulent les ordinateurs
(Bit, octet, adresse) ≠ Langages évolués (Pascal, Fortran, ADA)

Il est suffisamment général pour permettre de développer des
application de type scientifique ou de gestion basée sur l’accès
aux bases de données (Word et Excel sont écrits à partir de C ou
C++)

Il est un des 1ers langages offrant des possibilités de
programmation modulaire: Un programme peut être constitué de
plusieurs module (module = fichier .c)
Prof Asmaa El Hannani
2AP-S3
12
Classification du langage C
Tous les Languages
de Programmation
Languages
Imperatifs
Programmation
Procedurale
Ada, Pascal, C
Prof Asmaa El Hannani
Programmation
Orientee Objets
C++, Java
Languages
Declaratifs
Programmation Programmation Programmation
Concurrente
Fonctionelle
Logique
Ada 95
LISP, SCHEME
PROLOG
2AP-S3
13
Qu’est ce qu’un programme C?

C’est un texte écrit avec un éditeur de texte, respectant une certaine syntaxe
et stocké sous forme d'un ou plusieurs fichiers (avec l'extension .c).

A l'opposé du langage assembleur, les instructions du langage C sont
obligatoirement encapsulées dans des fonctions et il existe une fonction
privilégiée appelée main qui est le point de départ de tout programme.
Exemple:
main()
{
printf(’’Bonjour!’’);
}
Source.c
Compilation
Prof Asmaa El Hannani
Objet.o
2AP-S3
Edition des liens
Exécutable
14
Phases d’élaboration d’un programme C

L’élaboration d’un programme C passe par 4 phases :
1. Edition du code source: Cette phase consiste à écrire le code du
programme C en utilisant un éditeur de texte. Ce code est enregistrer
dans un fichier texte d’extension « .c».
2. Traitement du pré-processeur : Consiste à préparer la phase de
compilation en effectuant les transformations textuelles , dans le code
source, suivantes :

L’inclusion de code source (fichiers en-tête (Header) « .h ») : #include

La compilation conditionnelle : #if … #else
Le traitement de macros : #define

Prof Asmaa El Hannani
2AP-S3
#end if
15
Phases d’élaboration d’un programme C
3. Compilation: Consiste à traduire le code généré par le pré-processeur en
langage machine. Le résultat de compilation porte le nom de module objet
(fichier.obj). Ce module objet n'est pas directement exécutable.
4. Édition de liens: Produit, à partir d'un ou de plusieurs fichiers objets et
des bibliothèques standards, un fichier exécutable (fichier.exe). Outre
l'assemblage des divers fichiers objets, l'édition des liens inclut les
définitions des fonctions prédéfinies utilisées par le programme.
Prof Asmaa El Hannani
2AP-S3
16
conio.h
/* conio.h */
.
.
.
Fichier2.c
graphics.h
/* graphics.h */
.
.
.
#include<conio.h>
#include<graphics.h>
…
main()
{
…
}
Fichier1.c
#include<stdio.h>
#include<maths.h>
…
Calcul()
{
…
}
math.h
stdio.h
/* conio.h */
.
.
.
/* math.h */
.
.
.
Pré-processeur
Fichier2.i
/* conio.h */
…
/* graphics.h */
…
…
main()
{
…
}
Fichier1.i
/* stdio.h */
…
/* maths.h */
…
…
Calculs()
{
…
}
Compilation
Math.lib
stdio.lib
Fichier2.obj
Fichier1.obj
Graphics.lib
Edition de liens
Prof Asmaa El Hannani
2AP-S3
Fichier.exe
17
Structure d’une application en C
Programme typique en C
include
Main() est toujours la
1ere fonction appelée
main()
fonction a()
instructions
fonction b()
instructions
instructions
Prof Asmaa El Hannani
2AP-S3
18
Programme minimum en C
Le programme
commence toujours par
la fonction main
Directives préprocesseur – Inclure les
bibliothèques
Instruction toujours
terminée par ;
Bloc d’instructions
encadré par des
accolades
Le programme renvoie toujours une valeur
Insérer de préférence une ligne vide
Prof Asmaa El Hannani
2AP-S3
19
Structure d’un programme C

Un programme C peut se décomposer par :

Des directives de préprocesseur

Des déclarations de types, de variables et de constantes

Des prototypes de fonctions

Des définitions de fonctions parmi lesquelles la fonction main
Prof Asmaa El Hannani
2AP-S3
20
Exemple
Prof Asmaa El Hannani
2AP-S3
21
Eléments de base
#include
# include <stdio.h>
main()
{
printf(’’Bonjour!’’);
}

La directive #include inclu le fichier stdio.h au programme avant la
compilation (pour pouvoir utiliser la fonction prédéfinie printf.

Une directive ne s’applique qu’à la partie du programme qui lui succède).
D’une manière générale, il est préférable de les placer au début !

On parle alors de directives à destination du préprocesseur
Prof Asmaa El Hannani
2AP-S3
23
Les Commentaires

Il existe trois types de commentaire en C :


Tout texte entre « // » et la fin de la ligne
Tout texte entre « /* » et « */ »: commentaire multi ligne
# include <stdio.h> //pour pouvoir utiliser la fonction printf
main()
{
printf(’’Bonjour!’’);
}
/* Ce programme imprime la chaine de
caractère ‘’Bonjour!’’ à l’écran */
Prof Asmaa El Hannani
2AP-S3
24
Les identificateurs
Les identificateurs servent à désigner les différents objets
manipulés par le programme: Variables, fonctions, …

Commence nécessairement par une lettre

Une lettre majuscule est tenue pour différente de la lettre
minuscule correspondante;

Au plus 32 caractère

Le caractère _ (appelé « blanc souligné ») est considéré
comme une lettre ; il peut donc figurer à n'importe quelle place
dans un identificateur: _Total2, Prix_unit
Prof Asmaa El Hannani
2AP-S3
25
Les mots-clés

Certains « mots-clés » sont réservés par le langage à un usage
bien défini et ne peuvent pas être utilisés comme
identificateurs.
Auto
break
case
char
const
continue default do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile while
Prof Asmaa El Hannani
2AP-S3
26
Types et variables

Qu'est-ce qu'une variable ?
 c'est le nom d’un emplacement mémoire
 on en crée (presque) autant qu’on veut
 son contenu peut changer dans le temps.
 elle contient toujours quelque chose !!!

Qu'est-ce qu'un type ?
 définit une convention de codage de l'information
 dans un emplacement de taille préfixée
Une variable sera toujours définie par un type avant utilisation
Prof Asmaa El Hannani
2AP-S3
27
Les types de données
Prof Asmaa El Hannani
2AP-S3
28
Les Types dans C


Les types de base du langage C se répartissent en 3 grande
catégories en fonction de la nature des informations qu’ils
permettent de représenter:

Nombres entiers (int)

Nombres flottants (float ou double)

Caractère (char): apparaît en C comme un cas particulier de int.
Ils peuvent être signés ou non signés : signed ou unsigned
Prof Asmaa El Hannani
2AP-S3
29
Les Types Entiers



short int ou short (entier sur 16 bits : - 32 768 à 32 767)
int (entier sur 32 bits : - 2 147 483 648 à 2 147 483 647)
long int ou long (entier sur 32 bits ou 64 bits, selon les machines)
Chacun des 3 peut être nuancé par l’utilisation du qualificatif unsigned pour ne
représenter que des nombres positifs:
Exemple:

unsigned short x;
x peut aller de 0 à 65 535
pas de bit réservé pour le signe
C accepte aussi les constantes entière en notation hexadécimale ou octale:
 014 (octale) correspond à la valeur décimale 12
 0x1A (hexadécimale) correspond à la valeur décimale 26 (16+10)
Prof Asmaa El Hannani
2AP-S3
30
Les Types Flottants

Float : codé sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits
d'exposant (3.4 x 10-38 à 3.4 x 1038)

Double : codé sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11
bits d'exposant (1.7 10-308 à 1.7 10308)

Long : codé sur 10 octets avec 1 bit de signe, 64 bits de mantisse et 15 bits
d'exposant (3.4 10-4932 à 3.4 104932)

C accepte les constantes flottante en notation décimale ou scientifique:
3.5e+3
Prof Asmaa El Hannani
3500 2.43
-0.38
2AP-S3
-.38
4.
.27
31
Le Type Char

Char : un caractère est un entier signé codé sur 1 octet (-128 à 127)

Les constantes de type « caractère », lorsqu’elles correspondent à
des caractères imprimables, se notent de façon classique, en écrivant
entre apostrophes le caractère voulu, comme dans ces exemples :
'a'

'Y'
'+'
'$‘
Il existe des caractères non imprimables, tel que le changement de
ligne, de Tabulation, … en voici un tableau récapitulatif
Prof Asmaa El Hannani
2AP-S3
32
Caractères spéciaux
NOTATION
RESULTAT
\a
cloche ou bip (alert ou audible bell)
\b
Retour arrière (Backspace)
\f
Saut de page (Form Feed)
\n
Saut de Ligne (Line Feed)
\r
Retour chariot (Carriage Return)
\t
Tabulation horizontaLe (HorizontaL Tab)
\v
Tabutation verticale (VerticaL Tab)
\\
\
\'
‘
\ ''
‘’
\?
?
Prof Asmaa El Hannani
2AP-S3
33
Type booléen

Pas de type booléen en C. Le type booléen est représenté par
un entier. Il se comporte comme la valeur booléenne vraie si
cette valeur entière est non nulle.

Dans un contexte qui exige une valeur booléenne (comme les
tests, par exemple), un entier non nul équivaut à vrai et la
valeur zero équivaut à faux.
Prof Asmaa El Hannani
2AP-S3
34
Les conversions de types

Dans certains cas, le compilateur peut être amené à effectuer certaines
conversions lors des évaluations pour obtenir un exécutable correct :
int i, j, k;
On peut laisser faire certaines
float x;
conversions implicites, mais il
faut mieux apprendre à les
x = i;
maîtriser soi-même.
j = k+x;

Pour forcer une conversion :
(type) expression ;
int i, j, k;
float x;
x = (float) i;
j = k + (int) x;
Prof Asmaa El Hannani
2AP-S3
35
La déclaration de variables

Les déclarations des types des variables sont obligatoires et doivent être
regroupées au début du programme. Elles peuvent être soit individuelle ou
groupées :
type variable (optionnel = valeur) ;
Le ; est obligatoire
Une variable peut être initialisée à une valeur au
moment de sa déclaration
Le nom de la variable doit commencer par une lettre
Le type détermine la taille (ou l’occupation mémoire) de la
variable
Prof Asmaa El Hannani
2AP-S3
36
La déclaration de variables
Char
Auto
Register
Const
Static
volatile
extern
Unsigned
Short
Signed
Int
long
Identificateur;
Float
Double
Long double
Prof Asmaa El Hannani
2AP-S3
37
Les constantes

Il est possible de déclarer que la valeur d’une variable ne doit
pas changer lors de l’exécution du programme.
const double CST = 20.3 ;
Le ; est obligatoire
Opérateur = obligatoire
La constante reçoit une valeur lors de la compilation et est
ensuite protégée contre d’autres modifications
Le Type de la constante
Prof Asmaa El Hannani
2AP-S3
38
Opérateurs et Expressions
Les opérateurs du C

C dispose d'un important éventail d'opérateurs:








les opérateurs de calcul
………………d'assignation
………………d'incrémentation
………………de comparaison
………………logiques
………………bit-à-bit
………………de décalage de bit
Les priorités
Prof Asmaa El Hannani
2AP-S3
40
Les opérateurs de calcul

Les opérateurs de clacul (arithmétiques) binaires ne sont à priori définis
que pour deux opérandes ayant le même type parmi: int, long int, float,
double, long double et ils fournissent un résultat de même type que leurs
opérandes.
Prof Asmaa El Hannani
2AP-S3
41
Les opérateurs de calcul

De plus, il existe un opérateur de "modulo" noté % qui ne peut
porter que sur des entiers et qui fournit le reste de la division
de son premier opérande par son second. Par exemple, 11%4
vaut 3, 23%6 vaut 5

Remarque: le quotient de deux entiers fournit un entier.
Ainsi 5/2 vaut 2; en revanche, le quotient de deux flottants
(noté, lui aussi, /) est bien un flottant (5.0/2.0 vaut bien
approximativement 2.5).
Prof Asmaa El Hannani
2AP-S3
42
Conversion implicite de type

On peut écrire des expressions mixtes dans lesquelles interviennent des
opérandes de types différents:
Int n,p; float x;
n*x + p
(int * float) + int
Conversion implicite: int  float
( float*float) + int
Même mécanisme :

float
+ int
float
+ float  float
On parle de conversion implicite de type:
intlongfloatdoublelong double
Prof Asmaa El Hannani
2AP-S3
43
Promotions numériques

En C les opérateurs numériques ne sont pas définis pour le types char et
short :

C prévoit que toute valeur char ou short soit d’abord convertie en int.
short n,p; float x;
n*x + p
(short * float) + short
Conversion systématique:
( int * float) + int
Conversion implicite :
float * float + int
float + float  float
Prof Asmaa El Hannani
2AP-S3
44
Les opérateurs d'assignations

i = 5 est une expression qui réalise une action d'affectation de
la valeur 5 à i. Cet opérateur d'affectation (=) peut faire
intervenir d'autres expressions comme dans : c=b + 3

En C une opération x = x + 2 peut aussi s'écrire x += 2;
Prof Asmaa El Hannani
2AP-S3
45
Opérateurs d’incrémentation et de
décrémentation

++ : incrémente de 1 la valeur de la variable

On dit que ++ est:



un opérateur de pré incrémentation lorsqu'il est placé à gauche
un opérateur de post incrémentation lorsqu'il est placé à droite
x=3;
//post-incrémentation
y= x++;  y=x; x=x+1;
//y=3, x=4
//pré incrémentation
y=++x;  x=x+1; y=x;
//x=y=5
--: decrémente de 1 la valeur de la variable

Utilise les même règles que le ++
Prof Asmaa El Hannani
2AP-S3
46
Les opérateurs de comparaison

Comme tout langage, C permet de "comparer" des expressions à l'aide
d'opérateurs classiques de comparaison. exemple : 2*a > b +5

Par contre, C se distingue de la plupart des autres langages sur deux
points:
1- le résultat de la comparaison est, non pas une valeur "booléenne" (on dit
aussi "logique") prenant l'une des deux valeurs vrai ou faux, mais un
entier valant:
 0 si le résultat de la comparaison est faux,
 1 si le résultat de la comparaison est vrai.
Ainsi, la comparaison ci-dessus devient en fait une expression de type
entier. Cela signifie qu'elle pourra éventuellement intervenir dans des
calculs arithmétiques;
Prof Asmaa El Hannani
2AP-S3
47
Les opérateurs de comparaison
2- les expressions comparées pourront être de type quelconque et seront
soumises au règles de conversion présentées précédemment.
Liste des opérateurs:
< <= > >=
même priorité
Exemple: a < b == c < d

>
== !=
même priorité
(a < b) == (c < d)
Remarque: les opérateurs relationnels sont moins prioritaires que les
opérateurs arithmétiques ( x+y < a+2

(x+y) < (a+2) )
Prof Asmaa El Hannani
2AP-S3
48
Les opérateurs Logiques

C dispose de trois opérateurs logiques classiques: et (noté &&), ou (noté | |)
et non (noté ! ).

Ces opérateurs acceptent n'importe quel opérande numérique, y compris les
types flottants, avec les règles de conversion implicite déjà rencontrées. à
condition de considérer que:
 0 correspond à faux,
 toute valeur non nulle correspond à vrai
Prof Asmaa El Hannani
2AP-S3
49
Les opérateurs Logiques
Exemples:
n et p sont des entiers, le compilateur accepte des expression telles que:
n && p
n||p
if ( !n )  if (n == 0)
Remarque1: l’opérateur ! a une priorité supérieur à celle de tous lés
opérateurs arithmétiques et relationnels.
La négation de a==b serait !(a==b) et non !a==b
Remarque2: l’opérateur | | est moins prioritaire que &&. Tous deux sont de
priorité inférieure aux opérateurs arithmétique et relationnels
a<b && c<d équivaut à (a<b) && (c<d)
Ne sera évaluée que si a<b est vrai
Prof Asmaa El Hannani
2AP-S3
50
Les opérateurs bit-à-bit
Prof Asmaa El Hannani
2AP-S3
51
Les opérateurs de décalage de bit
Prof Asmaa El Hannani
2AP-S3
52
Autres opérateurs

L’opérateur de CAST :
Exemple:

n=10, p=3;
(double) (n/p) aura comme valeur 3
(double) n/p aura comme valeur 3.33333…
L’opérateur conditionnel : (seul opérateur ternaire en C)
syntaxe : condition ? Valeur si vrai : valeur si faux
z = (x==y) ? a : b ;
on utilise la valeur de l’expression
a>b ? i++ : i-- ; la valeur de l’expression n’est pas utilisée
Prof Asmaa El Hannani
2AP-S3
53
Les priorités
Prof Asmaa El Hannani
2AP-S3
54
Les Entrées-Sorties
Les Entrées-Sorties Conversationnelles

C dispose d’une multitude de fonctions pour afficher des
informations à l’écran ou pour en lire au clavier.

C’est ce que nous avons appelé les « entrées-sorties
conversationnelles ».

Plus tard, nous verrons que ces mêmes fonctions (moyennant
la présence d’un argument supplémentaire) permettent
également d’échanger des informations avec des fichiers.
Prof Asmaa El Hannani
2AP-S3
56
Les Entrées-Sorties Conversationnelles

Fonctions pour l’affichage des données:
printf("Format" , expr [ , expr,…]) ; /*affiche des données selon un format */
puts(Chaine); /* affiche une chaîne de caractère */
putchar(caractere); /* affiche un caractère */

Fonctions pour la lecture des données
scanf("Format" ,adres_var [ ,adresse_var,…]) ; /*Lit des donnée selon un format */
gets(Var_Chaine); /* Lit une chaîne de caractère */
var_caratere = getchar(); /* Lit un caractère */
var_caratere = getch() ; /* Lit un caratère sur le clavier */
Prof Asmaa El Hannani
2AP-S3
57
Les possibilités de la fonction printf

La fonction printf se présente ainsi:
printf ( format[, liste_d’expressions] )


format une chaîne de caractères qui spécifie:
 Des caractères à afficher tels quels;
 Des code de format repérés par % (c, d, f..) qui précise le type de
l’information à afficher.
liste_d’expressions : suite d’expressions séparées par des virgules d’un
type en accord avec le code format correspondant.
Exemple:

printf("leur somme est : %d", n1+n2);
Un code de format peut contenir des informations complémentaires
agissant sur le cadrage, le gabarit ou la précision.
Prof Asmaa El Hannani
2AP-S3
58
printf: Les principaux codes de conversion

c : char: caractère affiché ''en clair" (convient aussi à short ou à
int compte tenu des conversions systématiques)

d : int (convient aussi à char, compte tenu des conversions
systématiques)

u : unsigned int (convient aussi à unsigned char ou à unsigned
short, compte tenu des conversions systématiques)

ld : long

lu : unsigned long
Prof Asmaa El Hannani
2AP-S3
59
printf: Les principaux codes de conversion

f : double ou float écrit en notation "décimale" avec six
chiffres après le point

e : double ou float écrit en notation ''exponentielle'' (mantisse
entre 1 et 9) avec six chiffres après le point décimal, sous la
forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres
positifs et -x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les
nombres négatifs

s : chaîne de caractères dont on fournit l'adresse (notion qui
sera étudiée ultérieurement)
Prof Asmaa El Hannani
2AP-S3
60
printf: Action sur le gabarit d’affichage:



Les entiers sont affichés par défaut sans espaces avant ou après.
Les flottants avec six chiffres après le point.
Pour agir sur l’affichage  un nombre est placé après % et précise le
nombre de caractère minimum à utiliser.
Exemples:
printf("%3d" , n );
n = 20
n=3
n = 2358
n = -5200
Prof Asmaa El Hannani
^20
// ^ désigne un espace
^^3
2358
-5200
2AP-S3
61
printf: Action sur le gabarit d’affichage:
Exemples:
printf("%f" , x );
x = 1.2345
1.234500
x = 12.3456789 12.345678
printf("%10f" , x );
x = 1.2345
^^1.234500
x = 1.2345E5
123450.000000
printf("%e" , x );
x = 1.2345
1.234500e+000
x = 123.45
1.234500e+002
Prof Asmaa El Hannani
2AP-S3
62
printf: Actions sur la précision
pour les flottants, on peut préciser un nombre de chiffres après le point décimal
Exemples:
printf("%10.3f" , x );
x = 1.2346
^^^^^1.235
x = 1.2345E3
^^1234.500
x = 1.2345E7
12345000.000
Remarques:

Cadrage de l’affichage à gauche :
printf("%-10.3f" , x ); x = 1.2345  1.235^^^^^

Le caractère * figurants à la place d’un gabarit ou une précision signifie
que la valeur effective est fournie dans la liste des arguments de printf:
printf("%8.*f" , n, x ); n=1; x=1.2345  ^^^^^1.2

La fonction printf fournit une valeur de retour (nombre de caractère
affichés)
Prof Asmaa El Hannani
2AP-S3
63
printf: Les erreurs de programmation
Erreur1: Code de format en désaccord avec le type de l’expression à afficher:
Conséquence : mauvaise interprétation si même taille (int en %u),
sinon, conséquences plus désastreuses.
Erreur 2: Nombre de code de format différents du nombre d’expressions de la
liste
Conséquence 1: si des expressions de la liste n’ont pas de format,
elles ne seront pas affichées
( printf("%d" , n, p ); // valeur de p ne sera pas affiché )
Conséquence 2 : s’il y a trop de code de format, printf cherchera à
afficher n’importe quoi
( printf("%d %d" , n ); n=8  8 2 )
Prof Asmaa El Hannani
2AP-S3
64
Les possibilités de la fonction scanf

La fonction scanf se présente ainsi:
scanf ( format, liste_d_adresse )


format une chaîne de caractères qui spécifie:
 Des code de format repérés par %, précisant le type de
l’information à lire.
liste_d_adresses : liste d’adresse, séparées par des virgules, d’un type
en accord avec le code de format correspondant.
Exemple:

scanf ("%d", &p) ;
Il faut noter la nécessité de recourir à l’opérateur & pour désigner
l’adresse de la variable pour laquelle on souhaite lire une valeur.
Prof Asmaa El Hannani
2AP-S3
65
scanf : Les principaux codes de conversion :










c : char
d : int
u : unsigned int
hd : short int
hu : unsigned short
ld : long
lu : unsigned long
f ou e : float écrit en notation "décimale" ou ‘'exponentielle''
Lf ou le : double écrit en notation "décimale" ou ‘'exponentielle''
s : chaîne de caractères dont on fournit l'adresse (notion qui sera
étudiée ultérieurement)
Prof Asmaa El Hannani
2AP-S3
66
scanf : Notion de tampon et de séparateurs

Lorsque scanf attend des données, l’information frappée au clavier
est rangée temporairement dans l’emplacement mémoire nommé
« tampon ».

Le tampon est exploré caractère par caractère au fur et à mesure des
besoins.

Certains caractères jouent un rôle particulier: les séparateurs
(l’espace et la fin de ligne \n)
Prof Asmaa El Hannani
2AP-S3
67
scanf : Les règles utilisées par scanf

Les codes de format correspondant à un nombre entraînent
l’avancement du pointeur jusqu’au 1er caractère différent d’un
séparateur, puis scanf prend en compte tous les caractères
suivants jusqu’à la rencontre d’un séparateur.

Quand au code de format %c, il entraîne la prise en compte du
caractère désigné par le pointeur (même un séparateur) et il est
avancé sur le caractère suivant.
Prof Asmaa El Hannani
2AP-S3
68
scanf : Les règles utilisées par scanf
Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne)



scanf("%d%d" , &n, &p );
12^25@
^12^^25^^@
n = 12 p=25
n = 12 p=25
scanf("%d%d" , &n, &p );
12@
@
^25
n = 12 p=25
scanf("%d%c" , &n, &c );
12^a@
n = 12 c=‘ ‘
Prof Asmaa El Hannani
2AP-S3
69
scanf : On peut imposer un gabarit maximal

Le traitement d’un code de format s’interrompe soit à la
rencontre d’un séparateur, soit lorsque le nombre de caractère
indiqué a été atteint !!
Exemples : (n et p sont de type int, @ désigne une fin de ligne)
scanf("%3d%3d" , &n, &p );
12^25@
^^^^^12345@
12@
25@
Prof Asmaa El Hannani
2AP-S3
n = 12
n = 123
p=25
p=45
n = 12
p=25
70
scanf : Rôle d’un espace dans le format

Un espace entre deux codes de format demande à scanf de
faire avancer le pointeur au prochain caractère différent d’un
séparateur !!
Exemples : (n et p de type int, c char, @ désigne la fin de ligne)
scanf("%d %c" , &n, &c );
12^a@
n = 12 c=‘a‘
12^^^@
a@
Prof Asmaa El Hannani
n = 12 c=‘a‘
2AP-S3
71
scanf : Arrêt prématuré de scanf

Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est
pas en mesure de fabriquer une valeur adéquate !!
Exemples : (n et p de type int, c char, @ désigne la fin de ligne)
compte = scanf("%d %d %c" , &n, &p, &c );
12^25^b@ n = 12
p = 25
c=‘b‘
12b@
n = 12
p indéfini
c indéfini
b@
n indéfini p indéfini
c indéfini

compte = 3
compte = 1
compte = 0
La valeur de retour fournie par scanf indique le nombre de
valeurs convenablement lues.
Prof Asmaa El Hannani
2AP-S3
72
scanf : Problème de synchronisation entre l’écran
et le clavier



Le tampon n’est pas vide à chaque nouvel appel de scanf
Pour vider le buffer d'entrée il faut utiliser: fflush ( stdin );
Exemple:
233^122@

Résultat à l’exécution:
Prof Asmaa El Hannani
donner une valeur pour n : 233 122
Merci pour 233
donner une valeur pour p : Merci pour 122
2AP-S3
73
scanf : Les erreurs de programmation
Erreur1: Code de format en désaccord avec le type de l’expression:
Conséquence: Si même taille  introduction d’une mauvaise valeur
Si la variable a une taille inférieur  écrasement d’un
emplacement mémoire consécutif à cette variable
Erreur 2: Nombre de codes de format différent du nombre d’éléments de la
liste:
Conséquence: Scanf("%d",&n, &p);  seule la valeur de n est lue
Scanf("%d%d",&n); 
on affecte une valeur à un
emplacement aléatoire de la mémoire
Prof Asmaa El Hannani
2AP-S3
74
Download