Vous êtes sur la page 1sur 17

Universit Sidi Mohamed Ben Abdellah

Facult des Sciences Dhar El-Mehraz Fs


Dpartement dInformatique

Initiation
la programmation C

Par Noureddine Chenfour


1995-2015

N. Chenfour 1
Chapitre 1 :

Elments de base du langage C

Rsum :

- Pour commander un ordinateur, on utilise un programme

- Un programme est une squence de commandes (Instructions) adresses au


microprocesseur

- Le programme est charg depuis le Disque Dur vers la mmoire (qui est contenu
volatil, mais accs trs rapide par rapport au disque dure).

- La mmoire est rattache au Microprocesseur par lintermdiaire dune suite de


BUS (de donnes ou dadresse) permettant de faire vhiculer Instruction ou
donnes (+ adresses) entre le Microprocesseur et la mmoire.

- Le microprocesseur charge les instructions depuis la mmoire (RAM) instruction


par instruction.

- Chaque instruction sera dpose dans un registre dinstruction, traite par le bloc
de dcodage et excution des instruction. Si linstruction comporte ladresse dune
donne (Mov Ax, X),

- Celle-ci sera charge dans le microprocesseur via un bus de donne, vers


laccumulateur = registre AX qui constitue la sortie de lUAL : Unit
Arithmtique et Logique, l o se passent toute les opration du processeur.

- Linstruction Excute par le Microprocesseur est en code Machine (binaire).

N. Chenfour 2
- Pour faciliter la tche aux dveloppeurs, il fallait inventer un langage de
programmation (Le langage dassemblage) + le traducteur [Langage dassemblage
 Binaire] (ce dernier est appel ASSEMBLEUR).

Exemples dinstruction du langage dassemblage :

MOV AX, X

ADD AX, Y

MOV Z, AX

- Ce code qui signifie (Z X + Y) sera transform en binaire pour tre excut par
le Microprocesseur.

- Lvolution a permis plus tard de crer des langages plus volus (proche de la
syntaxe humaine). Linstruction devient par exemple (en Langage C) :

Z=X+Y;

- Le traducteur dans ce cas est appel COMPILATEUR.

- Pour faire de la programmation il faut donc choisir un langage de programmation


(Pascal, C, C++, Java, ) en fonction des besoins.

- Il faut ensuite tudier et matriser la syntaxe du langage.

I. Squelette gnral dun programme C

Rappel : Un programme est un ensemble de variables (les donnes du programme) + un


ensemble dinstructions utilisant ces variables :

Dclaration des variables Globales

void main() {

Dclaration des variables Locales au main()

Instructions

N. Chenfour 3
II. Dclaration de variables
- Une variable peut tre globale ou locale au main. Si elle est dclare dans le main,
alors ces une variable locale (elle ne peut tre utilise que dans le main).

- Pour dclarer une variable, il faut lui donner un nom (significatif) et un type.

- Il existe plusieurs types, nous utiliserons dans ce chapitre 3 types de base :

1. int : permettant de grer des entiers signs : 2 Octets de valeurs entre -32768 et
32 767. exemple : ages, quantits, annes, mois, etc

2. float : permettant de grer des valeurs rels sur 4 Octets. Exemples : salaires, prix
en DH, etc

3. char : permettant de grer les caractre (entre quotes). exemples rponse la


question (o/n) ? on va rpondre par o ou par n.

- Les noms de variables, appels identificateurs, sont forms comme une suite de
lettres de chiffres et de blancs souligns ( _ ), qui commence par une lettre ou un
_ : alpha, a2, prix_unitaire, 2A, t, t#,

- La syntaxe de dclaration est la suivante :

type var1, var2, var3, . ;

avec type = int ou float ou char,


Exemple :
int a1, a2, a3 ;
float x1, y1 ;
char c ;
- Une variable peut tre initialise lors de la dclaration :
Syntaxe :
type variable = valeur ;

type variable ;
variable = valeur ;

Exemple :
int a1=20, a2, a3=10 ;
float x1=14.5, y1 ;
char c = A ;

N. Chenfour 4
Liste des types de donnes standards

Type Longueur Domaine de valeurs


char 8 bits -128 .. 127
unsigned char 8 bits 0 .. 255
short int 16 bits -32768 .. 32767
int 16 bits -32768 .. 32767
unsigned int 16 bits 0 .. 65535
long 32 bits -2,147,483,648 .. 2,147,483,647
unsigned long 32 bits 0 .. 4,294,967,295
float 32 bits 3.4 (10-38) .. 3.4 (10+38 )
double 64 bits 1.7 (10-308) .. 1.7 (10+308 )
long double 80 bits 3.4 (10-4932) .. 1.1 (10+4932 )

III. Les Instructions de base


Laffectation :
Cela consiste attribuer une valeur une variable. On utilisera le symbole : = .
Variable = valeur ;
Gnralement :
Variable = Expression ;
Les Expressions :
Expression est gnralement une expression arithmtique qui utilise des
oprateurs arithmtiques : +, -, *, /, % (reste dune division entire)
Exemple :
X=Y+Z*2;
X=3*Y/5;
Remarques :
1. * et / sont plus prioritaire que + et
2. Les expressions sont values de gauche vers la droite :
X = Y +1 Z +2 T ;
X = Y +2 Z *1 T +3 E ;
3. Il est possible dutiliser les parenthses pour changer lordre dvaluation :
X = (Y +1 Z) *2 T
4. Une variable peut figurer gauche et droite dune affectation
X = 20 ;
X = X + 1 ;  21
On peut lire a : X reoit lancienne valeur de X + 1
5. Une variable ne peut figurer droite dune affectation que si elle a dj une valeur.

N. Chenfour 5
Exemples :
1. on a 2 variable X et Y et on veut changer leur valeur :
int X = 20, Y = 30 ;
on a besoin dune 3me variable Z :
int Z ;
en suite :
Z = X ;
X = Y ;
Y = Z ;
Remarque :
Attention, le langage C est sensible la casse, cd : X diffrent de x, int # Int,

Conversions implicites :
int X = 20.5 ;  20
char c = 65 ;  A
int x = A ;  65
float x ;
x=1/2;0
Rgle : une expression sur des entiers donne un rsultat entier
Pour rsoudre le problme, il suffit que lune des valeurs soit un rel :
x = 1.0 / 2 ;  x = 1 / 2.0 ;  x = 1. / 2 ;  x = 1 / 2. ;  0.5
Pb. Si les oprandes sont des variables :
int a =1, b=2 ;
float x = a / b ;  0
Solution 1 :
float x = 1. * a / b;  0.5
Solution 2 : le Casting  Transtypage  Transformation de type explicitement
float x = (float)a ;
#include <stdio.h>
#include <conio.h>
void main() {
int a=1, b=2;
float x;
x = (float)a / b;
clrscr();
printf("%f", x);  0.5 ;
}

N. Chenfour 6
IV- Les Entres/Sorties
4.1 Affichage :
Ralis par lintermdiaire de la fonction printf().
Syntaxe :
printf("chane de spcification de format", arg1, arg2, )
Informations afficher, de
type lmentaire qq (int,
float, char, ). On peut
Messages + descripteur de aussi fournir des
fromat constantes : 20, 30, a,
Les descripteurs de format, on utilisera :
%d  pour afficher les entiers (int)
%f  pour laffichage des rels (float)
%c  pour laffichage des cractres (char).

Remarque 1 :
Dans la chane de spcification de format, on utilisera autant de spcificateurs de
format (%?) que darguments :
Exemple :

,
printf ("..%d.%c.%f.%d" arg1, arg2, arg3, arg4) ;

Si pour lexemple on na pas utilis le dernier (%d), alors arg4 ne sera pas affich.
Remarque 2 :
Le type des arguments correspond celui des spcificateurs de format : arg1 est
un entier, arg2 un char, arg3 un float et arg4 un int.

Remarque 3 :
Il existe cependant une possibilit de conversion automatique du type de donnes lors
de laffichage laide des descripteurs de format :
char c = A ;
printf("%d", c) ;  65 (code ascii de A) ;
int a = 65 ;
printf("%c", a) ;  A (caractre de code ascii de 65) ;
float x = 3.4 ;
printf("%d", (int)x) ;  3 (partie entire) ;
int i = 30 ;
printf("%f", (float)i ) ;  30.0000

Remarque 4 :
La chane de caractres peut comporter des caractres de contrles :
\n : retour chariot ( le symbole \ avec le caractre suivant constitue un seule caractre).
\t : tabulation
\b : backspace (retour arrire)
\" : pour afficher des guillemets
\\ : pour afficher \

N. Chenfour 7
Remarque 5 :
La fonction printf peut tre utilise sans les arguments (arg1, arg2, ), son objectif
serait alors un simple affichage dun message dinvitation (gnralement utilis avant un
scanf) :
printf("entrer un entier : ") ;
scanf("%d", &x) ;

Remarque 6 : Format daffichage


Le Format daffichage est un moyen utilis pour prciser la taille des donnes
afficher :
1. les entiers :
printf("%tailled", x) ;
avec taille est une constante qui dfinie la taille de la zone daffichage en nombre de
caractres :
printf("%20d", x) ;
lentier x sera affich sur un emplacement de 20 caractres en compltant par des espaces
gauche.

Si la taille nest pas suffisante, elle est alors ignore.

2. Les rels :
printf("%taille.ncavf", x) ;
avec taille est une constante qui dfinie la taille de la zone daffichage en nombre de
caractres et ncav : le nombre de chiffre aprs la virgule.
printf("%20.2f", x) ;
lentier x sera affich sur un emplacement de 20 caractres en compltant par des espaces
gauche, avec 2 chiffres aprs la virgule

1. Si la taille nest pas suffisante, elle est alors ignore.


2. la partie : taille peut ne pas tre spcifie :

printf("%.2f", x) ;

Remarque :
Si on veut liminer la partie flottante dans laffichage :
printf("%.0f", x) ;

Remarque :
Pour utiliser des couleurs lors de laffichage, il faut utiliser la fonction : cprintf au lieu
de printf. Celle-ci a la mme syntaxe dutilisation.
Exemple :
#include <stdio.h>
#include <conio.h>
void main() {
clrscr();
system("cls");
textcolor(14);
system("COLOR 27");
textbackground(3);
printf("Bonjour");
clrscr();// pour donner la couleur de fond tout lcran
cprintf("un message en rouge\n");
getchar();
getch();
}

N. Chenfour 8
4.2 La saisie :
4.2.1 fonction scanf() :
Sa syntaxe ressemble celle de la fonction printf avec 2 diffrences :
1. dans la chane, on utilise uniquement les descripteurs de format
2. les arguments sont prcds par le symbole & pour dsigner leurs adresses.

scanf ("%d%c%f%d", &arg1, &arg2, &arg3, &arg4) ;

Remarque 1 :
Pour le cas de scanf() est ncessaire de respecter le format des argument laide des
descripteurs de format.
Remarque 2 :
La fonction scanf nest jamais utilise pour afficher, donc jamais autre caractre que
les spcificateurs de format dans la chane du scanf.

4.2.2 fonction getchar() :

Elle peut tre utilise pour lire un caractre :


char c ;
c = getchar() ;
cest quivalent :
char c ;
scanf("%c", &c) ;

Remarque :
On peut utiliser la fonction getchar() pour arrter lexcution du programme une
position donne, car getchar() attendra une touche (retour chariot) depuis le clavier. Dans ce
cas, on peut lutiliser comme suit :
getchar() ;

4.2.3 Fonction getch() de <conio.h>


Remarque :
Les 2 fonctions scanf et getchar() attendent une validation par un retour chariot. Les
donnes en entre sont alors charges dans un tampon intermdiaire qui sera consomm par
ces deux fonctions :

scanf() getchar() getch()

Tampon intermdiaire de
lecture (RAM)

Clavier

N. Chenfour 9
La fonction getch() effectue UNE LECTURE AU VOL, cd directement depuis le clavier, en
ne passant pas par le tampon intermdiaire.
Autres caractristiques :
1. pas besoin de valider par retour chariot
2. naffiche pas le caractre tampon
3. mme si le tampon est plein, la fonction getch() lit depuis le clavier
Les autres fonctions lisent depuis le tampon jusqu ce quil soit compltement consom.

Exemple 1 :
#include <stdio.h>
#include <conio.h>

void main() {
int x, y;
char c;

clrscr();
printf("Entrer un entier : ");
scanf("%d", &x);

printf("Entrer un autre entier : ");


scanf("%d", &y);

printf("Entrer un caractre : ");


c = getch();
printf("%c\n", c);

printf("x = %d, y = %d, c=[%c]\n", x, y, c);


getch() ;
}

Exemple 2 :
#include <stdio.h>
#include <conio.h>

void main() {
int x, y;
char c;

clrscr();
printf("Entrer un entier : ");
scanf("%d", &x);

printf("Entrer un autre entier : ");


scanf("%d", &y); //flushall();// ou
getchar();
printf("Entrer un caractre : ");
scanf("%c", &c);

printf("x = %d, y = %d, c=[%c]\n", x, y, c);

getch();
}

N. Chenfour 10
V. Les Instructions de choix
5.1 Linstruction if :
Syntaxe :
- cas du if sans else :

if (condition) instruction ;
ou :
if (condition) {
instruction 1 ; Bloc dinstructions imbriqu
instruction 2 ;

}
Exemple :
#include <stdio.h>
#include <conio.h>

void main() {
float MHT, MTHT, TTVA=0.2, TVA, MT, Remise;
int Q;

clrscr();

printf("Entrer le Montant Hors Taxes : ");


scanf("%f", &MHT);

printf("Entrer la quantit : ");


scanf("%d", &Q);

MTHT = MHT * Q;
TVA = MTHT * TTVA;
MT = MTHT + TVA;

printf("Le Montant Total est : %10.2fDH\n", MT);

if (MT >= 2000) {


Remise = 0.05 * MT;
MT = MT - Remise;
printf("Remise = %.2fDH\n", Remise);
printf("Motant Total payer : %.2fDH\n", MT);
}

getch();

- cas du if avec else :


if (condition) instruction ;
else une_autre_instruction ;
ou
if (condition) {
instruction 1 ;
...
}
else {
une_autre_instruction ;
...
}

N. Chenfour 11
5.2 Les Conditions :
Rgles dcriture des conditions :
- Une condition est toujours dfinie entre les 2 parenthses :
if ( condition ) {
...
}
- On distingue entre les conditions simples (lmentaires) et les conditions
composes.
- Une condition lmentaire est une comparaison entre 2 valeurs, 2 variables, une
variable et une valeur ou gnralement 2 expressions en utilisant lun des
oprateurs de relation :
infrieur <
Infrieur ou gal <=
Suprieur >
Suprieur ou gal >=
Egal ==
Diffrent (not equal) !=
Exemple :
if (x < y)
if (2*x+3 >= 3*y)
Cas Particuliers :
1. Le true en C++ est reprsent par toute valeur non nulle

if ( X ) ...

if ( X != 0 ) ...

2. Le false est reprsent par 0 (une valeur nulle)



if ( !X ) ...

if ( X == 0 ) ...
Remarque :
Loprateur de relation utilis pour lgalit est ==, ne pas confondre avec le
symbole =.
On a ainsi :
if ( X = 20 ) ...

if ( (X = 20) != 0 )
qui est une superposition de 2 instruction : laffectation + la comparaison : la
suite de cette instruction, on sortira tjs avec X ayant la valeur 20, car = est un
oprateur daffectation.

- Une condition compose est compose de 2 ou plusieurs comparaisons. Ainsi dire


que X est situe entre a et b (a <= X <= b), revient dire que (X est >=
a) et (X <= b). Ce qui ncessite lutilisation de la notion doprateurs
logiques (ici, cest le et logique)
 if ( a <= X && X >= b )

N. Chenfour 12
La liste des oprateurs logique est la suivante :

Le et logique (and) &&


Le ou logique (or) ||
Le non logique (not) !

- Lutilisation de parenthses imbriques nest utile que pour lever lambigut


dvaluation de la condition car le && est plus prioritaire que le ||. Les 2 moins
prioritaires que le !:
Exemple :

if ( X < 0 && Y > 2 || Z == 20 )



if ( (X < 0 && Y > 2) || (Z == 20) )
mais cest diffrent par rapport lcriture :
if ( X < 0 && (Y > 2 || Z == 20) )

5.3 Les if imbriques :


Il est possible dimbriquer autant de fois que ncessaire des instructions if dans dautre
instruction if ou dans leurs partie else :
if ( C1) {

if (C3) {

}

if (C4) {

}
else {

}
}
else if (C2) {

}
else {

if (C5) {

}

}

N. Chenfour 13
5.2 Linstruction switch :
Elle permet de raliser autrement une squence dinstructions if else if else if,
dans le cas de test dgalit sur une mme variable de type ordinal (entier ou caractre).
if ( X == a ) {
T1 ;
}
else if (X == b) {
T2;
}
else if (X == c) {
T3;
}
else {
T4;
}

switch ( X ) {
case a:
T1;
break;
case b:
T2;
break;
case c:
T3;
break;
default:
T4;
}

Ceci est valable si:


1. X est de type ordinal : int, char, short int,
2. a, b et c sont des constantes
3. a, b et c sont distinctes
Remarque dans le cas ou un mme traitement (T3) devrait tre excut si X la valeur c ou d
ou e :
switch ( X ) {
case a:
T1;
break;
case b:
T2;
break;
case c:case d:case e:
T3;
break;
default:
T4;
}

N. Chenfour 14
VI. les Boucles
6.1 la boucle while :
Cest un if dont le traitement est rpt tant que la condition est vrifie. on sorira de
la boucle lorsque la condition na plus la valeur vrai. La syntaxe est la suivante :
while ( Condition ) {

}
Exemple 1 :
Calculer la premire puissance de 2 >= 1000 : chercher le p tq : 2n = p, le n tant incunu

int p = 1 ;
int n = 0 ;
while (p<1000) {
p = p * 2 ;
n ++ ;
}
Printf("2 puissance %d est = %d\n", n, p) ;

6.2 la boucle do while :


Syntaxe :
do {
...
}
while ( Condition ) ;

La seule diffrence entre le while et le dowhile est la position du test. Pour le while elle se
trouve au dbut, alors que pour le dowhile elle est la fin. Le rsultat de ceci est que : pour
le while le traitement risque de ne jamais tre excut si la condition nest pas vrifie au
dbut alors que pour le cas de dowhile le traitement sexcute au moins une fois, car le test
est effectu aprs le traitement. En dehors de cette contrainte les 2 boucles sont quivalentes.
Lexemple prcdent peut donc tre ralis avec la boucle dowhile.

int p = 1 ;
int n = 0 ;
do {
p = p * 2 ;
n ++ ;
}
while (p<1000) ;
Printf("2 puissance %d est = %d\n", n, p) ;

Remarques :
1. Ces 2 boucles sont parfaitement adaptes au cas o on ne connat pas au pralable
le nombre de rptition
2. Les 2 boucle peuvent tout de mme tre utilises si on connat le nombre de
rptition :

N. Chenfour 15
Exemple 2 : afficher les entiers de 1 10 :
int i = 1 ; //initialisation
while (i<=10) {// le test
printf("%d\n", i); //Le traitement rpter
i++ ; // lincrmentation
}
Exemple 3 : afficher les nombres pairs entre 0 et n :
scanf("%d", &n) ;
int i = 0 ; //initialisation
while (i<=n) {// le test
printf("%d\n", i); //Le traitement rpter
i = i + 2 ; // lincrmentation
}
Exemple 4 : afficher les nombres pairs entre n et m :
int n, m , p, i ;
scanf("%d", &n) ;
scanf("%d", &m) ;
//permuter si n>m  on aura en rsultat n < m
if (n>m) {
p = n ;
n = m ;
m = p ;
}
if (n%2==0) {// n est paire
// on commence par n
i = n; //initialisation
}
Else {// n est impaire
// on commence par n + 1
i = n + 1; //initialisation

}
while (i<=m) {// le test
printf("%d\n", i); //Le traitement rpter
i = i + 2 ; // lincrmentation
}
Exemple 5 : lire une rponse saisie au clavier qui doit tre obligatoirement o, n, O ou N :
do {
printf("Encore une note ? ");
reponse = getch();
printf("%c\n", reponse);
if (reponse!='o' && reponse!='O'
&& reponse!='n' && reponse!='N') {
printf("Rponse Incorrecte!");
}
}
while (reponse!='o' && reponse!='O'
&& reponse !='n' && reponse!='N');

N. Chenfour 16
Exemple 6 : Exercice : afficher les nombres premiers entre n et m.

6.1 la boucle for :


Syntaxe :
for (initialisation ; test ; incrmentation|dcrm) {
traitement rpter
}
On remarque que les 3 instructions dinitialisation, de test et dincrmentation (ou de
dcrmentation) sont runies dans la mme ligne qui constitue la syntaxe de for. (cest la
diffrence par rapport aux 2 autres boucles).
Lexemple 4 peut ainsi tre ralis laide de for comme suit :
int n, m , p, i ;
scanf("%d", &n) ;
scanf("%d", &m) ;
//permuter si n>m  on aura en rsultat n < m
if (n>m) {
p = n ;
n = m ;
m = p ;
}
if (n%2 !=0) {// n est impaire
n = n + 1; //initialisation
}
for (i=n; i <= m; i = i + 2 ) {// initialisation + test + incrmentation
printf("%d\n", i); //Le traitement rpter
}

Remarques :
1. Il y a une diffrence entre le for du langage Pascal est celui du langage C : avec le for
du langage Pascal, on ne peut utiliser for que si on connat le nombre de rptition
lavance. Le for du langage C est plus gnral et peut tre utilis mme si on ne
connat pas le nombre de rptition.
2. On va tout de mme rserver le for pour des cas o lon connat le nombre de
rptition lavance.

N. Chenfour 17