Vous êtes sur la page 1sur 197

2015/2016

Langage C - FSDM
2015/2016
Introduction
Comment et ou les ordinateurs sont utiliss?
Tous les ordinateurs ont des caractristiques
communes : pour raliser une tche utile, trois
choses doivent cohabiter (travaillent ensemble) :
1) Matriel (Hardware) : composantes physiques
internes ou externes dun ordinateur
2) Systme dexploitation (Operating System) :
ensemble de programmes qui pilotent/grent le
hardware dun ordinateur (Windows XP, Linux)
3) Applications logicielles (Software) :
programmes charges dans lordinateur pour
raliser une fonction prcise (Word)

Langage C - FSDM 3
Programme vs Applications logicielles
Programme :
ensemble d'instructions permettant l'ordinateur de raliser une tche dfinie.

Logiciel :
programmes + documentation + licence + support (CD...). Cet ensemble peut
tre commercialis, distribu des utilisateurs.

Application:
logiciel, ou ensemble de logiciels qui cooprent par exemple, un site web,
application mobile (serveur HTTP+CGI(Common Gateway Interface)+base de
donnes...))

Progiciel :
logiciel propritaire destin un usage spcifique et adaptable chaque
utilisateur (typiquement: SAP, Saqqara, Commerce server...).

Langage C - FSDM 4
Applications logicielles
Application logicielle
une application logicielle = Application = Programme
(dans ce cours)
Ce sont des programmes qui sont lancs par lutilisateur.
Par exemple :
Editeur de texte : word, edit, (logiciel)
Navigateur : Chrome, Interet Explorer, Firefox, (logiciel)
Messagerie instantane (tchat): WhatsApp, facebook messenger,
skype, (application)
Compilateur, (programme)
Interface graphique, (programme)
Langage C - FSDM 5
Applications logicielles
Programme
A chaque tche, que notre PC ralise, correspond un programme.

Mais de quoi est constitu un programme?

Langage C - FSDM 6
Applications logicielles
Programme
Un programme est constitu dune suite dinstructions comprhensible
par lordinateur (en langage machine).
Une instruction spcifie :
Les oprations excuter
La faon dont elles senchanent

Langage C - FSDM 7
Applications logicielles
Donnes dun programme et rsultats
Un programme peut ncessit des donnes. Il peut aussi retourner un
rsultat.
Exemple: on dispose dun programme qui calcule la moyenne des
notes.
Celui-ci a besoin quon lui fournisse les notes (donnes)
Pour quil nous retourne la moyenne (rsultat)

Donnes

Programme Mmoire

Rsultat
Langage C - FSDM 8
Applications logicielles
Excution simplifie dun programme
UC = Unit centrale ou CPU
MC = Mmoire centrale
Priphrique UC MC

1
Programme
2 +

3 Infos temporaires

1) Prlvement dune instruction

2) Excution de linstruction avec possibilit dchange avec la MC

3) Excution dune instruction dchange avec un priphrique


Langage C - FSDM 9
Applications logicielles
Excution simplifie dun programme
Pour calculer 12+5, il faut une suite d'instructions
Transfrer:
le nombre 12 saisi au clavier dans la mmoire
le nombre 5 saisi au clavier dans la mmoire
le nombre 12 de la mmoire vers un registre A
le nombre 5 de la mmoire vers un registre B
Demander l'unit de calcul (UAL unit arithmtique et logique) de faire
l'addition
Transfrer:
le contenu du rsultat dans la mmoire
le rsultat (17) se trouvant en mmoire vers l'cran de la console (pour
l'affichage)

Langage C - FSDM 10
Programmation
Programmation?
Lordinateur ne comprend que le binaire (0 eet1), est-ce pour
autant quon doive crire des programmes en binaire ?
Il existe des langages de programmation dits volus (proches
du langage courant)
Pour chaque langage, il existe un programme qui le traduit en
binaire (ou langage machine)

Langage C - FSDM 11
Programmation
Traduction des programmes

Programme Programme
Traducteur excutable
source

Il existe essentiellement deux modes de traduction

Compilation: la traduction se fait une fois pour toute

Interprtation: a chaque fois quon veut excuter le programme,


linterprte traduit une instruction la fois. Une fois que celle-ci
est excute, il passe linstruction suivante.
Langage C - FSDM 12
Compilation et Interprtation
Il existe deux techniques de traduction

Ce que nous crirons Affichage ligne


par ligne
Ce que lon utilisera chaque fois que
lon voudra excuter le code source :
traduction/excution ligne par ligne.

Langage C - FSDM 13
Compilation et Interprtation

traduit la totalit du texte Programme prt tre excut


source en une fois

Langage C - FSDM 14
Programmation
Programmation

Programmation = A priori, criture de programmes dans un langage de


programmation (C, Java, Pascal, Visual Basic, Fortran, Python, Perl,
)
Or il y a plusieurs langages,
Existe il plusieurs sortes de programmation?

Langage C - FSDM 15
Les types de programmation
Gnration 1 : Programmation Spaghettis :
o Assembleur, Fortran I, Basic
o Logique de saut goto . Absence totale d'entits autonomes et
modifiables indpendamment du reste du programme. Code et
donnes troitement imbriqus

Gnration 2 : Programmation Structure :


o Pascal, C, Algol, Perl, Python
o Expression spare des donnes et des traitements.
o Modularit :
Donnes types.
Possibilit de cration de types complexes.
Structures de contrle remplaant les sauts.
Notion de sous-programmes et compilation spare (entits autonomes)

Langage C - FSDM 16
Les types de programmation
Gnration 3 : Programmation par Objets :
o Simula, SmallTalk, Eiffel, C++, Pascal objet, Java, C#
o Modularit qui regroupe les donnes et les traitements dans une
mme entit appele objet.
o Les objets peuvent tre vus comme des tentatives de simuler une
situation relle (objets personne , voiture ). Les objets rels ne
sont ni des traitements purs, ni des donnes pures mais une
combinaison des deux

Langage C - FSDM 17
Plusieurs autres types
programmation oriente objets
programmation logique
programmation fonctionnelle
programmation imprative
programmation par scripting/dynamique
programmation dclarative
programmation oriente aspect
Programmation concurrente
et plus

Langage C - FSDM 18
Gnalogie des langages de programmation

Langage C - FSDM 19
Classement des langages de programmation

Classement gnral selon lIEEE, la plus grande association mondiale


de professionnels techniques (400 000 membres) en informatique,
lectronique, et tlcommunication

2015 2014

Langage C - FSDM 20
Classement des langages de programmation

Top 10 des langages pour le dveloppement de sites et


applications web

Langage C - FSDM 21
Classement des langages de programmation

pour le dveloppement dapplications pour les appareils mobiles

Langage C - FSDM 22
Classement des langages de programmation

pour le dveloppement dapplications dentreprise

Langage C - FSDM 23
Classement des langages de programmation

pour le dveloppement dapplications embarques

Langage C - FSDM 24
25

Langage C - FSDM
2015/2016
Introduction au C
Langage C
Invent aux Bell Labs / ATT en 1970

Conu pour tre le langage de programmation dUnix, premier systme


dexploitation crit dans un langage autre quun langage machine

Diffus grce Unix

Popularis par sa concision, son expressivit et son efficacit

Disponible actuellement sur quasiment toutes les plateformes

Langage C - FSDM 26
Introduction au C
Langage C
Un langage impratif : le programmeur spcifie explicitement lenchanement
des instructions devant tre excuts :
Fais ceci, puis cela
Fais ceci, si cela est vrai
Fais ceci, tant de fois ou tant que cela est vrai
Un langage de haut niveau
Programmation structure
Organisation des donnes (regroupement structurel)
Organisation des traitements (fonctions)
Possibilit de programmer faon objet
Un langage compil : compilateur comme cc ou gcc

Langage C - FSDM 27
Structure dun programme C
Programme C
Un programme est la spcification dun processus de traitement dinformations

Un programme impratif spcifie prcisment les traitements devant tre


raliss sous la forme de suites dinstructions lmentaires

Ces instructions oprent sur les valeurs numriques contenues dans des
variables nommes

Langage C - FSDM 28
Structure dun programme C
Mon premier programme (hello.c) : Hello World

#include <stdio.h> #include <stdio.h>


#include <stdlib.h>

int main() main()


{ {
printf("Hello World") ; printf("Hello World") ;
return EXIT_SUCCESS; return;
} }

Les deux programmes sont (presque) identiques, ils affichent la mme chose, le
message Hello World, mais prfrer la premire solution (plus propre)

Langage C - FSDM 29
Structure dun programme C
Mon premier programme : Hello World
La machine ne comprend que le langage machine, donc mon programme
hello.c .

Donc il faut traduire mon programme hello.c en langage machine laide dun
traducteur du langage C vers le langage machine.

Un programme appel compilateur (habituellement nomm cc ou gcc) vrifie la


syntaxe de mon programme (on dit dune faon gnrale, code source) et le
traduit en code objet, compris par le processeur.

Le programme en code objet ainsi obtenu peut tre excut sur la machine
(aprs dition de liens)

Langage C - FSDM 30
Rappel
Mais avant de programmer !!!!! Les bonnes pratiques
Les tapes de ralisation dun programme
Enonc du problme
Spcification

Cahier des charges


Analyse

Algorithme
Traduction en langage de programmation

Programme
Tests et modifications Compilation

Excutable

Version finale de lexcutable


Langage C - FSDM 31
Structure dun programme C
Mon premier programme : Hello World
Schma simplifi de la compilation #include <stdio.h>
#include <stdlib.h>
int main()
{
Editeur de texte ou environnement de
printf(" Hello World");
dveloppement
return EXIT_SUCCESS;
}

Fichier code source en langage C .c

Compilateur gcc

Fichier excutable a.out


Langage C - FSDM 32
Structure dun programme C
Mon premier programme : Hello World
En pratique deux faons sont possibles pour compiler hello.c :

1. En ligne de commande (cmd sous windows et un terminal sous linux):


Vous utilisez un diteur de texte comme Emacs (Linux) ou Bloc-notes
(Windows), et un compilateur comme gcc ( tlcharger gratuitement sur le
net)
Dans le rpertoire ou se trouve le fichier compiler, vous tapez :
gcc hello.c
Dans ce cas un fichier excutable nomm a.out est gnr dans le
mme rpertoire, pour lexcuter, taper ./a.out sous linux et a.out
sous windows

Langage C - FSDM 33
Structure dun programme C
Mon premier programme : Hello World
En pratique deux faons sont possibles pour compiler hello.c :

2. En utilisant un environnement de dveloppement


La plupart des environnements incluent un compilateur en plus de
lditeur de texte
Pour compiler, il y a un bouton compile , gnralement dans le menu
build
Pour excuter votre programme, slectionner toujours dans le mme
menu, licne run

Langage C - FSDM 34
Structure dun programme C
Mon premier programme : Hello World
Quelques environnements de dveloppement
Sous Windows
Code::Blocks
Eclipse
Netbeans
Visual C++
Turbo c++
Dev-C++
Sous Linux
Eclipse
Netbeans
KDevelop

Langage C - FSDM 35
De lalgorithmique au C
Rappel sur la structure dun algorithme

Langage C - FSDM 36
De lalgorithmique au C
Algorithme et programmation C

Algorithme somme Entte int main ( )


{
variable X, Y: Entier Dclarations int X, Y ;
Dbut
X4 X=4 ;
Ecrire("Donner Y ") Corps printf("Donner Y");
Lire(Y) scanf("%d",&Y);
Ecrire(X+Y) printf("%d",X+Y);
Fin return EXIT_SUCCESS;
Langage C - FSDM
} 37
De lalgorithmique au C
Traduction de lentte dun algorithme
Syntaxe en pseudo-code:
Algorithme <nom_algorithme>
Syntaxe en langage C :
int main ( )
(ventuellement ajouter au dbut du fichier des inclusions
#include <stdio.h> )

Langage C - FSDM 38
Commentaires
Rle des commentaires
Commentaires = explications du code = documentation du code
Ceci est , il sert
Ceci sest utile pour cela et fait appel cela
Ici, on fait ceci, puis cela
Ceci prend cela et retourne
Les commentaires sont non seulement utiles, mais ncessaires la
comprhension dun programme
Pensez ceux qui vous suivront !
Ils doivent donner une information de niveau dabstraction plus lev
que le code quils commentent
Sinon cest de la paraphrase inutile

Langage C - FSDM 39
Commentaires
Deux syntaxes pour les commentaires :
Syntaxe standard : /* */
a = a +1; /* Ceci est un commentaire de ligne */
b = b +1; /* Et ceci en est un autre */
Le commentaire finit au premier */ rencontr
Un commentaire peut tre sur une ligne ou plusieurs lignes
/* Ce commentaire, qui a un style de commentaire de bloc,
stend
** sur plusieurs lignes.
*/
Syntaxe la C++ : //
a = a +1; // Ceci est un commentaire de ligne
b = b +1; // Et ceci en est un autre

Le commentaire finit la fin de la ligne


Langage C - FSDM 40
Commentaires
/* Ce fichier contient le code dun programme
Types de commentaire ** permettant le calcul de puissance de 2
** Date de cration : 13/04/09
En gnral, trois types de commentaires ** Auteur : I.B
sont possibles ** Version : v1
*/
Commentaires dentte de fichier #include <stdio.h>
#include <stdio.h>
Explique ce que contient ce fichier
/* Fonction principale qui lance lexcution */
Commentaires de fonction de bloc int main() {
Explique la fonction et lusage du int n ; // la puissance calculer
fragment du code qui suit
scanf("%d",&n);
Commentaires de ligne
Dclaration de variable /*On ne considre que la puissance dans N*/
if (n>0){
Dbut de boucle

Astuces, etc. }
return EXIT_SUCCESS; // pour viter le
// Warning du compilateur
}
Langage C - FSDM 41
Ecriture et lecture
Traduction des instructions : criture
Syntaxe en algo Syntaxe en C
Ecrire() printf()

Exemple :
Type de la valeur Syntaxe en algo Syntaxe en C
Une chane Ecrire("Bonjour") printf("Bonjour") ;
X est entier Ecrire(X) printf("%d", X) ;
Y est un rel Ecrire(Y) printf("%f", Y) ;
Z est un caractre Ecrire(Z) printf("%c", Z) ;
Ecrire(" La valeur de X =", X , " printf(" La valeur de X =
Une expression
et de Y =",Y) %d et de Y =%f ", X, Y);

Pour pouvoir utiliser la fonction printf(), il faut ajouter au dbut de votre fichier :
#include<stdio.h>
Langage C - FSDM 42
Ecriture et lecture
Exercice
Traduire en C

Algorithme echange
Variables A, B, C : Entier
Dbut
A3
B2
Ecrire(" Avant change")
Ecrire(" La valeur de A =", A , " et de B =", B)
CB
B A
A C
Ecrire(" Aprs change")
Ecrire(" La valeur de A =", A , " et de B =", B)
Fin

Langage C - FSDM 43
Ecriture et lecture
Corrig
Traduire en C
#include<stdio.h>
#include<stdlib.h>
Algorithme echange
Variables A, B, C : Entier int main ( )
Dbut {
A3 int A, B, C;
B2 A = 3;
Ecrire(" Avant change") B =2;
Ecrire(" La valeur de A =", A , " et de B =", B) printf(" Avant change");
CB printf("La valeur de A =%d et de B =%d",A, B) ;
BA C=B;
A C B=A;
Ecrire(" Aprs change") A=C;
Ecrire(" La valeur de A =", A , " et de B =", B) printf(" Aprs change") ;
Fin printf("La valeur de A =%d et de B =%d",A, B);

return EXIT_SUCCESS;
}
Langage C - FSDM 44
Ecriture et lecture
Traduction des instructions : lecture
Syntaxe en algo Syntaxe en C
Lire() scanf()

Exemple :

Type de la valeur Syntaxe en algo Syntaxe en C


X est entier Lire(X) scanf("%d", &X) ;
Y est un rel Lire(Y) scanf("%f", &Y) ;
Z est un caractre Lire(Z) scanf("%c", &Z) ;

Pour pouvoir utiliser la fonction scanf(), il faut ajouter au dbut de votre fichier :
#include<stdio.h>

Langage C - FSDM 45
Ecriture et lecture
Exercice
Traduire en C

Algorithme echange
Variables A, B, C : Entier
Dbut
Ecrire("Donner A")
Lire(A)
Ecrire("Donner B")
Lire(B)
CB
B A
A C
Ecrire("Aprs change")
Ecrire("La valeur de A =", A , " et de B =", B)
Fin

Langage C - FSDM 46
Ecriture et lecture
Corrig
Traduire en C
#include<stdio.h>
Algorithme echange
#include<stdlib.h>
Variables A, B, C : Entier
int main ( )
Dbut
{
Ecrire("Donner A")
int A, B, C;
Lire(A)
printf("Donner A");
Ecrire("Donner B")
scanf(" %d",&A);
Lire(B)
printf("Donner B");
CB
scanf("%d ",&B) ;
BA
C=B;
A C
B=A;
Ecrire("Aprs change")
A=C;
Ecrire("La valeur de A =", A , " et de B =", B)
printf("Aprs change") ;
Fin
printf("La valeur de A =%d et de B =%d",A, B);
return EXIT_SUCCESS;
}
Langage C - FSDM 47
48

Langage C - FSDM
2015/2016
Variables
Identificateurs
Les variables servent stocker les donnes manipules par le programme
Les variables sont nommes par des identificateurs alphanumriques
Le premire lettre est comprise dans lensemble { a, .., z, A, , Z, _ } (mais viter
le _ au dbut de lidentificateur, rserv aux variables systmes)
Les autres lettres sont comprises dans lensemble {a, .., z, A, , Z, 0, , 9, -,_}
Il y a une diffrence entre majuscules et minuscules
Alors que pensez vous des identificateurs suivants :

Brol Brol_2_brol_1 1brol 123_23 _brol


bRol Brol_ 123 change
brol123 b1rol ma variable

Ok Ok Non
Langage C - FSDM Non Ok
Eviter
49
De lalgorithmique au C
Traduction des dclarations dun algorithme : variables
Syntaxe en pseudo-code:
variable <nom_variable> : <type_variable>

Syntaxe en langage C : Ne pas oublier le point


virgule ;
<type_variable> <nom_variable> ;

Exemple :

Syntaxe en algo Syntaxe en C


variable X : Entier int X;
variable Y, Z : Rel float Y, Z;
Langage C - FSDM 50
De lalgorithmique au C
Traduction des dclarations dun algorithme : variables

Types en algorithmique Types en langage C


Type non dfini en C mais on peut avoir des
Boolen
expressions boolennes (0 ou diffrent de zro)
short = 16 bits
Entier int = taille du mot machine,
long = 32 bits
float = virgule flottante simple prcision
Rel
double = virgule flottante double prcision
Caractre char = 8 bits

Type non dfini, mais on utilise les pointeurs char


Chane de caractres
* ou les tableaux char [ ]

Le langage C dfini dautres types (voir plus loin)


Langage C - FSDM 51
Variables
Mots rservs
Certains mots cls sont rservs par le langage un usage bien dfini et ne
peuvent pas tre utiliss comme identificateurs.

auto default float register struct volatile

break do for return switch while

case double goto short typedef

char else if signed union

const enum int sizeof unsigned

Continue extern long static void

Langage C - FSDM 52
Types
Types
Toutes les variables sont types :
Types simples
Types structurs
Rfrences (pointeurs) de types

C est un langage (assez) fortement typ : on ne pourra mettre dans une


variable dun type donn une valeur dun type incompatible
Langage C - FSDM 53
Types simples
Types simples
Deux familles principales :
Types entiers :
char : type caractre (et un seul caractre)
short, int, long : types numriques servant au stockage des nombres
entiers signs (positifs, ngatifs ou nuls)
Versions unsigned pour les entiers non signs (positifs ou nuls)
Types flottants
float : nombre virgule flottante en simple prcision
double : nombres virgule flottante en double prcision

Le langage C ne dfinit pas de type boolen. Cependant toute expression nulle


est considre fausse et toute expression non nulle est considre comme vraie
Langage C - FSDM 54
Types simples
Domaine des valeurs
Le domaine de types simples dpend de larchitecture (Fichiers float.h et limits.h)
Borne infrieure Borne suprieure
Type Taille Borne infrieure
(formule)
Borne suprieure
(formule)

char 8 bits -128 -(27) +127 27-1

unsigned char 8 bits 0 0 +255 28-1

short 16 bits -32 767 -(215-1) +32 767 215-1

unsigned short 16 bits 0 0 +65 535 216-1

int 16 bits -32 767 -(215-1) +32 767 215-1

unsigned int 16 bits 0 0 +65 535 216-1

long 32 bits -2 147 483 647 -(231-1) +2 147 483 647 231-1

unsigned long 32 bits 0 0 +4 294 967 295 232-1

-9 223 372 036 854 +9 223 372 036 854


long long (C99) 64 bits
775 807
-(263-1)
775 807
263-1

+18 446 744 073 70


unsigned long long (C99) 64 bits 0 0
9 551 615
264-1

Float 32 bits Valeur : 1


2(127)

Valeur : 1 2(1023)
Double 64 bits

Langage C - FSDM 55
Types simples
Domaine des valeurs
Comment choisir le type de vos variables ? : la rponse est simple, selon les
donnes manipules et la prcision souhaite
Dans mon programme, jai des donnes qui correspondent des caractres
Type = char
Dans mon programme, je manipule des valeurs entires
Type = int
Dans mon programme, je manipule des valeurs entires positives
Type = unsigned int
Dans mon programme, jai des rels avec peu de chiffres aprs la virgule
Type = float
Dans mon programme, je fais des calculs sur des rels correspondants des
donnes scientifiques sensibles
Type = double

Langage C - FSDM 56
Types simples
Reprsentation en mmoire
Types entiers :
un bit est conserv pour reprsenter le signe du nombre ( en gnral 0 correspond un
nombre positif).

Types flottants :
Les types flottants permettent de reprsenter dune manire approche, une partie des
nombres rels. Un nombre rel est reprsent sous forme
M. BE
B est la base (2 ou 16 qui dpend de la machine )
M est la mantisse et E lexposant

Chiffres
Prcision Encodage Signe Exposant Mantisse Valeur d'un nombre Prcision
significatifs

Simple prcision 32 bits 1 bit 8 bits 23 bits 1 2(127) 24 bits environ 7


Double prcision 64 bits 1 bit 11 bits 52 bits 1 2(1023) 53 bits environ 16

Langage C - FSDM 57
Types simples
Dclaration des variables
On spcifie le type, puis le nom de la variable
Autant de fois que ncessaire
<type_de_la_variable> <nom_de_la_variable> ;
Les dclarations se font au dbut dun bloc dinstruction
Aprs une accolade ouvrante : {
On peut mettre plusieurs noms, spars par une virgule : ,

{
int i; /* i : variable entire signe */
int j, k ; /* j et k : idem */
unsigned long l; /* l : entier long non sign */
double d, e; /* d, e : flottants double prcision */
float f; /* f : flottant simple prcision */
char c; /* c : caractre */
Langage C - FSDM 58
Variables et Types
Affectation de variables
On donne une valeur une variable au moyen de linstruction = :
i = 1; /* i : variable entire signe */
j = 3455; /* j : idem */
d = 7.45; /* d : flottants double prcision */
k = 1.34e3; /* k : flottants double prcision */
f=1.44589; /* f : flottant simple prcision */
c = A; /* c : caractre */
Ce nest pas une galit au sens mathmatique
Le sens exact est : prends la valeur de ce qui est droite du = et mets-la dans
la variable qui est sa gauche.
Il est possible de dclarer et dinitialiser une variable en mme temps

int j=3, k =8 ;
double d=7.45 ;
char c=A;
Langage C - FSDM 59
Travaux pratiques
Exercice
Ecrire un programme qui permet de calculer et dafficher le produit deux
entiers saisis au clavier
#include <stdio.h>
#include <stdlib.h>
int main(){
int x, y, prod;
printf("Entrer deux entiers :");
scanf("%d ",&x);
scanf("%d", &y);
prod = x*y;
printf("Le produit de %d et de %d est : %d", x, y, prod);
return EXIT_SUCCESS;
}
Langage C - FSDM 60
Travaux pratiques
Exercice
Ecrire un programme qui permet de calculer et dafficher la somme de deux
flottants saisis au clavier
#include <stdio.h>
#include <stdlib.h>
int main(){
float x, y, som;
printf(" Entrer deux rels :");
scanf("%f %f",&x, &y);
som = x+y;
printf("la somme de %f et de %f est : %f", x, y, som);
return EXIT_SUCCESS;
}
Langage C - FSDM 61
Types structurs
Tableau
Attention, en C, aucun contrle de dbordement sur les indices !!!!!

int t[8]; /* Tableau de 8 lments entiers */


int i ; /* indice utilis pour parcourir le tableau */

for (i =0 ; i < 8 ; i= i+1) /* On initialise tout le tableau */


{
t[i] = i;
}
for (i =0 ; i < 8 ; i= i+2) /* Pour tout les multiples de 2, on crase avec */
{ /* la valeur lue */
scanf("%d", &t[i]);
}

t[8] = 10; /* On crit en dehors du tableau, */

Langage C - FSDM 62
Types structurs
Tableau
On peut initialiser un tableau lors de sa dclaration
Liste des constantes du type adquat, entre accolades

int t[8] = {1, 2, 3, 4, 5, 6, 7, 8 };

Nombre dlments compts par le compilateur

int t[] = {1, 2, 3, 4, 5, 6, 7, 8 }; /* Le compilateur comptera votre place */

La liste peut tre partielle

int t[8] = {1, 2, 3, 4}; /* 8 places prises, 4 initialises*/

Langage C - FSDM 63
Types structurs
Tableau : exercice
Supposer que vous avez un tableau tab de taille 9 qui contient des
rels simple prcision (dj rempli). Ecrire les instructions qui
permettent dafficher le contenu de ce tableau

int i;
for (i =0 ; i < 9 ; i= i+1)
{
if(i==0){
printf("La valeur du %d er lment du tableau est %f", i, tab[i]);
}
else{
printf("La valeur du %d me lment du tableau est %f", i, tab[i]);
}
}

Langage C - FSDM 64
Chanes de caractres
Il nexiste pas de type chane spcifique

Une chane de caractres en C est un tableau unidimensionnel de


caractres
Le nom de la chane fait rfrence ladresse de dbut du
premier caractre de la chane

Une chane de caractres bien forme est toujours termine par un


caractre nul '\0'
Indique o le contenu utile de la chane finit
Ne pas oublier de compter et de rserver sa place!!

Langage C - FSDM 65
Chanes de caractres
Dclaration dune chane
On peut dclarer et initialiser une chane de caractres comme on
dclare un tableau de caractre.

char t[] = {'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0' };

Il est prfrable dutiliser les constantes


char t[] = "Bonjour"; // tableau modifiable en mmoire
t[1] = 'Z'; // lgal car t est modifiable

Langage C - FSDM 66
Chanes de caractres
Affichage
Directement dans printf si chane simple : %s pour affiche les
chanes
La chane est affiche jusquau premier \0 rencontr

char t[] = "Bonjour"; // tableau modifiable en mmoire


printf("%s", t);

Langage C - FSDM 67
Chanes de caractres
Lecture
On utilise scanf
Code %s aussi
Pas besoin de & car une chane est dj une rfrence sur une
zone mmoire
Limiter la taille avec la syntaxe %nums pour viter les
dbordements de tampons
char str[10]; // Une chane de 10 caractres
int a;

printf("Enterez votre nom : ");


scanf("%s", str); // pas de & car str est une rfrence

scanf("%9s", str); // on limite 9 pour \0


Langage C - FSDM 68
Chanes de caractres
Fonctions de manipulation de chanes

Dans la bibilothque stdlib.h (#include <stdlib.h>)


strlen( ) : renvoie la taille courante dune chane (pas la taille
maximale du tableau)
strcpy ( ) : copie dune chane source vers un tableau de caractres
destination
strcat ( ) : ajout dune chane source la fin dune chane
destination
Strchr () : recherche de la premire occurrence dun caractre
dans une chane
Etc,
Langage C - FSDM 69
Constantes
Constantes
On peut avoir des :
Constantes entiers
Constantes virgule flottante
Constantes caractres
Les signes + et - sont optionnels
Le marquer de type est aussi optionnel :
U ou u : pour les constantes non signes
L ou l : pour les constantes de type long
F ou f : pour les constantes virgule flottante simple
prcision

Langage C - FSDM 70
Constantes
Constantes entires
Constantes dcimales Constantes octales Constantes hexadcimales
Base 10 Base 8 (3bits) Base 16 (4bits)
Suite de chiffres Suite de chiffres octaux Suite de chiffres en hexa :
dcimaux : [0-9] : [0-7] [0-9A-F]
Pas de 0 au dbut Commencent par un Commencent par 0x
du nombre 0 ou 0X

0 0
+0 05 = 5*80 = 5 +0x0 =0
43 -017 = 1*81 +7*80= -15 0x0 =0
-43 0x1 =1
126367 0xA = 10
-183899 Ne mettez pas des 0 0xB = 11
4883084949U devant les constantes 0xF = 15
9799092739389487UL entires pour faire joli.. -0x17 = 1*161 +7*160= - 23

Langage C - FSDM 71
Constantes
Constantes virgule flottante
Signe optionnel : + , - -12.48
Suite de chiffres et point dcimal . +12.45
12.45

Suite de chiffre aprs le . est optionnelle -12.


+12.
12.
Exposant e ou E est lexposant entier dcimal, optionnels

-12.32e3 = -12320
12.2E-2 = 0.122
Marqeur de type, optionnel
F : constante en simple prcision 12.F

Langage C - FSDM 72
Constantes
Constantes caractres
Unique caractre encadr par des apostrophes
Les caractres en C sont reprsents par des entiers
La valeur dune constante de type caractre est la valeur de son code dans
le jeu de caractres de la machine
Exemple : O correspond 48 dans le codage ASCII
Caractre dchappement : la barre inverse \ (appele antislash
en anglais)
\0 Caractre nul \" Guillemet \t Tabulation
\\ Antislash \r Retour chariot \b Retour arrire
\ Apostrophe \n Nouvelle ligne \a Bip Terminal

A Lettre A \ Apostrophe
Espace \n Nouvelle ligne
\0 Caractre nul \" Guillemet
Langage C - FSDM 73
Constantes
Constantes caractres
Donner les instructions qui permettent dafficher :
Bonjour, je suis une apostrophe :
printf("Bonjour, je suis une apostrophe : \");
Bonjour, je suis un guillemet : "
printf("Bonjour, je suis un guillemet : \"");
Bonjour, je suis un antislash : \
printf("Bonjour, je suis un antislash: \\");
Le message Une nouvelle ligne va me suivre et revient la ligne
printf("Une nouvelle ligne va me suivre \n");
Le message Entre moi suivie dune tabulation, suivie du message et
lui, il y a une tabulation , puis suivie dun bip du terminal et une nouvelle
ligne
printf("Entre moi \t et lui, il y a une tabulation \a \n ");
Langage C - FSDM 74
Oprateurs et expressions
Vocabulaire
Un oprateur est un symbole dopration qui permet dagir sur des variables
ou de faire des calculs
Une oprande est une entit (variable, constante ou expression) utilise par un
oprateur
Une expression est une combinaison doprateur(s) et doprande(s),
Une expression possde une valeur et un type.
Dans a+b :
a est loprande gauche
+ est loprateur
b est loprande droite
a+b est appel une expression
Si a et b sont des entiers, lexpression a+b est un entier

Langage C - FSDM 75
Oprateurs et expressions
Oprateurs arithmtiques

Oprateur Syntaxe

Soustraction expr1 - expr2

Division expr1 / expr2

Si les deux oprandes sont entiers alors / est une division entire (5/2 vaut 2 et
non 2.5)
% calcule le reste de la division entire de deux entiers ( 5%2 vaut 1)
Il existe des oprateurs unitaires et + qui changent le signe de leur oprande

Langage C - FSDM 76
Oprateurs et expressions
Expression boolenne
Une expression boolenne est une fonction logique qui ne retourne que les
valeurs VRAI ou FAUX
En C, il nexiste pas de type boolen propre
Type bool introduit dans la norme C99 seulement
Le type boolen est mul par le type int, avec les conventions suivantes :
FAUX : valeur 0
VRAI : toutes les autres valeurs non nulles
En C, toute expression non nulle est considre vraie et toute expression nulle
est considre fausse

Langage C - FSDM 77
Oprateurs et expressions
Oprateurs relationnels, dgalit et logiques

Oprateurs relationnels

Infrieur ou gale expr1 <= expr2

Suprieur ou gale expr1 >= expr2

Toutes ces oprations donnent 0 si la comparaison indique est


fausse et 1 si elle est vraie

Langage C - FSDM 78
Oprateurs et expressions
Oprateurs relationnels, dgalit et logiques

Oprateurs dgalit

Diffrent de expr1 != expr2

Toutes ces oprations donnent 0 si la comparaison indique est


fausse et 1 si elle est vraie

Langage C - FSDM 79
Oprateurs et expressions
Oprateurs relationnels, dgalit et logiques

Oprations logiques

Conjonction (ET logique) expr1 && expr2

Toutes ces oprations donnent 0 si la comparaison indique est fausse et


1 si elle est vraie
Pour &&, expr1 est dabord value. Si elle est fausse, && retourne 0
sans valuer expr2. Sinon expr2 est value
Pour ||, expr1 est dabord value. Si elle est vraie, || retourne 1 sans
valuer expr2. Sinon expr2 est value

Langage C - FSDM 80
Oprateurs et expressions
Oprateurs relationnels, dgalit et logiques
Avec une expression boolenne, on peut
Stocker le rsultat dun expression boolenne dans une
variable entire

int a = ( (b>4) && ((c== A) || (c == a)) ) ;

int m = (c!= A) || ! b ;

Langage C - FSDM 81
Oprateurs et expressions
Oprateurs relationnels, dgalit et logiques
Avec une expression boolenne, on peut
Utiliser le rsultat dune expression entire comme valeur de
condition

if(4){ if(0){
printf("Rat \n "); printf("Rat \n ");
} }
else { else {
printf("Ben Oui \n"); printf("Ben Oui \n");
int i = 4;
} }
int a =3, b=4, c=5;
int a = 4; i= ((a>b) && (a>c)); int a = 0;
if(a){ printf("la valeur de i est %d \n", i ); if(a){
printf("Rat \n "); printf("Rat \n");
} 0 }
else { else {
printf("Ben Oui \n"); printf("Ben Oui \n");
} Langage C - FSDM
} 82
Oprateurs et expressions
Oprateurs daffectation
Lopration daffectation en C se note = . Contrairement beaucoup
de langages de programmation, laffectation en C nest pas une
instruction, mais une expression, car elle a
Un type : le type du membre droit
Une valeur : la valeur du membre droit
Ainsi, var = expr range ladresse dsign par var la valeur
expr convertie dans le type de var et de plus vaut cette valeur
On peut donc les utiliser comme termes dexpressions englobant.
i = j = 3; /* j=3 est une expression dont la valeur est 3, cette valeur est stocke dans i */

Cependant cest une source potentielle de problmes


if(a=3) if(a=0)
printf("Attention Danger"); printf("Attention Danger");
Langage C - FSDM 83
Oprateurs et expressions
Oprateurs daffectation combine
Comme de nombreuses instructions arithmtiques sont des
modification du contenu de variables, il existe des raccourcis
spcifiques pour laffectation
var = var op expr; var op= expr ;

On trouve des raccourcis pour tous les oprateurs arithmtiques


binaires : +=, -=, *=, /=, %=

i = 3; i += 12 /* i =15 */
i = 3; i -= 7 /* i =-4 (i de type int) */
i = 3; i *= 4 /* i =12 */
i = 3; i /= 2 /* i = 1 (division entire ) */
i = 3; i %= 2 /* i =1 */

Langage C - FSDM 84
Oprateurs et expressions
Oprateurs dincrmentation et de dcrmentation
Les oprateurs mythiques pour tout programmeur C sont + +
qui ajoute 1 son oprande et -- qui retranche 1 de son
oprande.
var = var +1; var ++;
var = var - 1; var -- ;

Ces instructions sont galement des expressions qui ont une


valeur et un type et peuvent tre utilises dans une expression
englobant
i = 3;
a = i ++; /* Lexpression i ++ a un type et une valeur */

Langage C - FSDM 85
Oprateurs et expressions
Oprateurs dincrmentation et de dcrmentation
Selon que les oprations sont positionns avant ou aprs la variable sur
laquelle ils oprent, on lit la valeur de la variable avant ou aprs
lopration : on a donc deux modes de fonctionnement

Post-incrmentation var ++;


Le suffixe : Post-dcrmentation var -- ;

Pr-incrmentation ++ var;
Le prfixe
Pr-dcrmentation -- var ;

Ce quil faut retenir :


a = i ++; a =i ; a = i --; a =i ;
i=i+1; i=i-1;

a = -- i; i=i-1; a = ++ i; i=i+1;
a =i ; a =i ;
Langage C - FSDM 86
Oprateurs et expressions
Oprateurs dincrmentation et de dcrmentation
Exemple :
i =3;
a = i ++;
printf("Valeur de i =%d et de a =%d"); /* i=4 et a =3 */

i =3;
a = i --;
printf("Valeur de i =%d et de a =%d"); /* i=2 et a =3 */

i =3;
a = ++i;
printf("Valeur de i =%d et de a =%d"); /* i=4 et a =4 */

i =3;
a = --i;
printf("Valeur de i =%d et de a =%d"); /* i=2 et a =2 */
Langage C - FSDM 87
Oprateurs et expressions
Oprateurs dincrmentation et de dcrmentation
Exemple : i =3;
i++; /* i = i+1 */
a=i;
printf("Valeur de i =%d et de a =%d"); /* i=4 et a =4 */
i =3;
i--; /* i = i-1 */
a=i;
printf("Valeur de i =%d et de a =%d"); /* i=2 et a =2 */
i =3;
++i; /* i = i+1 */
a = i;
printf("Valeur de i =%d et de a =%d"); /* i=4 et a =4 */
i =3;
--i; /* i = i-1 */
a = i;
printf("Valeur de iLangage
=%d Cet- FSDM
de a =%d"); /* i=2 et a =2 */ 88
Oprateurs et expressions
Oprateurs dincrmentation et de dcrmentation
Exercice : Donner, pour chaque cas, le message affich, ainsi que
les valeurs de a et c la fin des instructions suivantes :

a = 3; a = 3; a = 3;
b = 3; b = 3; b = 3;
c = 2;
if (a++> b) if (++a> b) if ((++a > b) || (a > c --))
{ { {
printf("Rat"); printf("Rat"); printf("Rat");
} } }
else { else { else {
printf("Ok"); printf("Ok"); printf("Ok");
} } }
Effet de bord
Ok Rat Rat
a vaut 4 a vaut 4
Langage C - FSDM
a vaut 4 et c =2 89
Oprateurs et expressions
Conversion de type
Lorsque deux variables de types diffrents mais comparables, et que lon dsire
par exemple affecter la valeur de lune lautre, il se pose un problme des
diffrences de structure internes entre ces variables (par exemple le nombre de
bits affect la variable). En C, il y a, avant lvaluation dune expression, une
conversion implicite du type le plus faible vers le type le plus fort :
char < short int long < float < double
Les constantes entires sont de type int
Les constantes flottantes sont de type double (si on prcise pas autre chose)

A +1 : une expression de type int car 1 est un entier qui est plus fort quun char
var + 12.45 : une expression de type double car 12.45 est un double (pas un float)
12 / 5.F : une expression de type float car 23.F est float (le rsultat est 2.5 et non 2)
Langage C - FSDM 90
Oprateurs et expressions
Conversion de type et affectation
Lors dune affectation, le type du membre droit est converti dans le
type du membre gauche
Si le type de destination (gauche) est plus faible que le type du membre
droit :
Le rsultat peut tre indfini pour les types flottants si le nombre ne peut
tre reprsent
Il y a troncature pour les types entiers

char c; int i =2 ;
c = A +1; /* Aucun problme
i = i * 12.34; /* Dabord on calcul 2 * 12.34 ce qui donne 24.68 puis on tronque 34,
ce qui donne 12. Attention toutefois avec si on dpasse la capacit
dun entier, on peut se retrouver avec des chiffre ngatives */

Cest vraiment dlicat, cest le compilateur qui fait de lui-mme, il faut faire attention, voir
lexemple du TP Langage C - FSDM 91
Oprateurs et expressions
Conversion de type : casting
Loprateur parenths de conversion de type (aussi appel type
cast ) permet les conversions explicites de types.
Permet de spcifier explicitement des conversions au compilateur
Supprime les avertissements du compilateur lors de la conversions vers
des types plus faibles
int a = 2 ;
int b = 3; resultat1 =1.
int diviseur; double resultat1, rsultat2, resultat3,
resultat4;
resultat2 =1.5
int reste;
double nombre; resultat1 = b / a; resultat3 =1.5
reste = (int ) nombre % diviseur; resultat2 = (double) b / a;
resultat3 = b / (double) a;
resultat4 =1.5
resultat4 = (double) b / (double) a; resultat5 =1.
resultat5 = (double) ( b / a);

Langage C - FSDM 92
Oprateurs et expressions
Tableau partiel des priorits des oprateurs dj abords
Oprateur Signification Associativit
() Parenthsage Gauche Droite
- Ngation unitaire Droite Gauche
! ++ -- Non/Inc/dcrmentation Droite Gauche
* / % Mult/Div/modulo Gauche Droite
+ - Addition/Soustraction Gauche Droite
< <= > >= Comparaison Gauche Droite
== != Egalit /Ingalit Gauche Droite
&& Et logique Gauche Droite
|| Ou logique Gauche Droite

= += -= Affectation Droite Gauche


*= /= %=

Lordre dvaluation dune expression dpend des priorits des


oprateurs
Langage C - FSDM 93
Oprateurs et expressions
Exercice
Soit les dclarations suivantes

int n = 10, p = 4;

long q = 2;

float x = 1.75;

Donner le type et la valeur de chacune des expressions suivantes :

n+q

n+x (q-2) && (n-


10)
n%p + q
x* (q==2)
n<p x*(q==5)
n>=p

n>q
Lordre dvaluation dune expression dpend
q+3* (n>p)
des priorits des oprateurs !
q && n
Langage C - FSDM 94
95

Langage C - FSDM
2015/2016
Plan
Structures de contrle
if else
Oprateur ternaire ?... :
switch case
for
while
do while
Instruction break
Instruction continue

Langage C - FSDM 96
Instructions
Structures de contrle
Les structures de contrle servent orienter lexcution du programme
en fonction de la valeur courante dune expression
Excution conditionnelle dun fragment de code si une certaine
condition est vrifie
Excution rptitive dun fragment du code si une certaine condition
est vrifie

Les conditions de contrle sont des expressions logiques boolennes

Langage C - FSDM 97
De lalgorithmique au C
Traduction des instructions : schma conditionnel

Syntaxe en algo Syntaxe en C


Si condition Alors if ( condition)
Dbut Si {
instructions instructions
Fin Si }

Si condition Alors if ( condition )


Dbut Si {
instructions instructions
Fin Si }
Sinon else
Dbut Sinon {
instructions instructions
Fin Sinon }

Langage C - FSDM 98
Instructions
Instruction if else
Syntaxe :
if (expression) instruction1
if (expression) instruction1 else instruction2
Si lexpression est vrai, linstruction1 est excute, sinon linstruction 2 est
excute si elle existe

if((an%4) !=0) { /* Si lanne nest pas bissectrice */


nbjours =365;
}
else {
nbjours = 366;
}

Les accolades dterminent le bloc dinstructions qui dpend du if ou du


else : si la condition est vraie toutes les instructions du bloc sont
excutes
Langage C - FSDM 99
Instructions
Instruction if else
Lorsquon a plusieurs cas tester, il est possible denchaner les if else

if((an%4) !=0) { /* Si lanne nest pas bissectrice */


nbjours =365;
}
else {
if ((an/400) ==0) {
nbjours = 365;
}
else {
nbjours = 366;
}
}

Le else se rapporte toujours au premier if le


prcdant
Langage C - FSDM 100
Instructions
Instruction if else
Lorsque le bloc dinstructions qui dpend dun if ou dun else se
compose dune seule instruction, il est possible domettre les
accolades : MAIS ATTENTION
if((an%4) !=0) {
nbjours =365; if((an%4) !=0) if((an%4) !=0)
} nbjours =365; nbjours =365;
else { else { else if ((an/400) ==0)
if ((an/400) ==0) { if ((an/400) ==0) nbjours = 366;
nbjours = 366; nbjours = 366; else
} else nbjours = 366;
else { nbjours = 366;
nbjours = 366; }
}
} Le else se rapporte toujours au premier if le
prcdant
Langage C - FSDM 101
Instructions
Instruction if else
Exemples : que affiche se code suivant

int a =3;
int a =3; int a =3; if(a==3){
if(a==3) if(a==3) printf("a vaut 3 \n ");
printf("a vaut 3 \n"); printf("a vaut 3 \n"); }
printf("Merci \n"); printf("Merci \n"); printf("Merci \n");

a vaut 3 Conclusion : Si vous


Indentez ntes
votre code pas sr Mettez des accolades
Merci de ce que vous faites, mettez les
accolades, cest plus simple

int a =3, b= 0; int a =3, b= 1; int a =0, b= 0;


if(a==3) if(a==3) if(a==3)
if(b==0) printf("Bonjour "); if(b==0) printf("Bonjour "); if(b==0) printf("Bonjour ");
else printf("Merci \n"); else printf("Merci \n"); else printf("Merci \n");

Bonjour Merci (naffiche rien)


Langage C - FSDM 102
De lalgorithmique au C
Exercice
Traduire en C
Si X > 0 alors
Dbut Si
Ecrire("X suprieur 0")
Fin si
Sinon
Dbut Sinon
Si X=0 alors
Dbut Si
Ecrire("X gal 0")
Fin Si
Sinon
Dbut Sinon
Ecrire("X infrieur 0")
Fin Sinon
FinSinon
Langage C - FSDM 103
De lalgorithmique au C
Corrig
Traduire en C
if (X > 0)
{
printf("X suprieur 0") ;
}
else
{
if (X==0)
{
printf("X gal 0") ;
}
else
{
printf("X infrieur 0") ;
}
} Langage C - FSDM 104
Travaux pratiques
Exercice
Ecrire un programme qui permet de comparer deux entiers :
#include <stdio.h>
#include <stdlib.h>
int main(){
int x, y ;
printf("Entrer deux entiers ");
scanf("%d %d", &x, &y);
if (x > y){
printf("%d est suprieur %d", x, y);
}
else {
printf("%d est suprieur %d", y, x);
}
return EXIT_SUCCESS;
} Langage C - FSDM 105
Instructions
Oprateur ternaire ?... :
Dans de nombreux cas, une instruction conditionnelle sert juste
positionner une variable
Redondance du code

if(a > b)
max = b;
max = a;
if(a > b)
else
max = a;
max = b ;

Loprateur ternaire ? : renvoie une valeur diffrente selon la


validit de lexpression qui le prcde

max = (a >b) ? a : b ;

Langage C - FSDM 106


Instructions
Switch case
Linstruction switch case sert traiter des choix multiples en fonction dune
expression entire (des caractres ou des entiers)
printf("Entrez votre choix \n");
scanf("%c",&c);
switch(c) { /* valuation dune expression entire */
case A :
printf("Vous avez saisi A \n"); // Instructions excutes jusquau break
printf("Enter un entier");
scanf("%d",&i);
i++;
break; // break permet de sortir de la slection
case B :
printf("Vous avez saisi B \n");
break;
default :
printf("Choix \"%c\" invalide\n",c); // comportement par dfaut
(optionnel)
break;
}
Langage C - FSDM 107
Instructions
Switch case
Supposer quon a oubli un break dans le bloc de case A et que lutilisateur a
saisi A, quelle sont les instructions qui seront excutes?
printf("Entrez votre choix \n");
scanf("%c",&c);
switch(c) { /* valuation dune expression entire */
case A :
printf("Vous avez saisi A \n"); // Instructions excutes jusquau break
printf("Enter un entier");
scanf("%d",&i);
i++;
/* break; */ // on a oubli de faire un break
case B :
printf("Vous avez saisi B \n");
break;
default :
printf("Choix \"%c\ invalide\n"); // comportement par dfaut

break;
}
Langage C - FSDM 108
Instructions
Switch case
Bien sur, au lieu de saisir une caractre, on peut saisir un entier
printf("Entrez votre choix \n");
scanf("%d",&k);
switch(k) { /* valuation dune expression entire */
case 1:
printf("Vous avez saisi A \n"); // Instructions excutes jusquau
break
printf("Enter un entier");
scanf("%d",&i);
i++;
/* break; */ // on a oubli de faire un break
case 2 :
printf("Vous avez saisi B \n");
break;
default :
printf("Choix \"%c\ invalide\n"); // comportement par dfaut

break;
} Langage C - FSDM 109
Instructions
Instruction while
Syntaxe :
while (expression) instruction
Tant que lexpression est vraie, on excute linstruction
Remarque : une instruction doit modifier lexpression, sinon on a
une boucle infinie

printf("Entrez le nombre de dpart : ");


scanf("%d",&n);

while (n >1) {
n = ((n%2)==0) ? (n / 2 ) : ( (n-1) / 2);
printf("%d \n", n);
}

Langage C - FSDM 110


Instructions
Instruction do while
Syntaxe :
do instruction while (expression) ;
Linstruction est dabord excute, puis lexpression est value. Si
elle est vraie, on reboucle sur lexcution de linstruction.
A la diffrence de la boucle while, linstruction est toujours
excute au moins une fois.

do {
printf("Entrez un nombre entre 1 et 10 : ");
scanf("%d",&n);
}while ( (n <1) || (n>10) ) ;

Langage C - FSDM 111


De lalgorithmique au C
Traduction des instructions : boucle Tant que et rpter tant que
Syntaxe en algo Syntaxe en C
while (condition)
Tant que condition Faire
{
instructions
instructions
Fin Tant que
}

Syntaxe en algo Syntaxe en C


do
Rpter
{
instructions
instructions
Tant que condition
}while (condition) ;

Langage C - FSDM 112


De lalgorithmique au C
Exercice
Traduire en C
Algorithme Saisie
Variable n : Entier
Dbut
Lire (n)
Tant que n > 0 Faire
crire ("Saisissez un nombre")
Lire(n)
Fin Tant que
Fin

Langage C - FSDM 113


De lalgorithmique au C
Corrig #include <stdio.h>
#include <stdlib.h>
int main ( )
{
int n ;
scanf("%d",&n);
while (n > 0)
{
printf("Saisissez un nombre");
scanf("%d",&n);
}
return EXIT_SUCCESS;
}
Langage C - FSDM 114
Instructions
Instruction for
Syntaxe :
for (instruction1 ; expression ; instruction2)
instruction3
Linstruction1 est dabord excute (initialisation). Puis, tant que
lexpression est vraie, on excute linstruction3 (corps de la
boucle), puis linstruction 2 (itrateur)

printf("Je compte jusqu 10 : \n ");


for ( ; ; )
for ( i= 1 ; i < = 10 ; i ++) printf("Je suis une boucle infinie \n ");
printf("%d", i );

printf("%d", i );

Langage C - FSDM 115


De lalgorithmique au C
Traduction des instructions : boucle Pour
Syntaxe en algo Syntaxe en C
for ( i = valeur initiale ; i < = valeur
Pour i valeur initiale valeur
finale ; i = i + p )
finale [de pas p ] Faire
{
instructions
instructions
Fin Pour
}

Syntaxe en algo Syntaxe en C


for ( i = 1 ; i < = 100 ; i = i + 1 )
Pour i 1 100 de pas 1 Faire
{


Fin Pour
}

Pour i 1 100 Faire for ( i = 1 ; i < = 100 ; i++ )


{
Fin Pour }

Langage C - FSDM 116


Instructions
Instruction for
Linstruction for est smantiquement quivalente linstruction
while.
printf("Je compte jusqu 10 : \n ");
printf("Je compte jusqu 10 : \n ");
i = 1;
for ( i= 1 ; i < = 10 ; i ++) while (i < = 10){
printf("%d", i ); printf("%d", i );
i ++ ;
}

Langage C - FSDM 117


De lalgorithmique au C
Exercice
Traduire en C

Algorithme Factorielle
Variables n, fact : Entier
Dbut
fact 1
Pour n 1 100 Faire
fact (n * fact)
Fin pour
Ecrire ("La factorielle de 100 est ", fact)
Fin

Langage C - FSDM 118


De lalgorithmique au C
Corrig
#include <stdio.h>
#include <stdlib.h>

int main ( )
{
int n, fact;
fact =1 ;
for (n=1; n<=100; n=n+1)
{
fact = n * fact ;
}

printf ("La factorielle de 100 est %d", fact) ;


return EXIT_SUCCESS;
}
Langage C - FSDM 119
Instructions
Instruction break
Linstruction break permet de quitter la boucle la plus interne, ou
bien la case, ans lesquels elle se trouve.
On ne sort que dun seul niveau
Ne concerne pas les if else
printf("Je calcule la somme de 10 entiers positifs \n ");

somme =0 ;

for ( i= 1 ; i < = 10 ; i ++) { /* Lecture dau plus 10 entiers */


scanf("%d", &n );
if ( n <= 0) // si un entier nest pas strictement positif
break; // On quitte la boucle for

somme += n;
}
printf("Somme %d",somme);
Langage C - FSDM 120
Instructions
Instruction break
Linstruction break peut tre utilise pour sortir dune boucle
dclare comme boucle infinie
while (1) { /* Boucle infinie */
scanf("%c", &c );
if ( (c == Q) || (c == q) ) // si c vaut la valeur de sortie : q ou Q
break; // On quitte la boucle while
switch (c) {
case A :
case a :
.
break; // se break l, ne fait sortir que du
switch
.
}
}
Langage C - FSDM 121
Instructions
Instruction continue
Linstruction continue sert sauter litration courante de la
boucle la plus interne, dans laquelle elle se trouve, et passer
litration suivante (vite les goto)

printf("Je calcule la somme de 10 entiers positifs \n ");

somme =0 ;

for ( i= 1 ; i < = 10 ; i ++) { /* Lecture dau plus 10 entiers */


scanf("%d", &n );
if ( n <= 0) // si un entier nest pas strictement
positif
continue; // On ne quitte pas la boucle for, mais on
//passe litration suivante (au nombre
//suivant)
somme += n;
} Langage C - FSDM 122
Instructions
Exercice
Soit le programme suivant :
#include <stdio.h>
void main()
Ecrire un programme quivalent en {
int n, i, som;
employant la place de linstruction som = 0;
for
for ( i= 0 ; i < 4 ; i ++) {
Une instruction while, printf("Donner un entier");
Une instruction do while scanf("%d", &n );
som += n;
}
printf("Somme : %d \n", som);
}

Langage C - FSDM 123


Instructions
Exercice
Afficher un triangle rempli dtoiles, stendant sur un nombre de
lignes fourni en donne et se prsentant comme dans cet exemple :
*
**
***
*****
******
*******
********
*********
********** Langage C - FSDM 124
Instructions
Exercice
Dterminer si un nombre entier fourni en donne est premier ou
non

Langage C - FSDM 125


126

Langage C - FSDM
2015/2016
Plan
Analyse descendante
Sous-programme et fonctions
Fonctions en C
Paramtres des fonctions
Visibilit des variables
Rcursivit

Langage C - FSDM 127


Analyse descendante
Problmatique

Problme : Comment traiter les problmes trop complexes pour


tre apprhends en un seul bloc (dans la fonction main par
exemple) ?

Solution : On peut appliquer la mthode "Diviser pour rgner", et


dcomposer le problme en sous-problmes plus simples : cest
lanalyse descendante

Langage C - FSDM 128


Analyse descendante
Principe danalyse descendante
Rle : Mthode pour crire un programme de qualit : lecture plus
facile de programme, modularit du code
Principe :
Abstraire
Repousser la plus loin possible lcriture de lalgorithme (codage)
Dcomposer
Dcomposer la rsolution du problme initial en une suite de
sous problmes que lon considre comme rsolus
Combiner
Rsoudre le problme initial par combinaison des abstractions des
sous-problmes
Langage C - FSDM 129
Analyse descendante
Exemple

Analyseur alphabtique : crire un programme analysant un


fichier texte et indiquant le nombre doccurrence de chaque lettre
de lalphabet dans le fichier

Programme
Fichier texte Statistique de chaque lettre
Analyseur
alphabtique

Langage C - FSDM 130


Analyse descendante
Exemple
Rsoudre le problme revient :
Extraire un mot du fichier
Pour chaque, lettre de lalphabet, compter le nombre doccurrence
Calculer le cumul doccurrence de chaque lettre
Rpter la traitement jusquau dernier mots du fichier.
Chacun de ces sous-problmes devient un nouveau problme rsoudre
Si on considre que lon sait rsoudre ces sous-problmes, alors on sait
quasiment rsoudre le problme initial

Langage C - FSDM 131


Analyse descendante
Exemple
Programme
Fichier texte Statistique de chaque lettre
Analyseur
alphabtique

Fichier texte

mot Chiffre
Extraire Calculer Cumul
un mot loccurrence

caractre caractre
Langage C - FSDM 132
Fonctions et sous-programmes
Sous-programmes et fonctions
Donc crire un programme qui rsout un problme revient toujours
crire des sous-programmes qui rsolvent des sous parties du problme
initial. Il faut comprendre les mots programme et de sous-
programme comme programme algorithmique indpendant de toute
implantation
En algorithmique il existe deux types de sous-programmes :
Les fonctions : ralisent des traitements en se servant des valeurs de
ce certaines variables et renvoient un rsultat. Elles se comportent
comme des fonctions mathmatiques : y=f(x, y,. . . )
Les procdures : ralisent seulement des traitements mais ne
renvoies aucun rsultat

Langage C - FSDM 133


Fonctions et sous-programmes
Fonctions et procdures

Les fonctions et les procdures sont des groupes d'instructions


indpendants dsigns par un nom. Elles ont plusieurs intrts :
permettent de "factoriser" les programmes, c--d de mettre en
commun les parties qui se rptent
permettent une structuration et une meilleure lisibilit des
programmes
facilitent la maintenance du code (il suffit de modifier une seule
fois)
ces procdures et fonctions peuvent ventuellement tre
rutilises dans d'autres programmes

Langage C - FSDM 134


Fonctions en C
Exemple
La fonction SommeCarre suivante calcule la somme des carres de deux rels x et y :
float SommeCarre (float x, float y )
{
float z;
z = x*x+y*y;
return z; // on retourne le rsultat laide de linstruction return
}

La fonction Pair suivante dtermine si un nombre est pair :


int Pair(int x)
{
if (x%2 == 0)
return 1; // vue quil ny a pas de type boolen en C, on retourne 1
else //pour dire que cest vrai et 0 pour faux
return 0;
}
Langage C - FSDM 135
Fonctions en C
Exemple
La fonction Affiche permet dafficher le message Bonjour lcran:

void Affiche ( )
{
printf("Bonjour \n");
/* Laffichage lcran nest pas considr comme un rsultat en C, donc
pas besoin de linstruction return */
}

La fonction afficheInt permet dafficher le contenu dune variable entire lcran:

void AfficheInt ( int i )


{
printf("La valeur de i est %d \n", i );
/* Laffichage lcran nest pas considr comme un rsultat en C, donc
pas besoin de linstruction return */
}
Langage C - FSDM 136
Fonctions en C
Exemple
La fonction ValeurAbsolue retourne la valeur absolue dun entier pass en
paramtre:
int ValeurAbsolue ( int X )
{
int valeur;
if (X > =0 )
valeur = X;
else
valeur = - X;

return valeur;
/* remarquer que le type de la variable valeur est le mme que celui du
retour de la fonction ValeurAbsolue
*/
}

Langage C - FSDM 137


Fonctions en C
Remarque
Les paramtres des fonctions sont vus comme des variables locales
au bloc de code de la fonction. On peut dfinir dautres variables
dans le bloc.

int ValeurAbsolue ( int X )


Si la fonction ne renvoie aucun rsultat, {
on utilise la mot rserv void. Laffichage int valeur;
lcran nest pas considr comme un if (X > =0 )
valeur = X;
un rsultat (un retour)
else
valeur = - X;

Si la fonction na besoin daucun paramtrereturn valeur;


on crit simplement ( ) ou ( void )
}

Langage C - FSDM 138


Fonctions en C
Instruction return
On spcifie la valeur que renvoie une fonction au moyen de
linstruction return
Valeur de mme type que le type de retour dclar de la fonction
int ValeurAbsolue ( int X ) // retourne la valeur absolue dun entier pass en paramtre
{
int valeur;
if (X > =0 )
valeur = X;
else
valeur = - X;

return valeur;
/* remarquer que le type de la variable valeur est le mme que celui du retour de la fonction
ValeurAbsolue
*/
}

Langage C - FSDM 139


Fonctions en C
Instruction return
Linstruction return permet la terminaison anticipe de la fonction
Peut exister en plusieurs exemplaires

int Pair(int x)
{
if (x%2 == 0)
return 1; // vue quil ny a pas de type boolen en C, on retourne 1
else //pour dire que cest vrai et 0 pour faux
return 0;

printf ("Ce message ne sera jamais affich \n");


}

Langage C - FSDM 140


Fonctions en C
Instruction return
Pour les fonctions ne retournant rien, soit on utilise linstruction
return sans argument, soit on met rien. Dans ce cas, le type de
retour de la fonction est void

void Affiche ( )
void Affiche ( ) {
{ printf("Bonjour \n");
printf("Bonjour \n");
} return; // optionnel
}

Langage C - FSDM 141


Fonctions en C
Exercice
Ecrire une fonction permettant de retourner le max de deux rels.

float max2 ( float a, float b )


{
float max; // le rsultat final sera stock dans cette variable

if (a > = b)
max = a;
else
max = b;

return max;
}

Langage C - FSDM 142


Fonctions en C
Exercice
Ecrire une fonction permettant de retourner le factoriel dun
entier donn
int factoriel ( int n )
{
int fac; // le rsultat final sera stock dans cette variable
int i; // utilise dans la boucle

fac = 1; // on initialise la variable 1 pour pouvoir calculer les produits

for (i =1; i < = n; i++)


{
fac = fac * i; // ou encore fac *= i;
}

return fac;
}
.
Langage C - FSDM 143
Fonctions en C
Fonction main : fonction principale
int main () est une fonction particulier qui retourne un entier et
dont la liste des paramtres est vide. Elle est appele la fonction
principale.

Tout programme doit contenir obligatoirement la fonction


principale, qui est excute lorsque le programme est lanc.
int main ( )
{

return EXIT_SUCCESS;
}
.

Langage C - FSDM 144


Fonctions en C
Exercice
Ecrire une fonction permettant dafficher le contenu dun tableau
dentiers pass en paramtre. La taille du tableau est aussi pass
en paramtre de la fonction

void afficheTableau ( int tab[], int n )


{
int i; // utilise dans la boucle

for (i =0; i < n; i++)


printf("la valeur de la case dindice %d est : %d", i, tab[i]);
}
.

Langage C - FSDM 145


Fonctions en C
Appel de fonction

int ValeurAbsolue ( int X ) int main ( )


{ {
int valeur; int val1, val2;
if (X > =0 )
valeur = X; printf("Saisir un entier");
else scanf ("%d", &val1);
valeur = - X;
val2 = ValeurAbsolue(val1);
return valeur; printf("la valeur absolue de %d est : %d ", val1, val2);
}
return EXIT_SUCCESS;
}

Langage C - FSDM 146


Fonctions en C
Appel de fonction

int ValeurAbsolue ( int X ) int main ( )


{ {
int valeur; int val1, val2;
if (X > =0 )
valeur = X; printf("Saisir un entier");
else scanf ("%d", &val1);
valeur = - X;
val2 = ValeurAbsolue(val1);
return valeur; AfficheInt(val2);
}
return EXIT_SUCCESS;
void AfficheInt ( int i ) }
{
printf("La valeur de i est %d \n", i );
}
Langage C - FSDM 147
Fonctions en C
Exercice
Dans un exercice, nous avons dfini une fonction qui permet de calculer
le max de deux rel. Maintenant, on veut crire une fonction max3 qui
calcule de max de trois rels. Donner le code de max3 , en faisant un
appel la fonction max2

float max2 ( float a, float b ) float max3 ( float a, float b, float c )


{ {
int max; int m, max;

if (a > = b) m = max2 (a,b);


max = a;
else max = max2(m,c)
max = b;
return max;
return max; }
}
Langage C - FSDM 148
Fonctions en C
Exercice
Ecrire un programme qui demande lutilisateur de saisir trois
rels et qui affiche leur max

Langage C - FSDM 149


Fonctions en C
Corrig
/* Fichier maximum.c /* Fonction qui calcule le max de 3 rels */
* Ce fichier contient le programme qui * float max3 ( float a, float b, float c )
calcule le max de trois entiers {
* Auteur : SMI2009 int m, max;
* Version : v1 m = max2 (a,b);
* Date cration : aujourdhui max = max2(m,c)
*/ return max;
#include < stdlib.h> }
#include < stdio.h>
/* Fonction principale qui lance lexcution */
/* Fonction qui calcule le max de 2 rels int main ( )
float max2 ( float a, float b ) {
{ float x, y, z, max ;
int max; printf("Saisir trois rel : ");
if (a > = b) scanf ("%f%f%f",&x,&y,&z);
max = a;
else max = max3(x,y,z);
max = b; printf("La max est %f : ", max);
return max; return EXIT_SUCCESS;
} }
Langage C - FSDM 150
Paramtres des fonctions
Paramtres formels et effectifs
Les paramtres servent changer des donnes entre la fonction
appelante et la fonction appele
Vocabulaire
Un paramtre formel est aussi appel aussi paramtre
Un paramtre effectif est aussi appel argument
Signification
Les paramtres placs dans la dclaration d'une fonctions sont des
paramtres formels. Ils peuvent prendre toutes les valeurs possibles
dans le type dclar mais ils sont abstraits (n'existent pas rellement)
Les paramtres placs dans l'appel d'une fonction sont des
paramtres effectifs. ils contiennent les valeurs pour effectuer le
traitement

Langage C - FSDM 151


Paramtres des fonctions
Paramtres formels et effectifs
Un paramtre effectif est une variable ou constante (numrique ou
dfinie par le programmeur)
Le paramtre formel et le paramtre effectif sont associs lors de
lappel de la fonctions. Donc,
Le nombre de paramtres effectifs doit tre gal au nombre de
paramtres formels.
L'ordre et le type des paramtres doivent correspondre

Langage C - FSDM 152


Paramtres des fonctions
Exemple int main ( )
{
int val1, val2;
int ValeurAbsolue ( int X )
{ Paramtres formels printf("Saisir un entier");
int valeur;
scanf ("%d", &val1);
if (X > =0 )
valeur = X;
val2 = ValeurAbsolue(val1);
else
AfficheInt(val2); // ok
valeur = - X;
AfficheInt(3); // Ok
AfficheInt(Tab[ ]); //erreur
return valeur;
}
return EXIT_SUCCESS;
}
void AfficheInt ( int i )
{
printf("La valeur de i est %d \n", i ); Paramtres effectifs
} Langage C - FSDM 153
Paramtres des fonctions
Transmission des paramtres
Il existe deux modes de transmission de paramtres en C :
La transmission par valeur : les valeurs des paramtres effectifs sont affectes
aux paramtres formels correspondants au moment de l'appel de la fonction.
Dans ce mode le paramtre effectif ne subit aucune modification.
Lorsque le type des paramtres est un type simple, la transmission est par valeur
La transmission par adresse (ou par rfrence) : les adresses des paramtres
effectifs sont transmises la fonction appelante. Dans ce mode, le paramtre
effectif subit les mmes modifications que le paramtre formel lors de l'excution
de la fonction
Remarque : le paramtre effectif doit tre une variable (et non une valeur) lorsqu'il
s'agit d'une transmission par adresse.
Lorsque le type des paramtres est un type tableau ou une rfrence (pointeur), la
transmission est par rfrence

Langage C - FSDM 154


Paramtres des fonctions
Transmission des paramtres : Exemple
int main ( )
/* Passage par valeur */
{
void incrementer (int X, int int x, y;
Y)
{ x = 1;
La valeur de x est 1
X = X+1; y = 2;
La valeur de y est 2
Y = Y +1;
} afficher(x, x);
La valeur de x est 1 afficher(y, y);
La valeur de y est 2
incrementer (x, y);

void affiche( int i, char c ) afficher(x, x);


afficher(y, y);
{
printf("La valeur de %c est %d \n", c, i ); return EXIT_SUCCESS;
} }

Langage C - FSDM 155


Paramtres des fonctions
Transmission des paramtres : Exemple

/* Passage par valeur */ int main ( )


void echange (float y, float x {
) float x, y;
{
La valeur de x est 1 x = 1;
float z;
z =x; La valeur de y est 2 y = 2;
x = y;
y=z La valeur de x est 1 afficher(x, x);
} afficher(y, y);
La valeur de y est 2
echange (x, y);
void affiche( float i, char c )
{ afficher(x, x);
printf("La valeur de %c est %f \n", c, i ); afficher(y, y);
}
return EXIT_SUCCESS;
}
Langage C - FSDM 156
Paramtres des fonctions
Transmission des paramtres : Exemple
/* Passage par rfrence */ void affiche( int tab[], int taille )
void remplirTab1 ( int tab [ ],int taille) {
{ int i =0;
int i; for (i =0; i < taille; i++)
for (i =0; i < taille; i++) printf("La valeur de la case %d est %d \n", i, tab[i] );
tab[i] = i; }
}
int main ( )
/* Passage par rfrence */ {
void remplirTab2 ( int tab [ ],int taille) int tab [3];
{ remplirTab1( tab, 3);
int i; La valeur de la case 0 est 0 afficher(tab, 3);
for (i =0; i < taille; i++) La valeur de la case 1 est 1
tab[i] = 0; remplirTab2( tab, 3);
La valeur de la case 2 est 2
} afficher(tab, 3);
return EXIT_SUCCESS;
La valeur de la case 0 est 0 }
La valeur de la case 1 est 0
La valeur de la case 2 est 0
Langage C - FSDM 157
Paramtres des fonctions
Transmission des paramtres : conclusion

Types simples : int, float, char, .


Passage par valeur

Types : tableaux, pointeurs


Passage par rfrence

Langage C - FSDM 158


Paramtres des fonctions
Exercice
Ecrire une fonction une fonction remplirTab qui permet de
remplir un tableau de rels. Les valeurs sont saisies par
lutilisateur
/* Passage par rfrence */
void remplirTab ( float tab [ ],int taille)
{
int i;
for (i =0; i < taille; i++)
{
printf("Saisir la valeur de la case %d ", i);
scanf("%f", &tab[i]);
}
}

Langage C - FSDM 159


Paramtres des fonctions
Exercice
Ecrire une fonction afficheTab qui permet dafficher un tableau de
rels.

void afficheTab( float t[], int taille )


{
int i =0;
for (i =0; i < taille; i++)
printf("La valeur de la case %d est %f \n", i, t[i] );
}

Langage C - FSDM 160


Paramtres des fonctions
Exercice
Ecrire une fonction incTab qui permet dincrmenter les valeurs
des cases dun tableau

void incrTab( float t[], int taille )


{
int i =0;
for (i =0; i < taille; i++)
t[i] = t[i]+1;
}

Langage C - FSDM 161


Paramtres des fonctions
Exercice
Ecrire un programme qui demande lutilisateur de
le nombre de notes saisir,
saisi ces notes
incrmente les valeurs saisies et
les affiche

Langage C - FSDM 162


Paramtres des fonctions
void afficheTab( int t[], int taille )
{
Corrig int i =0;
/* Fichier incremente.c for (i =0; i < taille; i++)
* Ce fichier contient le programme qui permet printf("La valeur de la case %d est %d \n", i, t[i] );
* dincrmenter les valeurs saisies par }
* lutilisateur
* Auteur : SMI2008 void incrTab( float t[], int taille )
* Version : v1 {
* Date cration : aujourdhui int i =0;
*/ for (i =0; i < taille; i++)
#include < stdlib.h> t[i] = t[i]+1;
#include < stdio.h> }

void remplirTab ( float tab [ ],int taille) int main ( )


{ {
int i; int n;
for (i =0; i < taille; i++) float tab[10] ;
{ printf("Saisir le nombre des notes ( max est 10 )");
printf("Saisir la valeur de la case %d ", i); scanf ("%d",&n);
scanf("%f", &tab[i]); remplirTab(tab, n);
} incrTab(tab,n);
} afficheTab(tab,n);
return EXIT_SUCCESS;
}
Langage C - FSDM 163
Paramtres des fonctions
Exercice
Ecrire une fonction chercherMotif qui permet de chercher un
entier dans un tableau, elle retourne 1 si lentier existe et 0 sinon
int chercherMotif (int T[], int taille, int motif ) int chercherMotif (int T[], int taille, int motif )
{ {
int i; int i, isIn =0 ;
for (i =0; i < taille; i++) for (i =0; i < taille; i++)
{ {
if( t[i] == motif) if( t[i] == motif)
return 1; // on termine la fonction {
} isIn = 1; // on la trouv
}
return 0; else
} }

return isIn;
}

Langage C - FSDM 164


Paramtres des fonctions
Exercice
Ecrire un programme qui demande lutilisateur le nombre
dlments saisir, saisi ces lments et cherche un lment donn.

Langage C - FSDM 165


Paramtres des fonctions
return 0;
}
Corrig
void remplirTab ( float tab [ ],int taille)
{ /*ajouter ici le code de lexo prcdent (manque de
place) */
/* Fichier chercher.c }
* Ce fichier contient le programme qui permet
* dun lment parmi les valeurs saisies par int main ( )
* lutilisateur {
* Auteur : SMI2008 float n, motif, tab[20] ;
* Version : v1 int result;
* Date cration : aujourdhui printf("Saisir le nombre dlments( max est 20 )");
*/ scanf ("%d",&n);
#include < stdlib.h> remplirTab(tab, n);
#include < stdio.h> printf("Elment recherch ? :");
scanf ("%d",&motif);
int chercherMotif (int T[], int taille, int motif ) result = rechercherMotif(tab,n, motif);
{ if (result == 1)
int i; printf("Llment nexiste pas ");
for (i =0; i < taille; i++) else
{ printf("Llment existe ");
if( t[i] == motif)
return 1; return EXIT_SUCCESS;
} }
Langage C - FSDM 166
Paramtres des fonctions
Exercice
Ecrire une fonction minTab qui permet de chercher le plus petit lment dans un
tableau dentier partir dune case donne index :

int minTab(int T[], int index, int taille )


{
int i;
int tmp;
tmp = T[index]; // on suppose que le plus est T[indice] : initialisation
for (i =index +1; i < taille; i++) // la boucle commence partir dindex + 1
{
if( T[i] < tmp ) // si je trouve un plus petit, je change le min
{
tmp = T[i];
}
}

return tmp;
}

Langage C - FSDM 167


Paramtres des fonctions
Exercice
Ecrire une fonction tri qui permet de trier un tableau dentier par ordre
croissant sans utiliser de tableau intermdiaire (faire deux boucles)

void tri (int T[], int taille )


{
int i,j ;
int tmp;
for (i =0; i < taille; i++)
{
for (j = i+1; j < taille; j++)
{
if( T[j] < T[i] )
{
tmp = T[i];
T[i] = T[j];
T[j] = tmp;
}
}

Langage C - FSDM 168


Visibilit des variables
Variables locales et globales
On peut dclarer une variable soit
Dans un bloc dinstruction : variable locale
En dehors dun bloc dinstruction, dans un fichier : variable globale

/* Fichier test.c
*/
#include < stdlib.h>
#include < stdio.h>

int b =1; // variable globale


void remplirTab ( float tab [ ],int taille)
{
int i; // variable locale
for (i =0; i < taille; i++)
scanf("%f", &tab[i]);
}
Langage C - FSDM 169
Visibilit des variables
Variables locales et globales
On peut manipuler 2 types de variables dans un module (fichier, fonction) : des
variables locales et des variables globales.
Une variable locale n'est connue qu' l'intrieur du module ou elle a t
dfinie. Elle est cre l'appel du module et dtruite la fin de son excution
Une variable globale est connue par l'ensemble des modules et le programme
principale. Elle est dfinie durant toute lapplication et peut tre utilise et
modifie par les diffrents modules du programme

Langage C - FSDM 170


Visibilit des variables
Variables globales
Une variable dclare en dehors du corps dune fonction est visible de toutes les
fonctions du fichier dans lequel elle est dclare

int i; // variable visible dans tout le fichier

void f( )
{
i=4; // On la voit et on lutilise ici
}

int main( )
{
i=3; // on la voit et on lutilise ici
f ( );
printf("%d",i); // 3 ou 4 ?
return EXIT_SUCCESS;
}
Langage C - FSDM 171
Visibilit des variables
Variables locales
Une variable dclare lintrieur du corps dune fonction ou dun bloc
dinstruction nest visible qu lintrieur du corps du bloc.
void f( )
{
int i; // une premire variable locale i
i=4; // On la voit et on lutilise ici
}
void g( )
{
int i; // une autre, diffrente de la premire
i=3; // On la voit et on lutilise ici
}

int main( )
{
i=5; // ici, on ne voit ni lune ni lautre : erreur
f ( );
g( );
return EXIT_SUCCESS;
}
Langage C - FSDM 172
Visibilit des variables
Variables locales
Lorsquune variable locale a le mme nom quune variable globale, celle-ci est
masque lintrieur du bloc ou la variable locale est dfinie.

int i; // variable visible dans tout le fichier

void f( )
{
int i; // la variable locale masque la variable globale
i=4; // Ici, on utilise donc la variable locale
}

int main( )
{
i=3; // on la voit et on lutilise ici
f ( );
printf("%d",i); // 3 ou 4 ?
return EXIT_SUCCESS;
}

Langage C - FSDM 173


Visibilit des variables
Variables statiques
Le mot cl static, utilis pour qualifier une variable locale, tend sa porte la
dure du programme

int f ()
{
static int i = 1; /* Alloue et initialise la compilation */
return i ++; /* L'incrmentation sera conserve */
}

int main ()
{
printf ("f : %d fois\n", f ()); /* Affiche "1" */
printf ("f : %d fois\n", f ()); /* Affiche "2" */
return EXIT_SUCCESS;
}

Langage C - FSDM 174


Rcursivit
Principe
Une fonction peut s'appeler elle-mme: on dit que c'est une fonction rcursive

Toute fonction rcursive doit possder un cas limite (cas trivial) qui arrte la
rcursivit

int factoriel (int n )


{
if ( n==1 )
return 1;
else
return ( n * factoriel (n-1) );
}

Langage C - FSDM 175


Rcursivit
Exercice
Ecrivez une fonction rcursive qui calcule le terme n de la suite de
Fibonacci dfinie par : U(0)=U(1)=1
U(n)=U(n-1)+U(n-2)
int Fib (int n)
{ int Fib (int n)
int res; {
if (n==1 || n==0) int res;
res = 1; if (n==1 || n==0)
else return 1;
res = Fib(n-1)+Fib(n- else
2); return Fib(n-1)+Fib(n-2);
return res; }
}

Langage C - FSDM 176


177

Langage C - FSDM
2015/2016
Pr. Ahmed AZOUGH
Plan
Pointeurs
Occupation mmoire
Tableaux et pointeurs
Pointeurs et fonctions

Langage C - FSDM 178


Pointeurs
Variables
Les variables servent stocker les donnes manipules par le programme.
Lorsque lon dclare une variable, par exemple un entier i, lordinateur rserve
un espace mmoire pour y stocker les valeurs de i.
Lemplacement de cet espace dans la mmoire est nomm adresse

i
mmoire 1

adresse 23000 23004

Pour connatre ladresse dune variable donne, on utilise loprateur &. Ainsi,
&i vaut 23000

Langage C - FSDM 179


Pointeurs
Variable pointeur
Un pointeur est une variable dont le contenu est une adresse.
Par exemple, si on dclare une variable entire initialise 1 et que
lon dclare un pointeur p dans lequel on range ladresse de i (on
dit que p pointe sur i), on a un schma qui ressemble :

p i
mmoire 23000 1

adresse 20004 23000

Pour connatre ladresse dune variable donne, on utilise


loprateur &. Ainsi, &i vaut 23000
Langage C - FSDM 180
Pointeurs
Dclaration dun pointeur
On dclare un pointeur au moyen de lopration dindirection *
Syntaxe :
type * var ;
(type : le type du contenu point par var)
Attention :
Le contenu de var est une adresse. Le type des donnes point par
var est type .
Exemple :

int i, j; // dclaration de deux variables de type entier


int * p; // dclaration dun pointeur sur une variable entire
char * s, * t; // dclaration de deux pointeurs

Langage C - FSDM 181


Pointeurs
Accs au contenu dun pointeur
Pour accder au contenu point par un pointeur, on utilise *

int a;
int b;
int * maxptr;

a=5;
b=17;
maxptr = (a>b) ? &a : &b; // on obtient la rfrence du max
(*maxptr)++; // incrmente le max de 1

printf("Le maximum incrment est %d \n", *maxptr);

Langage C - FSDM 182


Occupation mmoire
Taille dune variable
A toute variable cre est associe une zone de la mmoire, servant
stocker le contenu de cette variable
La taille de cette zone mmoire dpend du type de la variable
considre :
char : 1 octet
int : 2, 4 ou 8 octets (selon larchitecture du systme)
float : 4 octets
double : 8 octets
etc

Langage C - FSDM 183


Occupation mmoire
Taille dune variable
Loprateur sizeof() donne la taille en octets du type ou de la
variable passe en paramtre
Ce nest pas une fonction normale
valu et remplac par la constante entire correspondante
lors de la compilation

printf("Sur mon systme un \" int \" fait %d octets \n", sizeof(int) ) ;
// taille dun type ici, int

double d;
printf("Sur mon systme un \" double \" fait %d octets \n", sizeof(d)) ;
// taille dune varaible

Langage C - FSDM 184


Pointeurs et fonctions
Transmission des paramtres
On a dit quil existe deux modes de transmission de paramtres en C :
La transmission par valeur : les valeurs des paramtres effectifs sont
affectes aux paramtres formels correspondants au moment de l'appel
de la fonction.
La transmission par adresse (ou par rfrence) : les adresses des
paramtres effectifs sont transmises la fonction appelante.

Dans tous les cas, ce sont des copies des variables qui sont transmises

Langage C - FSDM 185


Pointeurs et fonctions
Passage par valeur : type simple
int main ( )
/* Passage par valeur */ {
void echange (float x, float y ) float x, y;
{
float z;
x = 1;
z =x;
y = 2;
x = y;
y=z
echange (x, y);
}
printf(" x = %f \n", x );
printf(" y = %f \n", y );
La valeur de x est 1
La valeur de y est 2
return EXIT_SUCCESS;
La valeur de x est 1 }
La valeur de y est 2
Langage C - FSDM 186
Pointeurs et fonctions
Passage par valeur : type simple
int main ( )
/* Passage par valeur */ {
void echange (float x, float y float x, y;
)
{ x = 1;
float z; y = 2;
z =x;
x = y; echange (x, y);
y=z
} }
copies
x' 1 y' 2 x 1 y 2
236 1300 2300 2100

Les arguments qui sont passs echange() sont des copies de x et y


Langage C - FSDM 187
Pointeurs et fonctions
Passage par valeur : type simple
int main ( )
/* Passage par valeur */ {
void echange (float x, float y float x, y;
)
{ x = 1;
float z; y = 2;
z =x;
x = y; echange (x, y);
y=z
} }
copies
x' 2 y' 1 x 1 y 2
236 1300 2300 2100
echange() modifie le contenu des copies qui sont dtruites la sortie de la fonctions

Langage C - FSDM 188


Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float *z; p = &x;
z =x; q= &y ;
x = y; echange (x, y); // erreur
y=z
} echange (p, q); // ou echange(&x,&y)

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

return EXIT_SUCCESS;
}
Langage C - FSDM 189
Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float *z; p = &x;
z =x; x 1 y 2 q= &y ;
x = y; echange (p, q);
120 230
y=z
} }
copies
p' 120 q' 230 p 120 q 230
236 1300 2300 2100

Les arguments qui sont passs echange() sont des copies de p et q : p et q


Langage C - FSDM 190
Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float *z; p = &x;
z =x; x 1 y 2 q= &y ;
x = y; echange (p, q);
120 230
y=z
} }

p' 230 q' 120 p 120 q 230

echange() modifie des copies qui sont dtruites la sortie de la fonctions


236 1300 2300 2100

Langage C - FSDM 191


Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float z; p = &x;
z =*x; q= &y ;
*x = *y; echange (x, y); // erreur
*y = z
} echange (p, q); // ou echange(&x,&y)

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

return EXIT_SUCCESS;
}
Langage C - FSDM 192
Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float z; p = &x;
z =*x; x 1 y 2 q= &y ;
*x = *y; echange (p, q);
120 230
*y = z
} }

p' 120 q' 230 p 120 q 230


236 1300 2300 2100
Les arguments qui sont passs echange() sont des copies de p et q : p et q
Langage C - FSDM 193
Pointeurs et fonctions
Passage par adresse : pointeur int main ( )
{
float x, y;
/* Passage par adresse */ float *p, q;
void echange (float * x, float * y x = 1;
) y = 2;
{
float z; p = &x;
z =*x; x 2 y 1 q= &y ;
*x = *y; echange (p, q);
120 230
*y = z
} }
copies

p' 120 q' 230 p 120 q 230


236 1300 2300 2100
Les arguments qui sont passs echange() sont des copies de p et q : p et q
Langage C - FSDM 194
Pointeurs et fonctions
Passage par adresse
/* Passage par rfrence */ void affiche( int tab[], int taille )
void remplirTab1 ( int tab [ ],int {
taille) int i =0;
{ for (i =0; i < taille; i++)
int i; printf("La valeur de la case %d est %d
for (i =0; i < taille; i++) \n", i, tab[i] );
tab[i] = i; }
}
int main ( )
/* Passage par rfrence */ {
void remplirTab2 ( int tab [ ],int int tab [3];
taille) La valeur de la case 0 est 0 remplirTab1( tab, 3);
{ La valeur de la case 1 est 1 afficher(tab, 3);
int i; La valeur de la case 2 est 2
for (i =0; i < taille; i++) remplirTab2( tab, 3);
tab[i] = 0; La valeur de la case 0 est 0 afficher(tab, 3);
} La valeur de la case 1 est 0 return EXIT_SUCCESS;
La valeur de la caseC 2- FSDM
Langage est 0 } 195
Pointeurs et fonctions
Transmission des paramtres : conclusion

Types simples : int, float, char, .


Passage par valeur

Types : tableaux, pointeurs


Passage par rfrence

Langage C - FSDM 196


Rfrences

Livre
Mthodologie de la programmation en C : Bibliothque
standard API Posix. Jean-Pierre Braquelaire. 3me dition
Dunod
Le langage C. B.W. Kernighan et D.M. Ritchie. 2me dition,
MASSON.
Programmer en language C. Claude Delannoy

Cours en ligne sur internet


Le langage C. Francois Pellegrini, ENSEIRB
www.developpez.com

Langage C - FSDM 197

Vous aimerez peut-être aussi