Vous êtes sur la page 1sur 22

Cours sur le Langage C

Sommaire du Cours sur le Langage C


A) Introduction
1) Notions de base de la programmation 2) Le programme c 3) Structure d'un programme c 4) Les objets du programme 1 1 1 1 1 2 2 2 3 3 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 8 8 8 9 9 9 10 10 10 10

B) Production d'un excutable


1) La chane de production de l'excutable 2) Les librairies de turboc

C) Elments de syntaxe du langage c


1) Introduction 2) Les sparateurs 3) Les dlimiteurs 4) Les identificateurs 5) Les mots rservs

D) Les constantes
1) Constante entire 2) Constante nombre rel 3) Constante caractre 4) Constante chane de caractres

E) Les variables
1) Gnralits 2) Variable globale 3) Variable locale

F) Les types de base


1) Introduction 2) Les entiers 3) Les rels

G) Expressions et oprateurs
1) Les oprateurs arithmtiques 2) Les oprateurs de manipulation de bits 3) Les oprateurs relationnels 4) Oprateurs logiques 5) L'affectation 6) Incrmentation dcrmentation 7) Expression conditionnelle 8) Oprateurs d'accs aux objets 9) Oprateur sizeof 10) Oprateurs combins

H) Priorits des oprateurs


1) Gnralits 2) Tableau rcapitulatif

I) Les instructions simples


1) Instruction vide 2) Instruction d'affectation 3) Instruction expression

4) Le bloc

J) instruction conditionnelle
1) Syntaxe 2) Exemple 3) Remarques

K) Instruction d'aiguillage
1) Syntaxe 2) Exemple 3) Utilisation de l'instruction break dans un switch

L) Les instructions rptitives ou boucles


1) Instruction while 2) Instruction do 3) Instruction for

M) Instructions associes aux boucles


1) Instruction break 2) Instruction continue 3) Instruction goto 4) instruction ";"

N) Les directives de compilation


1) Introduction 2) Macro-dfinitions 3) Macro-definitions paramtres 4) Destruction de macro-dfinitions 5) Inclusions de fichiers sources 6) Compilation conditionnelle

O) Les fonctions
1) Gnralits 2) Dclarations de fonctions 3) Dfinitions de fonctions 4) Appel d'une fonction 5) Passage des paramtres 6) Variables locales 7) Pointeurs de fonction

P) Les pointeurs
1) Dfinitions 2) Oprations sur les pointeurs

Q) Les tableaux
1) Les tableaux simples 2) Les tableaux plusieurs dimensions 3) Initialisation des tableaux

10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 14 15 15 15 15 16 16 16 17 17 17 17 18 18 18 18 19 19 19 20 20 20 20

Cours sur le langage C A) INTRODUCTION 1) NOTIONS DE BASE DE LA PROGRAMMATION Le programme rsout des problmes en manipulant des donnes. Il faut pour cela: w fournir les informations au programme (notions d'entres), w trouver une place pour les conserver en mmoire (notion de types de donnes et de variable); w donner les instructions ncessaires leur traitement (notion d'oprations), w restituer les rsultats l'utilisateur (notion de sorties). On peut organiser les instructions de telle faon que: w certaines ne soient excutes que si une condition spcifique est vraie (excution conditionnelle), w d'autres soient rptes un certain nombre de fois (notion de boucles), w d'autres soient excutables en diffrents points du programme (notion de sous-programme). 2) LE PROGRAMME C Un programme C est un texte structur en ligne, crit l'aide d'un diteur de texte selon les rgles de construction du langage C. Le programme source crit en C liste, dans un ou plusieurs fichiers portant l'extension .c, les objets et les actions ncessaires la ralisation d'une tache par l'ordinateur. Pour aider la programmation une bibliothque de sous-programmes prcompils (fichier.lib) est mise la disposition de l'utilisateur. Les dclarations de ces primitives sont localises dans les fichiers .h, dits fichiers d'en-ttes, lisibles l'aide d'un diteur de texte. 3) STRUCTURE D'UN PROGRAMME C On peut distinguer dans un programme: w les commentaires ou texte utile pour la prsentation et la comprhension, un commentaire commence toujours par /* et se termine par */, w le programme proprement dit crit selon les rgles du langage. Le programme proprement dit est compos w de blocs qui, en C, sont appels fonctions. Une fonction est en fait un sous-programme qui ralise une action et produit une valeur; w de listes d'objets qui vont contenir les donnes. Une fonction particulire joue le rle de fonction principale, encore communment appele programme principal, et est repre par le nom main. 4) LES OBJETS DU PROGRAMME Le programme manipule, par l'intermdiaire de ses fonctions, des objets de diffrentes natures: w des constantes, w des variables, objets dont le contenu peut tre modifi. Une constante est entirement caractrise par sa valeur et se confond avec elle. Une variable est localise en mmoire et est caractrise par: w son type (fonction de l'objet que l'on veut y stocker, il dtermine sa taille et sa structure), w son identificateur ou nom qui permet d'accder directement son contenu, w son adresse en mmoire qui permet aussi d'accder son contenu de manire indirecte. Une fonction est localise en mmoire et est caractrise par: w son identificateur ou nom qui permet de lancer son excution, w ses arguments ou liste des donnes qui lui sont ncessaires en entre, w son type ou nature de la valeur retourne en fin d'excution. B) PRODUCTION D'UN EXECUTABLE EXECUTABLE langc2.doc Page 1

Cours sur le langage C 1) LA CHAINE DE PRODUCTION DE L'EXECUTABLE La production d'un programme excutable par la machine, partir des fichiers source .c et des primitives, se fait l'aide d'un compilateur et d'un diteur de liens.

Source1.c Source2.c Source3.c

compilateur compilateur compilateur

Source1.obj Source2.obj Source3.obj diteur de liens

fichier.exe

primitives bibliothque

Les fichiers .c sont les fichiers source et contiennent le code source en C. Les fichiers .obj sont les fichiers objets et contiennent le code objet en langage binaire. Le fichier .exe est le programme rellement excutable, il contient le code objet et les primitives. 2) LES LIBRAIRIES DE TURBOC Une librairie se prsente sous forme d'un fichier dans lequel a t rassembl un certain nombre de fonctions prcompiles appeles primitives. La bibliothque de TURBOC est places dans TC\LIB dont les principales librairies sont: w Cx.LIB (librairies standards), w MATHx.LIB (librairies mathmatiques), w GRAPHICS.LIB (librairie graphique). Toutes les primitives de la bibliothque C sont dclares dans les fichiers .h dits fichiers d'en-tte. Ces fichiers regroupent les prototypes ou "descriptifs des primitives en langage C".

langc2.doc

Page 2

Cours sur le langage C C) ELEMENTS DE SYNTAXE SYNTAXE DU LANGAGE C 1) INTRODUCTION le langage C comporte 6 classes d'units syntaxiques (lments du langage ayant un sens symbolique): w les identificateurs ou noms donns aux objets manipuls par le programme, w les mots rservs ou mots cls du langage, w les constantes ayant une valeur fige (tudies dans le chapitre suivant), w les oprateurs permettant de manipuler les donnes (tudis dans un autres chapitre), w les dlimiteurs et w les sparateurs permettant aux compilateur de distinguer les diffrentes units du langage. 2) LES SEPARATEURS Ils peuvent tre: w un ou plusieurs caractres espace, tabulation, interligne, retour chariot, w ; termine une dclaration de variable ou une instruction, w , spare deux lments dans une liste. 3) LES DELIMITEURS Ils vont par deux et sont: w ( et ) encadrent une liste d'arguments ou de paramtres, w [ et ] encadrent la dimension ou l'indice d'un tableau, w { et } encadrent un bloc d'instructions ou une liste de valeurs d'initialisation, w < et > encadrent le nom d'un fichier d'en-tte, w " et " dlimitent une chane de caractres, w ' et ' dlimitent un caractre, w /* et */ dlimitent un commentaire 4) LES IDENTIFICATEURS Ils permettent de rfrencer les objets manipuls par le programme. Un identificateur doit tre construit en respectant les rgles suivantes: w il doit commencer par une lettre (a..z ou A..Z) ou par un caractre soulign "_", w les caractres suivants peuvent tre des lettres, des chiffres ou le soulign et rien d'autre, w majuscules et minuscules sont diffrencies, w seuls les 32 premiers caractres sont significatifs. 5) LES MOTS RESERVES Ce sont des mots cls ayant une signification particulire en C, ils ne peuvent servir d'identificateurs
Type int char short long unsigned float double struct union enum void Classe auto extern static register typedef instruction if else while do for switch break continue goto return Oprateur sizeof tiquette case default

langc2.doc

Page 3

Cours sur le langage C D) LES CONSTANTES 1) CONSTANTE ENTIERE Elles peuvent tre reprsentes selon 3 systmes: w en dcimal c'est la notation usuelle (exemple: 9, -213, +65535), w en octal le nombre est prcd du chiffre 0 (exemple: 010,0325,0177777), w en hexadcimal le nombre est prcd de 0x ou 0X (exemple: 0xa, 0X5d, 0xFFFF). 2) CONSTANTE NOMBRE REEL Elles peuvent tre reprsentes selon 2 notations: w dcimale, exemple: -12.5, 456, 14.0, w scientifique, exemple: 0.314e1, -8.56E-15. 3) CONSTANTE CARACTERE Elles permettent de dsigner les valeurs entires correspondant aux codes ASCII. Caractre visible: Il est plac entre apostrophes, exemple: '4', 'a'. caractre non visible et codes spciaux Il est not entre apostrophes w soit par sa valeur octale ou son caractre reprsentant la fonction prcd de la barre inverse \. Exemple: '\12' ou '\n'. w soit par sa valeur hexadcimale prcde de \x. Exemple: '\xA'.
'Squence' \a \b \f \n \r \t \v \\ \' \DDD \xHHH Valeur (hex et octal) 0x07 ou 007 0x08 ou 010 0x0C ou 014 0x0A ou 012 0x0D ou 015 0x09 ou 011 0x0B ou 013 0x5C ou 134 0x2C ou 054 0DDD 0xHHH Caractre BEL BS FF LF CR HT VT \ ' tout tout Effet signal sonore effacement arrire saut de page interligne retour chariot tabulation horizontale tabulation verticale barre inverse apostrophe DDD=valeur octal HHH=valeur hexadcimale

4) CONSTANTE CHAINE DE CARACTERES Suite de caractres placs entre guillemets. Elle peut contenir tous types de constantes caractres. Si le guillemet doit figurer il doit tre prcd de la barre inverse \. Si la barre inverse doit figurer il faut la doubler. Exemples: "on va la ligne\net on fait un bip\7" ; "guillemet=\"" c:\\new\\outils". ; "chemin d'accs est

Toute chane de caractres est obligatoirement termine par le caractre NULL ('\0'). Celui-ci est automatiquement engendr par le compilateur. Exemple: "Cours" sera reprsent en mmoire par C o u r s \0

Il ne faut pas confondre les reprsentations machine du caractre 'a' et de la chane de caractre "a". "" reprsente la chane de caractres vide et occupe un octet en mmoire, celui du caractre NULL.

langc2.doc

Page 4

Cours sur le langage C E) LES VARIABLES 1) GENERALITES En C tout objet manipul par le programme doit auparavant tre dclar. Dclarer une variable c'est dfinir ses caractristiques physiques avec les mots du c selon le format: classe type nom; w sa classe, prcise sa place dans l'espace mmoire (facultatif), w son type, permet de dfinir sa taille et sa structure, w le nom permet d'identifier la variable (identificateur). 2) VARIABLE GLOBALE Si une variable est dclare sans spcification de classe dans un fichier source l'extrieur de tout bloc elle est dite globale. w Elle est localise dans l'espace mmoire permanent. Sa dure de vie est donc celle du programme. w Elle est visible et utilisable par toutes les fonctions du fichier qui suivent sa dfinition. Sa visibilit est globale. w Elle peut tre utilise dans d'autre fichier condition d'y rappeler sa dclaration prcde du mot extern. Ce mot prcise au compilateur que la variable est de classe externe, qu'elle a t dfinie dans un autre fichier et qu'il ne faut pas rserver de place mmoire. w Son contenu est initialis automatiquement 0 en dbut d'excution, ou une autre valeur si vous l'indiquez explicitement lors de la dclaration. 3) VARIABLE LOCALE Variables automatiques Si une variable est dclare sans spcification de classe l'intrieur d'une fonction elle est dite de classe auto ou automatique. w Sa place mmoire est alloue dans la pile lors de l'appel de la fonction, puis libre lors du retour de la fonction. w Son contenu est donc dfinitivement perdu entre deux appels conscutifs. w Pour deux excutions diffrentes de la fonction, la variable de la 1ire excution est diffrente de la variable de la 2nde excution. w Elles ne sont pas initialises automatiquement. Variables statiques C'est une variable dont la dclaration l'intrieur d'une fonction est prcde du mot static. w Elle n'est utilisable que dans la fonction o elle a t dclare, elle est locale. w Sa place mmoire est rserve lors de la compilation. C'est donc une variable permanente. w Son contenu qui peut voluer est garanti tout au long de la dure d'excution du programme. w Son contenu est initialis 0 en dbut d'excution, ou une autre valeur si vous l'indiquez explicitement lors de la dclaration. float x,y; extern int n; { int i,j; ... } int n; extern float x; { static char i; .... } dclaration/dfinition variables globales dclaration variables globales dfinies ailleurs variables locales temporaires variable locale permanente

langc2.doc

Page 5

Cours sur le langage C F) LES TYPES DE BASE 1) INTRODUCTION Les types de base du C sont: les entiers et les rels. Un spcificateur peut prcder le type afin de moduler sa prcision et sa taille en mmoire. A partir des types de base on peut construire des types plus complexes: tableaux, pointeurs, structures, unions, numrations, fonctions qui seront tudis dans les chapitres qui leurs sont consacrs. 2) LES ENTIERS Le type char Les variables de ce type permettent de mmoriser les caractres ASCII. La variable contient un entier qui correspond au code ASCII sign ou non d'un des caractres de la table ASCII.
(Spcificateur ) Type char unsigned char Taille (octets) 1 1 Prcision -128..127 0..255

Exemple: Le type int

char c;

/* dclare une variable caractre nomme c*/

Leurs contenus s'identifient aux entiers relatifs. Les variables de ce type occupent un mot mmoire (une unit adressable de la machine cible). La taille n'est donc pas dfinie par le langage et varie d'un matriel l'autre. Sur vos machines:
(Spcificateur) Type int unsigned (int) short (int) unsigned short (int) long (int) unsigned long (int) Taille (octets) 2 2 2 2 4 4 Prcision -32 768..32 767 0..65 535 -32 768..32 767 0..65 535 -2 147 483 648..2 147 483 647 0..4 294 967 295

Exemple: 3) LES REELS

long int n,m;

/* dclaration de 2 entiers longs nomms n et m */

Leurs contenus s'identifient aux nombres fractionnaires.


(Spcificateur) Type float double long double Taille (octets) 4 8 10 Prcision 3.4E-38..3.4E+38 1.7E-308..1.7E+308 3.4E-4932..1.1E+4932

Exemple:

double x,y,z;

/*dclaration de 3 rels nomms x, y et z*/

langc2.doc

Page 6

Cours sur le langage C G) EXPRESSIONS ET OPERATEURS OPERATEURS On peut distinguer les oprateurs unaires, qui agissent sur un oprande, les oprateurs binaires qui mettent en relation deux oprandes, les oprateurs ternaires qui mettent en relation trois oprandes. Une expression est constitu d'oprandes et d'oprateurs. Les oprandes peuvent tre des constantes, des variables ou des expressions. L'expression est value l'excution et produit toujours une valeur qu'il est possible de rutiliser. 1) LES OPERATEURS ARITHMETIQUES Les oprandes sont de types entier et/ou rel.
+ * / % addition et plus unaire soustraction et moins unaire multiplication division entire et relle reste de la division entire

Si les oprandes de / sont entiers il est effectue un division entire (exemple 5/2 donne 2). Si un des oprandes est rel le division est relle (exemple: 5.0/2 donne 2.5). En C l'valuation s'effectue de gauche droite. et chaque type d'oprateur a une priorit. Le - et + unaire sont les plus prioritaires, puis viennent sur un mme plan /, * et % et enfin l'addition et la soustraction. Si il subsiste une ambigu t dans l'ordre d'valuation des oprations, il est alors conseill d'utiliser les parenthses. Tout expression entre parenthse est value en premier. 2) LES OPERATEURS DE MANIPULATION DE BITS Ils s'appliquent aux types entier et caractres mais non aux objets de type rel.
& | ^ ~ << >> ET logique (AND) OU logique (OR) OU exclusif (EOR) complment un dcalage vers la gauche dcalage vers la droite

3) LES OPERATEURS RELATIONNELS


> >= < <= == != suprieur suprieur ou gal infrieur infrieur ou gal galit ingalit

Ce sont les oprateurs de comparaisons. Ils mettent en relations deux expressions, le rsultat est une nouvelle expression vraie ou fausse. Si la nouvelle expression est fausse elle prend la valeur entire 0, si elle est vraie elle prend la valeur 1. a=1.25 expression relle de valeur 2.5 (a*2) < (5/2) expression entire constante de valeur 2

expression entire de valeur 0

langc2.doc

Page 7

Cours sur le langage C 4) OPERATEURS LOGIQUES


! && || ngation d'une valeur logique ET logique de deux valeurs OU logiques de 2 valeurs logiques

Ces oprateurs interviennent sur des valeurs de type entier. w La valeur 0 est considr comme faux, w toutes les autres valeurs sont considres comme vrai. Les valeurs produites sont 0 pour faux et 1 pour vrai. Exemple: si i=1 et a=3 alors l'expression (i<10)&&(a!=2) est vraie et vaut 1. 5) L'AFFECTATION C'est l'opration la plus rpandue, elle est symbolise par =, elle introduit le rsultat de l'expression de droite dans la variable qui est gauche. exemples: i=8 k=j&0377 Une affectation est une expression qui prend la valeur de l'expression de droite. Cette valeur peut donc tre rutilise. exemple: x=y=z affecte y et x le contenu de z (opration effectue de droite gauche). x=2*(y=z) met le contenu de z dans y et 2*z dans x. 6) INCREMENTATION DECREMENTATION ++ ajoute 1 la variable qui lui est associe, ainsi ++x et x++ sont quivalents x=x+1. -- retranche 1 la variable qui lui est associe, ainsi --x et x-- sont quivalent x=x-1. Si l'oprateur est plac devant il y a incrmentation ou dcrmentation avant utilisation, si il est plac derrire elle aura lieu aprs l'utilisation. Exemple: y = x = 0 y = x++ donne 0 dans y et 1 dans x alors que y = ++x donne 1 dans y et dans x. 7) EXPRESSION CONDITIONNELLE Elle s'crit (expression)?(expression1):(expression2). Expression est value, si la valeur est vraie (diffrente de 0) c'est expression1 qui est value, sinon (valeur 0) c'est expression2 qui est value. Exemple: SI a < b alors z = a sinon z = b peut s'crire z = (a < b) ? a : b. 8) OPERATEURS D'ACCES AUX OBJETS L'oprateur unaire & fournit l'adresse de la variable qui le suit. L'oprateur unaire * fournit le contenu dont l'expression suit. Il ne faut pas les confondre avec la multiplication et le ET binaire. Si adr_obj = &obj alors obj = *adr_obj soit obj = *&obj. 9) OPERATEUR SIZEOF Il donne la taille en octet de l'oprande qui lui est associ. Syntaxe: sizeof(oprande). 10) OPERATEURS COMBINES Toutes les expressions de la forme <variable> = <variable> <oprateur> <expression> peuvent tre remplaces par <variable> <oprateur> = <expression>. Exemple: a = a + b est condens en a += b; de mme a = a|b se condense en a |= b etc...

langc2.doc

Page 8

Cours sur le langage C H) PRIORITES DES OPERATEURS OPERATEURS 1) GENERALITES Lors de l'valuation des expressions et afin de lever toute ambigu t , certaines rgles sont appliques systmatiquement par le compilateur: w les oprations les plus prioritaires sont appliques en premier, w les oprateurs de mme priorit sont appliqus de la gauche vers la droite (sauf les oprateurs unaires, les affectations et l'expression conditionnelle); w les expressions entre parenthses sont values en premier. 2) TABLEAU RECAPITULATIF
Oprateurs appel de fonction indexation champ de structure ngation logique ngation bit bit incrmentation dcrmentation moins unaire conversion indirection adresse taille multiplication division modulo addition soustraction dcalages relationnels galit diffrence et bit bit ou exclusif bit bit ou bit bit et logique ou logique expression conditionnelle affectation affectations tendues expression compose Symboles () [] ->, . ! ~ ++ -(<type>) * & sizeof * / % + << , >> <, <=, >, >= = != & ^ | && || ?: = +=, -=, *=, /=, %=, >>=, <<=, &=, |=, ^= , ordre d'valuation gauche droite --> droite gauche <-----

-->

--> --> --> --> --> --> --> --> --> <----<-----

-->

langc2.doc

Page 9

Cours sur le langage C I) LES INSTRUCTIONS INSTRUCTIONS SIMPLES Le texte en gras indique les mots du C. Les lments entre crochets [ ] sont facultatifs. Les lments entre < et > encadre le texte qui n'est pas taper mot mot. 1) INSTRUCTION VIDE Le point virgule seul signifie que le traitement est inexistant.

;
2) INSTRUCTION D'AFFECTATION <variable> = <expression>; La valeur rsultant de l'valuation de l'expression est place dans la variable. Une conversion du type du rsultat vers le type de la variable rceptrice peut intervenir si les deux types sont diffrents. Exemple: int i; char c; double x; .... i=12; c=2*i; /* expression de type entier convertie en caractre */ x=i/5; /* expression de type entier convertie en double */ x=i/5.0; /* expression de type double comme la variable */ 3) INSTRUCTION EXPRESSION <expression>; La valeur rsultant de l'valuation est inutilise et donc perdue. Un telle instruction est gnralement une expression d'affectation ou un appel de fonction retournant un rsultat indfini ou inutilis. 4) LE BLOC Les accolades sont utilises pour regrouper plusieurs instructions et en faire une instruction compose appele bloc. Une telle construction est syntaxiquement quivalente une instruction simple. Les dclarations dans un bloc (si il y en a) doivent tre au dbut, les objets ainsi dfinis ne sont visibles que dans le bloc lui mme. Le bloc peut apparatre partout ou une instruction est attendue. L'accolade fermante n'est jamais suivie d'un point-virgule. { [<dclarations>] <instruction>; <instruction>; ... }

langc2.doc

Page 10

Cours sur le langage C J) INSTRUCTION CONDITIONNELLE CONDITIONNELLE 1) SYNTAXE if (<expression>) <instruction1>; [else <instruction2>;] Lorsque l'expression dlivre la valeur vrai (entier non nul) <instruction1> est excute. Dans le cas contraire (zro) <instruction2> est excute si elle est prsente. 2) EXEMPLE if (delta<0) /* teste le discriminant */ printf("racines imaginaires"); else if (delta = = 0) /* peut aussi s'crire if (!delta) */ x = -b/(2*a); /* une racine double */ else { /* deux racines relles */ x1=(-b-sqrt(delta))/(2*a); x2=(-b+sqrt(delta))/(2*a); } 3) REMARQUES Du fait que le else est facultatif une ambigu t peut survenir lorsque un if suit un autre if. Exemple: if (e1) if (e2) action1 else action2 Pour lever l'ambigu t on adopte la rgle qui associe le premier else rencontr avec le if le plus proche qui le prcde. Ainsi action2 sera effectu si e1 est vrai et si e2 est faux.

langc2.doc

Page 11

Cours sur le langage C K) INSTRUCTION INSTRUCTION D'AIGUILLAGE 1) SYNTAXE switch(<expression-entire>) { case<valeur1>:<instruction-1>; case<valeur2>:<intruction-2>; ... case<valeuri>:<instruction-i>; ... case<valeurn>:<instruction-n>; [default :<inst-dfaut>;] } La valeur entire produite par l'expression est recherche parmi les constante <valeuri> puis l'instruction associe est excute ainsi que toutes les instructions qui suivent. Dans le cas o la valeur n'est pas trouve c'est l'instruction <inst-dfaut> qui est excute si elle est prsente. 2) EXEMPLE char c; ... switch (c) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y':printf("c est une voyelle"); } 3) UTILISATION DE L'INSTRUCTION BREAK DANS UN SWITCH Ds qu'une instruction break; est rencontre elle provoque le sortie de l'instruction switch et la poursuite l'instruction qui suit. Exemple: ici error est un entier qui contient un code d'erreur. int error; ... switch (error) { case 0:break; /* pas d'erreur */ case 1: case 2: case 3:printf("erreur numro %d",error);break; case -1:printf(""erreur catastrophique");break; default:printf("erreur %d inconnue",error); }

langc2.doc

Page 12

Cours sur le langage C L) LES LES INSTRUCTIONS REPETITIVES REPETITIVES OU BOUCLES 1) INSTRUCTION WHILE while(<expression>) <instruction> Tant que expression fournit une valeur vraie (entier non nul) l'instruction est excute. Le test de boucle est effectu en dbut de boucle. <instruction> peut ne pas s'effectuer. Exemple: while (n>0) {n=n-1} /* la fin on a 0 dans n si n est positif ou nul sinon n inchang */ On peut crire l'exemple prcdent des faons suivantes: while(n>0) {n-=1} while(n>0) {n--} while(n--) /* si on est sr que n>0 */ 2) INSTRUCTION DO do <instruction> while <expression>; L'instruction est effectue tant que expression fournit une valeur vraie (non nulle). Le test de boucle est effectu en fin de boucle. <instruction> s'effectue au moins une fois. Exemple: do {n=n-1} while (n>0); /* identique au prcdent si n>0 sinon on a n-1 dans n */ 3) INSTRUCTION FOR for(<inst-initiale>;<condition-fin>;<inst-incr>) <instruction> <inst-initiale> dfinit l'action correspondant l'initialisation. Cette instruction est excute une seule fois, avant la premire itration. C'est une instruction simple. <condition-fin> est une expression qui doit tre gale faux (zro) pour stopper la boucle. <inst-incr> dfinit le calcul effectuer entre deux itrations (avant d'effectuer l'valuation de <condition-fin>). C'est une instruction simple. <instruction> est le corps de la boucle ou itration. Un ou plusieurs termes peuvent tre absents. Les sparateurs point virgule permettent de lever les ambigu ts qui en dcouleraient. Ceci permet d'avoir les configurations suivantes: for(;test;incr) <instruction> /* pas d'initialisation */ for(init;test;) <instruction> /* pas de progression */ for(;test;) <instruction> /* identique while(test) <instruction> */ for(;;) /* boucle infinie */ Exemple: comptage des parenthses ouvrante et fermante d'une chane entre au clavier. for(begin=0,end=0;(c=getchar())!='\n;){ switch(c){ case '(':++begin;break; case ')':++end; } } printf("nombre de ( = %d",begin); printf("nombre de ) = %d",end); if(begin-end) printf("erreur de parenthses"); langc2.doc Page 13

Cours sur le langage C M) INSTRUCTIONS ASSOCIEES ASSOCIEES AUX BOUCLES 1) INSTRUCTION BREAK Syntaxe: break; Elle provoque une sortie immdiate de la boucle en cours d'excution. Le programme se poursuit l'instruction qui suit immdiatement la boucle. while (1) { ... if (exp) break; ... } for (;;) { ... if (exp) break; ... }

Elle est aussi utilise pour sortir aprs l'excution d'un cas dans un switch. 2) INSTRUCTION CONTINUE Syntaxe: continue; Elle donne le contrle la fin de la boucle sans en sortir, en sautant ainsi la squence d'instruction comprise entre le continue et la fin de boucle. Elle a pour effet de provoquer une nouvelle itration. Ce qui revient redonner le contrle au niveau du test de la condition. Dans le cas du for le troisime champ <inst-incr> est excut.
while (exp) { ... ... if (test) continue; ... } do { ... ... if (test) continue; ... } while (exp);

3) INSTRUCTION GOTO syntaxe: goto <label>; Label est un identificateur spcifiant l'endroit o doit tre fait le branchement. L'instruction oblige le programme se poursuivre l'instruction prfixe par le label. Cette instruction en langage volu est utiliser le moins possible. Exemple: ... goto etiq; ... etiq: printf("sortie de boucle"); 4) INSTRUCTION ";" C'est l'instruction ne rien faire. Elle permet par exemple de terminer une boucle while sans corps de boucle: while ((c=getchar())= =' '||c= ='\t'); /* permet d'ignorer espace et tabulation */.

langc2.doc

Page 14

Cours sur le langage C N) LES DIRECTIVES DE COMPILATION 1) INTRODUCTION Les directives de compilation commencent toujours par le symbole #. Elles ne sont pas excutables. Tout compilateur comprend un prprocesseur. Son action est uniquement une transformation du texte en fonction des directives de compilation donnes par le programmeur. Il est lanc automatiquement avant la compilation proprement dite pour prparer le fichier source. On distingue trois catgories de directives: w la directive de substitution symbolique: #define, w la directive d'inclusion de fichier: #include, w les directives de compilation conditionnelle: #if #else #endif #ifdef #ifndef. 2) MACRO-DEFINITIONS #define <identificateur> <chane de caractres> Cette directive ordonne au prprocesseur de remplacer toute apparition ultrieure de <identificateur> par <chane de caractres>. Exemple: #define PI 3.14159 #define BIP '07' #define NB_ELT (sizeof(tab) / sizeof(tab[0]) Le substitution dbute partir de sa substitution jusqu' la fin du fichier, ou jusqu' sa prochaine redfinition (nouveau #define avec le mme identificateur), ou encore jusqu' son invalidation par la directive: #undef <identificateur>. <chane de caractres> dbute aprs le premier espace suivant l'identificateur et se termine la fin de la ligne. La substitution n'a pas lieu dans les chanes de caractres entre guillemets. 3) MACRO-DEFINITIONS PARAMETREES #define <ident>(<liste-paramtres>) <chane> Remplace les apparitions de <identificateur>(<liste-paramtres>) par la chane de caractres qui suit. De plus, une substitution de chaque paramtre de la liste de la macro, par les paramtres correspondant sera effectue au point d'appel. <chane> dbute aprs le premier espace et se termine la fin de la ligne. <liste-paramtres> est une suite d'identificateurs spars par des virgules. Exemple: #define inf(x,y) ((x<y)?(x):(y)) ... c=inf(a,b); /* sera remplac par c=((a<b)?(a):(b)) par le prprocesseur */ ... d=inf(c,2*a); /* d=((c<2*a)?(c):(2*a)) */ Les paramtres x et y sont appels paramtres formels, ils ne servent qu' crire la macro, ils sont remplacs aux diffrents points d'appel par les paramtres effectifs ou expressions dont les valeurs vont effectivement servir l'valuation. Il faut autant de paramtres effectifs que de paramtres formels. langc2.doc Page 15

Cours sur le langage C 4) DESTRUCTION DE MACRO-DEFINITIONS #undef <macro> Dtruit le sens accord la macro. 5) INCLUSIONS DE FICHIERS SOURCES #include <fichier> Demande au prprocesseur de rechercher et d'inclure le contenu complet du fichier spcifi. Si <fichier> est un fichier d'en-tte du C localis dans le rpertoire spcial la directive s'crit: #define <stdio.h> #define <conio.h> ... Si <fichier> est un autre fichier la directive s'crit: #define "perso.x" #define "usr\connun\pile.h" ... Un fichier include peut contenir des dclarations usuelles, des dfinitions de variables globales, des constantes symboliques prdfinies et une ou plusieurs fonctions. 6) COMPILATION CONDITIONNELLE C'est l'une des trois directives suivantes: #if <expression constante> <liste instructions 1> [#else <liste instructions 2>] #endif #ifdef <identificateur> <liste instructions 1> [#else <liste instructions 2>] #endif #ifndef <identificateur> <liste instructions 1> [#else <liste instructions 2>] #endif

Si la valeur produite par le if est vraie c'est <liste d'instructions 1> qui sera compil, sinon ce sera <liste d'instructions 2> si le else est prsent. <expression constante> doit tre valuable lors de la compilation: la valeur produite est vraie si le rsultat est diffrent de zro, fausse sinon. #ifdef <identificateur> est vrai si <identifivateur> a t dfini dans une directive #define, faux sinon. #ifndef <identificateur> est la condition inverse. Exemple: #define DEBUG 1 /* on mettra DEBUG 0 si on ne veut pas compiler instructions-1 */ ... #if DEBUG ...instructions-1 /* n'est compil que si DEBUG est diffrent de zro */ #endif ...instructions-2 /* est compil dans tous les cas */

langc2.doc

Page 16

Cours sur le langage C O) LES FONCTIONS 1) GENERALITES Une fonction est un sous-programme qui ralise une action et produit une valeur ventuellement indfinie. L'action ralise est dfinie dans un bloc. Les fonctions ne peuvent s'imbriquer (une fonction ne peut contenir une autre fonction). Dclarer une fonction c'est donner au reste du programme les indications qui permettront aux autres fonctions (main comprise) de l'appeler. Dfinir une fonction c'est indiquer le contenu rel de la fonction elle-mme. 2) DECLARATIONS DE FONCTIONS Dclarer une fonction c'est donner son prototype, il est de la forme: <type> <nomfonction> ([<info_param1>,<info_param2>,etc.]); Ceci prcise le nom de la fonction, le type de la valeur qu'elle retourne et, entre parenthses, les informations concernant les paramtres formels ou arguments. <info_param> prcise pour chaque paramtre le type de donne et son nom. Lorsqu'aucun type n'est prcis, celui-ci est suppos tre int par dfaut. Si la fonction n'a pas de valeur retourner elle sera de type void. Mme si la liste de paramtres est vide les parenthses qui l'entourent restent obligatoires. Exemples: float get_ratio(double x,int y); int max(int a,b); /* identique max(int a,b); */ void toto(); /* identique void toto(void); */ 3) DEFINITIONS DE FONCTIONS Elle est de la forme <type> <nomfonction> ([<info_param1>,<info_param2>,etc.]) { [<dclarations locales>]; <instructions>; } On distingue l'en-tte, qui correspond au prototype sans point-virgule, et le corps entre accolades qui est constitu d'un bloc indiquant le contenu rel de la fonction. Toutes les dclarations faites l'intrieur ne sont visibles (c'est dire peuvent tre utilises) que dans cette fonction. Toute fonction qui n'est pas de type void devrait normalement comporter l'instruction return[(<expression>)]; qui dfinit la valeur qui doit tre retourne l'appelant. Exemples: int max(int a,b) { return((a>b)? a : b); } void erreur(char mess[16]) { printf("***erreur***/n>>%16s/n",mess); } langc2.doc Page 17

Cours sur le langage C 4) APPEL D'UNE FONCTION L'appel d'une fonction est ralise par: <nomfonction> (<liste des paramtres effectifs>); Les paramtres effectifs sont spars par des virgules dans la liste. L'excution du programme est interrompue, la liste des paramtres effectifs est mise en correspondance avec la liste des paramtres formels et les instructions de la fonction sont excutes, puis la valeur rsultat de la fonction est retourne l'appelant. Exemples: int j,r; r=max(2*j,10); /* initialise les paramtres formels a et b respectivement 2*j et 10 */ if (r>100) erreur("dpassement"); 5) PASSAGE DES PARAMETRES Les paramtres formels sont en fait des variables locales la fonction qui sont initialises lors de l'appel par les valeurs des paramtres effectifs (valeurs effectivement passes). Les valeurs des paramtres effectifs sont recopies dans les emplacements mmoire de la pile correspondant aux paramtres formels. La fonction travaille donc sur des copies et non sur les originaux qui restent intacts. On dit que le passage des paramtres se fait par valeur. Si la fonction a pour but de modifier le contenu des originaux il faut donc passer en argument l'adresse du paramtre effectif et non sa valeur. 6) VARIABLES LOCALES Les variables dclares dans le corps de la fonction sont locales, elles sont cres dans la pile lors de l'appel de la fonction comme les paramtres formels mais ne sont pas initialises (elles sont de classe auto). Les noms des variables locales un bloc doivent tre tous diffrents. Ces noms peuvent tre les mmes que ceux des variables dfinies au niveau global; dans ce cas ces variables globales de mmes noms ne sont plus visibles dans la fonction ou dans le bloc. L'attribut static permet de dfinir des variables locales rmanentes, il spcifie que cette variable doit tre alloue dans un emplacement mmoire permanent et non plus dans la pile comme les variables automatique (auto). La dure de vie d'une telle variable est alors celle du programme complet, en consquence, cette variable conserve sa valeur entre deux appels de la fonction. Exemple: f(char x,int *y) /* dfinition de la fonction f */ { x='s'; /* ne modifie pas l'original */ (*y)++;} /* modifie l'original */ int i; char c; f(c,&i); /* appel de la fonction f */ ... /* x=copie de la variable c; f laisse c inchang */ /* y=copie de l'adresse de i; f modifie le contenu de i */ 7) POINTEURS DE FONCTION L'identificateur d'une fonction sans les parenthses la suite reprsente l'adresse de la fonction. Il est donc possible de dfinir un pointeur sur une fonction: int (*ptrf)(); /* ptrf est un pointeur de fonction retournant un entier; ne pas confondre avec */ int *f(); /* f est une fonction retournant un pointeur sur un entier */ langc2.doc Page 18

Cours sur le langage C P) LES POINTEURS POINTEURS 1) DEFINITIONS Un pointeur est une variable contenant l'adresse d'un objet. L'oprateur & unaire fournit le pointeur (adresse) sur l'oprande . L'oprateur * unaire considre son oprande comme un pointeur et permet de dsigner l'objet point. Exemple: int i,j; ptr=&i; /* ptr contient l'adresse de la variable entire i */ j=*ptr; /* met l'entier point par ptr dans j; quivalent j=i */ La dclaration d'une variable pointeur fait toujours intervenir le type de l'objet point; on dit que le pointeur est typ. Dans l'exemple prcdent il fallait dclar la variable ptr ainsi: int *ptr (*ptr est un entier, ptr est donc un pointeur sur entier). On peut avoir un pointeur de pointeur: int **p_ptr. 2) OPERATIONS SUR LES POINTEURS Pointeur NULL NULL (en majuscules) est une valeur de pointeur constante et prdfinie valant 0. Cette valeur appartient tous les types de pointeurs et signifie "ne pointe aucun objet". Incrmentation dcrmentation L'incrmentation d'un pointeur par l'entier 1 est autoris et tient compte du type des objets points. Elle signifie "passer l'objet du type point qui suit immdiatement en mmoire". Cette incrmentation utilise donc la taille des objets points. Le rsultat rel est en fait une incrmentation de la valeur de cette taille. Une incrmentation par un entier quelconque est une rptition de l'opration prcdente. Dans le cas d'une valeur ngative, une dcrmentation lieu. Exemple: int *ptr,k; ptr++; /* le contenu de ptr est augment de la taille de l'entier */ ptr+=k; /* le contenu de ptr est augment de k fois la taille d'un entier */ ptr-=k; Comparaison Il est possible de comparer deux pointeurs entre eux et de comparer un pointeur la valeur NULL. Soustraction La diffrence de deux pointeurs de mme type donne le nombre d'lments entre les deux adresses. Pointeurs et chane de caractres Une chane de caractres est un tableau, l'utilisation d'une chane de caractres se traduit par la rservation en mmoire de la place ncessaire pour contenir cette chane (plus le caractre \0) et la production d'un pointeur sur le premier caractre de la chane. Exemple: char *p; p="Langage C"; /* p reoit l'adresse du caractre 'L' */

langc2.doc

Page 19

Cours sur le langage C Q) LES TABLEAUX 1) LES TABLEAUX SIMPLES Un tableau regroupe plusieurs donnes de mme type. Chaque donne du tableau est appel lment du tableau. La taille du tableau est donne entre [ et ]. Exemples de dclaration de tableaux: int tab[4]; /*tab est un tableau de 4 entiers*/ char message[10]; /*message est un tableau de 10 caractres*/ A chaque lment d'un tableau est associe une valeur entire appele indice. w l'indice du premier lment est toujours 0, w l'indice d'un tableau de taille n varie donc de 0 n-1. Pour accder un lment on utilisera l'identificateur du tableau associ une expression entre crochet dont l'valuation fournit l'indice. Exemples d'lments de tableaux: tab[3], mess[2+j]. 2) LES TABLEAUX A PLUSIEURS DIMENSIONS Ce sont les tableaux de tableaux. Il faut donc deux indices pour accder aux lments. Exemple de dclaration: int tab[3][2]; /*dclaration d'un tableau constitu de 3 tableaux de 2 entiers*/ En mmoire il faut savoir que c'est l'indice qui est le plus droite qui varie le plus vite.
tab[0][0] tab[0][1] tab[1][0] tab[1][1] tab[2][0] tab[2][1]

}
tab[1][]

}
tab[0][]

tab[2][]

Remarques int tab[20]; tab[i] est le i+1 ime lment du tableau, c'est une variable. tab est une constante, c'est l'adresse du tableau ou adresse du premier lment. tab est identique &tab[0] c'est un pointeur du type des lments du tableau. tab tant une constante les expressions suivantes sont fausses: tab++ ; tab=expression. double t2d[10][20]; t2d, t2d[i] avec 0 [ i [ 9 sont des constantes contenant des adresses. On a t2d =&t2d[0][0] et t2d[2]=&t2d[2][0]. t3d[i][j] 0 [ i [ 9 et 0[ j [ 19 sont des variables relles double. 3) INITIALISATION DES TABLEAUX Un tableau peut tre explicitement initialis au moment de la compilation si il est extern ou static: char text[10]="mon texte"; /*la dimension doit tre 10 au min compte tenu du \0 de fin de chane*/ char text[10]={'m','o','n',' ','t','e','x','t','e','\0'};/*quivalent la ligne du dessus*/ char text[]="mon texte";/*dimension est automatiquement calcule par le compilateur et mis 10*/ int chiffre[10]={0,1,2,3,4,5,6,7,8,9}; /* initialisation complte du tableau chiffre */ int pair[5]={2,4,6};/*les deux derniers lments sont initialiss zro*/ int tab[5][4]={ {0,1,2,3}, /* initialisation de tab[0][] */ {4,5,6,7}, /* initialisation de tab[1][] */ }; /* le reste est initialis 0 */ int tab[]; sans prcision de dimension ni initialisation est correct si tab a t dfini ailleurs avec sa dimension. Cette dclaration n'alloue aucun espace mmoire. langc2.doc Page 20