Vous êtes sur la page 1sur 56

Prpar par Mr.

MOUFID

Langage de Programmation C

Introduction
Le compilateur des langages C et C++ ne comporte aucun systme de scurit (linitialisation des variables avant leur utilisation, la division par zro, le dpassement de capacit dun tableau ou dune chane de caractres, ) pour pouvoir produire des programmes trs compacts et proches au langage machine. Cela ncessite au programmeur un niveau de rigueur trs important, une conception claire et complte et une matrise du langage. Le premier chapitre donne une prsentation gnrale de la notion de programmation en C et C++. Le deuxime chapitre dcrit le type arithmtique. Le troisime chapitre dcrit le traitement squentiel. Le quatrime chapitre est consacr au traitement conditionnel. Le cinquime chapitre est rserv au traitement itratif. Le sixime chapitre prsente la notion de tableau. Le septime chapitre prsente la notion de type en gnral et les deux types ENUM et UNION en particulier. Le huitime chapitre prsent le type chane de caractres. Le neuvime chapitre prsente la notion de fonction. Le dixime chapitre prsente la notion de sorte. Le onzime chapitre est rserv l'tude des fichiers. Le douzime chapitre prsente la notion de pointeur. Le treizime chapitre est rserv un certain nombre d'utilitaires. C'est le Turbo C & C++ qui est tudi dans ce polycopi.

-1-

Prpar par Mr. MOUFID

Langage de Programmation C

1. Programmation en C
1.1. Historique
C est un langage de programmation conu en 1972 par Dennis RITCHIE au sein des Laboratoires Bell Telephon. Il est utilis dans plusieurs domaines malgr qu'il est baptis de langage de programmation des ordinateurs. Il est indpendant de l'architecture de tous les ordinateurs. Le compilateur C et C++ est crit en C et le systme d'exploitation UNIX a t rcrit entirement en C quil doit son norme succs. C permet une grande efficacit dans l'criture des programmes et le code gnr. Il permet aussi l'accs toutes les ressources matrielles et logicielles du systme. C & C++ est faiblement typs, ils ne manipulent que les types proches de l'architecture des machines avec peu de contrle de type. Il n'y a pas d'instructions d'entre-sortie. Mais il possde une bibliothque standard trs riche. Il existe plusieurs versions : C : produit de la socit Microsoft Corporation ; Turbo C : produit de la socit Borland International Inc ; Vax C / ULTRIX : produit de Digital Equipment Corporation ; C ++ : C avec une intgration des concepts de la programmation oriente objet ; Objective C : C avec une intgration des concepts de la programmation oriente objet ; C ANSI : C standardis en 1988. Elle introduit les notions suivantes : SIGNED , CONST et VOLATILE ; Visual C++ : de Microsoft ; etc. Le vocabulaire des langages C et C++ est compos en : les symboles de base : les lettres : a , ... , z , A , ... , Z les chiffres : 0 , ... , 9 les symboles spciaux : + - ^ * / % " ' = > < . ; , ( ) [ ] { } # $ ! & | ~ ? : les caractres de contrles : lespace, la tabulation, le retour chariot, le saut de ligne, le saut de page, Les diffrents termes lexicaux de base de C et C++ sont : les identificateurs ; les constantes ; les oprateurs ; les sparateurs ; les mots rservs, mots cls : C et C++ standard : AUTO BREAK CASE CHAR CONTINUE DEFAULT DO DOUBLE ELSE EXTERN FLOAT FOR GOTO IF INT LONG REGISTER RETURN SHORT SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED WHILE ANSI : CONST ENUM SIGNED VOID VOLATILE certains compilateurs C utilisent en plus : ASM CDECL CATCH DELETE FAR FRIEND HUGE INLINE NEAR NEW PASCAL C++ : CLASS OPERATOR PRIVATE PROTECTED TEMPLATE THIS THROW TRY VIRTUEL

1.2. Structure d'un programme


Syntaxe :
La structure simplifie dun programme en C ou C++ est la suivante :

[ liste_incl ]
-2-

Prpar par Mr. MOUFID

Langage de Programmation C

VOID MAIN ( ) { [ liste_dc_var ] liste_instr } liste_incl = incl liste_incl / incl incl = #INCLUDE "nom_f" / #INCLUDE <nom_f> liste_dc_var = dc_var liste_dc_var / dc_var dc_var = type liste_var ; liste_var = var , liste_var / var var = identif liste_instr = instr ; liste_instr / instr ;
Un programme est compos d'une ou plusieurs fonctions. La premire fonction, fonction principale, est MAIN. La fonction MAIN est sans argument pour l'instant. VOID MAIN (VOID) Les parenthses ( ). Les accolades { }. La partie dclaration des variables est une liste de dclarations de variables. La dclaration d'une liste de variables est compose par le nom du type suivi par la liste des variables, une ou plusieurs variables spares par virgule, puis point-virgule. Toute variable utilise doit tre dclare. Un identificateur est une suite de lettres, de chiffres et du symbole soulign qui commence par une lettre ou un soulign. La taille maximale dun identificateur est 247 dont seulement les 32 premiers caractres sont pris en compte. Il y a une diffrence entre les lettres majuscules et les lettres minuscules pour les identificateurs. Pour certains compilateurs, il n'y a pas de diffrence pour les mots rservs. Un mot rserv ne peut pas tre utilis comme un identificateur. Les identificateurs, les symboles et les mots rservs sont spars entre eux par un sparateur. Il n'y a pas de rgles de leur positionnement dans une ligne. Un sparateur peut tre : un ou plusieurs caractres de contrles ou un oprateur. Remarques : Il est conseill de mettre les expressions entre parenthses pour viter les problmes de prcdence et dassociativit des oprateurs. Il est conseill de mettre les instructions et les dclarations entre accolades ensemblistes en formant des blocs pour une bonne structuration du programme.

1.3. Exemple
Calcul de la moyenne de trois notes d'un tudiant. #INCLUDE <STDIO.H> VOID MAIN() { INT A , B , C ; INT S ; FLOAT M ; SCANF("%d %d %d" , &A , &B , &C) ; S=A+B+C; M=S/3; PRINTF("La moyenne est : %6.2f\n" , M) ; }
-3-

Prpar par Mr. MOUFID

Langage de Programmation C

2. Type arithmtique
2.1. Entier
2.1.1. Entier court
Loccupation mmoire est : 2 octets.

A. Constante
L'intervalle des entiers courts est : [- 32768, 32767].

Exemples :
- 24, 25

B. Variable Syntaxe :

SHORT INT var_1 [, var_2 , ] ; SHORT var_1 [, var_2 , ] ; Dclare la liste des variables var_1, var_2, de type entier court. SIGNED SHORT INT var_1 [, var_2 , ] ; SIGNED SHORT var_1 [, var_2 , ] ; Dclare la liste des variables var_1, var_2, de type entier court sign.
Exemples :
SHORT A, B, C; A, B et C sont des identificateurs de variables de type entier court. SIGNED SHORT A, B, C; A, B et C sont des identificateurs de variables de type entier court sign.

2.1.2. Entier simple


A. Constante
L'intervalle des entiers simples correspond celui des entiers de l'architecture de la machine. Loccupation mmoire est : 2 ou 4 octets. Suivant le compilateur, un entier simple est cod sur : 16 bits dont 1 de signe comme le type SHORT et l'intervalle est : [- 32768, 32767] ou [- 32767, 32767] ; 32 bits dont 1 de signe comme le type LONG. Syntaxe :

const = [ - ] suite_chiffres
Exemples :
- 24, 25

Remarques :
En Turbo C, il y a l'oprateur + unaire. Par contre, dans d'autre compilateur, il n'existe pas et par consquent, + 25 n'est pas un entier. Les nombres entiers peuvent tre exprims en octal (resp. en hexadcimal). Les constantes octales (resp. hexadcimales) sont prcdes par 0 (resp. 0X ou 0x). En hexadcimal, les symboles utiliss en plus des chiffres sont A,..., F ou a,..., f. Exemples : 0432, 0734, 0120 0XF5A, 0x3465, 0X65fe
B. Variable

Syntaxe :

INT var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type entier simple. SIGNED INT var_1 [, var_2 ]; SIGNED var_1 [, var_2 ] ;
-4-

Prpar par Mr. MOUFID

Langage de Programmation C

Dclare la liste des variables var_1, var_2, de type entier simple sign. Exemple : INT A, B, C ; A, B et C sont des identificateurs de variables de type entier simple. SIGNED INT A, B, C; ou SIGNED A, B, C; A, B et C sont des identificateurs de variables de type entier simple sign.

2.1.3. Entier long


Loccupation mmoire est : 4 octets.

A. Constante
L'intervalle des entiers longs est : [- 2 147 483 648, 2 147 483 647]. Syntaxe :

const = [ - ] suite_chiffres l/L


Exemples :
- 24l , 25L

Remarque :
Le suffixe l ou L n'est pas accept en Turbo C.

B. Variable Syntaxe :

LONG INT var_1 [, var_2, ] ; LONG var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type entier long. SIGNED LONG INT var_1 [, var_2, ]; SIGNED LONG var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type entier long sign.
Exemple :
LONG A , B , C ; A , B et C sont des identificateurs de variables de type entier long. SIGNED LONG A , B , C ; A , B et C sont des identificateurs de variables de type entier long sign. Remarque : Un entier qui ne peut pas tre de type INT est considr de type LONG.

2.1.4. Entier court non sign


Loccupation mmoire est : 2 octets.

A. Constante
L'intervalle des entiers courts non signs est : [0, 32767]. Exemples: - 24 , 25

B. Variable Syntaxe:

UNSIGNED SHORT INT var_1 [, var_2 , ] ; UNSIGNED SHORT var_1 [, var_2 , ] ; Dclare la liste des variables var_1, var_2, de type entier court non sign.
Exemple :
UNSIGNED SHORT INT A , B , C ; ou UNSIGNED SHORT A , B , C ; A , B et C sont des identificateurs de variables de type entier court non sign.

2.1.5. Entier simple non sign


A. Constante
L'intervalle des entiers simples non signs est : [ 0 , 65 535 ].

Syntaxe :
-5-

Prpar par Mr. MOUFID

Langage de Programmation C

const = [ - ] suite_chiffres u/U const = [ - ] suite_chiffres u/U l/L


Exemples :
25U, 60 000u, 4 000 000 000 ul

B. Variable Syntaxe :

UNSIGNED INT var_1 [, var_2, ] ; UNSIGNED var_1 [, var_2 , ] ; Dclare la liste des variables var_1, var_2, de type entier simple non sign.
Exemple :
UNSIGNED INT A, B, C ; ou UNSIGNED A , B , C ; A, B et C sont des identificateurs de variables de type entier simple non sign.

2.1.6. Entier long non sign


Loccupation mmoire est : 4 octets.

A. Constante
L'intervalle des entiers longs non signs est : [0, 4 294 967 295]. Syntaxe :

const = [ - ] suite_chiffres u/U l/L


Exemples :
- 24l , 25L

Remarque :
Le suffixe l ou L n'est pas accept en Turbo C.

B. Variable Syntaxe :

UNSIGNED LONG INT var_1 [, var_2, ] ; UNSIGNED LONG var_1 [, var_2 , ] ; Dclare la liste des variables var_1, var_2, de type entier simple non sign.
Exemple :
UNSIGNED LONG INT A , B , C ; ou UNSIGNED LONG A , B , C ; A , B et C sont des identificateurs de variables de type entier long non sign. Remarques : Un entier qui ne peut pas tre de type INT est considr de type LONG. Les entiers non signs obissent aux lois de l'arithmtique modulo 2 avec n le nombre de bits pour les entiers : -A = 2n - A. Cest la reprsentation complment deux. A est obtenu, partir de A, en remplaant les 0 par des 1 et les 1 par des 0 puis ajouter 1.

2.2. Rel
2.2.1. Rel simple prcision
Loccupation mmoire est : 4 octets.

A. Constante
L'intervalle des rels en simple prcision est : [ - 3.4 10+38 , - 3.4 10-38 ] U { 0 } U [3.4 10-38 , 3.4 10+38 ]. Un rel en simple prcision est cod sur 32 bits : 1 bit pour le signe, 8 bits pour l'exposant et 23 bits pour la mantisse avec 7 chiffres significatifs ; 1 bit pour le signe, 7 bits pour l'exposant et 24 bits pour la mantisse avec 6 chiffres significatifs. Il y a deux manires d'crire un nombre dcimal : le format linaire : format point dcimal fixe [ signe ] [ suite_chiffres ] [ .suite_chiffres ] [f/F] le format exponentiel : format point dcimal flottant val_arithEval_ent[f/F]
-6-

Prpar par Mr. MOUFID

Langage de Programmation C

val_aritheval_ent[f/F] La mantisse val_arith est un nombre dcimal en format linaire et l'exposant val_ent est un nombre entier. La mantisse et l'exposant peuvent avoir au maximum 11 chiffres significatifs. Si un nombre a plus que 11 chiffres significatifs, il est arrondi. Exemples : 3.7 , 0.79f , 2.3E-7F , 57 Remarques : Utilisation de point au lieu de virgule dans l'criture d'un nombre dcimal. Le plus grand nombre en valeur absolue est : 1.7014118346E+38 Le plus petit nombre en valeur absolue est : 2.9387358771E-39 La prcision est de 6 dcimales.

B. Variable Syntaxe :

FLOAT var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type rel simple prcision.
Exemple :
FLOAT S, M ; S et M sont des identificateurs de variables de type rel simple prcision.

2.2.2. Rel double prcision


Loccupation mmoire est : 8 octets.

A. Constante
L'intervalle des rels en double prcision est : [ - 1.7 10+308 , - 1.7 10-308 ] U { 0 } U [1.7 10-308 , 1.7 10+308 ]. Une relle double prcision est cod sur 64 bits : 1 bit pour le signe, 11 bits pour l'exposant et 52 bits pour la mantisse avec 14 chiffres significatifs ; 1 bit pour le signe, 10 bits pour l'exposant et 53 bits pour la mantisse avec 15 chiffres significatifs. Il y a deux manires d'crire un nombre dcimal : le format linaire : format point dcimal fixe [ signe ] [ suite_chiffres ] [ .suite_chiffres ] [d/D] le format exponentiel : format point dcimal flottant val_arithEval_ent[d/D] val_aritheval_ent[d/D] Exemples : 3.7, 0.79d, 2.3E-7D, 57 Remarques : Le plus grand nombre en valeur absolue est : 1.7014118346E+38 Le plus petit nombre en valeur absolue est : 2.9387358771E-39 La prcision est de 15 dcimales.

B. Variable

LONG FLOAT var_1 [, var_2, ] ; DOUBLE var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type rel double prcision.
Exemple:
FLOAT LONG S, M; DOUBLE T, R ; S, M, T et R sont des identificateurs de variables de type rel double prcision.

2.2.3. Rel long double


Loccupation mmoire est : 10 octets.

A. Constante
L'intervalle des rels en double prcision est :
-7-

Prpar par Mr. MOUFID

Langage de Programmation C

[- 1.2 10+4932, - 1.2 10-4932] U {0} U [1.2 10-4932, 1.2 10+4932]. Un rel double prcision est cod sur 80 bits : 1 bit pour le signe, 64 bits pour l'exposant et 15 bits pour la mantisse avec 18 chiffres significatifs. Il y a deux manires d'crire un nombre dcimal : le format linaire : format point dcimal fixe [ signe ] [ suite_chiffres ] [ .suite_chiffres ] [d/D] le format exponentiel : format point dcimal flottant val_arithEval_ent[d/D] val_aritheval_ent[d/D]

Exemples :
3.7, 0.79d, 2.3E-7D, 57

Remarques :
Le plus grand nombre en valeur absolue est : 1.7014118346E+38 Le plus petit nombre en valeur absolue est : 2.9387358771E-39 La prcision est de 15 dcimales.

B. Variable

LONG DOUBLE var_1 [, var_2, ] ; Dclare la liste des variables var_1, var_2, de type rel long double.
Exemple :
LONG DOUBLE S, M, T, R ; S, M, T et R sont des identificateurs de variables de type rel long double.

2.3. Expression arithmtique


2.3.1. Oprateurs
A. Oprateurs arithmtiques
Les oprateurs arithmtiques suivant leur ordre de prcdence dcroissant : + - unaire */% +expr_ent_1 % expr_ent_2 Est le reste de la division euclidienne de expr_ent_1 par expr_ent_2. Les oprandes et le rsultat de % sont des entiers.

Exemples :
A*B+C A+B*C A/D*4 7 % 3 ===> 1 5/9 ===> 0 5.0 / 9.0 ===> 0.5555555556 5 / 9.0 ===> 0.5555555556 5.0 / 9 ===> 0.5555555556

B. Oprateurs binaires
Les oprandes des oprateurs suivants sont des INT, LONG ou CHAR : & force 0 des bits || force 1 des bits << Dcalage gauche >> Dcalage droite La liste des oprateurs par ordre dcroissant du prcdence

Signification

Oprateur
-8-

Nombre doprateurs

Associativit

Prpar par Mr. MOUFID

Langage de Programmation C

Port de variable Appel de fonction Constructeur de classe Indexation de tableau Slection de champ Slection de champ Conversion de type Taille en octets Adresse ou rfrence Pointeur Ngation binaire Ngation logique Signe positif Signe ngatif Incrmentation Dcrmentation Rservation de mmoire Restauration de mmoire Slection de champs Slection de champs Multiplication Division Modulo Addition Soustraction Dcalage gauche Dcalage droite Comparaison et binaire ou-exclusif binaire ou binaire et logique ou logique Affection conditionnelle Affectation Liste

:: :: () () [] -> . () SIZEOF & * ~ ! + ++ -NEW DELETE .* ->* * / % * +<< >> < > <= >= == != & ^ | && || ?: = += -= *= /= %= <<= >>= &= ^= |= ,

1 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 indfini

droite-gauche gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche droite-gauche gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite gauche-droite droite-gauche droite-gauche gauche-droite

2.3.2. Fonctions de la bibliothque


Les fonctions suivantes font partie de la bibliothque standard math.h. Pour pouvoir les utiliser, il faut ajouter la ligne suivante : #INCLUDE <math.h> Les oprandes et les rsultats de ces fonctions sont de type DOUBLE. Si le rsultat correct de ces fonctions doit provoquer un dbordement arithmtique, ces fonctions retournent la valeur HUGE_VAL avec le signe appropri.

A. Trigonomtrie

COS(expr_arith)
Retourne le cosinus de l'argument expr_arith qui est un angle en radians.

SIN(expr_arith)
Retourne le sinus de l'argument expr_arith qui est un angle en radians.

TAN(expr_arith)
-9-

Prpar par Mr. MOUFID

Langage de Programmation C

Retourne la tangente de l'argument expr_arith qui est un angle en radians.


Retourne l'arc-cosinus de l'argument expr_arith dans [-1, 1]. Le rsultat est un angle en radians dans] 0, [.

ACOS(expr_arith) ASIN(expr_arith)

Retourne l'arc-sinus de l'argument expr_arith dans [-1,1]. Le rsultat est un angle en radians dans]/2,/2[.

ATAN(expr_arith)
Retourne l'arc-tangente de l'argument expr_arith. Le rsultat est un angle en radians dans] - /2, /2 [.

COSH(expr_arith)
Retourne le cosinus hyperbolique de l'argument expr_arith qui est un angle en radians.

SINH(expr_arith)
Retourne le sinus hyperbolique de l'argument expr_arith qui est un angle en radians.

TANH(expr_arith)
Retourne la tangente hyperbolique de l'argument expr_arith qui est un angle en radians.

ACOSH(expr_arith)
Retourne l'arc-cosinus hyperbolique de l'argument expr_arith. Le rsultat est un angle en radians dans ]0, [.
Retourne l'arc-sinus hyperbolique de l'argument expr_arith. Le rsultat est un angle en radians dans] - /2, /2 [.

ASINH(expr_arith)

ATANH(expr_arith)
Retourne l'arc-tangente hyperbolique de l'argument expr_arith. Le rsultat est un angle en radians dans] /2 , /2 [.

EXP(expr_arith)
Retourne l'exponentielle de l'argument expr_arith qui est infrieure ou gale 87,3365.

LOG10(expr_arith)
Retourne le logarithme dcimal de l'argument expr_arith qui est strictement positif.

LOG(expr_arith)
Retourne le logarithme nprien de l'argument expr_arith qui est strictement positif.

B. Conversion

FLOOR(expr_arith)
Retourne le plus grand entier infrieur ou gal l'argument expr_arith.

RINT(expr_arith)
Retourne la partie entire arrondi de l'argument expr_arith.

CIEL(expr_arith)
Retourne le plus petit nombre suprieur ou gal l'argument expr_arith.

C. Nombre alatoire
Les fonctions suivantes font partie de la bibliothque standard stdlib.h.

SRAND(expr_arith)
Rinitialise le gnrateur de nombre alatoire avec expr_arith, qui est un nombre entier simple non sign. Sans cette instruction, le gnrateur de nombre alatoire est rinitialis avec1.

RAND()
Retourne un nombre entier simple non sign alatoire.

RANDOM()
Retourne un nombre entier long alatoire. Remarque : a+RAND%(b-a+1) Retourne un nombre alatoire dans [a, b].
- 10 -

Prpar par Mr. MOUFID

Langage de Programmation C

SRAND((unsigned)time(NULL)) ; Rinitialise le gnrateur de nombre alatoire avec un nombre alatoire.

D. Divers

FABS(expr_arith)
Retourne la valeur absolue de l'argument expr_arith.

SQRT(expr_arith)
Retourne la racine carre de l'argument expr_arith qui est positif ou nul.

POW(expr_arith_1 , expr_arith_2)
Retourne le rsultat de l'argument expr_arith_1 la puissance l'argument expr_arith_2.

POW10(expr_arith)
Retourne le rsultat de 10 la puissance l'argument expr_arith de type entier.

FMOD(expr_arith_1 , expr_arith_2) Retourne le reste de la division entire de expr_arith_1 par expr_arith_2 de type entier. MODF(expr_arith, var_ent) Retourne la mantisse de expr_arith en plaant sa partie entire dans var_ent.

2.4. Conversion
(type) expr
Retourne la valeur de l'expression expr aprs l'avoir converti en type type. La conversion du type DOUBLE en type FLOAT arrondie le nombre avant de le tronquer. Une expression peut avoir des oprandes de types diffrents, dans ce cas des conversions automatiques sont appliques : SORT et CHAR sont converti en INT et FLOAT est converti en DOUBLE ; le rsultat d'une expression est INT si tous les oprandes sont INT ; si un oprande est DOUBLE l'autre oprande est convertit en DOUBLE est le rsultat est en DOUBLE ; si un oprande est LONG l'autre oprande est converti en LONG et le rsultat est en LONG ; si un oprande est UNSIGNE l'autre oprande est converti en UNSIGNE et le rsultat est en UNSIGNE ; LONG est converti en INT avec troncation, le rsultat peut donc tre erron ; FLOAT est converti en INT avec perte de la partie dcimale ; DOUBLE est converti en FLOAT arrondi puis tronqu avec perte de prcision. Exemples : INT(A) 65 A + 1 66 Par dfaut, les constantes entires sont de type INT. Par dfaut, les constantes dcimales sont de type DOUBLE.

VOLATILE type var ; dclare la variable var de type type qui peut tre modifie par un vnement externe comme le systme
dexploitation ou un priphrique en dehors des modification normales par le programme.

- 11 -

Prpar par Mr. MOUFID

Langage de Programmation C

3. Traitement squentiel
3.1. Instructions de base
3.1.1 Lecture
En C et C++, les fonctions d'entre-sortie n'appartiennent pas au langage, mais elles se trouvent dans la bibliothque standard d'entre-sortie de C et C++ respectivement. Pour tout programme utilisant des instructions de lecture ou d'criture, il faut ajouter la ligne suivante avant MAIN() :

#INCLUDE <STDIO.H>
STDIO.H est le fichier de la bibliothque standard d'entre-sortie. Cette ligne n'est pas obligatoire en Turbo C. Syntaxe :

SCANF(const_chane , &var_1 [ , &var_2 , ... ] ) ; const_chane est une chane de caractres entre guillemets compose par la liste des formes des
variables lire.

&var_1, &var_2 , ... est une liste des adresses des variables lire.
Le format est compos de 4 parties sans espace : % : indique l'endroit de lecture ; val : une valeur entire indiquant la longueur en caractre ; chane_1 : un symbole indiquant le format et pas obligatoire ; chane_2 : une ou deux lettres indiquant le type . chane_1 est l'une des formes suivantes : - : fait une justification gauche de la valeur, droite par dfaut ; + : ajoute le symbole + en cas d'un nombre positif ; * : ignore un nombre dans la liste saisie. chane_2 est l'une des formes suivantes : hi ou hd : un nombre dcimal de type short ; i ou d : un nombre dcimal de type int ; li ou ld : un nombre dcimal de type long ; ho : un nombre octal de type short ; o : un nombre octal de type int ; lo : un nombre octal de type long ; hx : un nombre hexadcimal, en utilisant les lettres : 'a',...'f', de type short ; hX : un nombre hexadcimal, en utilisant les lettres : 'A',...'F', de type short ; x : un nombre hexadcimal, en utilisant les lettres : 'a',...'f', de type int ; X : un nombre hexadcimal, en utilisant les lettres : 'A',...'F', de type int ; lx : un nombre hexadcimal, en utilisant les lettres : 'a',...'f', de type long ; lX : un nombre hexadcimal, en utilisant les lettres : 'A',...'F', de type long ; hu : un nombre dcimal non sign de type short ; u : un nombre dcimal non sign de type int ; lu : un nombre dcimal non sign de type long ; f : un nombre rel simple en format linaire ; lf : un nombre rel double en format linaire ; e : un nombre rel simple en format exponentiel en utilisant la lettre 'e' ; E : un nombre rel simple en format exponentiel en utilisant la lettre 'E' ; le : un nombre rel double en format exponentiel en utilisant la lettre 'e' ; lE : un nombre rel double en format exponentiel en utilisant la lettre 'E' ; g : un nombre rel en format linaire ; c : un caractre ; s : une chane de caractres.

- 12 -

Prpar par Mr. MOUFID

Langage de Programmation C

Exemples :
%d %ld %o %x %f %2d ne prend en compte que les deux premier chiffres introduits par l'utilisateur. %*d ignore un entier dans la liste saisie. %*2d ignore un mot de longueur 2 form par l'alphabet {0,...,9}. %*[256] ignore un mot form par l'alphabet {2,5,6}. Exemples : SCANF("%l %o" , &A , &B) ; l'utilisateur doit introduire 2 nombres entiers spars par un espace. L'espace peut tre toute combinaison de caractres d'espacement, de tabulation ou d'interligne. SCANF("%d" , &I) ; si l'utilisateur entre 1o au lieu de 10, I prend la valeur 1 sans message d'erreur. SCANF("%l , %o" , &A , &B) ; l'utilisateur doit introduire 2 nombres entiers spars par une virgule. SCANF("%l %o" , &A , &B) ; SCANF("%f" , &C) ; SCANF("%3d %*2d %f" , &A , %B) ; si lutilisateur entre 1234567.8 alors A pend 123 et B 67.8 avec la valeur 45 ignore. La fonction de lecture s'arrte lorsque la lecture suivant le format spcifi est termine ou lorsque elle rencontre une anomalie entre les entres et le format. Elle retourne EOF la fin du fichier d'entre. Les donnes saisies par l'utilisateur sur le terminal sont affectes la liste des variables en respectant l'ordre de saisie. Le curseur reste sa position aprs l'appui de la touche Return par l'utilisateur. Remarque : Les variables scalaires, entier, rel ou caractre, doivent tre prcdes par &. &var : est l'adresse, emplacement mmoire, de la variable var. Remarques : Le nombre de donnes doit tre au moins gal au nombre de variables. Les valeurs en plus seront ignores. Les donnes sont spares par au moins un espace. Le type d'une donne doit correspondre au type de la variable associe. Pour les variables numriques, la donne est une constante numrique et pas une expression arithmtique.

3.1.2. Ecriture
Syntaxe :

PRINTF( const_chane [, expr_1 [ , expr_2 ; ... ] ] ) ; const_chane est une chane de caractres entre guillemets compose par la liste des formes des
valeurs des expressions crire avec ventuellement des chanes de caractres afficher sans interprtation.

ent_1 ent_1.ent_2
La valeur de l'expression expr est affiche dans un champ de ent_1 positions, y compris le point dcimal et le signe du nombre. Si expr est un rel, nous pouvons spcifier le nombre de chiffres aprs le point dcimal par ent_2.
- 13 -

Prpar par Mr. MOUFID

Langage de Programmation C

Par dfaut les rels sont affichs en format exponentiel. %% : le caractre % ; %? : Le caractre ? ; \" : le caractre " ; \' : le caractre ' ; \\ : le caractre \ ; \b : l'effacement arrire ; \t : la tabulation ; \n : l'interligne ; \r : le retour chariot ; \f : le saut de page ; \b : le signal sonore. \0 : le caractre NUL ; \val: le caractre de code ASCII val. val est un nombre octal de 1 , 2 ou 3 chiffres ; \xval : le caractre de code ASCII val. val est un nombre hexadcimal de 1 , 2 ou 3 chiffres. # : ajoute la base du nombre, cest--dire : 0 : pour loctal ; 0x : pour lhexadcimal, en utilisant les lettres : 'a',...'f' ; 0X : pour lhexadcimal, en utilisant les lettres : 'A',...'F'. + : prcde le nombre par le signe + ou le signe suivant son signe. Exemples : PRINTF("%5d" , A) ; PRINTF("%5f" , F * 3) ; PRINTF("A") ; PRINTF("\n CREDIT \t DEBIT") ; PRINTF("%f%d" , J , (I<N)? A : B) ; PRINTF((I<N)? "%d" A : "%d" B , "%f" J) ; Exemples : INT A ; SCANF("%d" , &A) ; PRINTF("%3f" , A) ; Si on entre 3, on reoit lerreur suivante lexcution : printf : floating point formats not linked Abnormal program termination. INT A ; SCANF("%d" , &A) ; PRINTF("%d" , A) ; Si on entre 45987, on reoit -19549. INT A ; PRINTF("%d" , A) ; On reoit 0. INT A ; SCANF("%ld" , &A) ; PRINTF("%d" , A) ; Si on entre 65789, on reoit 253. INT A ; SCANF("%ld" , &A) ; PRINTF("%ld" , A) ; Si on entre 145784, on reoit 964180344. LONG A ; PRINTF("%ld" , A) ; On reoit 468470. LONG A ; PRINTF("%3d" , A) ;
- 14 -

Prpar par Mr. MOUFID

Langage de Programmation C

On reoit 468. FLOAT A ; PRINTF("%f" , A) ; On reoit 9512664541238919170.000000. FLOAT A ; PRINTF("%e" , A) ; On reoit 9.512665e+18. FLOAT A ; PRINTF("%el" , A) ; on reoit 9.512665e+18l. FLOAT A ; SCANF("%f" , &A) ; PRINTF("%f" , A) ; Si on entre 45, on reoit 45.000000. Si on entre 45.2546384, on reoit 45.254638. Si on entre 45.124578978, on reoit 45.124580. Si on entre 45.14578786, on reoit 45.145788. Si on entre 1.2e-14, on reoit 0.000000. FLOAT A ; SCANF("%f" , &A) ; PRINTF("%e" , A) ; Si on entre 45e39, on reoit +INF. Si on entre 54e-45, on reoit 5.465064e-44. Si on entre 45e23, on reoit 4.500000e+24. FLOAT A ; SCANF("%f" , &A) ; PRINTF("%el" , A) ; Si on entre 45, on reoit 4.500000e+01l. Si on entre 45e45, on reoit +INFl. Si on entre 54212154878, on reoit 5.421215e+03l. LONG FLOAT A ; SCANF("%f" , &A) ; PRINTF("%el" , A) ; Si on entre +78e458, on reoit +1.797693e+308l. Si on entre -78e458, on reoit -1.797693e+308l. Si on entre +54e-458, on reoit +0.000000e+00. Si on entre -54e-458, on reoit -0.000000e+00. LONG FLOAT A ; SCANF("%le" , &A) ; PRINTF("%d" , A) ; Si on entre 45.12, on reoit -15729. En C++, il y a deux manires de gestion des entres-sorties : par des fonctions conventionnelles dentres-sorties o les fonctions se trouvent dans la bibliothque : stdio.h ; par des flux de donnes o les fonctions se trouvent dans les bibliothques : iostream.h, ios.h et iomanip.h.

A. Lecture Syntaxe :
cin >> var Exemples :

B. Ecriture Syntaxe :
- 15 -

Prpar par Mr. MOUFID

Langage de Programmation C

cout << [ chane ] << expr_1 [ << expr_2 ] ; affichage de la liste des expressions expr_1, expr_2, lcran suivant le format chane.
Le format daffichage suit la notation suivante : dec oct hex setiosflags resetiosflags setprecision setw setfill Exemples :

3.1.3. Affectation
Syntaxe :

var = expr ; var_1 = var_2 = ... = var_n = expr ; ++var ; pr-incrmentation var++ ; poste-incrmentation --var ; var-- ; var op= expr ; var = expr_log ? expr_1 : expr_2 ; op = + - * / % << >> & ^ |
Remarques : A=B peut tre considr comme une expression qui la valeur et le type du membre gauche, cest--dire A. Dans le cas d'une affectation numrique, la valeur de l'expression est convertie dans le type de la variable. Exemples : A=3/8; B=C; R=S=T*6; A=B=C; ++I ; J++ ; A = ++I ; ===> A = I ; I = I + 1 ; B = I++ ; ===> I = I + 1 ; B = I ; C = A + I++ ; --K ; L-- ; I += 3 ; K = A>B ? 5 : 3 ;
x = ( y = 3 , z = 2 * y) ; ===> y = 3 ; z = 6 ; x = 6 ;

x=y=3,z=2*y; ===> y = 3 ; x = 3 ; z = 6 ; Remarque : La partie gauche d'une affectation est obligatoirement une variable et pas un identificateur de type constant, dfinie par CONST ou #DEFINE.

3.2. Notions de base


3.2.1. Initialisation
Les variables ne sont pas automatiquement initialises. Elles peuvent tre initialises lors de ses dclarations. Le contenu dune variable non initialise est imprvisible. Exemple : FLOAT R = 10.34 ; l'identificateur R est dclar comme une variable de type rel initialis par la valeur 10.34. Exemples : INT A = B = C = 0 ; INT A , B = 10 ; INT C = 20 , D = 30 , F = 20 * D ; LONG E = 500 * 100 ;
- 16 -

Prpar par Mr. MOUFID

Langage de Programmation C

Le contenu d'une variable non initialise est indtermin sauf pour les variables globales.

2.3.2. Inclusion de fichier


Syntaxe :

#INCLUDE "nom_f"
Smantique :
Insert le fichier de nom nom_f la position o se trouve cette ligne. La recherche du fichier est effectue dans le chemin de nom_f puis dans le rpertoire du fichier source. Syntaxe :

#INCLUDE <nom_f>
Smantique :
Insert le fichier de nom nom_f la position ou se trouve cette ligne. La recherche du fichier est effectue dans le chemin de nom_f puis dans le rpertoire dinclusion qui porte gnralement le nom INCLUDE. Exemples : #INCLUDE "stdio.h" #INCLUDE "global.c"

3.2.3. Constante
En C et C++, il y a la notion de constante nomme en plus de la possibilit de dfinir des constantes avec #DEFINE. Syntaxe :

CONST [type] identif_1 = val_1 [ , identif_2 = val_2 , ];


Exemple :
CONST INT MAX = 10 ; Remarque : Les constantes nommes ne sont pas ranges dans la mmoire car elles sont connues la compilation.

3.2.4. Commentaire
Syntaxe :

/* chane */
Un commentaire n'importe quelle position de la ligne et mme l'intrieur d'une instruction. La chane de caractres peut occuper plusieurs lignes. Smantique : Introduction de remarques et de commentaires dans un programme. En C++, il y aussi les syntaxes suivantes : Syntaxe :

// chane
Syntaxe :

// chane \ chane \ chane

3.2.5. Instruction fictive


; Est une instruction fictive.

3.3. Exemple
Calcul de la moyenne de trois notes d'un tudiant. /* La moyenne de 3 notes */ #INCLUDE <STDIO.H> #DEFINE c1 = 2 #DEFINE c2 = 3 #DEFINE c3 = 2
- 17 -

Prpar par Mr. MOUFID

Langage de Programmation C

MAIN() { INT A , B , C ; INT S ; FLOAT M ; /* Corps du programme */ PRINTF("Donner les 3 notes : ") ; /* Lecture des donnes */ SCANF("%d %d %d" , &A , &B , &C) ; S = A * c1 + B * c2 + C * c3 ; M = S / (c1 + c2 + c3) ; PRINTF("La moyenne est : %6.2f\n" , M) ; }

EXERCICES
Exercice 1 : Ecrire un programme en C ou C++ qui permet de calculer la surface d'un rectangle. Exercice 2 : crire un programme en C ou C++ permettant la dcomposition d'un intervalle de temps, donn en secondes, en heures, minutes et secondes. Exercice 3 : crire un programme en C ou C++ qui permet de raliser la permutation circulaire de trois nombres.

- 18 -

Prpar par Mr. MOUFID

Langage de Programmation C

4. Traitement conditionnel
4.1. Branchement inconditionnel
Syntaxe :

GOTO identif ;
Syntaxe :

identif: instr ;
Remarque :
Il n'y a pas de dclaration d'tiquette. Exemple : SCANF("%d" , &A) ; REP : B = A * 2 ; PRINTF("%5d" , B) ; GOTO REP ; Exemple : SCANF("%d" , &A) ; B=A*2; C=A*3; GOTO SAUT ; PRINTF("%5d" , B) ; SAUT : PRINTF("%5d" , C) ; Remarques : L'instruction GOTO peut tre utilise dans une structure de IF, CASE, FOR, WHILE ou REPEAT. Le domaine de validit de l'tiquette est uniquement le bloc o elle est dfinie.

4.2. Expression logique


En C et C++, il n'y a pas de type logique : une expression numrique de valeur 1 ou non nulle reprsente vrai ; une expression numrique de valeur 0 reprsente faux. Les oprateurs relationnels : == < > <= >= != Les oprateurs logiques : ! || && ^^ Remarque : L'valuation d'une expression logique est arrte aussitt que sa valeur est dtermine. Exemples : (5>3) || (A>3) est vrai (5<3) && (A>3) est faux Remarques : B == 0 est quivalent !B C != 0 est quivalent C

4.3. Instruction conditionnelle


Syntaxe :

IF (expr_log) module_1 [ ELSE module_2 ] module = ; / instr ; / bloc / suite_instr bloc = { liste_dc_var liste_instr } liste_instr = instr ; liste_instr / instr ; suite_instr = instr , suite_instr / instr ;
Remarques :
En Turbo C, ; n'est pas obligatoire juste avant }. Un bloc ne se termine jamais par ;. ELSE se rapport toujours au IF le plus rapproch, sauf en prsence d'accolades.
- 19 -

Prpar par Mr. MOUFID

Langage de Programmation C

Exemple :
IF (D >= 0) PRINTF("Il y a des solutions relles") ; ELSE PRINTF("Il n\'y a pas de solutions relles") ; Exemple : IF (D == 0) { FLOAT x0 ; x0 = - B / (2 * A) ; PRINTF("\nLa racine unique est : %5.2f\n" , x0) ;
GOTO Fin ; }

Remarque :
IF (A>B) IF (B>C) M = A ; ELSE M = B ; n'est pas quivalent IF (A>B) { IF (B>C) M = A ; } ELSE M = B ; Remarque :
IF (I == J) ...

n'est pas quivalent


IF ((I = J) ! 0) ...

Exemple :
A=5 IF (A>B) ... est quivalent
IF ((A=5)>B) ...

Exemple :
((A % 4 == 0) && (A % 100 != 0)) || (A % 400 == 0)

une anne est bissextile lorsqu'elle est divisible par 4 et pas par 100 ou lorsqu'elle est divisible par 400. Remarque : L'initialisation des variables locales un bloc peut utiliser des expressions quelconques et mme utiliser des variables globales.

4.4. Traitement par cas


Syntaxe :

SWITCH (expr_ent) { CASE expr_const_1 : [ module_1 ; BREAK ; ] CASE expr_const_2 : module_2 ; BREAK ; ... [ DEFAULT : module ; BREAK ; ] }
Remarques :
Les expressions doivent tre des entiers ou des caractres de mme type. BREAK de DEFAULT nest pas obligatoire si DEFAULT est la fin. Smantique : Si un cas correspond la valeur de l'expression teste, alors toutes les instructions du module correspondant sont excutes puis il passe au cas suivant sans faire de teste. Pour forcer la terminaison de l'instruction SWITCH il faut utiliser l'instruction BREAK. Exemple : switch (m) { case 20 : case 19 : case 18 : printf("tres bien") ; break ;
- 20 -

Prpar par Mr. MOUFID

Langage de Programmation C

case 17 : case 16 : printf("bien") ; break ; case 15 : case 14 : printf("assez bien") ; break ; case 13 : case 12 : case 11 : case 10 : printf("passable") ; break ; default : printf("ajourne") ; }

EXERCICES
Exercice 1 : crire un programme en C ou C++ qui permet de dterminer du plus grand nombre de trois nombres donns. Exercice 2 : crire un programme en C ou C++ qui permet de rsoudre l'quation du second degr AX2+BX+C=0, coefficients rels. Exercice 3 : Ecrire un programme en C ou C++ permettant la dtermination de la date du lendemain partir d'une date donne.

- 21 -

Prpar par Mr. MOUFID

Langage de Programmation C

5. Traitement itratif
5.1. Itration simple
Syntaxe :

FOR ( [instr_1_1[[,instr_1_2]...]] ; [expr_log] ; [instr_2_1[[,instr_2_2]...]] ) module module = ; / instr ; / bloc bloc = { liste_dc_var liste_instr } liste_dc_var = dc_var liste_dc_var / dc_var liste_instr = instr ; liste_instr / instr ; Si expr_log n'existe pas elle est considre comme toujours vrai.
Remarque :

FOR ( [instr_1_1[[,instr_1_2]...]] ; expr_log ; [instr_2_1[[,instr_2_2]...]] ) module


est quivalent

[instr_1_1[[,instr_1_2]...]] ; tiq : IF expr_log { module [instr_2_1[[,instr_2_2]...]] ; GOTO tiq ; }


Exemple :
FOR (I = 1 ; I<=1000 ; ++I) ;

Exemple :
FOR ( ; ; ) PRINTF("Informatique") ;

Exemple :
FOR (I = 1 ; I<=10 ; ++I) PRINTF("Informatique") ; Exemple : FOR (I = 10 ; I>=1 ; --I) { PRINTF("Informatique") ; PRINTF("Mathmatiques") ; } Exemple : FOR (A=-1 ; A<=0 ; ) SCANF("%d" , &A) ; Remarques : FOR peut tre utilise sans module rpter. FOR peut tre utilise sans connatre le nombre de fois de rptitions. BREAK : interrompt l'excution d'un bloc et passe l'instruction qui suive le bloc. BREAK ne peut tre que dans une instruction de traitement par cas ou une itration. CONTINUE : interrompt l'excution du bloc et passe l'tape suivante de la boucle o elle se trouve. CONTINUE ne peut tre que dans une instruction ditration. Remarque : FOR (...) { ... CONTINUE ; ... } est quivalent
- 22 -

Prpar par Mr. MOUFID

Langage de Programmation C

FOR (...) { ... GOTO identif ; ... identif : ; } Remarque : FOR (...) { ... BREAK ; ... } ... est quivalent FOR (...) { ... GOTO identif ; ... } identif : ...

5.2. Itration conditionnelle


Syntaxe :

WHILE (expr_log) module module = ; / instr ; / bloc


Exemple :
SCANF("%d" , &A) ; WHILE (A != 0) SCANF("%d" , &A) ; Syntaxe :

DO module WHILE (expr_log) ;


Exemple :
DO SCANF("%d" , &A) ; WHILE (A = 0) ;

EXERCICES
Exercice 1 : crire un programme en C ou C++ qui permet de calculer la moyenne arithmtique d'une suite de N nombres. Exercice 2 : crire un programme en C ou C++ qui permet de dterminer du plus grand nombre d'une suite de N nombres. Exercice 3 : crire un programme en C ou C++ permettant la dtermination de tous les diviseurs d'un nombre donn. Exercice 4 : crire un programme en C ou C++ permettant la dtermination d'un nombre donn s'il est parfait ou non. Un nombre est parfait s'il est gal la somme de ses diviseurs autre que lui-mme.
- 23 -

Prpar par Mr. MOUFID

Langage de Programmation C

Exercice 5 : crire un programme en C ou C++ permettant la dtermination de tous les nombres parfait infrieurs un nombre donn. Exercice 6 : crire un programme en C ou C++ qui permet de calculer la Factorielle dun nombre entier N. Exercice 7 : crire un programme en C ou C++ qui permet de calculer le sinus hyperbolique d'un nombre X comme limite de la somme de la srie suivante : X3 X5 XN S=X+ + + ... + 3! 5! N! Exercice 8 : Calcul du Nme terme de la suite de Fibonacci dfinie par : u0 = 0 u1 = 1 ui = ui-1 + ui-2

- 24 -

Prpar par Mr. MOUFID

Langage de Programmation C

6. Tableau
6.1. Dfinition
Syntaxe :

type identif [[expr_const_ent]] [ = {expr_1, } ] ; identif est un tableau de expr_const_ent valeurs de type type, de taille indfinie par dfaut ou dtermine par le nombre de valeurs de la liste de valeurs dinitialisation expr_1,. L'intervalle entier des indices est [ 0 , expr_const_ent - 1 ]. La taille du tableau expr_const_ent doit tre une expression constante de type entier dont la valeur
est calculable ds la compilation. La liste de valeurs dinitialisation expr_1,. Si le nombre de valeurs dinitialisation est infrieur la taille du tableau, les valeurs dinitialisation sont affectes aux premiers lments du tableau et les autres lments sont initialiss par 0. Syntaxe :

type identif [[expr_const_ent_1]][[expr_const_ent_2]] [ = { {expr_1_1, }, {expr_2_1, }, } ] ; identif est un tableau, de expr_const_ent_1 lignes et expr_const_ent_2 colonnes dont les valeurs sont de type type. L'intervalle entier des indices de lignes est : [ 0 , expr_const_ent_1 - 1 ]. L'intervalle entier des indices de colonnes est : [ 0 , expr_const_ent_2 - 1 ]. Le nombre de lignes expr_const_ent_1 et de colonnes expr_const_ent_2 du tableau doivent tre
des expressions constantes de type entier dont leur valeurs sont calculable ds la compilation. Exemple : #DEFINE MAX 10 INT V1[5] ; FLOAT V2[] = { 5 , 2 , 9 , 2 , 9 } ; INT V3[4] , V4[5] , T[MAX+1] ; FLOAT M1[4][2] = { { 1 , 5 } , { 2 } , { 3 , 6 } } ; INT M2[MAX][MAX] ; INT M3[3][2] = { 1 , 6 , 4 , 5 , 6 , 6 } ; INT V[1000]={0} ; Utilisation :

identif[expr_ent_1] [ [ [expr_ent_2] ] ... ]


Exemples :
V1[I] = A * 3 ; B = V2[1] / 5 ; V4[1] = V4[0] * 2 ; M1[I][J] = A * B ; A = M2[I][J] * B ; V1 = { 1 , 9 , 0 , 7 , 7 } ; SCANF("%d" , &V1[1]) ; V1 = V2 ; Loccupation mmoire est : nombre d'lments * taille du type des lments. Remarques : Il n'y a pas de contrle d'accs en dehors des limites d'un tableau. L'initialisation se fait ligne par ligne. identif reprsente ladresse du premier lment du tableau identif. identif est quivalent &identif[0].

- 25 -

Prpar par Mr. MOUFID

Langage de Programmation C

EXERCICES
Exercice 1 : crire un programme en C ou C++ qui calcul le nombre d'lments nuls dans un vecteur d'ordre N. Exercice 2 : crire un programme en C ou C++ qui permet de calculer la somme des lments dun tableau donne, en saisissant leurs lments. Exercice 3 : crire un programme en C ou C++ qui permet de trouver le plus grand lment dun tableau d'ordre N. Exercice 4 : crire un programme en C ou C++ qui permet de trouver le plus petit lment dun tableau d'ordre N. Exercice 5 : crire un programme en C ou C++ qui permet de calculer la somme de deux vecteurs donns. Exercice 6 : crire un programme en C ou C++ qui permet de trier les lments d'un vecteur par ordre croissant.

- 26 -

Prpar par Mr. MOUFID

Langage de Programmation C

7. Chane de caractres
7.1. Caractre 7.1.1. Constante
Un caractre est un symbole, de l'ensemble fini et ordonn de tous les caractres, entre '. Exemples : 'A' , 'a' , '.' , ' ' '\'' , '\\' , '\''' , '\?' '\n' , '\t' , '\b' , '\o', '\a', '\v', '\f', '\r' '\137', '\X2A5', '\007' La valeur d'une constante de type caractre est gale la valeur du code de ce caractre dans le systme de codage des caractres de la machine (ASCII par exemple).

Remarque :
'\a' ou '\7' : est le caractre dmission dun signal sonore. La premire forme et plus scurisant que la deuxime pour la portabilit du programme, en effet, le code du signal sonore en ASCII est 7 mais en EBCDIC est 57.

'chane'
A pour valeur la valeur du premier caractre de chane.

7.1.2. Variable
Le type caractre est dsign par le mot rserv CHAR. Syntaxe :

CHAR identif_1 [ = expr_1 ] [, identif_2 [ = expr_2 ] , ...] ;


Exemple :
CHAR C1 = 'B' , C2 ; Loccupation mmoire est : 1 octet. Les oprateurs relationnels : == < > <= >= != La comparaison des caractres se fait d'aprs l'ordre lexicographique en suivant le systme de codage des caractres de la machine.

7.1.3. Fonctions de la bibliothque


GETCHAR() : retourne le caractre suivant de l'entre standard, tap partir du clavier. Elle retourne EOF la fin du fichier. PUTCHAR(expr_car) : Transfert le caractre de expr_car la sortie standard, sur l'cran. Si dans une expression arithmtique un oprande est de type caractre, il est transform par son code qui est un entier. Exemple : CHAR C1 , C2 , C3 ; INT A1 , A2 ; C1 = 'A' ; C2 = C1 ; C3 = GETCHAR() ; PUTCHAR(C3) ; PUTCHAR('a') ; A2 = 1 ; A1 = A2 + 'a' ; PRINTF("%c" , A1) ; PRINTF("%d" , A1) ; Remarques : var_car = GETCHAR() ; <===> SCANF("%c" , var_car) ;
- 27 -

Prpar par Mr. MOUFID

Langage de Programmation C

PUTCHAR(expr_car) ; <===> PRINTF("%c" , expr_car) ;


Dans la bibliothque "ctype.h", il y a les fonctions suivantes :

ISDIGIT(expr_car)
retourne 1 si le caractre de l'argument est un chiffre.

ISUPPER(expr_car)
retourne 1 si le caractre de l'argument est en majuscule.

_TOLOWER(expr_car)
retourne le caractre de l'argument en minuscule.

COUT.PUT(expr_car) ; affiche le caractre de expr_car. CIN.GET(var_car) ;


lit un caractre et le positionne dans var_car. Remarque : CHAR C1 , C2 , C3 ; CIN.GET(C1) ; CIN.GET(C2) ; CIN.GET(C3) ; // C1 = GETCHAR() ; // C2 = GETCHAR() ; // C3 = GETCHAR() ; si lutilisateur entre : A retour chariot puis B retour chariot puis C retour chariot alors C1 contiendra A, C2 contiendra '\n' et C3 contiendra B.

7.2. Chane de caractres


7.2.1. Constante
Une chane de caractre est une suite de caractres entre ". Exemples : "C'est bien" "a" , " " "\"" , "\'" ou "'" Remarques : Il y a une diffrence entre le caractre 'a' et la chane de caractres "a". Les constantes de type chane de caractres sont stockes dans la mmoire centrale, ce qui nest pas le cas des constantes des autres types. "oui" == "oui" est faut car les deux chanes de caractres sont stockes dans deux adresses diffrentes et la comparaison se fait sur leur pointeurs.

7.2.2. Variable
Le type chane de caractres est considr comme un tableau de caractres qui se termine toujours par le caractre spcial nul '\0'. Syntaxe :

CHAR identif[ [const_ent] ] ; CHAR *identif ; identif est une variable de type chane de caractres de longueur maximum const_ent - 1, 255 par
dfaut. Le respect de cette taille n'est pas obligatoire. Exemple : CHAR CHA[] = "bien" ; CHAR CHB[] = { 'b' , 'i' , 'e' , 'n' , '\0' } ; CHAR CHC[5] = "bien" ; CHAR CH1[24] ; CH1 = "C\'esr la vie" ; CH1[5] = 't' ;
- 28 -

Prpar par Mr. MOUFID

Langage de Programmation C

PRINTF("%s" , CH1) ; CH2 = { 'C' , '\'' , 'e' , 's' , 't' , ' ' , 'l' , 'a' , ' ' , 'v' , 'i' , 'e' , '\0' } ; SCANF("%s" , CH3) ; CIN >> CH3 ; Si lutilisateur entre oui, non alors CH3 contiendra oui et non restera dans le tampon pour une ventuelle future lecture pour les deux cas. Pour avoir une chane de caractres qui ne peut pas tenir sur une ligne, il suffit de terminer la ligne par \. Remarques : CHAR CHA[4] = "bien" ; Gnre une erreur car il ny a pas de la place pour '\0'.

var_chane = expr_chane ; si la longueur de la chane expr_chane et suprieure la longueur de la chane var_chane alors la
partie supplmentaire est tronque. Les oprateurs = et == ne sont pas permis pour les chanes de caractres.

7.2.3. Fonctions de la bibliothque


Les fonctions suivantes sont de la bibliothque string.h.

STRCAT(var_chane , expr_chane) concatne expr_chane dans var_chane. Une erreur imprvisible est gnre si var_chane ne peut pas contenir expr_chane. STRNCAT(expr_chane_1 , expr_chane_2 , expr_ent) retourne la chane rsultant de la concatnation de la chane de caractres expr_chane_1 avec expr_chane_2 de longueur maximale expr_ent. STRCPY(var_chane , expr_chane) copie la chane de caractres expr_chane dans var_chane. Une erreur imprvisible est gnre si var_chane ne peut pas contenir expr_chane. STRNCPY(var_chane , expr_chane , expr_ent) copie la chane de caractres expr_chane dans var_chane de longueur maximale expr_ent ou
complte par des espaces.

STRLEN(expr_chane)
retourne la longueur courante, le nombre de caractres, de l'argument sans le caractre \0.

DELETE(var_chane , expr_arith_1 , expr_arith_2)


supprime une sous chane du premier argument partir du deuxime argument et de longueur le troisime argument.

STRCMP(expr_chane_1 , expr_chane_2)
retourne 0 si les deux chanes de caractres sont gaux, une valeur positif si expr_chane_1 est suprieure expr_chane_2 et une valeur ngative si expr_chane_1 est infrieur expr_chane_2 dun point de vue lexicographique.

STRNCMP(expr_chane_1 , expr_chane_2 , expr_ent) retourne 0 si les deux chanes de caractres sont gaux jusqu'au expr_ent, une valeur diffrente de 0
sinon.

STRICMP(expr_chane_1 , expr_chane_2)
retourne 0 si les deux chanes de caractres sont gaux sans distinction entre majuscule et minuscule, une valeur diffrente de 0 sinon.

STRNICMP(expr_chane_1 , expr_chane_2 , expr_ent)


retourne 0 si les deux chanes de caractres sont gaux jusqu'au expr_ent sans distinction entre majuscule et minuscule, une valeur diffrente de 0 sinon. Les fonctions suivantes sont de la bibliothque stdlib.h. ATOI(expr_chane) : retourne la valeur numrique de type INT de expr_chane aprs sa conversion jusqu'au premier caractre qui n'est pas un chiffre, la valeur 0 si non convertible.
- 29 -

Prpar par Mr. MOUFID

Langage de Programmation C

ATOL(expr_chane)
retourne la valeur numrique de type LONG de expr_chane aprs sa conversion jusqu'au premier caractre qui n'est pas un chiffre, la valeur 0 si non convertible.

ATOF(expr_chane)
retourne la valeur numrique de type FLOAT de expr_chane aprs sa conversion jusqu'au premier caractre qui n'est pas un chiffre, la valeur 0 si non convertible. STRLWR(var_chane) : convertie la chane de caractres de var_chane en minuscule. STRUPR(var_chane) : convertie la chane de caractres de var_chane en majuscule. Exemples : ch_1 contient "C'est la vie" ch_2 contient "mort" ch_1 < ch_2 strcat(ch_1,strcat(" et la ",ch_2)) =====> "C\'est la vie et la mort" strncpy(ch_1,10,3) =====> 'vie' strlen(ch_1) =====> 12 delete(ch_1,1,9) =====> ch_1 devient "vie" Remarques : GETS(var_chane) ; et SCANF("%s" , var_chane) ; ne sont pas quivalent car la premire lu la chane de caractres jusqu la fin de la ligne et la deuxime lu la chane de caractres jusquau premier espace ou sparateur comme virgule rencontr.

PUTS(expr_chane) ; <===> PRINTF("%s\n" , expr_chane) ;


Exemple :
CHAR MOIS[12][10] = {"Janvier" , "Fvrier" , "Mars" , "Avril" , "Mai" , "Juin" , "Juillet" , "Aot" , "Septembre" , "Octobre" , "Novembre" , "Dcembre" } ; CHAR *MOIS[12] = {"Janvier" , "Fvrier" , "Mars" , "Avril" , "Mai" , "Juin" , "Juillet" , "Aot" , "Septembre" , "Octobre" , "Novembre" , "Dcembre" } ;

Les fonctions suivantes sont de la bibliothque conio.h.

GETCH () ;
retourne un caractre lu directement partir du clavier, sans passer par le tampon et sans cho. Lentrer du caractre ne ncessite pas le retour chariot.

GETCHE () ;
retourne un caractre lu directement partir du clavier, sans passer par le tampon et avec cho. Lentrer du caractre ne ncessite pas le retour chariot.

CIN.GET(var_chane , expr_ent , [expr_car]) ; lit une chane de caractres dans var_chane de taille maximale expr_ent et qui se termine par le caractre expr_car, par '\0' par dfaut. Elle nenregistre pas le dlimiteur et ne le supprime pas du
tampon.

CIN.GETLINE(var_chane , expr_ent , [expr_car]) ; lit une chane de caractres dans var_chane de taille maximale expr_ent et qui se termine par le caractre expr_car, par '\0' par dfaut. Elle nenregistre pas le dlimiteur mais le supprime du tampon.

- 30 -

Prpar par Mr. MOUFID

Langage de Programmation C

EXERCICES
Exercice 1 : Calculer le nombre d'occurrences d'un caractre dans une chane de caractres. Exercice 2 : Calculer le nombre de mots, dlimits par des espaces, dans une chane de caractres. Exercice 3 : Dterminer l'image miroir d'une chane de caractres.

- 31 -

Prpar par Mr. MOUFID

Langage de Programmation C

8. Fonction
Toute instruction, mme une directive, doit tre dans une fonction.

8.1. Fonctions intrinsques


Il y a deux types de fonctions intrinsques : les oprateurs : x = y * z ; les fonctions de la bibliothque : x = SQRT(y) ;

8.2. Construction de fonctions


8.2.1. Fonction principale
La fonction MAIN est une fonction particulire : la dfinition de la fonction MAIN concide avec sa dclaration et son utilisation ; la fonction MAIN est la premire fonction appele.

8.2.2. Fonction normale


A l'appel d'une fonction, il n'y a pas de vrification de concordance des types des paramtres effectifs avec les paramtres formels. A l'appel d'une fonction, les paramtres effectifs FLOAT sont convertis en DOUBLE, SORT ou CHAR en INT et les tableaux en pointeurs. Dclaration :

[type] identif([type_1 [[ , type_2 ], ...]]) ;


La partie dclaration n'est pas obligatoire, mais elle est vivement conseille de la faire systmatiquement. Elle permet une vrification des paramtres effectifs en nombre et en type ainsi que la conversion automatique des types.

Dfinition :

[type] identif([suite_dc_par_for]) { [liste_dc_var] [liste_instr] [RETURN( [expr] )] ; }


ou

[type] identif([suite_par_for]) liste_dc_par_for { [liste_dc_var] [liste_instr] [RETURN( [expr] )] ; } suite_dc_par_for = dc_par_for , suite_dc_par_for / dc_par_for dc_par_for = type var identif est l'identificateur, le nom de la fonction. type est le type du rsultat de la fonction, le type INT par dfaut.
VOID dans la partie paramtre signifie que c'est une fonction sans paramtre. VOID dans la partie type du rsultat signifie que c'est une fonction sans rsultat.

Utilisation :

identif([expr_1 [ [ , expr_2 ] ... ]]) [ ; ] expr_1 , expr_2 , ... est la liste des paramtres effectifs de l'appel de la fonction de nom identif.
Remarques : La dclaration dune fonction est obligatoire si son utilisation est avant sa dfinition ou si
sa dfinition est dans un autre fichier.
- 32 -

Prpar par Mr. MOUFID

Langage de Programmation C

La dclaration d'une fonction doit tre situe avant son utilisation. La dclaration d'une fonction peut tre rpte plusieurs fois mais la dfinition une seule fois. La dfinition d'une fonction peut tre aprs son utilisation. L'ordre de dfinition des fonctions n'est pas important. Linstruction RETURN peut ne pas exister comme elle peut tre place dans plusieurs endroit de la dfinition d'une fonction. La fonction est termine son excution. Une fonction peut ne pas retourner de rsultat. Le programme appelant une fonction peut ignorer son rsultat. C'est le cas d'une fonction effet de bort. L'appel d'une fonction peut tre soit dans une expression soit considr comme une instruction qui doit se terminer par ;. Il n'y a pas la notion de fonctions imbriques, mais une fonction peut appeler une autre. La dfinition dune fonction ne peut pas contenir la dfinition dune autre fonction mais peut contenir la dclaration dune autre fonction. Il n'y a pas la notion de procdure.

Exemple :
f(3 , (p=3 , p+5) , 7) ; Les paramtres effectifs de f sont : 3, 8 et 7.

8.2.3. Rsultat de fonction


[RETURN ;]
pour une fonction sans rsultat.

RETURN expr ; RETURN ( expr ) ;


pour une fonction qui retourne le rsultat expr. Le rsultat dune fonction peut tre de type simple, une classe, une rfrence ou un pointeur vers un tableau ou une fonction mais pas un tableau ou une fonction.

8.2.4. Nombre de paramtres indfini


Le nombre de paramtres formels dune fonction peut tre indfini.

Exemples :
SCANF et PRINTF.

[ type ] identif(par_for , ) ;
Remarque :
Lordre dutilisation des paramtres des fonctions dpend du compilateur.

Exemples :
INT a = 1 ; printf (a , a+1) ; si lordre dutilisation des paramtres est gauche-droite alors le rsultat est 1 2 si lordre dutilisation des paramtres est droite-gauche alors le rsultat est 2 2

8.2.5. Paramtres par dfaut


[ type ] identif(par_for = expr) ; dclare la fonction identif avec linitialisation de certains paramtres. par_for : une liste de paramtres formels, ventuellement un nombre infrieur au nombre de
paramtres formels de la dfinition ; expr : une liste dexpressions avec ventuellement des variables ou des appels de fonctions mais pas de variables locales.

identif(par_eff) ; appelle la fonction identif. par_eff : une liste de paramtres effectifs, ventuellement un nombre infrieur au nombre de
paramtres formels de la dfinition. Remarques : Il peut y avoir plusieurs dclarations dune mme fonction.
- 33 -

Prpar par Mr. MOUFID

Langage de Programmation C

Si un paramtre est dclar par dfaut tous les autres paramtres sa droite doivent tres des paramtres par dfaut

8.2.6. Surcharge de nom de fonction


La signature dune fonction est le nombre de ses paramtres avec leur types. La surcharge du nom dune fonction est le partage du mme nom de fonction plusieurs fonction de mme port. La distinction entre les fonctions se fait par leur signatures.

8.2.7. Fonction en ligne


inline [ type ] identif(par_for) {};
Une fonction en ligne est une fonction dont le compilateur remplace les appels de cette fonction par leur code aprs le remplacement des paramtres formels par les paramtres effectifs correspondants. Lutilisation des fonctions en ligne acclre lexcution du programme mais gnre un programme excutable de taille importante. Lutilisation des fonctions en ligne nest vraiment justifie que pour les petites fonctions simples, dune dizaine de lignes et non rcursives.

8.3. Transmission de paramtres


Il y a trois modes de transmission de paramtres : la transmission de paramtres par valeur : les paramtres de type simple sont transmis par valeur ; la transmission de paramtres par rfrence, par pointeur ; la transmission de paramtres par adresse : les paramtres de type tableau ou pointeur sont transmis par adresse. Une fonction ne peut pas tre considre comme une variable mais le nom de la fonction contient l'adresse de la dfinition de la fonction.

Exemple :
Permuter de deux nombres entiers. 1. la transmission de paramtres par valeur : MAIN () { INT A , B ; SCANF("Entrer deux nombres : %d %d" , &A , &B); ECHANGE(A , B) ; PRINTF("\nUne permutation est : %d , %d" , A , B) ; } VOID ECHANGE(INT X , INT Y) { INT Z ; Z=X; X=Y; Y=Z; } 2. la transmission de paramtres par rfrence : MAIN () { INT A , B ; SCANF("Entrer deux nombres : %d %d" , &A , &B); ECHANGE(A , B) ; PRINTF("\nUne permutation est : %d , %d" , A , B) ; } VOID ECHANGE(INT &X , INT &Y) { INT Z ;
- 34 -

Prpar par Mr. MOUFID

Langage de Programmation C

Z=X; X=Y; Y=Z; } 3. la transmission de paramtres par adresse : MAIN () { INT A , B ; SCANF("ENTRER DEUX NOMBRES : %D %D" , &A , &B); ECHANGE(&A , &B) ; PRINTF("\NUNE PERMUTATION EST : %D , %D" , A , B) ; } VOID ECHANGE(INT *X , INT *Y) { INT Z ; Z = *X ; *X = *Y ; *Y = Z ; }

Exemple :
INT F_VAL(INT); INT F_ADR(INT *) ; MAIN () { INT I ; F_VAL(I) ; F_ADR(&I) ; } INT F_VAL(INT V) {V=V*3;} INT F_ADR(INT *A) { *A = (*A) * 3 ; } Le nom d'une fonction peut tre un paramtre d'une autre fonction.

Exemple :
FLOAT f2() ; { FLOAT A ; ... INT f1() ; ... A = f2(... , f1 , ...) ... } FLOAT f2(... , f3 , ...) INT (*f3)() ... { ... (*f3)(...) ; ... } f3 est une variable qui pointe sur une fonction dont le rsultat est un entier.
- 35 -

Prpar par Mr. MOUFID

Langage de Programmation C

Remarques :
INT *f3() f3 est une fonction dont le rsultat est une variable qui pointe sur un entier. INT f3() f3 est une fonction dont le rsultat est un entier.

8.4. Fonction externe


Le but des fonctions externes est la conception d'une bibliothque de fonctions. Exemple : Calcul de la somme de deux vecteurs. + Fichier prog.c /* Cas_6_2 */ #INCLUDE <stdio.h> #INCLUDE "lecture.c" #INCLUDE "ecriture.c" #INCLUDE "somme.c" #DEFINE MAX 10 TYPEDEF FLOAT VECT[MAX] ; MAIN() { INT N ; VECT V1 , V2 , S ; PRINTF("Donner le nombre d\'lments : ") ; SCANF("%d" , &N) ; PRINTF("\nEntrer les valeurs du premier vecteur\n") ; LECTURE_v(V1,N) ; PRINTF("\nEntrer les valeurs du deuxime vecteur\n") ; LECTURE_v(V2,N) ; SOMME_v(V1,V2,N,S) ; PRINTF("Le vecteur somme est le suivant\n") ; ECRITURE_v(S,N) ; } + Fichier lecture.c : #INCLUDE <stdio.h> #DEFINE MAXL 10 TYPEDEF FLOAT VECTL[MAXL] ; LECTURE_v(X , M) VECTL X ; INT M ; { INT I ; FOR (I = 1 ; I <= M ; ++I) { PRINTF("\nDonner la %3d me valeur : " , I) ; SCANF("%f" , X[I]) ; } } + Fichier somme.c : #DEFINE MAXS 10 TYPEDEF FLOAT VECTS[MAXS] ; SOMME_v(X1 , X2 , M , X3) VECTS X1 , X2 , X3 ; INT M ; { INT I ;
- 36 -

Prpar par Mr. MOUFID

Langage de Programmation C

FOR (I = 1 ; I <= M ; ++I) X3[I] = X1[I] + X2[I] ; } + Fichier ecriture.c : #INCLUDE <stdio.h> #DEFINE MAXE 10 TYPEDEF FLOAT VECTE[MAXE] ; ECRITURE_v(Y , M) VECTE Y ; INT M ; { INT I ; FOR (I = 1 ; I <= M ; ++I) PRINTF("\n%5.2f " , Y[I]) ; } La compilation du programme principal doit tre faite aprs la compilation de tous les fichiers qu'il utilise. La compilation d'un fichier doit tre faite aprs la compilation de tous les fichiers qu'il utilise.

EXERCICES
Exercice 1 : Calcul de la factorielle d'un nombre. Exercice 2: Calcul de la longueur des cts d'un triangle. Exercice 3 : Image miroir d'une chane de caractres. Exercice 4 : Calculer la factorielle d'un nombre N avec une fonction rcursive.

- 37 -

Prpar par Mr. MOUFID

Langage de Programmation C

9. Type
Un objet peut tre : une constante ; une variable ; une fonction. La dfinition dun objet permet : la dclaration ; la rservation de lespace mmoire requise ; et ventuellement linitialisation. Un objet est caractris par : un identificateur ; un type ; une valeur ; une sorte : un domaine de validit ; une dure de vie.

9.1. Notion de type


Le but de la notion de type est : la dclaration d'une classe d'objets ayant les mmes caractristiques ; la composition de types complexes partir de types de base. Les types de base en C et C++ sont : types simples : scalaires : standards : entier : SHORT , INT , LONG avec ou sans SIGNED ou UNSIGNED caractre : CHAR ordinal : ENUM rel : FLOAT , DOUBLE , LONG DOUBLE types structurs : union : UNION tableau enregistrement : STRUCT types dynamiques : pointeur fichier : FILE Syntaxe :

TYPEDEF type identif [ [expr] ] ;


Les types dfinis sont dclars dans la partie dclaration des variables d'un programme et sont prcds par le mot rserv TYPEDEF. TYPEDEF ne permet pas de dfinir des nouveaux types mais simplement de donner des noms synonymes des types existants. Exemple : TYPEDEF INT VECT[100] ; ... VECT T1 , T2 ; INT V1[100] , V2[100] ;

SIZEOF(type) SIZEOF type


retourne la taille, en octets, du type type.
- 38 -

Prpar par Mr. MOUFID

Langage de Programmation C

SIZEOF(expr) SIZEOF expr


retourne la taille, en octets, de la valeur de l'expression expr.

(type)expr
retourne la valeur de l'expression expr aprs l'avoir convertie en type type.

Exemples :
sizeof int 4 int A = 1 ; sizeof A+5 4 (float)A+5 6.0

9.2. Ordinal
Les types ordinaux sont les types scalaires dfinis dans le programme. Les valeurs des types ordinaux sont numrables. Syntaxe : ENUM [ identif ] { identif_1 [ [ , identif_2] ... ] } [ var_1, ] ; Smantique : La dfinition d'un type ordinal identif form par les valeurs, dans l'ordre, identif_1, identif_2, ... avec la dclaration de la liste des variables var_1, de ce type. Exemple : ENUM JOUR { Lundi , Mardi , Mercredi , Jeudi , Vendredi , Samedi , Dimanche } ; ENUM MOIS { Janvier , Fevrier = 5 , Mars , Avril , Mai , Juin , Juillet , Aout , Septembre , Octobre , Novembre , Dcembre } M ; JOUR J ; J peut prendre l'une des valeurs : Lundi , ... , Dimanche. M peut prendre l'une des valeurs : Janvier , ... , Dcembre. J = Mardi ; J = (ENUM JOUR) 1 ; JOUR J1= Lundi ; Exemple : TYPEDEF ENUM {VRAI , FAUX } Booleen ; ou ENUM Booleen { VRAI , FAUX } ; Booleen B1 , B2 ; Remarque : Chaque composante du type scalaire une valeur ordinale. La valeur ordinale du premier lment est 0 par dfaut. La valeur ordinale d'un lment est gale la valeur pose dans la dfinition, la valeur de l'lment prcdant plus un par dfaut. Exemple : Les valeurs ordinales du JOUR sont : 0 , 1 , ... , 6. Les valeurs ordinales du MOIS sont : 0 , 5 , 6 , ... , 15. Le type scalaire est considr comme une constante de type INT.

9.3. Union
Le type union est un type parmi un ensemble de types dont l'interprtation peut varier dans le temps. Syntaxe :

UNION [ identif ] { type_1 identif_1_1 [[ , identif_1_2 ]...] ; [ type_2 identif_2_1 [[ , identif_2_2 ]...] ; ] ... } [var_1,...] ;
Smantique :
La dfinition d'un type union identif form par les champs identif_1_1, identif_1_2, ... de type type_1 et identif_2_1, identif2_2, ... de type type_2, etc. avec la dclaration de la liste des variables var_1, de ce type.
- 39 -

Prpar par Mr. MOUFID

Langage de Programmation C

Exemple :
UNION CHAINE { CHAR CH[8] ; CHAR C ; } H1 ; CHAINE H2 ; H1.CH = "bien" ; H1.C = 'r' ; H1.CH devient "rien" et H1.C reste 'r'. Remarques : La taille de UNION est gale la taille du plus long lment. A un instant donn, il ne peut contenir qu'un lment. Il ne peut pas tre initialis lors de sa dclaration.

9.4. Enregistrement
Syntaxe :

STRUCT [ identif_t ] { type_1 identif_1_1 [[ , identif_1_2 ]...] ; [ type_2 identif_2_1 [[ , identif_2_2 ]...] ; ] ... } [ identif_v_1 [[ , identif_v_2 ]...] ] ; identif_t identif_v_1 [[ , identif_v_2 ]...] ; identif_v_1, identif_v_2, ... est liste de variables de type identif_t qui est le type enregistrement compos des champs identif_1_1 de type type_1, des champs identif_2_1 de type type_2, ... .
Utilisation :

identif_v_1 . identif_1_1 est le champ identif_1_1 de l'enregistrement identif_v_1.


Exemple :
STRUCT ETUDIANT { INT CODE ; CHAR NOM[] , NIVEAU[] ; FLOAT NOTES[4] ; } E1 , E2 ; ETUDIANT E3 ; ETUDIANT E4 = { 125 , "OMAR" , "BEN ALI" , { 19 , 17 , 18.75 , 18 , 16 } } ; ETUDIANT CLASSE[99] ; E1.NOM = "OMAR" ; E2.NOTES[3] = 19.99 ;

Exemple :
STRUCT {INT jour , mois , annee ; } D ;

Exemple :
STRUCT adresse { INT num ; CHAR rue [50] ; LONG code ; CHAR ville [20] } ; adresse ad1 , ad2 , ad3 ;

Remarques :
Une structure externe ou statique peut tre initialise, par contre une structure interne ne peut pas l'tre. Les paramtres et le rsultat d'une fonction ne peuvent pas tre de type structure. Pour transmettre une structure dans une fonction il suffit de transmettre ses champs ou transmettre une variable qui pointe sur la structure. Un enregistrement ne peut tre utilis que pour spcifier un champ avec & ou pour une affectation.

Exemple :
STRUCT ETUDIANT E ; STRUCT ETUDIANT *PE ; E est une variable de type la structure ETUDIANT. &E est l'adresse de la variable E. PE est une variable qui pointe sur une structure de type ETUDIANT.
- 40 -

Prpar par Mr. MOUFID

Langage de Programmation C

PE -> CODE ou (*PE).CODE est le champ CODE de la structure. Exemple : STRUCT PERSONNE { CHAR NOM[20] , PRENOM[20] ; STRUCT DATE { INT JOUR , MOIS , ANNEE ; } }; PERSONNE P1 , P3[5] , *P2 ;

9.5. Pointeur
Un pointeur est un objet dont le contenu est l'adresse o se trouve l'information qu'il dsigne. L'adresse est compose d'un numro de segment ou de base et d'un dplacement (offset). La notion de pointeur est trs importante en C et C++. Elle permet l'accs toute variable du programme, aux tables de DOS et mme la mmoire. Un pointeur permit, dune part, d'accder indirectement au contenu dun objet travers son adresse, et dautre part, de manipuler le contenu dune zone mmoire sans nom.. Les pointeurs sont utiliss dans les paramtres de fonction rsultat multiples ou pour la transmission de paramtres par adresse. Les pointeurs doivent tre utiliss avec un peu de rigueur.

9.5.1. Adresse
&var : adresse de la variable var.

9.5.2. Rfrence
La notion de rfrence permet de donner des variables dj existant de nouveaux noms, des alias, des dsignations synonymes.

type &ref = var La rfrence ref fait rfrence la variable var. ref occupe le mme emplacement que var. Toute modification de ref implique la modification de var et inversement, toute modification de var implique la modification de ref.
Exemple :
INT I = 5 ; INT &AI = I ; Remarque : Il ny a pas de rfrence de rfrence. Il ny a pas de pointeur ver une rfrence. Il ny a pas de tableau de rfrences.

9.5.3. Pointeur
Dclaration :

type *identif ; identif est un pointeur vers un objet de type type. * est l'oprateur unaire d'indirection. NULL
est une valeur particulire de pointeur. Elle indique que le pointeur ne contient aucune adresse valide. Exemples : INT I , J ; I est une variable de type entier. I et *(&I) sont quivalent. &I est l'adresse de la variable I. INT *P ; P est un pointeur qui pointe vers une case de type entier. *P est le contenu de l'adresse indique par P. P = &I ; affecte l'adresse de I P. P pointe sur I. I et *P reprsente la mme case. // INT *P = &I ;
- 41 -

Prpar par Mr. MOUFID

Langage de Programmation C

J = *P ; affecte le contenu de l'adresse pointe par P J. P = NULL ; P ne contient aucune adresse valide. INT *Q = P ; initialise le pointeur Q par P. Loccupation mmoire dun pointeur est : 2 octets si l'espace de donnes est 64 Ko. Remarque : & est utilise uniquement pour les variables de sorte autre que REGISTER et pour les lments d'un tableau. L'utilisation d'un pointeur non initialis peut tre source de graves erreurs. Contre exemples : &(I+1) &5 Les oprations permises avec les pointeurs sont : l'addition ou la soustraction d'un pointeur et un entier ; la soustraction de deux pointeurs qui reprsente le nombre d'lments entre eux ; la comparaison de deux pointeurs en comparant les emplacements des lments d'un mme tableau. L'unit d'incrmentation ou de dcrmentation d'un pointeur est gale la taille de la variable pointe. Exemples : INT P , I , J ; I=7; ===> I <--- 7 P = (&I) ; ===> P <--- 2100 J = (*P) ; ===> J <--- 7 *P = 2 * J ; ===> I <--- 14 P++ ; ===> P <--- 2102

9.5.4. Lien entre les tableaux et les pointeurs


Un tableau avec des indices correspond un pointeur avec des dplacements et vice versa. Exemples : INT T[10] ; T est un tableau de 10 lments de type entier. T contient l'adresse du premier lment du tableau T. T[0] , ... , T[9] : sont les lments du tableau T. INT *P ; *P est le contenu de l'adresse indique par P. P = &T[0] ; ou P = T ; P pointe sur le premier lment du tableau T. P contient l'adresse du dbut du tableau T. P+1 pointe sur le deuxime lment du tableau T. P-1 pointe sur l'lment juste avant le premier lment du tableau T. P = &T[0] ; <===> P = T ; *P <===> T[0] ; *(P+I) <===> T[I] <===> P[I] &T[I] <===> T+I T[I] <===> *(T+I) Remarque : Le nom d'un pointeur est une variable, alors que le nom d'un tableau est un pointeur constant. C'est l'adresse du premier lment du tableau. Exemples : Les affectations suivantes sont permises : ++P ; P += I ; P = &T[0] ; Les affectations suivantes sont interdites : ++T ; T = P ; P = &T ;
- 42 -

Prpar par Mr. MOUFID

Langage de Programmation C

Remarque : Le passage d'un paramtre de type tableau transmis l'adresse du premier lment du tableau. Le paramtre formel correspondant peut tre considr comme un pointeur. Exemples : INT **P ; : P est un pointeur sur un pointeur d'entier. INT (*Q)[10] ; : Q est un pointeur sur des tableaux de taille 10 lments d'entier. INT *R[10] ; R est un tableau de 10 lments de pointeurs sur des entiers. P -> identif <===> (*P).identif Les pointeurs permettent de dfinir des structures rcursives. Exemple : STRUCT PERSONNE { CHAR *NOM , *PRENOM ; STRUCT PERSONNE *PERE , *MERE ; } ;

9.5.5. Pointeur de pointeur


Exemple :
INT I ; INT *P = &I ; INT **PP = &P ; **PP, *P et I sont quivalents. *PP, P et &I sont quivalents.

9.5.6. Pointeur gnrique


Un pointeur gnrique est un pointeur vers un objet de nimporte quel type. Un pointeur gnrique peut contenir, soit ladresse dun objet de nimporte quel type, soit un autre pointeur de nimporte quel type. Un objet point par un pointeur gnrique ne peut contenir une valeur quaprs avoir spcifi le type de lobjet point par le pointeur gnrique par le type de la valeur. Un pointeur ne peut contenir un pointeur gnrique quaprs avoir spcifi le type du pointeur gnrique par le type du pointeur. VOID * : est le type pointeur gnrique. Exemple : INT I ; FLOAT F ; VOID *P ; INT *Q ; P = &I ; // permit *P = 25 ; // interdit P = &F ; // permit *P = 2.5 ; // interdit *(FLOAT *)P = 2.5 ; // permit P=Q; // permit Q=P; // interdit Q = (INT *)P ; // permit

9.5.7. Variable dynamique

type *var [ = expr ] ; : Dclare un pointeur var qui pointe vers le type type. var = NEW type [ ( expr ) ] ; : Alloue une case mmoire dynamique pour le pointeur var qui pointe vers une case mmoire de type type. DELETE var ; : restaure la case mmoire de var. DELETE [ ] var ; : restaure les cases mmoires du tableau var.
- 43 -

Prpar par Mr. MOUFID

Langage de Programmation C

Remarques : Le type de dclaration et dallocation doivent tre identiques, il na pas de conversation de type. Les rgles de conversation sont applicables lors des affectations. Une deuxime allocation sans la restauration de la premire masque cette dernire. Un tableau dynamique ne peut pas tre initialis lors de sa dclaration. La taille de la premire dimension dun tableau peut tre une variable mais les autres dimensions doivent tre des constantes. Si une rservation despace mmoire par NEW ne peut pas tre satisfaite, alors le pointeur NULL est retourn. Les fonctions de la gestion dynamique de la mmoire sont dans la bibliothque stdlib.h. Une variable dynamique est une variable qui est cre dans le segment de tas (heap segment), la zone dallocation dynamique, lors de lexcution du programme. Elle est utilise pour les pointeurs. Elle est utilise pour les tableaux de taille dynamique et pour les objets qui sont trs peu utiliss pour pouvoir rcuprer leur espace mmoire. Exemple : INT I = 5 ; INT *PI ; // INT *PI = 3 ; PI = NEW INT (3) ; // allocation dune case mmoire // INT *PI = NEW INT (3) ; *PI = 7.3 ; // affectation de 7 DELETE PI ; // restauration de la case mmoire Exemple : INT N ; INT *T ; T = NEW INT [N] ; // INT *T = NEW INT [N] ; T[3] = 5 ; // *(T+3) = 5 ; Exemple : INT (*M)[10] = NEW INT [N][10] ; M est un pointeur vers des tableaux de 10 lments de type INT. Exemple : IF (P != NULL)

9.6. Notion de sorte


Le sorte, la classe d'allocation mmoire, d'une variable spcifie le type d'espace mmoire o l'emplacement correspondant cette variable sera allou, sa dure de vie et sa visibilit par les diffrentes fonctions. Il y a 4 types de sorte : AUTO : locale, automatique ou interne ; REGISTER : registre ; EXTERN : externe ou globale ; STATIC : statique.

9.6.1. Domaine de validit


Le problme de la dtermination de la liste des identificateurs utilisables dans une fonction se pose constamment La dclaration ou la dfinition dun objet peut tre : local, cest--dire lintrieur dun bloc ou dune fonction ; statique, cest--dire lintrieur dun fichier ;
- 44 -

Prpar par Mr. MOUFID

Langage de Programmation C

global, cest--dire lextrieure de tout bloc et de toute fonction. Le domaine de validit dun objet dpend de lendroit de sa dclaration ou de sa dfinition. Il y a trois types de domaine de validit : le bloc : les objets locaux du bloc ; le fichier : les objets statiques du fichier ; tous les fichiers lis : les objets globaux de nimporte quel fichier ; la classe : les lments de la classe. La dclaration ou la dfinition dun objet dun nom dj utilis pour un autre objet, mme de type diffrent : dans un bloc, une fonction, un fichier diffrent de domaines de validit disjoints, ne gnre pas derreur ; dans un bloc, une fonction, un fichier diffrent de domaines de validit recouverts, la deuxime dfinition masque la premire ; dans le mme bloc ou la mme fonction, gnre une erreur de compilation ; dans un autre fichier li, gnre une erreur ddition de lien. Les paramtres formels dune fonction sont des variables locales non statiques.

9.6.2. Variable locale


[ AUTO ] type var [ = expr ] ;
Une variable locale est une variable cre dans un bloc sur le segment de pile, la zone mmoire dynamique, lors de sa dclaration l'intrieur du bloc et dtruite la fin du bloc. Sa valeur est indtermine sauf si elle est initialise. Une variable automatique peut tre initialise par une expression quelconque. Les tableaux, les structures et les unions automatiques ne peuvent pas tre initialiss. Le nombre de variables automatiques est limit par la taille du segment de pile. Exemple : MAIN () { INT I ; ... } F(...){ INT J =25 ; } I est une variable automatique dans la fonction principale. J est une variable automatique dans la fonction F.

9.6.3. Registre
REGISTER type var [ = expr ] ;
Une variable registre est une variable locale mmorise dans un registre de la machine. Les deux registres utiliss en Turbo C sont : SI et DI. Les variables registres sont utilises uniquement pour les variables de type INT, CHAR et les pointeurs qui sont trs utilises dans un programme pour amliorer sa performance. Lutilisation de variables registres est limite par le nombre de registres de la machine qui sont de nombre trs restreint. Une utilisation abusive de variables registres n'est pas dtecte et elles seront considres comme des variables locales normales. Les variables registres peuvent tre initialises par des expressions quelconques. Exemple : MAIN () { INT K ; REGISTER INT R ; K = R*2 ; ... } R est une variable registre s'il reste un registre libre.
- 45 -

Prpar par Mr. MOUFID

Langage de Programmation C

9.6.4. Variable globale


EXTERN CONST type identif [ = expr ] ; dfinie la constante globale identif. EXTERN CONST type identif ; redclare la constante globale identif. EXTERN type var [ = expr ] ; dfinie la variable globale var. EXTERN type var ; redclare la variable globale var. ::var permet daccder la variable globale var qui est masque par une autre.
Exemple :
INT A ; // A global MAIN () { INT A ; // A local A=5; // A local ::A = 7 ; // A global Une variable globale est une variable cre, dans le segment de donnes, la zone d'allocation mmoire statique, la compilation lors de sa dclaration et peut tre utilise dans tous les blocs qui suivent sa dclaration du mme fichier et mme pour les autres fichiers lis. Elle est dclare l'extrieur de tout bloc, dans le fichier principal ou dans un autre fichier part. L'utilisation d'une variable globale dans un bloc ncessite une redclaration, sans initialisation, dans ce bloc avec le mot rserv EXTERN. Cette dclaration ne procde pas une allocation de mmoire. Sa valeur est 0 sauf si elle est initialise par une autre valeur. Une variable globale ne peut tre initialise qu'avec une expression ne contenant que des constantes. Un tableau global peut tre initialis. Elle peut tre utilise pour la communication entre les fonctions mme si elles sont compiles sparment. Exemple : FLOAT A = 25 ; MAIN () { INT K ; EXTERN INT B ; K = B*2 ; ... } INT B = 5 ; A et B sont des variables globales.

9.6.5. Variable statique


STATIC type var [ = expr ] ;
dfinie la variable globale statique var.

STATIC type identif(par_for) {}; dfinie la fonction statique identif.


Une variable statique est cre, dans un bloc sur le segment de donnes, la zone d'allocation mmoire statique, la compilation lors de sa dclaration mais conserve sa valeur lors du retour au bloc. Une variable statique est une variable dont la dure de vie est tout le programme mais son domaine de validit est uniquement le bloc de sa dfinition. La cration se fait une seule fois et linitialisation se fait ventuellement une seule fois la cration. Sa valeur est initialise par 0 par dfaut sauf si elle est initialise par une autre valeur. Une variable statique ne peut tre initialise qu'avec une expression ne contenant que des constantes. Un tableau statique peut tre initialis.
- 46 -

Prpar par Mr. MOUFID

Langage de Programmation C

Une variable statique peut tre locale ou globale. Les variables statiques locales d'une fonction sont des variables locales la fonction mais qui existent mme si la fonction n'est pas appele. Les chanes de caractres locales une fonction sont toujours statiques. Les variables statiques globales d'une fonction sont utilises dans tout le fichier de la fonction mais pas dans les autres fichiers spars. Les rsultats des fonctions peuvent tre statiques comme les variables statiques globales. Toute variable globale est statique. Exemple : MAIN () { INT K ; STATIC INT S = 1 ; K = S*2 ; ... } S est une variable statique initialis une seule fois par 1. Remarque : En cas o la sorte d'une variable est omis, elle est globale l'extrieur de toute fonction et locale l'intrieur d'une fonction.

- 47 -

Prpar par Mr. MOUFID

Langage de Programmation C

10. Fichier
10.1. Ouverture-fermeture
FOPEN(expr_chane , expr_car) ;
retourne un fichier logique associ au fichier physique expr_chane aprs son ouverture en mode expr_car. Le mode d'ouverture expr_car est : "w" : ouverture en mode criture au dbut du fichier ; "a" : ouverture en mode criture la fin du fichier ; "r" : ouverture en mode lecture. Remarque : Le nom physique d'un fichier est compos d'un identificateur d'au plus 8 caractres et en option, d'une extension de 1 3 caractres. L'identificateur et l'extension sont spars par un point.

FCLOSE(identif) ;
ferme le fichier de nom logique identif puis vide les tampons. La fermeture dun fichier rompe la connexion entre le nom logique et le nom physique du fichier.

10.2. Fichier structur


Un fichier structur est un ensemble ordonn d'enregistrements. Le premier enregistrement est de rang 0. C'est un fichier slectif. Dclaration :

FILE *identif ; identif est un pointeur de fichier.


Exemple :
FILE *F ;

FSCANF(identif , const__chane , &var_1 [[, &var_2 ]...]) ; lire la liste des pointeurs var_1, var_2, ... dans le fichier de nom logique identif. Elle retourne EOF
si la fin du fichier est atteinte.

FPRINTF(identif , const_chane , expr_1 [[, expr_2 ]...]) ; crire la liste des expressions expr_1, expr_2, ... dans le fichier de nom logique identif. SEEK(identif , expr_ent) ; positionne le pointeur de fichier l'enregistrement de rang expr_ent. FILESIZE(identif) retourne le nombre d'enregistrements du fichier de nom logique identif.

10.3. Fichier texte


Un fichier de type texte, fichier ASCII, est un ensemble de caractres groups en lignes. Chaque ligne est termine par la squence de caractres CR et LF (Carriage Return et Line Feed). Le fichier est termin par le caractre CR. C'est un fichier squentiel qui peut tre manipul en dehors d'un programme C. Il peut tre considr comme un fichier structur de type caractre. EOLN(identif) (End Of LiNe) retourne TRUE si la fin de la ligne courante est atteinte. Sinon elle retourne FALSE.

GETC(identif) ;
retourne le caractre courant du fichier de nom logique identif, EOF si le fichier est puis.

PUTC(expr_car , identif) ; criture du caractre expr_car la position courante du fichier de nom logique identif. Remarque :
getc(stdin) ; putc('a',stdout) ; <===> getchar() ; <===> putchar('a') ;
- 48 -

Prpar par Mr. MOUFID

Langage de Programmation C

11. Utilitaires
11.1. Arrt d'excution
HALT
arrte l'excution du programme ou du sous-programme o elle se trouve et elle retourne au systme d'exploitation.

EXIT[(expr_ent)]
interrompt l'excution du programme ou du sous-programme o elle se trouve et elle retourne au programme ou au sous-programme appelant avec expr_ent comme code de retourne. Elle ferme tous les fichiers de sortie ouverts.

_EXIT
interrompt l'excution du programme ou du sous-programme o elle se trouve et elle retourne au programme ou au sous-programme appelant. Elle ne ferme pas les fichiers de sortie ouverts.

PAUSE()
attend

SYSTEM[(expr_chane)]
lance l'excution d'un processus Shell interprtant la commande correspondante la chane point par

expr_chane. Le programme est interrompu jusqu' l'excution du processus Shell.


Exemple :
system("sleep 60") ;

11.2. Prprocesseur
Le compilateur C possde un prprocesseur de dfinition de constante, d'inclusion de fichier et de compilation conditionnelle. Les lignes interprtes par le prprocesseur sont des directives qui commencent par # et ne se termine pas par ;. # doit tre le premier caractre, diffrent d'espace, dans une ligne. En Turbo C, il peut y avoir un espace aprs #. Ces lignes peuvent apparatre n'importe o dans un programme.

11.2.1. Constante symbolique


Syntaxe :

#DEFINE identif chane


Le prprocesseur effectue un remplacement textuel de lidentificateur identif par le texte chane correspondant. La partie dfinition des constantes symboliques se situe avant l'appel de la fonction principale. Exemples : #DEFINE A 25 #DEFINE B 25.03 #DEFINE C 25 + B #DEFINE D (25 + B) #DEFINE C Bien + D #DEFINE D Mal #DEFINE PI 3.1415 #DEFINE begin { #DEFINE end } #DEFINE MES "Ce programme \ simple" Syntaxe :

#UNDEF identif
termine le domaine de validit de la dfinition de identif. Remarque : Il est plus prudent de mettre toujours une expression entre parenthses pour les ventuelles valuations d'expressions ultrieures.
- 49 -

Prpar par Mr. MOUFID

Langage de Programmation C

11.2.2 Compilation conditionnelle


Les directives suivantes permettent d'incorporer ou d'exclure de la compilation des portions de programme. Syntaxe :

#IF (expr_const) module_1 [#ELSE module_2] #ENDIF


Syntaxe :

#IF (expr_const_1) module_1 #ELIF (expr_const_2) module_2 ... #ENDIF


Syntaxe :

#IFDEF (identif) module_1 [#ELSE module_2] #ENDIF


ou

#IF DEFINED (identif) module_1 [#ELSE module_2] #ENDIF


Syntaxe :

#IFNDEF (identif) module_1 [#ELSE module_2] #ENDIF


ou

#IF !DEFINED (identif) module_1 [#ELSE module_2] #ENDIF

11.2.3. Constantes pr-dfinies


__LINE__
le numro de la ligne courante dans le fichier source courant.

__FILE__
le nom du fichier source courant.

__DATE__
la date de la dernire compilation du fichier source courant.

__TIME__
lheure de la dernire compilation du fichier source courant.

__CPLUSPLUS__
dfinie lorsque un fichier source C++ est compil.
- 50 -

Prpar par Mr. MOUFID

Langage de Programmation C

11.2.4. Macro-instruction
Une macro-instruction est une suite dinstructions rassembles sous un nom. Elle ressemble une fonction en ligne.

A. Macro-instruction sans paramtre


Syntaxe :

#DEFINE identif suite_instr


suite_instr = instr / instr \ suite_instr

Syntaxe :

#UNDEF identif
termine le domaine de validit de la dfinition de identif.

B. Macro-instruction avec paramtre


Syntaxe :

#DEFINE identif(liste_par_for) expr


Exemple :
#DEFINE LONG(X1,X2,Y1,Y2) SQRT(POW(X2-X1)+POW(Y2-Y1))

Remarque :
Il n'y a pas d'espace entre identif et (. L'expression expr peut tre poursuivie la ligne suivante en ajoutant \ la fin de la ligne. Syntaxe :

#UNDEF identif
termine le domaine de validit de la dfinition de identif.

11.2.5. Traitement derreur


#ERROR chane
affiche la chane de caractres chane puis arrte la compilation.

11.3. Programme paramtr


ARGC : le nombre de paramtres de la ligne de commande. ARGV : le tableau des paramtres sous forme de chanes de caractres.
Exemple :
#INCLUDE <stdio.h> MAIN(ARGC , ARGV) INT ARGC ; CHAR *ARGV[] ; // CHAR **ARGV ; { INT I ; PRINTF("Nom du programme est : %s \n" , ARGV[0]) ; PRINTF("Le nombre de paramtres est : %9d \n" , ARGC) ; PRINTF("La liste des paramtres \n") ; FOR (I = 1 ; I < ARGC ; ++I) PRINTF("Argument %d est : %s \n" , I , ARGV[I]) ; }

11.4. Variables denvironnement


ENV : le tableau des variables d'environnement sous forme de chanes de caractres.
Exemple :
#INCLUDE <stdio.h> MAIN(ARGC , ARGV , ENV) INT ARGC ;
- 51 -

Prpar par Mr. MOUFID

Langage de Programmation C

CHAR *ARGV[] , *ENV[]; { INT I ; PRINTF("La liste des variables d'environnement \n") ; I=0; WHILE (ENV[I] != NULL) { PRINTF("%s \n" , I , ENV[I]) ; I++ ; } } Exemple : main(argc,argv,env) int argc; char *argv[],*env[]; { int i; char *p; printf("%9d",argc); for(i=0;i<=argc-1;++i) printf("\n%s",argv[i]); for(i=0;i<=10;++i) printf("\n%s",env[i]); } Le rsultat est : 3 C:\TURBOC\NONAME.EXE bien 6 COMSPEC=C:\COMMAND.COM PROMPT=$p$g
PATH=\EXCEL;\MOUSE;\WINDOWS;\DB;\DOS;\ISIS\SYS;\OUTILS;\PCTOOLS;\WINDOWS\SMARTDRV.EXE;\W INWORD;\ARABIC;\UTILE

TEMP=C:\DOS RUN=c:\arabic (null)

11.5. Compilation en ligne de commande


La commande de compilation est : tcc prog.c Cette commande fait compiler le fichier principal source prog.c en plaant le code objet dans le fichier prog.obj. Si la compilation est faite dans le disque, le fichier excutable prog.exe est cr.

- 52 -

Prpar par Mr. MOUFID

Langage de Programmation C

12. Classe
Un objet du monde rel est reprsent par un ensemble de caractres. Chaque caractre est manipul par un ensemble doprations propres lui. Les types simples du langage ne permettent de reprsenter quun caractre la fois et sparment. Les fonctions ne permettent de raliser les oprations que sparment.

12.1. Dfinition
Une classe est un type dfinie par : un ensemble de donnes membres, de donnes, dattributs ; un ensemble de fonctions membres, dactions, doprations, de mthodes. La notion dencapsulation des donnes consiste ce que les donnes membres dune classe ne soient accessibles que par le biais des fonctions membres de la classe. Une instance, un objet, dune classe est une variable dun type classe.

CLASS [ identif ] [ : [PRIVATE/PUBLIC/PROTECTED] identif_b ] df_type { PRIVATE : df_var dc_df_fonct PUBLIC : df_var dc_df_fonct PROTECTED : df_var dc_df_fonct } [ var_1 , var_2 , ] ; identif var_1 , var_2 , ; dclare ou dfinie une classe identif drive de la classe de base identif_b. df_type : dfinie une suite de types. df_var : dfinie les donnes membre de la classe. dc_df_fonct : dclare ou dfinie les fonctions membres de la classe. var_1 , var_2 , : dclare une liste dobjet de type la classe identif. identif var_1 , var_2 , ; dclare une liste dobjets de type la classe identif.
Exemple : Remarques :
Il ny a pas dinitialisation des donnes membres dune classe lors de sa dfinition car la dfinition dun type nest pas accompagne dune rservation despace mmoire. Une donne membre dune classe ne peut pas tre de type la classe elle-mme mais il peut tre un pointeur ou une rfrence vers cette classe. Une fonction membre dune classe peut tre dfinie lintrieur ou lextrieure de la classe. Une fonction membre dune classe dfinie lintrieure de la classe est implicitement en ligne. Les fonctions membres accdent directement aux donnes membres de la classe. La dfinition des types est locale la classe.

type identif_c : : identif(par_for) {}


dfinition externe dune fonction membre identif de la classe identif_c.
- 53 -

Prpar par Mr. MOUFID

Langage de Programmation C

identif_1.identif_don identif_don est une donne membre de linstance identif_1. identif_1.identif_fonct identif_fonct est une fonction membre de linstance identif_1.
Il y a trois types daccs un membre dune classe : PRIVATE : laccs au membre est rserv aux fonctions membres et aux fonctions amies de la classe. Cest laccs par dfaut ; PUBLIC : laccs au membre est autoris lintrieur et lextrieur de la classe par tous les identificateurs ; PROTECTED : laccs au membre est rserv aux fonctions membres et aux fonctions amies de la classe et des autres classes qui sont bases sur elle. Remarques : Les fonctions membres publiques dune classe forment une interface des donnes membres prives ou protges de la classe. Un spcificateur daccs est valable pour tous les membres qui le suivent jusqu la rencontre ventuelle dun nouveau spcificateur daccs.

12.2. Classe drive


Une classe C2 est drive dune classe C1 si C2 contient C1 en plus de ses propres donnes membres et fonctions membres. Dans ce cas, C1 est une classe de base de C2. Une classe qui est drive dune autre classe hrite de la classe de base tous les membres publics ou protgs mais pas les membres privs.

12.3. Classe imbrique


CLASS [ identif ] [ : [PRIVATE/PUBLIC/PROTECTED] identif_b ] [ PRIVATE : / PUBLIC : ] CLASS [ identif_i ] dfinition dune classe, locale par dfaut, identif_i imbrique dans la classe identif.

12.4. Constructeur de classe


Le constructeur dune classe est une fonction membre de la classe qui porte le mme nom que la classe, qui na pas de rsultat, sans VOID comme rsultat, public et qui peut tre surcharg. Le constructeur dune classe est appel automatiquement lors de la dfinition dune instance de la classe. Le constructeur dune classe ne peut pas tre appel pour modifier les donnes membres dune mme instance.

12.5. Destructeur de classe


Le destructeur dune classe est une fonction membre de la classe qui porte le mme nom que la classe prcd par ~, qui na ni paramtre ni rsultat, sans VOID comme rsultat, public et qui peut tre surcharg. Le destructeur dune classe est appel automatiquement lors de la destruction dune instance de la classe.

12.6. Fonction virtuelle


VIRTUAL type fonct (par_for) {}
rend la fonction membre dune classe de base redfinable dans une classe drive.

- 54 -

Prpar par Mr. MOUFID

Langage de Programmation C

Bibliographie
Langage C, Philippe DAX, Editions Eyrolles, 1990. C : Langage, bibliothque, applications, Henri GARRETA, InterEditions, 1992. Turbo C, Grard LEBLANC, Editions Eyrolles, 1992. Variations en C, Steve SCHUSTACK, Traduit par Yvette FISCHER et Jean-Franois REY, Cedic/Nathan, 1986. Turbo C, Manuel d'utilisation / Guide de rfrence, Borland International, Inc. Borland C++, Guide de programmateur, version 3.0, Borland International, Inc., 1991. Le langage C++, Grand livre, MicroApplication, Grard Willms, 1997.

- 55 -

Prpar par Mr. MOUFID

Langage de Programmation C

Annexe

Liste des symboles utiliss


const : constante. identif : identificateur. var : variable. fonct : fonction. expr : expression. op : oprateur. arith : arithmtique. ent : entier. log : logique. chane : chane de caractre. type : type. ti : tiquette. car : caractre. sca : scalaire. rel : relationnel. module : module. val : valeur numrique. instr : instruction. type : type. df : dfinition. dc : dclaration. par : paramtre. for : formel. eff : effectif.
: dfinition. : disjonction. : suite de termes. : partie optionnelle. terme : terme, en gras, mettre. terme : terme, en italique, remplacer = / ... [ ... ]

- 56 -

Vous aimerez peut-être aussi