Langage C
ITI 1A 2017-2018
Un programme en C permet de manipuler des données plus ou moins complexes. Ces données sont associées à desvariables pouvant être de plusieurs types, manipulées à l’aide d’opérateurs et defonctions.
Une multitude de fonctions existent déjà en C. Elles sont sto- ckées dans desbibliothèques(ou librairies) qui sont des fichiers portant l’extension.h.
— stdio.h: printf, getchar, putchar, scanf...
— stdlib.h: exit, rand, srand...
— math.h: cos, sin, pow...
V ariables
Une variable est caractérisé par :
— son adresse: endroit de stockage en mémoire du système (RAM généralement) ;
— son type : nature de l’information déterminant aussi la taille en mémoire d’une variable ;
— son identificateur: nom donnée à la variable ;
— sa valeur: contenu de la variable.
Il existe 3 types de variables :
— entiers ouint: pouvant être de plusieurs natures (long, short,unsigned...). Ils occupent 2 ou 4 octets en mémoire ;
— caractères ouchar : souvent considérés comme des en- tiers particuliers (norme ASCII) codés sur 1 octet ;
— réels oufloat ou double: codés sur 4 octets pour les flottants et 8 octets pour les double.
Les variables peuvent être :
— locales: utilisées uniquement dans la fonction où elles sont déclarées ;
— globales: réutilisées par différentes fonctions et déclarées hors de toute fonction.
Ladéclarationd’une variable se fait de la façon suivante : i n t i ;
d o u b l e j , k = 5 . 0 ;
C onstantes
Lesconstantessont des valeurs qui n’évoluent pas au cours de l’exécution d’une instruction. Elles sont déclarées au début du programme ou dans des fichiers d’en-tête ainsi :
# d e f i n e MAX 100
O p erateurs ´
Les opérateurs permettent de faire des opérations sur des va- riables du même type.
Le principal opérateur est l’affectation(=). Il permet d’affecter une valeur (placée à droite du signe égal) à une variable (placée à gauche du signe égal).
i = 3 5 ; k = k + 2 5 . 1 ; Les autres opérateurs :
Opérateurs Signification Exemple
+ somme x=a+b ;
- soustraction x=a - b ;
* multiplication x=a * b ;
/ division x=a/b ;
% modulo x=a % b ;
++ incrémentation x=b++; x= ++b ;
Il existe aussi des opérateurs effectuant des opérations bit à bit et non sur des nombres comme les précédentes. Ce sont les opérateurs :&(ET logique),|(OU logique),˜(NON logique),ˆ (OU EXCLUSIF),< <n(décalage à gauche de n bits) et> >n (décalage à droite de n bits).
T ableaux de variables
Ce sont desregroupements indexésde variables d’unmême type, l’indice allant de 0 à N-1.
Déclaration et remplissage d’un tableau de 5 entiers : i n t t a b 1 [ 5 ] = { 1 0 , 2 0 , 4 5 , −15 , 5 } ; i n t t a b 2 [ 5 ] ;
f o r( i=0 ; i<5 ; i++) t a b 2 [ i ] = 2∗i ;
A ffichage et r ecup ´ eration de donn ´ ees ´
Des fonctions particulières permettent d’afficher et de récupé- rer des données écrites par l’utilisateur.
La fonctionprintfpermet d’afficher des chaînes de caractères à l’écran.
p r i n t f ( " B o n j o u r! " ) ; p r i n t f ( " xv a u t%d \n " , x ) ;
La fonction scanf, au contraire, permet d’attendre une en- trée au clavier.ATTENTION: Le second argument correspond à l’adressede la variable dans laquelle doit être stockée la donnée.
s c a n f ( "%l f " , &k ) ;
Dans ces deux fonctions, les types de variables sont codés par :
%ccaractère (char),%dentier (int) et%lf réels (long float ou double).
D’autres fonctions comme putcharetgetchar existent pour afficher ou récupérer des données. En particulier, la fonctiongets permet de récupérer une chaine de caractères saisie au clavier (intégrant aussi les espaces, ce qui n’est pas le cas de la fonction scanf).
IOGS - Palaiseau - ITI 1A Langage C
L es tests
Les tests sont utilisés pour tester une valeur de variable ou tes- ter des opérations logiques. Les résultats sont booléens (vraiou faux).
Lesopérateurssont les suivants : supérieur (>), inférieur (<), supérieur ou égal (>=), inférieur ou égal (<=), égal (==- atten- tion au doublement du signe), différent (!=), ET logique (&&) et OU logique (||).
L es structures de contr ole ˆ
Les structures de contrôle permettent de changer l’ordre d’exécution des instructions. Ces structures font appel à des conditions logiques(CL).
IF ( cl ) ... ELSE ...
i f ( ( x == 1 ) | | ( x == 3 ) ) / / c o n d i t i o n
k = 1 ;
e l s e
k = 0 ;
SWITCH ( expression ) CASE ...
s w i t c h ( x ) {
c a s e 1 : k = 1 ; break; / / c a s x = 1
c a s e 2 : k = 3 ; break; / / c a s x = 2
d e f a u l t : k = 0 ; / / a u t r e s c a s
}
WHILE ( cl ) ...
Tant que la condition est vraie, les instructions contenues dans la boucle sont exécutées.
w h i l e ( x < 2 ) / / t a n t que x < 2
x = x + 1 ; / / ou x++;
Une seconde possibilité est offerte, garantissant l’exécution des intructions contenues dans la boucle au moins une fois.
do
x = x + 1 ;
w h i l e ( x < 2 ) ;
FOR ( indice ) DE min A max ...
L’ensemble des instructions contenues dans une telle boucle est exécuté un nombre connu de fois.
f o r( i = 0 ; i < 1 0 ; i++) {
i f( ( i % 2 ) == 0 ) / / nombre p a i r
k = i ∗ 2 ;
e l s e
k = i ;
p r i n t f ( " k=%d \n " , k ) ; }
S tructure d ’ un programme
Unfichier .cest composé d’unen-tête, permettant de spécifier leslibrairiesnécessaires à la compilation, une zone de décla- rationdes varaibles globales (si besoin), d’une fonctionmainet d’autresfonctionssi nécessaire.
La fonctionmainest la fonction principale du code. Elle sera exécutée en premier par le programme (point d’entrée du pro- gramme).
# i n c l u d e <s t d i o . h> / / l i b r a i r i e
# d e f i n e P I 3 . 1 4 / / c o n s t a n t e i n t k ; / / v a r i a b l e g l o b a l e v o i d i n i t S y s t e m e ( v o i d ) ;
i n t main ( v o i d ) {
i n t i ; / / v a r i a b l e l o c a l e
i n i t S y s t e m e ( ) ; / / a p p e l a une f o n c t i o n f o r( i = 0 ; i < 2 ; i++ )
p r i n t f ( " i∗P I=%l f \n " , (f l o a t) i∗P I ) ; r e t u r n EXIT_SUCCESS ;
}
v o i d i n i t S y s t e m e ( v o i d ) {
k = 3 ;
p r i n t f ( " I n i t i a l i s a t i o n \n " ) ; }
L es pointeurs
Un pointeur est une variable stockant l’adressed’une autre va- riable. On le déclare en ajoutant à son nom le symbole *.
i n t i = 1 2 ; i n t a ;
i n t ∗p = &i ; / / p c o n t i e n t l ’ a d r e s s e de i a = (∗p ) ; / / a va p r e n d r e l a v a l e u r
/ / de l a v a r i a b l e s t o c k e e a l ’ a d r e s s e p Ainsi p désigne l’adresse et *p son contenu. Sur une variable
«classique», i est la valeur et &i son adresse.
Les tableaux de variables (en particulier les chaînes de carac- tères - voir ci-après) peuvent aussi être considérés comme des pointeurs. En effet, le nom d’un tableau pointe sur le premier élé- ment du tableau.
i n t t a b l e [ 5 ] = { 1 , 2 , 3 , 4 , 5 } ; i n t a ;
i n t ∗p = NULL ; / / p o i n t e u r v i d e
p = t a b l e ; / / p p o i n t e s u r l e p r e m i e r e l e m e n t / / du t a b l e a u t a b l e
a = ∗( p + 2 ) ; / / a p r e n d l a v a l e u r s t o c k e e / / a l ’ a d r e s s e p+2 , s o i t t a b l e [ 2 ]
– 2 –
IOGS - Palaiseau - ITI 1A Langage C
L es structures
La structure de données est un type de données construit à par- tir d’une association de variables de types différents.
s t r u c t D a t e {i n t j o u r , mois , a n n e e ; } ; s t r u c t F i c h e {
c h a r nom [ 3 2 ] ;
s t r u c t D a t e n a i s s a n c e ; f l o a t t a i l l e ;
} ;
s t r u c t F i c h e Mr_X = { " T o t o " , { 1 , 2 , 1 9 8 0 } , 1 . 7 0 } ;
p r i n t f ( "%s%f \n " , Mr_X . nom , Mr_X . t a i l l e ) ; f l o a t a = Mr_X . t a i l l e ;
Mr_X . n a i s s a n c e . a n n e e = 1 9 8 2 ;
Une autre possibilité est de déclarée un nouveau type de don- nées :
t y p e d e f s t r u c t { c h a r nom [ 3 2 ] ; f l o a t t a i l l e ; } F i c h e ;
F i c h e Mr_X = { " T o t o " , 1 . 7 0 } ;
Ficheest alors considéré comme un nouveau type pour le pro- gramme.
L es fonctions
Une fonction permet de regrouper un ensemble d’instructions en donnant un identificateur(ou nom) et desparamètres (ou arguments) à ce groupe.
Elle possède untypeselon le type de variable qu’elle retourne grâce à l’instructionreturn. Elle peut avoir ses propres variables locales.
Elles sont écritesen dehorsde la fonction principale (main).
i n t somme ( i n t a , i n t b ) / / p r o t o t y p e {
i n t c = a + b ;
r e t u r n c ; }
Ladéclarationd’une fonction doit se faire avant sa première utilisation. Pour cela, on déclare leprototypede la fonction en dehors et avant la fonctionmain. Sadéfinitionpeut se faire sépa- rément.
L es cha ˆ ines de caract eres `
En C, il n’existe pas de type de variable pour les chaînes de caractères comme il en existe pour les entiers (int) ou pour les caractères (char). Les chaînes de caractères sont en fait stockées dans untableau de caractères(char) dont la fin est marquée par le caractère ’\0’. En mémoire la chaîne "Bonjour" est représentée ainsi :
B o n j o u r ’\0’
Tout ce qui suit le caractère ’\0’ sera ignoré : c h a r s [ 1 4 ] = " H e l l o\0 World ! " ;
p r i n t f ( "%s\n " , s ) ; / / a f f i c h e r a H e l l o
Il ne faut donc pas oublier de réserver une place supplémen- tairepour le caractère de fin de chaîne sinon on obtient un simple tableau de caractères et, dans ce cas, son utilisation en tant que chaîne de caractères mène à un comportement indéfini.
Il existe plusieurs manières de déclarer et d’initialiser une chaîne de caractères :
c h a r s 1 [ 1 1 ] = " C o u r sdeC" ; c h a r s 2 [ ] = " C o u r sdeC" ; c h a r ∗s 3 = " C o u r sdeC" ;
La première méthode réserve une zone de 11 octets et la chaîne
"Cours de C" y est stockée.
La seconde méthode laisse le compilateur calculer la taille ap- propriée (11 octets dans notre cas).
La dernière méthode ne réserve pas de mémoire, elle se contente de stocker l’adresse d’une chaîne de caractères. Si vous souhaitez utiliser une chaîne de taille variable, il faut utiliser les mécanismes d’allocation dynamique de la mémoire :
c h a r ∗s = m a l l o c (s i z e o f (∗s ) ∗ 2 5 6 ) ; / / p e r m e t d ’ a l l o u e r 256 o c t e t s p o u r s / / s o i t 255 c a r a c t e r e s
f r e e ( s ) ; / / l i b e r e s
Des fonctions dédiées aux "calculs" sur des chaînes de carac- tères sont regroupées dans la bibliothèquestring.h.
Voici les principales :
size_t strlen(const char* chaine)
Cette fonction renvoie la longueur de la chaîne de caractères.
c h a r c h a i n e [ ] = " S a l u t " ; i n t l o n g u e u r C h a i n e = 0 ;
/ / On r e c u p e r e l a l o n g u e u r de l a c h a i n e / / d a n s l o n g u e u r C h a i n e
l o n g u e u r C h a i n e = s t r l e n ( c h a i n e ) ; char* strcpy(char* c, const char* ct)
Cette fonction permet de copierctdansc.
c h a r c h a i n e [ ] = " T e x t e " ; c h a r c o p i e [ 1 0 0 ] ;
s t r c p y ( c o p i e , c h a i n e ) ; char* strcat(char* c1, const char* c2)
Cette fonction ajoute à la suite de la chaînec1la chaînec2, en remplaçantc1.
c h a r c h a i n e 1 [ 1 0 0 ] = " S a l u t" ; c h a r c h a i n e 2 [ ] = " av o u s " ; s t r c a t ( c h a i n e 1 , c h a i n e 2 ) ; p r i n t f ( c h a i n e 1 ) ;
/ / a f f i c h e r a S a l u t a v o u s – 3 –
IOGS - Palaiseau - ITI 1A Langage C
int strcmp(const char* c1, const char* c2)
Cette fonction permet de comparer les chaînesc1etc2. Elle renvoie 0 si les deux chaînes sont identiques, sinon une autre va- leur.
c h a r c h a i n e 1 [ ] = " T e x t edet e s t " ; c h a r c h a i n e 2 [ ] = " T e x t edet e s t " ; i f ( s t r c m p ( c h a i n e 1 , c h a i n e 2 ) == 0 )
p r i n t f ( " I d e n t i q u e s\n " ) ; e l s e
p r i n t f ( " D i f f e r e n t e s\n " ) ; char* strstr(const char* c, const char* ct)
Cette fonction recherche la première occurrence de la chaîne ctdans la chaînec. Elle renvoie alors une chaîne de caractères correspondante à cette première occurrence, sinon la chaîne de caractères resteNULL.
c h a r ∗s u i t e C h a i n e ;
s u i t e C h a i n e = s t r s t r ( " T e x t edet e s t " , " t e s t " ) ; i f ( s u i t e C h a i n e != NULL)
p r i n t f ( " Lac h a i n e%se s tp r e s e n t e\n " , s u i t e C h a i n e ) ;
G estion des fichiers
Il existe plusieurs fonctions permettant de gérer des fichiers.
Les fichiers sont de typeFILE *.
La fonction FILE *fopen(char *nomfic, char *mode) ouvre le fichier dont le nom est donné comme premier argument, selon le mode d’ouverture précisé (w=écriture, r=lecture, a= ajout en fin de fichier) et l’assigne à un flux, i.e. à une variable de typeFILE *.
La fonctionFILE *fclose(char *nomfic)permet de refer- mer le fichier.
Les fonctions char *fgets(char *chaine, int max, FILE *fichier) et void fscanf(FILE *fichier, char
*format, adr_var_1, adr_var_2, ...)permettent de lire les données.
L’exemple ci-dessous permet d’ouvrir un fichier nommé annuaire.txten lecture seule et de lire son contenu, annuaire sous forme :
nom prenom tel1 tel2 tel3 tel4 tel5
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t r i n g . h>
# i n c l u d e <s t d l i b . h>
i n t main ( v o i d ) {
FILE ∗f i c ;
i n t n b _ l i g n e s , t 1 , t 2 , t 3 , t 4 , t 5 ; c h a r nom [ 2 5 5 ] , prenom [ 2 5 5 ] ;
/ / o u v e r t u r e du f i c h i e r en l e c t u r e f i c = f o p e n ( " a n n u a i r e . t x t " , " r " ) ; i f( f i c == NULL) {
p r i n t f ( " O u v e r t u r ei m p o s s i b l e\n " ) ;
e x i t ( 1 ) ; }
/ / r e c u p e r e r l e s d o n n e e s de l ’ a n n u a i r e n b _ l i g n e s = 0 ;
w h i l e( f s c a n f ( f i c , "%s%s%d%d%d%d%d " ,\
nom , prenom , &t 1 , &t 2 , &t 3 , &t 4 , &t 5 )\
!= EOF ) { / / end o f f i l e p r i n t f ( "\tnom=%s\n " , nom ) ;
p r i n t f ( "\t p r e n o m=%s\n " , prenom ) ; p r i n t f ( "\t t e l=%d%d%d%d%d\n " ,\
t 1 , t 2 , t 3 , t 4 , t 5 ) ; n b _ l i g n e s++;
}
p r i n t f ( " l ef i c h i e rc o m p o r t e%dl i g n e s\n " ,\ n b _ l i g n e s ) ;
/ / f e r m e t u r e du f i c h i e r i f( f c l o s e ( f i c ) == EOF ) {
p r i n t f ( " F e r m e t u r ei m p o s s i b l e " ) ; e x i t ( 1 ) ;
}
r e t u r n EXIT_SUCCESS ; }
La fonctionint fputs(char *chaine, FILE *fic)écrit la chaîne de caractèreschainesur le fluxfic. Elle retourne le dernier caractère de la chaîne en cas de succès (EOF en cas d’er- reur).
La fonction int fprintf(FILE *fic, char *format, var_1, var_2, ...)écrit les donnéesvar_dans le fluxfic en respectant le format spécifié par la chaîne format. Elle re- tourne le nombre de caractères écrits sur le flux.
– 4 –