Sie sind auf Seite 1von 190

IT NISRO

Club Tutoriel Informatique

INTRODUCTION A LA PROGRAMMATION EN LANGAGE ANSI-C

Le langage C

Le langage C est un langage dingnieur destin la cration dapplications informatiques. Un programme en C est constitu dun (ou plusieurs) fichiers sources organiss dune faon conventionnelle.

Club Tutoriel Informatique

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

NOTIONS DE BASE

#include <stdio.h> #include <conio.h> main() /* Notre premier programme en C */ { printf("hello, world\n"); getch(); }
Club Tutoriel Informatique

Les bibliothques de fonctions prdfinies

La pratique en C exige l'utilisation de bibliothques de fonctions. Pour pouvoir les utiliser, il faut inclure des fichiers en-tte (header files - extension .H) dans nos programmes. L'instruction #include insre les fichiers entte indiqus comme arguments dans le texte du programme au moment de la compilation.
Club Tutoriel Informatique

Les bibliothques de fonctions prdfinies

Nous avons crit un programme qui fait appel des fonctions mathmatiques et des fonctions graphiques prdfinies. Pour pouvoir utiliser ces fonctions, le programme a besoin des bibliothques:

MATHS.LIB GRAPHICS.LIB

Nous devons donc inclure les fichiers en-tte correspondants dans le code source de notre programme l'aide des instructions:

#include <math.h> #include <graphics.h>

Club Tutoriel Informatique

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

Les composantes d'un programme en C

Les Fonctions

En C, le programme principal et les sous-programmes sont dfinis comme fonctions. Il n'existe pas de structures spciales pour le programme principal ni les procdures Le programme principal tant aussi une 'fonction'. La fonction main().

Club Tutoriel Informatique

Les Fonctions
Dfinition d'une fonction en C :
<TypeRs> <NomFonct> (<TypePar1> <NomPar1>, <TypePar2> <NomPar2>, ...) { <dclarations locales> <instructions> } En C, une fonction est dfinie par: * une ligne dclarative qui contient: <TypeRs> - le type du rsultat de la fonction <NomFonct> - le nom de la fonction <TypePar1> <NomPar1>, <TypePar2> <NomPar2>, ... * les types et les noms des paramtres de la fonction * un bloc d'instructions dlimit par des accolades { }, contenant:

<dclarations locales> - les dclarations des donnes locales (c.--d.: des donnes qui sont uniquement connues l'intrieur de la fonction) <instructions> - la liste des instructions qui dfinit l'action qui doit tre excute
Club Tutoriel Informatique

Les Fonctions
Rsultat d'une fonction :
Par dfinition, toute fonction en C fournit un rsultat dont le type doit tre dfini. Si aucun type n'est dfini explicitement, C suppose par dfaut que le type du rsultat est int (integer). Le retour du rsultat se fait en gnral la fin de la fonction par l'instruction return. Le type d'une fonction qui ne fournit pas de rsultat (comme les procdures en langage algorithmique ou en Pascal), est dclar comme void (vide).

Club Tutoriel Informatique

10

Les Fonctions
Paramtres d'une fonction
La dfinition des paramtres (arguments) d'une fonction est place entre parenthses ( ) derrire le nom de la fonction. Si une fonction n'a pas besoin de paramtres, les parenthses restent vides ou contiennent le mot void. La fonction minimale qui ne fait rien et qui ne fournit aucun rsultat est alors: void Afficher () {}

Instructions
En C, toute instruction simple est termine par un point-virgule ; (mme si elle se trouve en dernire position dans un bloc d'instructions). Par exemple: printf("hello, world\n");

Club Tutoriel Informatique

11

La Fonction main()
La fonction main est la fonction principale des programmes en C: Elle se trouve obligatoirement dans tous les programmes. L'excution d'un programme entrane automatiquement l'appel de la fonction main.
main() { <dclarations> <instructions> return 0; } le type rsultat de main est toujours int, puisque c'est le type par dfaut. Nous allons terminer nos programmes par l'instruction: return 0; Si nous utilisons des fonctions prdfinies (par exemple: printf), il faut faire prcder la dfinition de main par les instructions #include correspondantes
Club Tutoriel Informatique

12

Les commentaires
Un commentaire commence toujours par les deux symboles '/*' et se termine par les symboles '*/'. Il est interdit d'utiliser des commentaires imbriqus.

Exemples
/* Ceci est un commentaire correct */ /* Ceci est /* videmment */ dfendu */ // Ceci est un commentaire correct

Club Tutoriel Informatique

13

Squence d'chappement
sq. d'chapp. descr. anglaise descr. franaise

\n \t \b
\r \" \\ \0 \a

new line tabulator back


return quotation marks back-slash NUL attention (bell)

passage la ligne tabulation curseur arrire


retour au dbut de la ligne guillemets trait oblique fin de chane signal acoustique

Club Tutoriel Informatique

14

INTRODUCTION A LA PROGRAMMATION EN L-C

TYPES DE BASE, OPRATEURS ET EXPRESSIONS

Ensembles de nombres et leur reprsentation

En mathmatiques, nous distinguons divers ensembles de nombres:

* l'ensemble des entiers naturels IN, * l'ensemble des entiers relatifs ZZ, * l'ensemble des rationnels Q, * l'ensemble des rels IR

Club Tutoriel Informatique

16

Les types entiers

Avant de pouvoir utiliser une variable, nous devons nous intresser deux caractristiques de son type numrique:

(1) le domaine des valeurs admissibles (2) le nombre d'octets qui est rserv pour une variable

Le tableau suivant rsume les caractristiques des types numriques entiers de C :

Club Tutoriel Informatique

17

Les types entiers


dfinition description domaine min domaine max nombre d'octets

char short int long

caractre entier court entier long

-128 -32768 -2147483648

127 32767 32767 2147483647

1 2 2 4

entier standard -32768

Si on ajoute le prfixe unsigned la dfinition d'un type de variables entires, les domaines des variables sont dplacs comme suit:
dfinition description min max nombre d'octets

unsigned char unsigned short unsigned int unsigned long

caractre entier court entier standard entier long

0 0 0 0

255 65535 65535 4294967295

1 2 2 4

Club Tutoriel Informatique

18

Les types rationnels

En informatique, les rationnels sont souvent appels des 'flottants'. Ce terme vient de 'en virgule flottante' et trouve sa racine dans la notation traditionnelle des rationnels.

<+|-> <mantisse> * 10<exposant> Exemples


3.14159*1010 , 1.25003*10-12 4.3001*10321 , -1.5*103

Club Tutoriel Informatique

19

Les types rationnels

En C, nous avons le choix entre trois types de rationnels: float, double et long double. Dans le tableau ci-dessous, vous trouverez leurs caractristiques:

min et max : reprsentent les valeurs minimales et maximales positives. Les valeurs ngatives peuvent varier dans les mmes domaines.

mantisse : indique le nombre de chiffres significatifs de la mantisse.

Club Tutoriel Informatique

20

Les types rationnels


dfinition prcision mantisse domaine min domaine max nombre d'octets

float double long double

simple double suppl.

6 15 19

3.4 * 10-38 1.7 * 10-308 3.4 * 10-4932

3.4 * 1038 1.7 * 10308 1.1 * 104932

4 8 10

Club Tutoriel Informatique

21

Exercice

Quel(s) type(s) numrique(s) pouvez-vous utiliser pour les groupes de nombres suivants? Dressez un tableau et marquez le choix le plus conomique:

(1) : (2) : (3) : (4) : (5) : (6) : (7) : (8) : (9) : (10) : (11) : (12) : (13) :

1 12 1 12 1 12 1 12 -220 32000 -3000005.000000001 410 50000 410 50000 3.14159265 2*107 10000001 2*10 -7 -1.05*1050 305.122212

4 -4 4 -4 0 2 -2 1015

0 0 0 0.5

-125 250 250 125

10000001 0.0001 0 -12

Club Tutoriel Informatique

22

La dclaration des variables simples

Maintenant que nous connaissons les principaux types de variables, il nous faut encore la syntaxe pour leur dclaration:

<Type> <NomVar1>,<NomVar2>,...,<NomVarN>;

Exemple :
int compteur,X,Y; float hauteur,largeur; double masse_atomique; char touche; int t_pressee;

boolen : En C il n'existe pas de type spcial pour variables boolennes. Si l'utilisation d'une variable boolenne est indispensable, le plus naturel sera d'utiliser une variable du type int. (0 pour faux et 1 pour vrai)
Club Tutoriel Informatique

23

Exercice

Traduisez les dclarations suivantes en C, sachant que vous travaillerez dans les ensembles de nombres indiqus. Choisissez les types les plus conomiques, sans perdre en prcision.
(1) entier COMPTEUR {0 ,..., 300}

(2)
(3) (4) (5)

entier
entier rel rel

X,Y
MESURE SURFACE1 SURFACE2

{-120 ,..., 100}


{-10 ,..., 104} {0.5 ,..., 150075} {-12 ,..., 1500750.5}

(6)
(7) (8) (9) (10)

entier
entier entier entier boolen

N1
N2 N3 N4 TROUVE

{0 ,..., 210}
{-47 ,..., 47} {0 ,..., 326} {-1280 ,..., 1285} {vrai, faux}

Club Tutoriel Informatique

24

Initialisation des variables


Initialisation En C, il est possible d'initialiser les variables lors de leur dclaration:

int MAX = 1023; char TAB = '\t'; float X = 1.05e-4;

const En utilisant l'attribut const, nous pouvons indiquer que la valeur d'une variable ne change pas au cours d'un programme:

const int MAX = 767; const double e = 2.71828182845905; const char NEWLINE = '\n';

Club Tutoriel Informatique

25

Spcificateurs de format
SYMBOLE TYPE DE VARIABLE

%d ou %i %u %o %b

entier relatif entier naturel (unsigned) entier exprim en octal entier exprim en hexadcimal

%c %s
%f ou %e

caractre chane de caractres


rationnel en notation dcimale ou exponentielle (scientifique)

Club Tutoriel Informatique

26

Les oprateurs connus


Oprateurs arithmtiques
+ * / % addition soustraction multiplication division (entire et rationnelle!) modulo (reste d'une div. entire)

Oprateurs logiques
&&
|| !

et logique (and)
ou logique (or) ngation logique (not)

Oprateurs de comparaison
== gal

!=
<, <=, >, >=

diffrent de
plus petit que, ...

Club Tutoriel Informatique

27

Les oprateurs d'affectation

En pratique, nous retrouvons souvent des affectations comme: i=i+2

En C, nous utiliserons plutt la formulation plus compacte: i += 2 L'oprateur += est un oprateur d'affectation.

Pour la plupart des expressions de la forme: expr1 = (expr1) op (expr2)

il existe une formulation quivalente qui utilise un oprateur d'affectation: expr1 op= expr2

Club Tutoriel Informatique

28

Les oprateurs d'affectation


+= ajouter

-=
*= /= %=

diminuer de
multiplier par diviser par modulo

Exemple : i = i + 8; j = j * 14; i += 8; j *= 14;

Club Tutoriel Informatique

29

Oprateurs d'incrmentation et de dcrmentation

Les affectations les plus frquentes sont du type:


I = I + 1 et I = I 1 En C, nous disposons de deux oprateurs inhabituels pour ces affectations :

I++ ou ++I

pour l'incrmentation

(augmentation d'une unit)

I-- ou --I

pour la dcrmentation

(diminution d'une unit)

Les oprateurs ++ et -- sont employs dans les cas suivants:

incrmenter/dcrmenter une variable (p.ex: dans une boucle). incrmenter/dcrmenter une variable et en mme temps affecter sa valeur une autre variable.

Club Tutoriel Informatique

30

Oprateurs d'incrmentation et de dcrmentation


X = i++ X = i-X = ++i X = --i

passe d'abord la valeur de i X et incrmente aprs passe d'abord la valeur de i X et dcrmente aprs incrmente d'abord et passe la valeur incrmente X dcrmente d'abord et passe la valeur dcrmente X

Exemple :

Supposons que la valeur de N est gal 5: Incrm. postfixe: X = N++; Rsultat: N=6 et X=5 Incrm. prfixe:

X = ++N; Rsultat: N=6 et X=6

Club Tutoriel Informatique

31

Les conversions de type automatiques

Considrons le calcul suivant:


int I = 8; float X = 12.5; double Y; Y = I * X;

Pour pouvoir tre multipli avec X, la valeur de I est convertie en float (le type le plus large des deux). Le rsultat de la multiplication est du type float, mais avant d'tre affect a Y, il est converti en double. Nous obtenons comme rsultat: Y = 100.00
Club Tutoriel Informatique

32

Les conversions de type automatiques


Rgles de conversion automatique Conversions automatiques lors d'une opration avec :

(1) deux entiers: D'abord, les types char et short sont convertis en int. Ensuite, l'ordinateur choisit le plus large des deux types dans l'chelle suivante: int, unsigned int, long, unsigned long (2) un entier et un rationnel: Le type entier est converti dans le type du rationnel. (3) deux rationnels: L'ordinateur choisit le plus large des deux types selon l'chelle suivante: float, double, long double

(4) affectations et oprateurs d'affectation: Lors d'une affectation, le rsultat est toujours converti dans le type de la destination. Si ce type est plus faible, il peut y avoir une perte de prcision.
Club Tutoriel Informatique

33

Les conversions de type automatiques


Exemple :
Observons les conversions ncessaires lors d'une simple division:
int X; float A=12.48; char B=4; X=A/B;

B est converti en float (rgle 2). Le rsultat de la division est du type float (valeur 3.12) et sera converti en int avant d'tre affect X (rgle 4), ce qui conduit au rsultat X=3 .
Club Tutoriel Informatique

34

Exercice
Soient les dclarations: long A = 15; char B = 'A'; /* code ASCII : 65 */ short C = 10; Quels sont le type et la valeur de chacune des expressions:

(1) (2) (3) (4) (5) (6)

C+3 B+1 C+B 3*C+2*B 2 * B + (A + 10) / C 2 * B + (A + 10.0) / C


Club Tutoriel Informatique

35

Les conversions de type forces (casting)

Il est possible de convertir explicitement une valeur en un type quelconque en forant la transformation. Exemple :
char A=3; int B=4; float C; C = (float)A/B;

La valeur de A est explicitement convertie en float. La valeur de B est automatiquement convertie en float (rgle 2). Le rsultat de la division (type rationnel, valeur 0.75) est affect C. Rsultat: C=0.75

Club Tutoriel Informatique

36

Exercices

crire un programme qui affiche le quotient et le reste de la division entire de deux nombres entiers entrs au clavier ainsi que le quotient rationnel de ces nombres .
crire un programme qui affiche la rsistance quivalente trois rsistances R1, R2, R3 (type entier) :

- les rsistances sont branches en srie:


Rsr = R1+R2+R3

- les rsistances sont branches en parallle:

Club Tutoriel Informatique

37

Exercices
a) Ecrire un programme qui calcule le prix TTC (type float) d'un article partir du prix net (type int) et du pourcentage de TVA (type int) ajouter. Utilisez la formule suivante en faisant attention aux priorits et aux conversions automatiques de type:

b) Ecrire un programme qui calcule le prix net d'un article (type int) partir du prix TTC (type float) et du pourcentage de TVA (type int) qui a t ajoute.
(Dduisez la formule du calcul de celle indique ci-dessus)
Club Tutoriel Informatique

38

crire un programme qui calcule la moyenne des notes dun tudiant. Les matires exiges lexamen et leurs coefficients sont : Math (2), Franais (1), Informatique (3) Le programme doit afficher lcran suivant :

Exercices

Club Tutoriel Informatique

39

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LA STRUCTURE ALTERNATIVE

if - else
La structure alternative en C
if ( <expression> ) <bloc d'instructions 1> else <bloc d'instructions 2>

Exemple 1
if ( A == B ) printf("A est gal B\n"); else printf("A est diffrent de B\n");

Club Tutoriel Informatique

41

if sans else

La partie else est facultative. On peut donc utiliser if de la faon suivante: L'expression suivante peut tre interprte de deux faons:
if (N>0) if (A>B) MAX=A; else MAX=B;

Ou bien :
if (N>0) if (A>B) MAX=A; else printf("N est infrieur a 0");
Club Tutoriel Informatique

42

if sans else
Convention En C une partie else est toujours lie au dernier if qui ne possde pas de partie else. Dans notre exemple, C utiliserait donc la premire interprtation. Solution Pour viter des confusions et pour forcer une certaine interprtation d'une expression, il est recommand d'utiliser des accolades { } .
Club Tutoriel Informatique

43

if sans else

Exemple
Pour forcer la deuxime interprtation de l'expression ci-dessus, nous pouvons crire:
if (N>0) { if (A>B) MAX=A; } else printf("N est infrieur a 0");
Club Tutoriel Informatique

44

Exercice

Ecrivez un programme qui lit trois valeurs entires (A, B et C) au clavier et qui affiche la plus grande des trois valeurs crivez un programme qui lit deux valeurs entires (A et B) au clavier et qui affiche le signe du produit de A et B sans faire la multiplication.
Club Tutoriel Informatique

45

Exercice
Considrez la squence d'instructions suivante:
if (A>B) printf ("premier choix \n"); else if (A>10) printf ("deuxime choix \n"); if (B<10) printf ("troisime choix \n"); else printf ("quatrime choix \n");

a) Copiez la squence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else appartenant ensemble. b) Dterminez les rponses du programme pour chacun des couples de nombres suivants et vrifiez l'aide de l'ordinateur.
- A=10 et B=5 - A=5 et B=10 - A=20 et B=10 - A=5 et B=5 - A=10 et B=10 - A=20 et B=20

Club Tutoriel Informatique

46

if - else if - ... - else

En combinant plusieurs structures if - else en une expression nous obtenons une structure qui est trs courante pour prendre des dcisions entre plusieurs alternatives:

if - else - ... - else if ( <expr1> ) <bloc1> else if (<expr2>) <bloc2> else if (<expr3>) <bloc3> else if (<exprN>) <blocN> else <blocN+1>
Club Tutoriel Informatique

47

Exercices

Soit N un nombre entier, proposer une opration avec laquelle nous pourrons conclure si le nombre N est pair ou impair. crire un programme permettant de rsoudre une quation du premire degr (ax + b = c). crire un programme C qui permet de :

lire 3 nombre entier. les tris dans un ordre croisant. les tris dans un ordre dcroisant

Club Tutoriel Informatique

48

Soit le programme suivant : #include<stdio.h> #include<conio.h> main() { int a,b,c; if(a==b || a==c) a+=++b-=c--;if(a<0) a=--b; else if(b==c && b!=0) b=a++;if(c>=0) a-=--c+b++; else b=c++; printf("a=%d, b=%d, c=%d",a,b,c); getch(); } Dduire le rsultat du programme dans les cas suivant : a=c=b=3 ; a= -3 , b= 0, c= -3 ; a= 0 , b= -1, c= 0 ; a= 7, b= 5, c= 5 ; a= -9 , b= -7, c= 0 ; a=1 , b=1 , c=7;

Club Tutoriel Informatique

49

Les oprateurs conditionnels

Le langage C possde une paire d'oprateurs un peu exotiques qui peut tre utilise comme alternative if - else :

<expr1> ? <expr2> : <expr3>

Exemple :

La suite d'instructions
if (A>B) MAX=A; else MAX=B;

peut tre remplace par:


MAX = (A > B) ? A : B;

Club Tutoriel Informatique

50

Exercice

crire la phrase suivante avec une seule instruction : Si N gale 1 alors :

Vous avez 1 carte

Si N suprieur 1 alors :

Vous avez 3 cartes

printf("Vous avez %i carte%s \n", N, (N==1) ? " " : " s ");

Club Tutoriel Informatique

51

Slection (switch)
L'instruction switch est une sorte d'aiguillage. Elle permet de remplacer plusieurs instructions imbriques. La variable de contrle est compare la valeur des constantes de chaque cas (case). Si la comparaison russit, l'instruction du case est excute jusqu' la premire instruction break rencontre. If (a==1)
<instruction 1>; If (a==2) <instruction 2>; If (a==3) Switch (a) { Case 1 : Case 2 : Case 3 : Case 4 : }

Ou bien

<instruction 3>;
If (a==4) <instruction 4>;

<instruction 1>; break; <instruction 2>; break; <instruction 3>; break; <instruction 4>; break;

Club Tutoriel Informatique

52

Exercices
On dispose de 3 nombres rels saisis au clavier. selon un choix effectu partie dun menu affich lcran, on dsire calculer la somme ou le produit ou la moyenne ou chercher le minimum ou le maximum de ces 3 nombres. Exemple : 1) somme des 3 nombres 2) produit des 3 nombres 3) moyenne des 3 nombres 4) minimum des 3 nombres 5) maximum des 3 nombres

crire un programme permettant de rsoudre une quation du deuxime degr (ax2 + bx = c).
Club Tutoriel Informatique

53

Exercices
Dans une entreprise, le salaire brut dun employ est calcul en fonction du nombre dheures travailles dans le mois et de son taux horaire. A ce salaire on ajoute une prime danciennet en fonction du nombre dannes travailles, cette prime est gale 7% du salaire brut par anne, (il est impossible davoir une anciennet >20ans). Pour chaque employ en doit retirer une somme de 200DH pour IGR, ainsi que la participation dans une des assurances suivante :

Assurance maladie (250 DH) Assurance logement (470 DH) Assurance dcs (180 DH)

Calculer le salaire net de lemploy. Le programme devra afficher 4 information, Salaire brut, Prime, Retenue et le salaire net.
Club Tutoriel Informatique

54

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LA STRUCTURE REPETITIVE

LA STRUCTURE REPETITIVE
En C, nous disposons de trois structures qui nous permettent la dfinition de boucles conditionnelles:

1) la structure : while 2) la structure : do - while 3) la structure : for

il est possible de programmer toutes sortes de boucles conditionnelles en n'utilisant qu'une seule des trois structures. il est donc, absolument recommand de choisir toujours la structure la mieux adapte au cas actuel 56

Club Tutoriel Informatique

while

La structure while correspond tout fait la structure tant que du langage algorithmique.

La structure while en C :
while ( <expression> ) { <bloc d'instructions> }

Club Tutoriel Informatique

57

Exemple 1
/* Afficher les nombres de 0 9 */ int I = 0; while (I<10) { printf("%i \n", I); I++; }

Club Tutoriel Informatique

58

Exemple 2
/* Afficher les nombres de 9 0 */
int I = 10; while (I>0) { printf("%i \n", I); I-- ; }

Club Tutoriel Informatique

59

do - while
La structure do - while est semblable la structure while, avec la diffrence suivante :

* while value la condition avant d'excuter le bloc d'instructions, * do - while value la condition aprs avoir excut le bloc d'instructions. Ainsi le bloc d'instructions est excut au moins une fois.

Club Tutoriel Informatique

60

do - while
La structure do - while en C :
do {

<bloc d'instructions> }while ( <expression> );


Le <bloc d'instructions> est excut au moins une fois et aussi longtemps que l'<expression> est ralise. 61

Club Tutoriel Informatique

Exemple 1
int N ; do { printf("Introduisez un nombre entre 1 et 10 :") ; scanf("%f", &N) ; } while (N<1 || N>10) ;

Club Tutoriel Informatique

62

Exemple 2

Le programme de calcul de la racine carre :


#include <stdio.h> #include <math.h> main() { float N; do { printf("Entrer un nombre (>= 0) : "); scanf("%f", &N) } while (N < 0); printf("La racine carre de %f est %f\n", N, sqrt(N)); return 0; }
Club Tutoriel Informatique

63

for
La structure for en Pascal et la structure pour en langage algorithmique sont utilises pour faciliter la programmation de boucles de comptage. La structure for en C est plus gnrale et beaucoup plus puissante.
La structure for en C :
for ( <init.> ; <cond. rptition> ; <compteur> ) <bloc d'instructions>

Club Tutoriel Informatique

64

for
<expr1>; while ( <expr2> ) { <bloc d'instructions> <expr3>; }

est quivalent :
for ( <expr1> ; <expr2> ; <expr3> ) <bloc d'instructions>

Club Tutoriel Informatique

65

Exemple 1
Int i=0; while ( i<10 ) { <bloc d'instructions> i++; }

est quivalent :
for ( int i=0 ; i<10 ; i++ ) { <bloc d'instructions> }
Club Tutoriel Informatique

66

Exemple 2
int n, tot; for (tot=0, n=1 ; n<101 ; n++) { tot+=n; } printf("La somme des nombres de 1 100 est %d\n", tot);

Club Tutoriel Informatique

67

Choix de la structure rptitive


Nous avons vu trois faons diffrentes de programmer des boucles (while, do - while, for). Utilisez la structure qui reflte le mieux l'ide du programme que vous voulez raliser, en respectant toutefois les directives suivantes :

Si le bloc d'instructions ne doit pas tre excut si la condition est fausse, alors utilisez while ou for. Si le bloc d'instructions doit tre excut au moins une fois, alors utilisez do - while. Si le nombre d'excutions du bloc d'instructions dpend d'une ou de plusieurs variables qui sont modifies la fin de chaque rptition, alors utilisez for. Si le bloc d'instructions doit tre excut aussi longtemps qu'une condition extrieure est vraie (p.ex aussi longtemps qu'il y a des donnes dans le fichier d'entre), alors utilisez while.

Le choix entre for et while n'est souvent qu'une question de prfrence ou d'habitudes:
Club Tutoriel Informatique

68

Exercice d'application 1

On se propose dcrire un programme qui dtecte si un nombre entr au clavier est positif ou ngatif. La condition darrt de la saisie est lentre dun zro. crire un programme permettant dafficher la table de multiplication de 5.

Club Tutoriel Informatique

69

Exercice d'application 2

crivez un programme qui affiche, pour chaque entier de 1 20, sa valeur, un espace, le texte "au carr vaut", un espace, la valeur de son carr et un retour la ligne :
1 au carr vaut 1 2 au carr vaut 4 3 au carr vaut 9 ...

Club Tutoriel Informatique

70

Exercice d'application 3

crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre, un par ligne, tous les entiers compris entre ces deux nombres. On suppose que l'utilisateur entre le plus petit des deux nombres en premier.
Par exemple si l'utilisateur entre 21 puis 24, le programme devra afficher :
21 22 23 24

Club Tutoriel Informatique

71

Exercice d'application 4

crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre inverse, spars par des virgules, les entiers compris entre ces deux valeurs, en en sautant un sur deux. On suppose que l'utilisateur entre le plus petit des deux nombres en premier. Par exemple, si l'utilisateur tape 11 puis 20, votre programme doit afficher :
20,18,16,14,12
Club Tutoriel Informatique

72

Exercice d'application 5

Ecrivez un programme qui lit N nombres entiers au clavier et qui affiche leur somme, leur produit et leur moyenne. Choisissez un type appropri pour les valeurs afficher. Le nombre N est entrer au clavier. Rsolvez ce problme,

a) en utilisant while, b) en utilisant do - while, c) en utilisant for. 73

Club Tutoriel Informatique

Exercice d'application 6

Calculez la factorielle N! = 123...(N-1)N d'un entier naturel N en respectant que 0!=1.


a) Utilisez while, b) Utilisez for.

Club Tutoriel Informatique

74

Exercice d'application 7
crire un programme permettant dafficher les formes suivants (1<N<10) : tape 1 : ***
N=3

tape 2 :
N=3

*** *** * ** *** * ** *** * ** *** ** *

tape 3 :
N=3

tape 4 :
N=3

Club Tutoriel Informatique

75

Exercice d'application 8

crire un programme qui affiche tous les diviseur dun nombre N (1<N<50). Exemple :
N= 33 les diviseurs de 33 sont : 1 3 11 33

crire un programme qui affiche le P.G.C.D. de deux entiers naturels entrs au clavier en utilisant (l'algorithme d'Euclide).
Club Tutoriel Informatique

76

Exercice d'application 9
crivez un programme qui lit deux nombres au clavier et qui affiche dans l'ordre, tous les entiers premier compris entre ces deux nombres.

On veut trouver le plus petit entier N (sil existe) tel que 1+1/2+.+1/N >1000. crire la boucle qui permet de dterminer n.

Club Tutoriel Informatique

77

Exercice d'application 10
Lire la suite des prix (en Dirham entiers) des achats dun client. Calculer la somme quil doit, lire la somme quil paye, et simuler la remise de la monnaie en affichant le nombre de pices de : "10 DH", "5 DH" , "2 DH" et "1 DH" autant de fois quil y a de pices de chaque sorte rendre.

Club Tutoriel Informatique

78

Exercice d'application 11
crire un algorithme qui permette de connatre ses chances de gagner au tierc. On demande lutilisateur le nombre de chevaux partants, et le nombre de chevaux jous. Les deux messages affichs par le programme sont :
Dans lordre : une chance sur X de gagner Dans le dsordre : une chance sur Y de gagner

X et Y nous sont donns par la formule suivante, si n est le nombre de chevaux partants et k le nombre de chevaux jous : X= Y=
Club Tutoriel Informatique

79

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LES TABLEAUX

Les Tableaux

Les tableaux sont certainement les variables structures les plus populaires. Ils sont disponibles dans tous les langages de programmation et servent rsoudre une multitude de problmes.
Les chanes de caractres sont dclares en C comme tableaux de caractres et permettent l'utilisation d'un certain nombre de notations et de fonctions spciales.

Club Tutoriel Informatique

81

Les tableaux une dimension


Dfinitions :

Un tableau (uni-dimensionnel) A est une variable structure forme d'un nombre entier N de variables simples du mme type, qui sont appeles les composantes du tableau. Le nombre de composantes N est alors la dimension du tableau.

Club Tutoriel Informatique

82

Exemple
La dclaration
int JOURS[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

dfinit un tableau du type int de dimension 12. Les 12 composantes sont initialises par les valeurs respectives 31, 28, 31, ... , 31. On peut accder la premire composante du tableau par JOURS[0], la deuxime composante par JOURS[1], . . . , la dernire composante par JOURS[11].
Club Tutoriel Informatique

83

Dclaration
Dclaration de tableaux en C
<TypeSimple> <NomTableau> [<Dimension>];

Exemples :
int A[25]; float B[100]; int C[10]; long A[25]; double B[100]; char D[30];

Club Tutoriel Informatique

84

Mmorisation

En C, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau. Les adresses des autres composantes sont calcules (automatiquement) relativement cette adresse.
short A[5] = {1200, 2300, 3400, 4500, 5600};

Exemple:

Club Tutoriel Informatique

85

Initialisation

Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades.

Exemples :
int A[5] = {10, 20, 30, 40, 50}; float B[4] = {-1.05, 3.33, 87e-5, -12.3E4}; int C[10] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};

Il faut videmment veiller ce que le nombre de valeurs dans la liste corresponde la dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les composantes, les composantes restantes sont initialises par zro.

Club Tutoriel Informatique

86

Rservation automatique

Si la dimension n'est pas indique explicitement lors de l'initialisation, alors l'ordinateur rserve automatiquement le nombre d'octets ncessaires.

Exemples :

Club Tutoriel Informatique

87

Accs aux composantes


En dclarant un tableau par: int A[5]; nous avons dfini un tableau A avec cinq composantes, auxquelles on peut accder par: A[0], A[1], ... , A[4]

Exemple :

Exemples :
MAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2; /* A[4]= A[4] * 2 = 6800 */
Club Tutoriel Informatique

88

Accs aux composantes


Attention !

Considrons un tableau T de dimension N:

En C,

- l'accs au premier lment du tableau se fait par T[0] - l'accs au dernier lment du tableau se fait par T[N-1]

En langage algorithmique,

- l'accs au premier lment du tableau se fait par T[1] - l'accs au dernier lment du tableau se fait par T[N]

Club Tutoriel Informatique

89

Affectation avec des valeurs


Comme scanf a besoin des adresses des diffrentes composantes du tableau, il faut faire prcder le terme A[I] par l'oprateur adresse '&'.

Exemple :

main() { int A[5]; int I; for (I=0; I<5; I++) scanf("%d", &A[I]); return 0; } La commande de lecture scanf doit tre informe du type exact des donnes lire. (Ici: %d ou %i pour lire des valeurs du type int)
Club Tutoriel Informatique

90

Affichage du contenu d'un tableau


La structure for se prte particulirement bien au travail avec les tableaux.

Exemple :
main() { int A[5]; int I; /* Compteur */ for (I=0; I<5; I++) printf("%d ", A[I]); return 0; }
Club Tutoriel Informatique

91

Exercice 1

Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Calculer et afficher ensuite la somme des lments du tableau.

Club Tutoriel Informatique

92

Exercice 2

crire un programme qui lit la dimension N d'un tableau NOTE (dimension maximale: 50 composantes), remplit le tableau par les notes d'une classe, afficher ensuite le tableau. Calculer et afficher ensuite la moyenne des tudiants de la classe. Afficher par la suit le nombre dtudiants admis pour la prochaine anne (avec une notes suprieures la
moyenne de la classe )

Club Tutoriel Informatique

93

Exercice 3

Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Le programme affichera le nombre de valeurs ngatives, le nombre de valeurs positives et le nombre de valeur nulle.

Club Tutoriel Informatique

94

Exercice 4

Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Ranger ensuite les lments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le tableau rsultant.
Ide: changer les lments du tableau l'aide de deux indices qui parcourent le tableau en commenant respectivement au dbut et la fin du tableau et qui se rencontrent en son milieu.

Club Tutoriel Informatique

95

Exercice 5

Ecrivez un algorithme constituant un tableau, partir de deux tableaux de mme longueur pralablement saisis. Le nouveau tableau sera la somme des lments des deux tableaux de dpart.

Club Tutoriel Informatique

96

Exercice 6

Toujours partir de deux tableaux prcdemment saisis, crivez un algorithme qui calcule le schtroumpf des deux tableaux. Pour calculer le schtroumpf, il faut multiplier chaque lment du tableau 1 par chaque lment du tableau 2, et additionner le tout. Par exemple si l'on a :

Club Tutoriel Informatique

97

Exercice 7

Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Copiez ensuite toutes les composantes strictement positives dans un deuxime tableau TPOS et toutes les valeurs strictement ngatives dans un troisime tableau TNEG. Afficher les tableaux TPOS et TNEG.
Club Tutoriel Informatique

98

Les tableaux deux dimensions

En C, un tableau deux dimensions A est interprter comme un tableau (uni-dimensionnel) de dimension L dont chaque composante est un tableau (uni-dimensionnel) de dimension C. On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau. L et C sont alors les deux dimensions du tableau. Un tableau deux dimensions contient donc L*C composantes.

Club Tutoriel Informatique

99

Exemple
Considrons un tableau NOTES une dimension pour mmoriser les notes de 20 lves d'une classe dans un devoir:
int NOTE[20] = {45, 34, ... , 50, 48};

Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de ces tableaux uni-dimensionnels dans un tableau NOTES deux dimensions :
int NOTE[10][20] = {{45, 34, ... , 50, 48}, {39, 24, ... , 49, 45}, ... ... ... {40, 40, ... , 54, 44}};

Dans une ligne nous retrouvons les notes de tous les lves dans un devoir. Dans une colonne, nous retrouvons toutes les notes d'un lve.
Club Tutoriel Informatique

100

Dclaration
Dclaration de tableaux deux dimensions en C :
<TypeSimple> <NomTabl> [<DimLigne>][<DimCol>];

Exemples :
int A[10][10]; float B[2][20]; double C[3][3]; char D[15][40];

Club Tutoriel Informatique

101

Mmorisation
Comme pour les tableaux une dimension, le nom d'un tableau est le reprsentant de l'adresse du premier lment du tableau (c.--d. l'adresse de la premire ligne du tableau). Les composantes d'un tableau deux dimensions sont stockes ligne par ligne dans la mmoire.
short A[3][2] = {{1, 2 }, {10, 20 }, {100, 200}}; Un tableau de dimensions L et C, form de composantes dont chacune a besoin de M octets, occupera L*C*M octets en mmoire.

Club Tutoriel Informatique

102

Initialisation et rservation automatique


Lors de la dclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades. A l'intrieur de la liste, les composantes de chaque ligne du tableau sont encore une fois comprises entre accolades. Pour amliorer la lisibilit des programmes, on peut indiquer les composantes dans plusieurs lignes.

Exemples :
int A[3][10] ={{ 0,10,20,30,40,50,60,70,80,90}, {10,11,12,13,14,15,16,17,18,19}, {11,12,23,34,45,56,67,78,89,90}}; Lors de l'initialisation, les valeurs sont affectes ligne par ligne en passant de gauche droite. Nous ne devons pas ncessairement indiquer toutes les valeurs: Les valeurs manquantes seront initialises par zro. Il est cependant dfendu d'indiquer trop de valeurs pour un tableau.
Club Tutoriel Informatique

103

Exemple

Club Tutoriel Informatique

104

Accs aux composantes


Accs un tableau deux dimensions en C
<NomTableau>[<Ligne>][<Colonne>] Les lments d'un tableau de dimensions L et C se prsentent de la faon suivante:
/ | A[0][0] | A[1][0] | A[2][0] |... | A[L-1][0] \ \ A[0][1] A[1][1] A[2][1] ... A[L-1][1] A[0][2] A[1][2] A[2][2] ... A[L-1][2] ... ... ... ... ... A[0][C-1] | A[1][C-1] | A[2][C-1] | ... | A[L-1][C-1] | /

Club Tutoriel Informatique

105

Accs aux composantes

Attention !
Considrons un tableau A de dimensions L et C. En C,

- les indices du tableau varient de 0 L-1, respectivement de 0 C-1. - la composante de la Nime ligne et Mime colonne est note:

A[N-1][M-1]

Club Tutoriel Informatique

106

Affichage
Lors du travail avec les tableaux deux dimensions, nous utiliserons deux indices (p.ex: I et J), et la structure for, souvent imbrique, pour parcourir les lignes et les colonnes des tableaux.
main() { int A[5][10]; int I,J; /* Pour chaque ligne ... */ for (I=0; I<5; I++) { /* ... considrer chaque composante */ for (J=0; J<10; J++) printf("%7d", A[I][J]); /* Retour la ligne */ printf("\n"); } return 0; }
Club Tutoriel Informatique

107

Affectation avec des valeurs


main() { int A[5][10]; int I,J; /* Pour chaque ligne ... */ for (I=0; I<5; I++) /* ... considrer chaque composante */ for (J=0; J<10; J++) scanf("%d", &A[I][J]); return 0; }

Club Tutoriel Informatique

108

Exercice

Ecrire un programme qui lit les dimensions L et C d'un tableau T deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entres au clavier et afficher le tableau ainsi que la somme de tous ses lments.
Ecrire un programme qui transfre un tableau M deux dimensions L et C (dimensions maximales: 10 lignes et 10 colonnes) dans un tableau V une dimension L*C.
Exemple :

Club Tutoriel Informatique

109

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LES CHANES DE CARACTRES

Dclaration
Dclaration de chanes de caractres en C :
char <NomVariable> [<Longueur>];

Exemples :
char NOM [20]; char PRENOM [20]; char PHRASE [300];

Lors de la dclaration, nous devons indiquer l'espace rserver en mmoire pour le stockage de la chane. La reprsentation interne d'une chane de caractres est termine par le symbole '\0' (NUL). Ainsi, pour un texte de n caractres, nous devons prvoir n+1 octets.

Club Tutoriel Informatique

111

Mmorisation
Le nom d'une chane est le reprsentant de l'adresse du premier caractre de la chane. Pour mmoriser une variable qui doit tre capable de contenir un texte de N caractres, nous avons besoin de N+1 octets en mmoire.

Exemple:
char TXT[10] = "BONJOUR !";

Club Tutoriel Informatique

112

Les fonctions de <string.h>


La bibliothque <string.h> fournit une multitude de fonctions pratiques pour le traitement de chanes de caractres. Voici une brve description des fonctions les plus frquemment utilises.

Club Tutoriel Informatique

113

Fonctions pour le traitement de chanes de caractres Dans le tableau suivant, <n> reprsente un nombre du type int. Les symboles <s> et <t> peuvent tre remplacs par le nom d'une variable dclare comme tableau de char

Club Tutoriel Informatique

114

Exercice
crire un programme qui lit deux chanes de caractres CH1 et CH2, les compare lexico graphiquement et affiche le rsultat.

Exemple:
Introduisez la premire chane: ABC Introduisez la deuxime chane: abc "ABC" prcde "abc"

Club Tutoriel Informatique

115

Exercice
crire un programme qui lit un verbe rgulier en "er" au clavier et qui en affiche la conjugaison au prsent de l'indicatif de ce verbe. Contrlez s'il s'agit bien d'un verbe en "er" avant de conjuguer. Utiliser les fonctions strcat et strlen.

Exemple:
Verbe : fter
je fte tu ftes il fte nous ftons vous ftez ils ftent

Club Tutoriel Informatique

116

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LES STRUCTURES

Diffrence entre une structure et un tableau

Un tableau permet de regrouper des lments de mme type, c'est--dire cods sur le mme nombre de bit et de la mme faon. Toutefois, il est gnralement utile de pouvoir rassembler des lments de type diffrents tels que des entiers et des chanes de caractres. Les structures permettent de remdier cette lacune des tableaux, en regroupant des objets (des variables) au sein d'une entit repre par un seul nom de variable. Les objets contenus dans la structure sont appels champs de la structure.
Club Tutoriel Informatique

118

Les Structures
Entit regroupant plusieurs variable de type divers : Exemple :

La fiche individuelle dune personne :

Description du type :

typedef struct personne{ char nom[16]; int naissance; long salaire; };

Club Tutoriel Informatique

119

Dclaration des variables dans le type


#include <stdio.h> typedef struct personne { char nom[16]; int naissance; long salaire; }; #include <stdio.h> typedef struct personne { char nom[16]; int naissance; long salaire; } pers1;

void main() { personne pers1, pers2 ; /* Instruction */ }

void main() { /* Instruction */


}

Club Tutoriel Informatique

120

Initialisation
#include <stdio.h>

typedef struct personne { char nom[16]; int naissance; int salaire; };


void main() { personne pers1={"safsouf",1983,6700}; personne pers2={"kalali",1979,3800}; /* Instruction */ }
Club Tutoriel Informatique

121

Opration sur les structures


Laccs a un membre se fait par (.)
typedef struct personne { char nom[16]; int naissance; int salaire; }; void main() { personne pers1={"safsouf",1983,6700}; printf(" \n le nom est %s " , pers1.nom);
printf(" \n le salaire est %d " , pers1.salaire); }
Club Tutoriel Informatique

122

Affectation avec des valeurs


typedef struct personne { char nom[16]; int naissance; int salaire; }; void main() { personne pers1; printf(" \n Entrez SVP le nom : "); scanf(" %s ", pers1.nom); printf(" \n Entrez SVP le salaire : "); scanf(" %d ", &pers1.salaire); }
Club Tutoriel Informatique

123

Exercice
crire un programme qui lit un enregistrement dtudiant, identifi par (nom, prenom, classe, sexe, note_fr, note_algo, note_ang), le programme doit afficher cette enregistrement et calculer la moyenne de ltudiant.
Ide:

Pour les note dclarer un tableau de note float note[3]

Club Tutoriel Informatique

124

Tableau de structure
il est possible de crer un tableau ne contenant que des lments du type d'une structure donne. Il suffit de crer un tableau dont le type est celui de la structure et de le reprer par un nom de variable :

Club Tutoriel Informatique

125

Exemple
void main() { personne pers[30]; for(int i=0 ; i<30 ; i++) { printf(" \n Entrez SVP le nom : "); scanf(" %s ", pers[i].nom); printf(" \n Entrez SVP le salaire : "); scanf(" %d ", &pers[i].salaire); } }
Chaque lment du tableau reprsente alors une structure du type que l'on a dfini...

Club Tutoriel Informatique

126

Exercice

Refaire le dernier exercice en supposant que vous avez une classe de 10 tudiants. Calculer la moyenne gnrale de la classe.

Club Tutoriel Informatique

127

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LES POINTEURS

Introduction

La plupart des langages de programmation offrent la possibilit d'accder aux donnes dans la mmoire de l'ordinateur l'aide de pointeurs, c.--d. l'aide de variables auxquelles on peut attribuer les adresses d'autres variables.
Avant de parler de pointeurs, il est indiqu de brivement passer en revue les deux modes d'adressage principaux, qui vont d'ailleurs nous accompagner tout au long des chapitres suivants.

Club Tutoriel Informatique

129

Adressage direct
Dans la programmation, nous utilisons des variables pour stocker des informations. La valeur d'une variable se trouve un endroit spcifique dans la mmoire interne de l'ordinateur. Le nom de la variable nous permet alors d'accder directement cette valeur.
Adressage direct: Accs au contenu d'une variable par le nom de la variable.

Exemple :

Club Tutoriel Informatique

130

Adressage indirect
Si nous ne voulons ou ne pouvons pas utiliser le nom d'une variable A, nous pouvons copier l'adresse de cette variable dans une variable spciale P, appele pointeur. Ensuite, nous pouvons retrouver l'information de la variable A en passant par le pointeur P.
Adressage indirect: Accs au contenu d'une variable, en passant par un pointeur qui contient l'adresse de la variable.

Exemple :

Club Tutoriel Informatique

131

Dfinition
Un pointeur est une variable spciale qui peut contenir l'adresse d'une autre variable. Si un pointeur P contient l'adresse d'une variable A, on dit que :

'P pointe sur A'.

Club Tutoriel Informatique

132

Remarque
Les pointeurs et les noms de variables ont le mme rle: Ils donnent accs un emplacement dans la mmoire interne de l'ordinateur. Il faut quand mme bien faire la diffrence :
* Un pointeur est une variable qui peut 'pointer' sur diffrentes adresses. * Le nom d'une variable reste toujours li la mme adresse.

Club Tutoriel Informatique

133

Les oprateurs de base


Lors du travail avec des pointeurs, nous avons besoin :

d'un oprateur 'adresse de' : & pour obtenir l'adresse d'une variable. d'un oprateur 'contenu de' : * pour accder au contenu d'une adresse.

Exemple :
& <NomVariable> : fournit l'adresse de la variable <NomVariable> * <NomPointeur> : dsigne le contenu de l'adresse rfrence par le pointeur <NomPointeur>

Club Tutoriel Informatique

134

Reprsentation schmatique
Soit P un pointeur non initialis :
et A une variable (du mme type) contenant la valeur 10 : Alors l'instruction : P = &A; affecte l'adresse de la variable A la variable P. En mmoire, A et P se prsentent comme dans le graphique en haut. Dans notre reprsentation schmatique, nous pouvons illustrer le fait que 'P pointe sur A' par une flche:
Club Tutoriel Informatique

135

Exemple
Soit A une variable contenant la valeur 10, B une variable contenant la valeur 50 et P un pointeur non initialis: Aprs les instructions, P = &A; B = *P; *P = 20;

- P pointe sur A, - le contenu de A (rfrenc par *P) est affect B, et - le contenu de A (rfrenc par *P) est mis 20.

Club Tutoriel Informatique

136

Dclaration d'un pointeur


<Type> *<NomPointeur>
dclare un pointeur <NomPointeur> qui peut recevoir des adresses de variables du type <Type>

Une dclaration comme :


int *PNUM;
peut

tre interprte comme suit :


"*PNUM est du type int"

ou
"PNUM est un pointeur sur int"

ou
"PNUM peut contenir l'adresse d'une variable du type int"

Club Tutoriel Informatique

137

Exemple
void main() { /* dclarations */ short A = 10; short B = 50; short *P; /* traitement */ P = &A; B = *P; *P = 20; }

Club Tutoriel Informatique

138

Les oprations lmentaires sur pointeurs


Aprs l'instruction

P = &X;
les expressions suivantes, sont quivalentes :
Y = *P + 1 *P = *P + 10 *P += 2 ++*P (*P)++ Y=X+1 X = X + 10 X += 2 /*X = X + 2*/ ++X X++

Club Tutoriel Informatique

139

Exercice
Copiez le tableau suivant et compltez-le pour chaque instruction du programme ci-dessus.

Club Tutoriel Informatique

140

Exercice
Copiez le tableau suivant et compltez-le pour chaque instruction du programme cidessus.

P1 &A

P2 &B

P3 &C

initialisation *P1=(*P2)++; *P3 - = - - (*P1); P1=&C; P3=&A; *P1*=*P2/=(*P3)++;

P2=P1;
P1=*P3+=3; P1=&B; *P3=++(*P1) **P2; P1=P3; P3=&C; *P2=&B; *P1/=(*P2)++;
Club Tutoriel Informatique

141

Pointeurs et tableaux
En C, il existe une relation trs troite entre tableaux et pointeurs. Ainsi, chaque opration avec des indices de tableaux peut aussi tre exprime l'aide de pointeurs.

Club Tutoriel Informatique

142

Adressage des composantes d'un tableau


le nom d'un tableau reprsente l'adresse de son premier lment. En d'autre termes:

&tableau[0] et tableau
En simplifiant, nous pouvons retenir que le nom d'un tableau est un pointeur constant sur le premier lment du tableau.

Club Tutoriel Informatique

143

Exemple
En dclarant un tableau A de type int et un pointeur P sur int, int A[10]; int *P; l'instruction: P = A; est quivalente P = &A[0];
Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la composante suivante. Plus gnralement,

P + i : pointe sur la i-ime composante devant P P - i : pointe sur la i-ime composante derrire P.

Club Tutoriel Informatique

144

Exemple
Ainsi, aprs l'instruction, P = A; le pointeur P pointe sur A[0], et

*(P+1) : dsigne le contenu de A[1] *(P+2) : dsigne le contenu de A[2] ... : ... *(P+i) : dsigne le contenu de A[i]
Club Tutoriel Informatique

145

Exemple
Soit A un tableau contenant des lments du type float et P un pointeur sur float:
float A[20], X; float *P; Aprs les instructions, P = A; X = *(P+9); X contient la valeur du 10-ime lment de A, (c.--d. celle de A[9]). Une donne du type float ayant besoin de 4 octets, le compilateur obtient l'adresse P+9 en ajoutant 9 * 4 = 36 octets l'adresse dans P.

Club Tutoriel Informatique

146

Exemple
Comme A reprsente l'adresse de A[0] :

*(A+1) : dsigne le contenu de A[1] *(A+2) : dsigne le contenu de A[2] ...


*(A+i) : dsigne le contenu de A[i]

Attention ! : Il existe toujours une diffrence essentielle entre un pointeur et le nom d'un tableau. 147

Club Tutoriel Informatique

Diffrence
- Un pointeur est une variable,
donc des oprations comme P = A ou P++ sont permises.

- Le nom d'un tableau est une constante,


donc des oprations comme A = P ou A++ sont impossibles.

Club Tutoriel Informatique

148

Rsumons
Soit un tableau A d'un type quelconque et i un indice pour les composantes de A, alors :
A A+i *(A+i) Si P = A, alors P P+i *(P+i) pointe sur l'lment A[0] pointe sur l'lment A[i] dsigne le contenu de A[i]
Club Tutoriel Informatique

dsigne l'adresse de A[0] dsigne l'adresse de A[i] dsigne le contenu de A[i]

149

Exercice 1

crire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes), remplit le tableau par des valeurs entres au clavier et affiche le tableau. Utiliser le formalisme pointeur chaque fois que cela est possible. Calculer et afficher ensuite la somme des lments du tableau.
Club Tutoriel Informatique

150

Allocation dynamique de mmoire


Nous avons vu que l'utilisation de pointeurs nous permet de mmoriser conomiquement des donnes de diffrentes grandeurs. Si nous gnrons ces donnes pendant l'excution du programme, il nous faut des moyens pour rserver et librer de la mmoire au fur et mesure que nous en avons besoin. Nous parlons alors de l'allocation dynamique de la mmoire.

Club Tutoriel Informatique

151

Dclaration statique de donnes


Chaque variable dans un programme a besoin d'un certain nombre d'octets en mmoire. Jusqu'ici, la rservation de la mmoire s'est droule automatiquement par l'emploi des dclarations des donnes. Dans tous ces cas, le nombre d'octets rserver tait dj connu pendant la compilation. Nous parlons alors de la dclaration statique des variables.

Club Tutoriel Informatique

152

Exemple
/* rservation de 12 octets */ float A, B, C; /* rservation de 400 octets */ short D[10][20]; /* rservation de 10 octets */ char E[] = {"Bonjour !"};

Club Tutoriel Informatique

153

Dclaration statique de donnes


Le nombre d'octets rserver pour un pointeur dpend de la machine et du 'modle' de mmoire choisi, mais il est dj connu lors de la compilation. Un pointeur est donc aussi dclar statiquement. Supposons dans la suite qu'un pointeur ait besoin de p octets en mmoire. (En DOS: p = 2 ou p = 4) Exemples :

double *G; char *H; float *I[10];

/* rservation de p octets */ /* rservation de p octets */ /* rservation de 10*p octets */

Club Tutoriel Informatique

154

Allocation dynamique
Souvent, nous devons travailler avec des donnes dont nous ne pouvons pas prvoir le nombre et la grandeur lors de la programmation. Ce serait alors un gaspillage de rserver toujours l'espace maximal prvisible. Il nous faut donc un moyen de grer la mmoire lors de l'excution du programme.

Club Tutoriel Informatique

155

Exemple
Nous voulons lire 10 phrases au clavier et mmoriser les phrases en utilisant un tableau de pointeurs sur char. Nous dclarons ce tableau de pointeurs par :
char *TEXTE[10];

Pour les 10 pointeurs, nous avons besoin de 10*p octets. Ce nombre est connu ds le dpart et les octets sont rservs automatiquement. Il nous est cependant impossible de prvoir l'avance le nombre d'octets rserver pour les phrases elles-mmes qui seront introduites lors de l'excution du programme ... La rservation de la mmoire pour les 10 phrases peut donc seulement se faire pendant l'excution du programme. Nous parlons dans ce cas de l'allocation dynamique de la mmoire.
Club Tutoriel Informatique

156

La fonction malloc
La fonction malloc de la bibliothque <stdlib> nous aide localiser et rserver de la mmoire au cours d'un programme. Elle nous donne de l'espace en mmoire laiss libre une fois mis en place le DOS.
malloc( <N> ) fournit l'adresse d'un bloc en mmoire de <N> octets libres ou la valeur zro s'il n'y a pas assez de mmoire.

Club Tutoriel Informatique

157

Exemple
Supposons que nous ayons besoin d'un bloc en mmoire pour un texte de 4000 caractres. Nous disposons d'un pointeur T sur char (char *T). Alors l'instruction: T = malloc(4000); fournit l'adresse d'un bloc de 4000 octets libres et l'affecte T. S'il n'y a plus assez de mmoire, T obtient la valeur zro. Si nous voulons rserver de la mmoire pour des donnes d'un type dont la grandeur varie d'une machine l'autre, nous avons besoin de la grandeur effective d'une donne de ce type. L'oprateur sizeof nous aide alors prserver la portabilit du programme.
Club Tutoriel Informatique

158

L'oprateur unaire sizeof


sizeof <var> fournit la grandeur de la variable <var> sizeof <const> fournit la grandeur de la constante <const> sizeof (<type>)

fournit la grandeur pour un objet du type <type>

Club Tutoriel Informatique

159

Exemple
Aprs la dclaration, short A[10];
nous obtenons les rsultats suivants sur un IBM-PC (ou compatible) :

sizeof A sizeof 4.25 sizeof "Bonjour !" sizeof(float) sizeof(double)

s'value 20 s'value 8 s'value 10 s'value 4 s'value 8

Club Tutoriel Informatique

160

Exemple
Nous voulons rserver de la mmoire pour X valeurs du type int; la valeur de X est lue au clavier:
int X; int *PNum; printf("Introduire le nombre de valeurs :"); scanf("%d", &X); PNum = malloc(X*sizeof(int));

Club Tutoriel Informatique

161

La fonction free
Si nous n'avons plus besoin d'un bloc de mmoire que nous avons rserv l'aide de malloc, alors nous pouvons le librer l'aide de la fonction free de la bibliothque <stdlib>.
free( <Pointeur> ) libre le bloc de mmoire dsign par le <Pointeur>; n'a pas d'effet si le pointeur a la valeur zro.

Club Tutoriel Informatique

162

INTRODUCTION A LA PROGRAMMATION EN ANSI-C

LES FONCTIONS

La notion de blocs
Les fonctions en C sont dfinies l'aide de blocs d'instructions. Un bloc d'instructions est encadr d'accolades et compos de deux parties:
Blocs d'instructions en C { <dclarations locales> <instructions> }

Ceci est vrai pour tous les blocs d'instructions

Club Tutoriel Informatique

164

Exemple
La variable d'aide I est dclare l'intrieur d'un bloc conditionnel. Si la condition (N>0) n'est pas remplie, I n'est pas dfini. A la fin du bloc conditionnel, I disparat. if (N>0) { int I; for (I=0; I<N; I++) ... }

Club Tutoriel Informatique

165

Variables locales
Les variables dclares dans un bloc d'instructions sont uniquement visibles l'intrieur de ce bloc. On dit que ce sont des variables locales ce bloc.
Exemple :

La variable NOM est dfinie localement dans le bloc extrieur de la fonction HELLO. Ainsi, aucune autre fonction n'a accs la variable NOM:
void HELLO(void) { char NOM[20]; printf("Introduisez votre nom : "); scanf("%s",NOM); printf("Bonjour %s !\n", NOM); }
Club Tutoriel Informatique

166

Variables locales
Attention ! Une variable dclare l'intrieur d'un bloc cache toutes les variables du mme nom des blocs qui l'entourent.
Exemple : Dans la fonction suivante,

Club Tutoriel Informatique

167

Variables locales
la premire instruction X=100 se rapporte la variable du type int dclare dans le bloc extrieur de la fonction; l'instruction X*=A agit sur la variable du type double dclare dans la boucle while. A l'intrieur de la boucle, il est impossible d'accder la variable X du bloc extrieur.

Club Tutoriel Informatique

168

Variables globales
Les variables dclares au dbut du fichier, l'extrieur de toutes les fonctions sont disponibles toutes les fonctions du programme. Ce sont alors des variables globales. En gnral, les variables globales sont dclares immdiatement derrire les instructions #include au dbut du programme. Attention !
Les variables dclares au dbut de la fonction principale main ne sont pas des variables globales, mais elles sont locales main !

Club Tutoriel Informatique

169

Exemple
La variable STATUS est dclare globalement pour pouvoir tre utilise dans les procdures A et B.

Club Tutoriel Informatique

170

Dfinition d'une fonction


Dans la dfinition d'une fonction, nous indiquons:

le type du rsultat fourni par la fonction le nom de la fonction le type, le nombre et les noms des paramtres de la fonction les donnes locales la fonction les instructions excuter

Remarquez qu'il n'y a pas de point-virgule derrire la dfinition des paramtres de la fonction.
Club Tutoriel Informatique

171

Renvoyer un rsultat
Par dfinition, toutes les fonctions fournissent un rsultat d'un type que nous devons dclarer. Une fonction peut renvoyer une valeur d'un type simple ou l'adresse d'une variable ou d'un tableau. Pour fournir un rsultat en quittant une fonction, nous disposons de la commande return:
return <expression>;

Club Tutoriel Informatique

172

Exemple
La fonction CARRE du type double calcule et fournit comme rsultat le carr d'un rel fourni comme paramtre.
double CARRE(double X) { return X*X; } void main() { double car , var = 12; car = CARRE(var); printf(" le carr de %f est %f ",var,car ); }
Club Tutoriel Informatique

173

Le type void
En C, il n'existe pas de structure spciale pour la dfinition de procdures comme en Pascal et en langage algorithmique. Nous pouvons cependant employer une fonction du type void partout o nous utiliserions une procdure en langage algorithmique ou en Pascal.

Club Tutoriel Informatique

174

Exemple

Club Tutoriel Informatique

175

Exemple

Club Tutoriel Informatique

176

Paramtres d'une fonction


Les paramtres ou arguments sont les 'botes aux lettres' d'une fonction. Elles acceptent les donnes de l'extrieur et dterminent les actions et le rsultat de la fonction. Techniquement, nous pouvons rsumer le rle des paramtres en C de la faon suivante: Les paramtres d'une fonction sont simplement des variables locales qui sont initialises par les valeurs obtenues lors de l'appel.
Club Tutoriel Informatique

177

Gnralits
Lors d'un appel, le nombre et l'ordre des paramtres doivent ncessairement correspondre aux indications de la dclaration de la fonction. Les paramtres sont automatiquement convertis dans les types de la dclaration avant d'tre passs la fonction.
Exemple :
double pow (double, double); A = pow (B, 2);
Club Tutoriel Informatique

178

Passage des paramtres par valeur


En C, le passage des paramtres se fait toujours par la valeur, c.--d. les fonctions n'obtiennent que les valeurs de leurs paramtres et n'ont pas d'accs aux variables elles-mmes.

Les paramtres d'une fonction sont considrer comme des variables locales qui sont initialises automatiquement par les valeurs indiques lors d'un appel.
A l'intrieur de la fonction, nous pouvons donc changer les valeurs des paramtres sans influencer les valeurs originales dans les fonctions appelantes. 179

Club Tutoriel Informatique

Exemple
La fonction ETOILES dessine une ligne de N toiles. Le paramtre N est modifi l'intrieur de la fonction. En utilisant N comme compteur, nous n'avons pas besoin de l'indice d'aide I La fonction TRIANGLE, appelle la fonction ETOILES en utilisant la variable L comme paramtre Au moment de l'appel, la valeur de L est copie dans N. La variable N peut donc tre dcrmente l'intrieur de ETOILES, sans influencer la valeur originale de L.

Club Tutoriel Informatique

180

Schmatiquement, le passage des paramtres peut tre reprsent dans une 'grille' des valeurs:

Club Tutoriel Informatique

181

Avantages
Le passage par valeur a l'avantage que nous pouvons utiliser les paramtres comme des variables locales bien initialises. De cette faon, nous avons besoin de moins de variables d'aide.

Club Tutoriel Informatique

182

Passage de l'adresse d'une variable


Comme nous l'avons constat ci-dessus, une fonction n'obtient que les valeurs de ses paramtres. Pour changer la valeur d'une variable de la fonction appelante, nous allons procder comme suit:

- la fonction appelante doit fournir l'adresse de la variable et - la fonction appele doit dclarer le paramtre comme pointeur.

On peut alors atteindre la variable l'aide du pointeur.

Club Tutoriel Informatique

183

Discussion d'un exemple


Nous voulons crire une fonction PERMUTER qui change le contenu de deux variables du type int. En premire approche, nous crivons la fonction suivante:
Nous appelons la fonction pour deux variables X et Y par :
PERMUTER(X, Y);

Rsultat : X et Y restent inchangs !


Club Tutoriel Informatique

184

Explication
Lors de l'appel, les valeurs de X et de Y sont copies dans les paramtres A et B. PERMUTER change bien contenu des variables locales A et B, mais les valeurs de X et Y restent les mmes.

Club Tutoriel Informatique

185

Solution
Pour pouvoir modifier le contenu de X et de Y, la fonction PERMUTER a besoin des adresses de X et Y. En utilisant des pointeurs, nous crivons une deuxime fonction:
Nous appelons la fonction par:
PERMUTER(&X, &Y);

Rsultat: Le contenu des variables X et Y est chang ! 186

Club Tutoriel Informatique

Explication
Lors de l'appel, les adresses de X et de Y sont copies dans les pointeurs A et B. PERMUTER change ensuite le contenu des adresses indiques par les pointeurs A et B.

Club Tutoriel Informatique

187

Exercices
Exercice 1 : crire un programme se servant d'une fonction MOYENNE du type float pour afficher la moyenne arithmtique de deux nombres rels entrs au clavier. Exercice 2 : crire une fonction MIN et une fonction MAX qui dterminent le minimum et le maximum de deux nombres rels. Ecrire un programme se servant des fonctions MIN et MAX pour dterminer le minimum et le maximum dun tableau de nombres rels entrs au clavier.
Club Tutoriel Informatique

188

Exercices
Exercice 3 :
La fonction LIRE_TAB trois paramtres TAB, N et NMAX lit la dimension N et les composantes d'un tableau TAB du type int. La dimension N doit tre infrieure NMAX.

Implmenter la fonction LIRE_TAB en choisissant bien le type des paramtres.

Club Tutoriel Informatique

189

Exercices
Exercice 4 :

Ecrire la fonction LONG_CH qui retourne la longueur d'une chane de caractres CH comme rsultat. Implmentez LONG_CH sans utiliser de variable d'aide numrique.

Club Tutoriel Informatique

190