• Aucun résultat trouvé

T ableaux de variables

N/A
N/A
Protected

Academic year: 2022

Partager "T ableaux de variables"

Copied!
4
0
0

Texte intégral

(1)

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).

(2)

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 –

(3)

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 –

(4)

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 –

Références

Documents relatifs

Il faut donc faire défiler le message dans buffer, c'est à dire copier message dans buffer à partir d'une position donnée, afficher son contenu pendant un instant donné

Ce théorème rappelle le théorème des bornes pour des fonctions de R dans R : &#34;Toute fonction d’une variable continue sur un segment est bornée et atteint ses bornes&#34;..

Comme d’habitude, une somme de fonctions continues est continue ; un quotient de fonctions continues dont le dénominateur ne s’annule pas est continue ; une composée de

[r]

69 portant sur les finances pour 2007 dans le Code de l’En- vironnement précise que les personnes physiques ou morales qui mettent sur le marché national, à titre

Compact dans ne signifie pas être un intervalle. est continue sur et est bien une partie compacte de mais ce n’est pas un intervalle. Pour obtenir le fait que

les fonctions V,(^) ainsi formées sont périodiques, comme les U/(,y), et admettent comme elles des dérivées premières et secondes; et nous pouvons, de proche en proche, déterminer

= i ; le domaine fondamental Fi est alors l'ensemble des points [ Re(z) [ ^ ^» z z ^ i, et possède un sommet parabolique ; d'autre part, deux fonctions invariantes par G ne sont