A.U. 2015/2016
Exemple 1 :
Appelle une fonction prdfinie (fournie avec le langage et quon na pas besoin dcrire)
nomme printf.
Cette fonction reoit un argument "premiere annee informatique"
Les guillemets servent dlimiter une chane de caractres (suite de caractres).
Chaque instruction en langage C se termine par un point virgule ; .
#include<stdio.h>: permet d'utiliser toute une famille de fonctions prcompiles (ex: printf )
void main(): c'est la fonction principale. elle doit tre prsente dans tout programme.
Exemple 2 :
chapitre 1 : Gnralits
Page 1
Exemple 3 :
Dans cet exemple, il y a une rservation dun espace mmoire pour la variable x, une
adresse mmoire quelconque (2 octets)
printf( "la valeur de x est %d", x) ;
Exemple 4 :
chapitre 1 : Gnralits
Page 2
Exemple 6 :
Cest un appel de la fonction prdfinie scanf dont le rle est de lire des informations au
clavier.
Comme printf, la fonction scanf possde en premier argument un format exprim sous
forme dune chaine de caractre: %d (int)
Largument prcise dans quelle variable on souhaite placer la valeur lue
&x: la fonction scanf range la valeur lue ladresse de la variable. (& est un oprateur
signifiant adresse de )
Exemple 7 :
int x ; // rservation de lespace mmoire pour une variable x de type entier, sans initialisation
Mme Wiem Yaiche Elleuch
chapitre 1 : Gnralits
Page 3
float y ; //rservation de lespace mmoire pour une variable y de type rel, sans initialisation
Exemple
Ecrire un programme qui lit 3 entiers au clavier, affiche leur somme et leur moyenne.
main() : en-tte : Elle prcise que ce qui sera dcrit sa suite est le programme
principal (main)
Le pgm principal est dlimit par des accolades
Les instructions situes entre accolades forment un bloc .
La fonction main est constitue dun en tte et dun bloc.
Il ira de mme pour toute fonction C
Un bloc peut lui-mme contenir dautres blocs
chapitre 1 : Gnralits
Page 4
Le caractre _ est considr comme une lettre. Il peut apparatre au dbut dun
identificateur (lg_ligne; _total; _89)
Les majuscules et les minuscules sont autorises mais ne sont pas quivalentes (ligne
Ligne).
Longueur des identificateurs: les 31 premiers caractres sont significatifs
#define NB 5 est une directive qui sera prise en compte avant la traduction
(compilation du programme).
Les directives (#include<stdio.h> #include<conio.h> #define NB 5) doivent tre
crites raison dune par ligne et elles doivent obligatoirement commencer en dbut
de ligne.
Ces directives demandent dintroduire (avant compilation) des instructions situes
dans le fichier stdio.h, conio.h et de remplacer le symbole NB par 5
chapitre 1 : Gnralits
Page 5
Lors de lappel dune fonction prdfinie, il est ncessaire dincorporer un tel fichier,
nomm fichier en-tte , qui contient des dclarations appropries concernant les
fonctions printf et scanf.
Ces dclarations permettront au compilateur deffectuer des contrles sur le nombre et
le type des arguments mentionns lors de lappel de la fonction
Un mme fichier en-tte contient des dclarations relatives plusieurs fonctions
En gnral, il est indispensable dincorporer stdio.h
#define NB 5 demande de remplacer systmatiquement, dans toute la suite du
programme, le symbole NB par 5.
#define sert dfinir la valeur dun symbole
dition du programme
Compilation
dition de liens
Ou saisie consiste crer partir dun clavier du texte dun programme (pgm)=>
programme source
Ce texte sera conserv dans un fichier=> fichier source
Chaque systme possde ses propres conventions de dnomination des fichiers
Un fichier: nom+extension
Elle consiste traduire le pgm source (ou le contenu du fichier source) en langage
machine en faisant appel un programme nomm compilateur
Lopration de compilation se fait en deux tapes:
o Traitement par le prprocesseur: qui excute les directives qui le concerne
(commenant par #include, #define)
o La compilation: traduction en langage machine du texte en langage C fourni
par le prprocesseur
Le rsultat de la compilation porte le nom de module objet
chapitre 1 : Gnralits
Page 6
Le prprocesseur
Cest un pgm qui est excut automatiquement avant la compilation et qui transforme
un fichier source partir dun certain nombre de directives
Les directives sont crites sur des lignes distinctes du reste du programme, elles sont
introduites par #: #include, #define
Les diverses possibilits offertes par le prprocesseur:
o Incorporation de fichiers source (#include)
o Dfinition de symboles et de macros (#define)
o Compilation conditionnelle
La notion de type
Types de base
Les types de base du langage C se rpartissent en trois grandes catgories:
Nombres entiers (int, short , long)
Nombres flottants (float, double, long double)
Caractres (char)
Catgorie des entiers :
char : caractre : Une variable du type char peut contenir une valeur entre -128 et 127 et
elle peut subir les mmes oprations que les variables du type short, int ou long.
int : entier standard : Sur chaque machine, le type int est le type de base pour les calculs
avec les entiers. Le codage des variables du type int est donc dpendant de la machine.
Sur les IBM-PC sous MS-DOS, une variable du type int est code dans deux octets.
short : entier court : Le type short est en gnral cod dans 2 octets. Comme une variable
int occupe aussi 2 octets sur notre systme, le type short devient seulement ncessaire, si
on veut utiliser le mme programme sur d'autres machines, sur lesquelles le type standard
des entiers n'est pas forcment 2 octets.
chapitre 1 : Gnralits
Page 7
dfinition
description
domaine min
domaine max
nombre d'octets
char
caractre
-128
127
short
entier court
-32768
32767
int
entier standard
-32768
32767
long
entier long
-2147483648
2147483647
Chacun de ces trois types peut tre qualifi de unsigned (non sign) (pas de bit rserv au
signe, des nombres positifs seulement)
dfinition
description
unsigned char
caractre
255
unsigned short
entier court
65535
65535
4294967295
entier long
Les types flottants permettent de reprsenter, de manire approche, une partie des
nombres rels.
Notation: M.BE Avec M: mantisse ; E: exposant; B:base
Exemple: 1.5 1022
0.472 10-8
1.5 et 0.472: mantisses ; 22 et -8: exposants
Un nombre rel sera reprsent en flottant.
Le C prvoit trois types de flottants: float, double et long double
Les constantes flottantes peuvent scrire indiffremment suivant lune des deux
notations:
o Dcimale
o Exponentielle
La notation dcimale doit comporter obligatoirement un point (~ virgule). La partie
entire ou dcimale peut tre omise 12.43 -0.38 -.38 4.
.27
La notation exponentielle utilise la lettre e (ou E) pour introduire un exposant entier
(puissance de 10), avec ou sans signe
4.25E4 4.25e+4 42.5E3 54.27E-32
542.7E-33 5427e-34
dfinition
float
simple
3.4 * 10-38
3.4 * 1038
double
double
15
1.7 * 10-308
1.7 * 10308
chapitre 1 : Gnralits
Page 8
long double
suppl.
19
10
sonnerie
\\
trait oblique
\b
\t
\n
\r
\0
curseur arrire
tabulation
nouvelle ligne
retour au dbut de ligne
NUL
\?
\'
\"
\f
\v
point d'interrogation
apostrophe
guillemets
saut de page (imprimante)
tabulateur vertical
Initialisation et constantes
#define: permet de donner une valeur un symbole. Dans ce cas, le prprocesseur
effectue le remplacement correspondant avant la compilation
chapitre 1 : Gnralits
Page 9
addition
soustraction
multiplication
chapitre 1 : Gnralits
Page 10
Lorsque plusieurs oprateurs apparaissent dans une mme expression, il est ncessaire de
savoir dans quel ordre ils sont mis en jeu.
Oprateurs unaires + (identit) et (oppos) sont prioritaires, ensuite *, /, % et enfin
oprateurs binaires: + et
En cas de priorit identique, les calculs seffectuent de gauche droite
Les parenthses permettent de changer ces rgles de priorit.
deux entiers: D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le
plus large des deux types dans l'chelle suivante:
int, unsigned int, long, unsigned long
chapitre 1 : Gnralits
Page 11
Pour le calcul de D, A est converti en float (rgle 2) et divis par C. Le rsultat (0.75) est affect
D qui est aussi du type float. On obtient donc: D=0.75
Pour le calcul de E, A est converti en int (rgle 1) et divis par B. Le rsultat de la division (type
int, valeur 0) est converti en float (rgle 4). On obtient donc: E=0.000
Pour le calcul de F, A est converti en float (rgle 2) et divis par C. Le rsultat (0.75) est retraduit
en char (rgle 4). On obtient donc: F=0
/**********************************************/
Tout argument de type char ou short est converti en int. Le code %c sapplique aussi un int. Il
affichera le caractre ayant le code correspondant
chapitre 1 : Gnralits
Page 12
9
A => code ASCII 65
B => code ASCII 66
C permet de comparer des expressions laide doprateurs classiques de comparaisons ( 2*a >
b+5)
Le rsultat de la comparaison est:
o 0 si le rsultat de la comparaison est faux
o 1 si le rsultat de la comparaison est vrai
Les oprateurs relationnels: <, <=, >, >=, ==, !=
Les quatre premiers sont de mme de priorit (<, <=, >, >=). Les deux derniers (==, !=) sont de
mme priorit, mais infrieure celle des prcdents
==
!=
<, <=, >, >=
gal
diffrent de
plus petit que, ...
Oprateurs de comparaison
chapitre 1 : Gnralits
Page 13
Il existe trois oprateurs logiques: et (not &&), ou (not ||), non (not !). Ces oprateurs
produisent un rsultat numrique (int)
o (a<b) && (c<d): prend la valeur 1 si les deux expressions sont vraies. 0 sinon
o (a<b) || (c<d): prend la valeur 1 si lune des expressions est vraie. 0 sinon
o !(a<b): prend la valeur 1 si lexpression est fausse
On rencontre frquemment if (!n) if (n==0)
! est prioritaire: !a==b => (!a)==b et non !(a==b)
|| est moins prioritaire que &&. Tous deux sont de priorit infrieure aux oprateurs arithmtiques
et relationnels.
a<b && c<d (a<b) && (c<d)
On value a<b si le rsultat est faux, on arrte
Oprateurs logiques
&&
||
!
et logique (and)
ou logique (or)
ngation logique (not)
i=j=5;
Il est possible de fournir loprateur daffectation des oprandes de types diffrents.
chapitre 1 : Gnralits
Page 14
Dans ce cas une conversion systmatique de la valeur de lexpression (droite) est effectue dans le
type de la variable (gauche)
Une telle conversion impose ne respecte plus ncessairement la hirarchie des types
Remarque :
i=i+1;
n=n-1;
i++;
n-- ;
++i;
--n ;
void main()
{
int n, i=5;
n= ++i -5 ;
printf("i: %d et n: %d",i,n); /* affichage i:6 et n: 1*/
i=5;
n= i++ -5 ;
printf("\n i: %d et n : %d",i,n); /*affichage i:6 et n: 0*/
}
Lors dune affectation, toutes les conversions sont acceptes par le compilateur (pb de perte de
prcision)
La conversion dun int en char sera satisfaisante si la valeur de lentier correspond un code dun
caractre
#include<stdio.h>
void main()
{
int n;
float x=2.3;
n=x+5.3;
printf("%d", n);
}
ce programme affiche 7
Mme Wiem Yaiche Elleuch
chapitre 1 : Gnralits
Page 15
Casting
Le programmeur peut forcer la conversion dune expression quelconque dans un type de son choix
int n=5, p=2; (double) (n/p);
Aura comme valeur celle de n/p convertie en double
#include<stdio.h>
void main()
{
int x=2, y=3;
printf("la somme est %f", float (x+y));
}
#include<stdio.h>
void main()
{
char A=3;
int B=4;
float C;
C = (float) A/B;
printf("%f",C);
}
=> ce programme affiche 0.7500000
#include<stdio.h>
void main()
{
char A=3;
int B=4;
float C;
C = A/B;
printf("%f",C);
}
=> ce programme affiche 0.000000
Les contenus de A et de B restent inchangs; seulement les valeurs utilises dans les
calculs sont converties
Classes de priorit
Priorit 1 (la plus forte):
()
Priorit 2:
! ++ --
Priorit 3:
*/%
Priorit 4:
+-
Priorit 5:
Priorit 6:
== !=
Priorit 7:
&&
Priorit 8:
||
= += -= *= /= %=
Loprateur conditionnel
If (a>b) max=a; else max=b;
max= a>b ? a:b;
chapitre 1 : Gnralits
Page 16
TYPE
int
int
int
int
int
double
double
char*
IMPRESSION COMME
entier relatif
entier naturel (unsigned)
entier exprim en octal
entier exprim en hexadcimal
caractre
rationnel en notation dcimale
rationnel en notation scientifique
chane de caractres
long
unsigned long
chapitre 1 : Gnralits
Page 17
Le caractre * figurant la place dun gabarit ou dune prcision signifie que la valeur
effective est fournie dans la liste des arguments de printf.
chapitre 1 : Gnralits
Page 18
scanf("<format>",<AdrVar1>,<AdrVar2>, ...)
"<format>" : format de lecture des donnes
<AdrVar1>,... : adresses des variables auxquelles les donnes seront
attribues
La fonction scanf reoit ses donnes partir du fichier d'entre standard stdin (par dfaut
le clavier).
La chane de format dtermine comment les donnes reues doivent tre interprtes.
Les donnes reues correctement sont mmorises successivement aux adresses indiques
par <AdrVar1>,... .
L'adresse d'une variable est indique par le nom de la variable prcd du signe &.
Pour tous les spcificateurs, nous pouvons indiquer la largeur maximale du champ
valuer pour une donne.
Les chiffres qui passent au-del du champ dfini sont attribus la prochaine variable qui
sera lue
chapitre 1 : Gnralits
Page 19
Exemple:
Ecrire un pgm qui lit un caractere au clavier, et affiche Caractere majuscule , si le caractre
est majuscule, Caractere minuscule si le caractre est minuscule, AUTRE sinon.
chapitre 1 : Gnralits
Page 20
chapitre 1 : Gnralits
Page 21