Académique Documents
Professionnel Documents
Culture Documents
programmation en langage C
INSTANTANE !
DUREE DE VIE ?
- Lisible
- Structur
Objectifs
Clart
Simplicit
Efficacit
Modularit
Extensibilit
4
Types de base
4 types de base, les autres types seront drivs de ceux-ci.
Type
char
Signification
Exemples de valeur
Codage en
mmoire
Peut tre
1 octet
signed,
unsigned
int
Nombre entier
0 1 -1 4589 32000
-231 231 +1
float
Nombre rel
simple
4 octets
double
Nombre rel
double prcision
8 octets
2 ou 4 octets
Short, long,
signed,
unsigned
long
5
int main(void)
{
/* corps du programme*/
begin
declaration des Cstes et Var ;
instruction1 ;
instruction2 ;
.
}
end
Directives du prprocesseur :
accs avant la compilation
Dclaration des fonctions
i=0;
fonc1(i) ;
fonc2(i) ;
}
int fonc1(int x) {
return x;
}
Programme
principal
Dfinitions des
fonctions
int fonc2(int x) {
return (x * x);
}
7
Indenter = lisibilt
#include <Lib1.h>
#include <Lib2.h>
#define X 0;
int fonc1(int x);
float fonc2(char a);
int main(void)
{ /*main*/
instruction;
instruction;
{
Fonctionnement :
-
instruction;
{
instruction;
}
}
instruction;
} /* fin main*/
Prprocesseur
Le prprocesseur effectue un prtraitement du programme source avant qu'il soit compil.
Ce prprocesseur excute des instructions particulires appeles directives.
Ces directives sont identifies par le caractre # en tte.
Inclusion de fichiers
#include <nom-de-fichier>
#include "nom-de-fichier"
La gestion des fichiers (stdio.h)
Les fonctions mathmatiques (math.h)
Taille des type entiers (limits.h)
Limites des type rels (float.h)
Traitement de chanes de caractres (string.h)
Le traitement de caractres (ctype.h)
Utilitaires gnraux (stdlib.h)
Date et heure (time.h)
/* rpertoire standard */
/* rpertoire courant */
/* Entrees-sorties standard */
1er Programme
#include <stdio.h>
#include <conio.h>
int main(void)
{
printf(" BTS GI ");
getch() ;
return 0;
BTS GI
10
La fonction printf() :
Librairie
stdio.h.
#include <stdio.h>
Syntaxe
C,
Les constantes de type caractre ont une valeur entire dans la table ASCII
char c1 = 'A',
c2 = '\x41'; /* reprsentation hexadcimale */
caractres
nom
\n
newline
LF
10
\t
tabulation
HT
\b
backspace
BS
\r
return
CR
\f
form feed
FF
12
\\
backslash
5C
92
\'
single quote
27
39
\"
double quote
22
34
dcimal
13
12
La fonction scanf() :
Librairie
stdio.h.
#include <stdio.h>
Syntaxe
13
1er Programme
#include <stdio.h>
#include <conio.h>
int main(void)
{
int age;
Variables : dclarations
Syntaxe :
Exemple:
Variables : initialisations
Les variables doivent tre dclares avant leur utilisation dans un dbut de bloc (juste aprs{),
zone des dclarations:
void main(void)
{
char c;
int i,j, k;
c = 'A';
i = 50;
j =10;
K=10;
est quivalent
void main(void)
{
char c = 'A';
int i=50,j, k;
= oprateur daffectation
j=k=10;
15
!
Exemples
char c1, c2, c3;
scanf(%c%c%c,&c1,&c2,&c3);
scanf
entres
abc
rsultats
c1=a c2=<espace> c3=b
c1=a
scanf( %c %c %c,&c1,&c2,&c3);
c2=b
c3=c
char c;
int i;
float x;
scanf(%2d %5f %c,&i,&x,&c);
12 123.567 r
i=12
x=123.5
c=6
16
Affichages et saisies
Librairie : stdio.h
Fonction
Syntaxe
Description
printf
criture formate
sortie standard
scanf
Lecture formate
entre standard
putchar
putchar(int c);
crire le caractre c
getchar
getch
puts
gets
sprintf
getchar();
getch();
sscanf
<conio.h>
*puts(char *s);
*gets(char *s);
sprintf(char *s, char *format, arg ...);
Ecriture/Lecture d'une
chane de caractres,
termine par \n
Ecrit dans la chane
d'adresse s.
Lit la chane d'adresse s.
17
Exemple:
Syntaxe :
texte(valeur)
#define PI 3.14159
void main()
{
float perimetre,rayon = 8.7;
perimetre = 2*rayon*PI;
....
}
#define identificateur
#define TAILLE
100
#define MAXI (3 * TAILLE + 5)
#define nom_macro(identif_p1 , ... ) texte
#define SOMME(X,Y) X+Y
#define MULTIP(A,B) (A)*(B)
!
Les identificateurs s'crivent
traditionnellement en
majuscules, mais ce n'est pas
une obligation.
18
Exemple:
voidmain()
{
constfloatPI=3.14159;
constintJOURS=5;
floatperimetre,rayon=8.7;
perimetre=2*rayon*PI;
....
JOURS=3;
....
}
Le compilateur rservedela
placeenmmoire(ici4octets).
19
Identificateurs
Les identificateurs nomment les objets C (fonctions, variables ... )
C'est une suite de lettres ou de chiffres.
Le premier caractre est obligatoirement une lettre.
Le caractre _ (soulign) est considr comme une lettre.
Reconnaissance suivant les 31 premiers caractres.
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
addition
soustraction
multiplication
division
modulo (reste de la division entire )
% ne peut tre utilis qu'avec des entiers
7/2
7.0/2
7/2.0
7.0/2.0
3
3.5
22
h = 5.0/4.0 = 1.25
h = 5/4 = 1.0000
void main(void)
{
int
i = 5, j = 4, k;
double f = 5.0, g = 4.0, h;
k = i / j;
h = f / g;
h = i / j;
}
23
<
plus petit
<=
>
>=
==
!=
plus grand
plus grand ou gal
gal
diffrent
et
||
ou (non exclusif)
non
Le type boolen
n'existe pas. Le
rsultat d'une
expression logique
vaut 1 si elle est
vraie et 0 sinon.
Rciproquement,
toute valeur non
!
nulle est considre
comme vraie et la
valeur nulle
comme fausse.
24
Exemple
int i;
float f;
char c;
i = 7;
f = 5.5;
c = 'w';
f>5
(i + f) <= 1
c == 'w
c != 'w'
c >= 10*(i + f)
(i >= 6) && (c == 'w')
(i >= 6) || (c == 119)
====>
====>
====>
====>
====>
====>
faux (0)
vrai (1)
faux (0)
faux (0)
vrai (1)
vrai (1)
!expr1 est vrai si expr1 est faux et faux si expr1 est vrai ;
expr1&&expr2 est vrai si les deux expressions expr1 et expr2 sont vraies
et faux sinon. L'expression expr2 n'est value que dans le cas o l'expression
expr1 est vraie ;
expr1 || expr2 = (1) si expr1=(1) ou expr2=(1) et faux sinon.
L'expression expr2 n'est value que dans le cas o l'expression expr1
est fausse.
25
Contractions d'oprateurs
aa+=
+=32;
32;
aa==aa++32;
32;
ff/=
/=9.2;
9.2;
ff==ff//9.2;
9.2;
ii*=
*=jj++5;
5;
ii==ii**(j(j++5);
5);
26
Incrment et dcrement
increment :
decrement
i++;
i++;
--j;
--j;
++i;
++i;
27
Prfixe et Postfixe
#include <stdio.h>
int main(void)
{
int
i, j = 5;
i = ++j;
printf("i=%d, j=%d\n", i, j);
j = 5;
i = j++;
printf("i=%d, j=%d\n", i, j);
return 0;
}
quivalent :
1. j++;
2. i = j;
quivalent :
1. i = j;
2. j++;
i=6,
i=6,j=6
j=6
i=5,
i=5,j=6
j=6
28
ifelse
Choix Multiple:
switchcase
Itrations:
for,while,dowhile
Rupture de Contrle:
goto
break,continue,return
30
Pas de then en C
Le bloc " else "
est optionnel.
if (a<b)
{
BLOC 1 D'INSTRUCTIONS
}
else
{
min=a;
}
else
{
BLOC 2 D'INSTRUCTIONS
min=b;
Exemples :
if (i < 10) i++;
La variable i ne sera incrmente que si elle a une valeur infrieure 10.
if (i == 10) i++;
== et pas =
La variable i ne sera incrmente que si elle est gale 10.
if (!recu) printf ("rien reu\n");
Le message "rien reu" est affich si recu vaut zro.
if ((!recu) && (i < 10)) i++;
i ne sera incrmente que si recu vaut zro et i<10.
Si plusieurs instructions, il faut les mettre entre accolades.
if ((!recu) && (i < 10) && (n!=0) ){
i++;
moy = som/n;
printf(" la valeur de i =%d et moy=%f\n", i,moy) ;
}
else {
printf ("erreur \n");
i = i +2;
// i +=2 ;
}
if(delta)
if(!delta)
if(delta!=0)
if(delta==0)
!
32
Attention!
main(void)
int
i = 0;
if(i = 0)
/* ici affectation */
printf("i = zero\n");
else
printf(Quand i != de zero\n");
return 0;
}
Quand
Quandii!=
!=de
dezero
zero
33
if embots
s)
e
l
uc
o
(B
int i,j;
i i==00
i i==11
for (i = 0; i <3; i++) {
printf ( "i = %d\n", i); i i==22
j j==55
}
j j==44
for(j = 5; j > 0; j- -)
printf("j = %d\n", j); j j==33
j j==22
j j==11
int i, j, k;
for( ; ; )
for(i = 0, j =
{
............; /* bloc d'instructions */
............;
............;
}
s)
e
l
uc
LA BOUCLE
o
B
(
Boucle pr-teste
Syntaxe en C:
Organigramme:
while (expression)
{
oui
condition
vraie
............;
............;
............;
non
/* bloc d'instructions */
}
Le test se fait d'abord, le bloc d'instructions
n'est pas forcment excut.
bloc d'
instructions
36
Exemple
itration
i=1;
while(i<5)
{
printf(Intrieur %d\n",i);
i++;
}
printf("Extrieur %d\n",i);
Intrieur
Intrieur
Intrieur
Intrieur
Intrieur
Intrieur
Intrieur
Intrieur
Extrieur
Extrieur
11
22
33
44
55
int
intj j==5;5;
i=1;
while(i<5);
{
printf(Intrieur %d\n",i);
i++;
}
start
start
printf("start\n");
end
printf("start\n");
end
while(j
==
0)
while(j == 0)
printf("j
printf("j==%d\n",
%d\n",j--);
j--);
printf("end\n");
printf("end\n");
37
es
l
c
ou
B
(
blocd'
instructions
oui
condition
vraie
non
suiteduprogramme
int
intjj==5;5;
do
do
printf("j
printf("j==%i\n",
%i\n",j--);
j--);
while(j
while(j>>0);
0);
printf("stop\n");
printf("stop\n");
jj==55
jj==44
jj==33
jj==22
jj==11
stop
stop
i=1;
do
{
printf(i=%d ",i);
i++;
}while(i<0);
printf("stop\n");
ii==11
stop
stop
38
case valeur2:........;
........;
break;
.
.
.
default: .......;
........;
/* etc ...*/
/* aucune des valeurs prcdentes: excuter ce bloc
d'instructions, pas de "break" ici.*/
}
Le bloc "default" n'est pas obligatoire. valeur1, valeur2, . doivent tre des expressions
constantes. Linstruction switch correspond une cascade dinstructions if ...else
39
int choix;
float
floatf;f;
scanf(" %d ", &choix);
switch(choix)
{
case 1:
switch(f)
switch(f){{
case
case2:2:
....
....
switch(i)
switch(i){{
case
case22**j:j:
....
....
Instructions
d'chappement
Pour rompre le droulement
squentiel d'une suite d'instructions
Break;
Continue;
int i, j=1;
char a;
for (i = -10; i <= 10; i++){
{
a=getchar();
if(a= ='x')
break;
}
}
return (expression);
permet de sortir de la fonction qui la contient
}
Si x est tape au clavier
exit (expression);
La fonction est interrompu.
expression : un entier indiquant le code de terminaison
du processus
41
goto tiquette
#include <stdio.h>
void main()
{
int i, j;
for (i=0; i < 10; i++)
for (j=0; j < 4; j++) {
if ( (i*j) == 10)
goto trouve;
printf("i*j != 10.\n");
}
trouve:
printf("i*j =%d * %d = %d== 10.\n",i,j,i*j);
}
42
Tableaux : Introduction
Dclaration de tableaux
Un tableau (array) est une collection de variables de mme type, appeles lments
On les dclare par un type, un nom et une dimension (CONSTANTE) place entre [ ]
Exemples
int tab[4]; dclare un tableau de 4 valeurs entires
#define
#define
int
int
SIZE
10
SIZE
10
a[SIZE];
a[SIZE];
/*/*aaest
estun
unvecteur
vecteurde
de10
10entiers
entiers*/*/
le compilateur rserve SIZE places en mmoire pour ranger les lments du tableau.
float
float
A[5]
A[5]
=={{10.1,
10.1,20.3,
20.3,30.5,
30.5,40.0,
40.0,50.4
50.4};};
43
void
voidmain(void)
main(void)
{{
int
a[6];
int
a[6];
int
i i==7;7;
int
a[0]
a[0]==59;
59;
a[5]
a[5]==-10;
-10;
a[i/2]
a[i/2]==2;2;
}}
a[6]
a[6]==0;
0;
a[-1]
a[-1]==5;5;
59
?
2
2
3
-10
void
void main(void)
main(void)
{{
int
inti;i;
int
intA[6]
A[6]=={{1,1,2,3,
2,3,5,5,7,7,11
11};};
for
for(i=0;i<6;i++)
(i=0;i<6;i++)
printf("%d
printf("%d",",A[i]);
A[i]);
}}
void main()
{
const int N=10;
int t[N],i;
for (i=0;i<N;i++){
printf("Entrez t[%d]=",i);
scanf("%d",&t[i]);
}
}
45
Fonctions en C
Encapsule un traitement particulier formant un tout
Notion de librairie
Dfinition de la fonction
Dclaration de la fonction
Appel de la fonction
Dclarer une fonction
Appeler une fonction
Rgles de visibilit des variables
Passage des paramtres par valeur
Fonction renvoyant une valeur au programme
Passage des paramtres par valeur et par adresse
Passage des tableaux aux fonctions
46
Fonctions en C
Les principes
unefonctionnepeutpastredclarel'intrieurd'uneautrefonction.Parcontre,unefonction
peutappeleruneautrefonction.Cettederniredoittredclareavantcellequil'appelle.
47
int
{
d;
lines = 1;
Nom de la fonction
printf("Celsius\tFarenheit\n");
for(d = start; d <= end; d += step, lines++)
printf("%.1lf\t%.1lf\n", d, d * 1.8 + 32);
return lines;
}
Valeur renvoye
48
#include <stdio.h>
int
void main(void)
{
int
combien;
double end = 100.0;
combien = print_table(1.0,end,3);
print_table(end, 200, 15);
}
Ici, on ne tient pas compte de la valeur de retour
49
Le compilateur ne
connat pas d
d = 3.7;
func (i);
}
void func(int v)
{
double d, e = 0.0, f =v; //lacales func
i++; g--;glo++;
f = 0.0;
}
Le compilateur ne
connat pas i et g
Cest le f local qui est
utilis
51
52
change:
change:vv==500
500
main:
main:var
var==55
}
void change(int v)
{
v *= 100;
printf("change: v = %d\n", v);
}
53
change(int v);
void main(void){
int var = 5;
int valeur;
valeur = change(var);
printf("main: var = %d\n", var);
printf("main: valeur = %d\n", valeur);
}
change:
change:vv==
main:
main:var
var==
main:
main:valeur
valeur==
int change(int v)
{
v *= 100;
printf("change: v = %d\n", v);
return (v+1);
}
54
return_Val
return_Val::rien
rien
main:
main:var
var==
main:
main:valeur
valeur==
int return_Val(int v)
{
if (v == 10)
return (2*v);
else
return (3*v);
}
55
return a ;
else return b ;
}
int min (int a, int b) {
if (a < b)
return a ;
else return b ;
}
int difference (int a, int b, int c) {
return (max (a, max(b,c)) - min (a, min (b, c))) ;
}
void main ()
{
printf ("%d", difference (10, 4, 7)) ;
}
56
Une fonction est dite rcursive, ds lors ou elle se fait appel pour
calculer une sous partie de la valeur finale qu'elle retournera.
#include <stdio.h>
int fact(int n);
int return_Val(int v);
void main(void){
int var = 5, int valeur;
valeur = return_Val(var);
printf("main: var = %d\n", var);
printf("main: valeur = %d\n", valeur);
}
int fact(int n) {
return (n<2?1:((int)n*fact(n-1));
}
int return_Val(int v)
{
if (v == 10)
return (2*v);
else
return fact(v);
}
return_Val
return_Val::rien
rien
main:
main:var
var==
main:
main:valeur
valeur==
(0)=0*fact(-1)
int temp=1;
while(n>1) temp*=n--;
57
Loprateur ternaire ?:
return(n<2?1:((int)n*fact(n-1));
Cet oprateur scrit: (condition) ? (instruction_1) : (instruction_2)
si la condition est vrifie le bloc instruction_1 est excut, sinon cest le
bloc instruction_2 qui lest.
if (n<2 ) {
return 1;
}
else {
return ((int)n*fact(n-1));
}
return(n<2?1:((int)n*fact(n-1));
58
ti
v
i
s
r
u
voidhanoi(intn,inta,
intb){
R
a
L
intc;
if(n==1)move(a,b);
else{
hanoi(n1,a,c);
move(a,b);
hanoi(n1,c,b);
}
}
59
p avant somme
p aprs somme
12
11
18
60
TP1
crire un programme en C qui range au maximum (taille
Nmax ) 20 nombres entiers saisis au clavier dans un
tableau. Il doit grer en boucle le menu de choix suivant :
ABCDEQ-
Saisie et affichage
Moyenne
Suppression du Max et affichage
Suppression du Min et affichage
Ajout dun entier une position donne
Quitter
62
Strings
char
char
first_name[5]
first_name[5]={
={'J','o','h','n','\0'};
'J','o','h','n','\0'};
'J'
'o'
'h'
'n'
char
char
last_name[6]
last_name[6] ="Minor";
="Minor";
'M' 'i'
'n'
'o'
'r'
char
char
other[]
other[]
'o' 'n'
'y'
32
'B'
'l'
o'
char
char
characters[7]
characters[7]=="No
"Nonull";
null";
'u'
'l'
'l'
=="Tony
"TonyBloot";
Bloot";
'T'
'N'
'o' 32
'n'
o'
't'
Pas de \0
64
Entres/Sorties Standards
main(){
char c;
while ( (c=getchar())!= EOF)
putchar(c);
}
Fichiers stdin et stdout: Tout programme lit ou crit sur ces fichiers (dfaut clavier et cran).
65
Minor
int i = 0;
last_name[3] = \0;
while(last_name[i] != '\0')
printf("%c", last_name[i++]);
printf("\n");
Min
printf("%s\n", last_name);
puts(last_name);
66
Unechane:pasdesymbole&.Onutiliserade
prfrencelafonctiongetsnonformate.
67
RQ:
scanfnepermetpaslasaisied'unechanecomportantdesespaces:
lescaractressaisispartirdel'espacenesontpasprisencompte.
Poursaisirunechanedetype"ilfaitbeau",ilfaututilisergets.
#include <stdio.h>
Affectation de strings :
Les strings peuvent tre
initialiss avec =,
mais pas affects avec =
(ce sont des tableaux!)
#include <string.h>
void main(void) {
char who[] = "Tony Bloot";
who = "John Minor";
strcpy(who, "John Minor");
}
68
void*strcat(char*chaine1,char*chaine2)
//Concatneles2chanes,rsultatdanschaine1.
void*strcpy(char*chaine1,char*chaine2)
//Copielachaine2danschaine1.+'\0
void *strncpy(char*chaine1,char*chaine2, NCmax)
// idem strcpy mais limite la copie au nombre de caractres NCmax.
intstrcmp(char*chaine1,char*chaine2)
//Compareleschanesdecaractreschaine1etchaine2,
renvoieunnombre:
positifsilachane1estsuprieurelachaine2(ausensdel'ordrealphabtique)
ngatifsilachane1estinfrieurelachane2
nulsileschanessontidentiques.
intstrlen(char*chaine)
//renvoielalongueurdelachaine('\0'noncomptabilis).
Exemple:
#include <string.h>
#include <ctype.h>
#define EOL \n
// toupper
void main(void)
{
int L,i=0;
char s[9] = "midi", u[11] = "avant", v[10] = "soir";
char text[80];
While ( (text[i] = getchar() ) != EOL ) i++;
puts(text);
L = strlen(s);
text[i] = getchar();
while ( text[i] != EOL ) {
i++;
text[i] = getchar();
}
/* L = 4 */
for (i=0;i<L;i++) {
putchar(toupper(s[i]));
/* M, I, D,I */
}
strcat(u,"-");
/* u devient "avant-" */
strcat(u , s);
/* u devient
"avant-midi" */
if (strcmp (u, s) >=0 )
/* "avant-midi" < "midi" */
printf ("il y a une erreur\n");
else {
printf("%s\n", u);
/* avant-midi */
strcpy (u, v);
printf("%s\n", u);
/* soir */
}
}
70
PASSAGEDESPARAMETRES
PARVALEUR
aetb:variableslocalesmain().La
fonctionechnepeutdoncpasmodifier
leurvaleur.Onlefaitdoncenpassantpar
l'adressedecesvariables.
a=5
b=8
Syntaxequiconduituneerreur
71
Les Pointeurs en C
La dclaration de pointeurs
Valeurs pointes et adresses
Passage de paramtres de fonction par rfrence
Pointeurs et tableaux
72
i=17
p=5A0F3
5A0F3
17
74
Dclaration de Pointeurs
Le symbole * est utilis entre le type et le nom du pointeur
Dclaration dun entier:
int
i;i;
int
Dclaration dun pointeur vers un entier:
int
int
*p;
*p;
/*/* pipiest
estun
unpointeur
pointeurvers
versun
unint
int
*pi
*pidsignelecontenudel'adresse
dsignelecontenudel'adresse*/*/
/*/*pfpfest
estun
unpointeur
pointeurvers
versun
unfloat
float*/*/
char
charc,c,d,d,*pc;
*pc;
/*/*ccetetddsont
sontdes
deschar*/
char*/
/*/*pc
pcest
estun
unpointeur
pointeurvers
versun
unchar
char*/*/
double
double*pd,
*pd,e,e,f;f; /*/*pd
pdest
estun
unpointeur
pointeurvers
versun
undouble*/
double*/
/*/*eeetetffsont
sontdes
desdoubles
doubles*/*/
double
double**tab;
**tab; /*/*tab
tabest
estun
unpointeur
pointeurpointant
pointantsur
surun
unpointeur
pointeurqui
qui
pointe
pointesur
surun
unflottant
flottantdouble
double*/*/
75
void
{
nom_de_Pointeur = &nom_de_variable
cp.
c
r
u
s
e
i nt
o
'a'
0x1132
p
c
main(void)
char
char
c = 'a', d = 'z';
on
d
;
c
e
*p;
d
se
s
e
r
l'ad
t
i
reo
*p = c;
p = &c;
printf("%c\n", *p);
p = &d;
}
printf("%c\n", *p);
0x1132
p
0x91A2
d
'z'
0x91A2
#include <stdio.h>
void main() {
int *p, x, y;
p = &x;
/* p pointe sur x */
x = 10;
/* x vaut 10 */
y = *p - 1;
y vaut ?
*p += 1;
x vaut ?
(*p)++;
y);
*p=0;
77
long
long
p = v;
printf("%ld\n", *p);
p++;
printf("%ld\n", *p);
p += 4;
printf("%ld\n", *p);
p += 4
p++
11
22
66
p
1000
1016
1000
1008
1012
1020
1004
78
* et ++
*p++ signifie:
*p++ trouver la valeur pointe
*p++ passer ladresse suivante
(*p)++ signifie:
(*p)++ trouver la valeur pointe
(*p)++ incrmenter cette valeur (sans
changer le pointeur)
*++p signifie:
*++p incrmenter dabord le pointeur
*++p trouver la valeur pointe
79
voidmain()
{
inta=5,b=8;
ech(a,b);
printf(a=%d\n,a); a=?
printf(b=%d\n,b);
b=?
}
PASSAGEDESPARAMETRES
PARVALEUR
Syntaxecorrecte:
aetb:
variables
locales
main().La
fonctionech
nepeutdonc
pasmodifier
leurvaleur.
Onlefait
doncen
passantpar
l'adressede
cesvariables.
#include<stdio.h>
voidech(int*x,int*y)
{
inttampon;
tampon=*x;
*x=*y;
*y=tampon;
}
voidmain()
{
inta=5,b=8;
ech(&a,&b);
printf(a=%d\n,a);
printf(b=%d\n,b);
}
PASSAGEDESPARAMETRES
a=?
b=?
PARADRESSE
80
change:
change:*p
*p==500
500
main:
main:var
var==500
500
82
#include <stdio.h>
void somme(int , int , int *);
int modif(int , int *, int *);
void main(){
int a, b, c;
a = 2; b = 8;
somme(a, b, &c);
*z = x + y;
}
int modif(int x, int *y, int *z){
x *= 2;
return x;
}
83
Exemple
#include <stdio.h>
void sum(long [], int);
int
main(void)
{
long Tab[6] = { 1, 2,
3, 5, 7, 11 };
sum(Tab, 6);
printf("%ld\n", Tab[0]);
return 0;
}
Tab
Tab
1
29
11
11
void
{
sz
}
85
sum(long*, int);
int
{
main(void)
long
Tab[6] = { 1, 2,
3, 5, 7, 11 };
*end = p + sz;
total = 0;
Tab
Tab
1
1000
1004
1008
1012
1016
11
1020
11
1024
p
1000
end
1024
return total;
}
86
Quelle notation?
short
short a[8]
a[8]=={{10,
10,20,
20,30,
30,40,
40,50,
50,60,
60,70,
70,80
80};};
short
short *p
*p==a;
a;
printf("%d\n",
printf("%d\n",a[3]);
a[3]);
printf("%d\n",
printf("%d\n",*(a
*(a++3));
3));
printf("%d\n",
printf("%d\n",*(p
*(p++3));
3));
printf("%d\n",
printf("%d\n",p[3]);
p[3]);
p
40
40
40
40
40
40
40
40
1000
10
1000
20 30 40 50 60 70 80
1002
1004
1008
1012
1006
1010
1014
87
SCANF
Pour saisir un caractre ou un nombre
char c;
float Tab[10], X[5][7]; // *Tab,(*X)[7]
printf("TAPER UNE LETTRE: ");
scanf("%c",&c);
scanf("%f",&Tab[5]);
On saisit ici le contenu de l'adresse &c c'est--dire le caractre
c lui-mme.
pointeur
char *adr;
printf("TAPER UNE LETTRE: ");
scanf("%c",adr);
On saisit ici le contenu de l'adresse adr.
88
void main()
{
char*texte;
float *adr1,*adr2;
adr1 = (float*)malloc(4*sizeof(float));
La rservation d'espace est la
charge du programmeur qui doit
le faire de faon explicite, en
utilisant les fonctions standard
malloc(), qui sont
prototypes dans <stdlib.h> et
<alloc.h>
adr2 = (float*)malloc(10*sizeof(float));
texte=(char*)malloc(10);
*adr1 = -37.28;
*adr2 = 123.67;
printf("adr1 = %p adr2 = %p r1 = %f
r2 = %f\n",adr1,adr2,*adr1,*adr2);
free(adr1); // Libration de la mmoire
free(adr2);
free(texte);
}
89
sizeof
void main()
{
int i;
char c;
float f;
double d;
printf (caractre : %d \n , sizeof c);
printf (entier : %d \n , sizeof i);
caractre : 1
entier : 2 ou 4
rel : 4
double : 8
90
void main(){
int i , dim;
long* tableau;
free(tableau);
}
91
Structures en C
Concepts
Crer un type de structure
Crer une instance de structure
Initialiser une instance
Accder aux membres dune instance
Passer les structures comme paramtres
Listes chanes
94
Concepts
struct
structMembre
Membre
{{
char
char nom[80];
nom[80];
char
char adresse[200];
adresse[200];
int
*numero;
int
*numero;
float
float amende[10];
amende[10];
};};
le type de la structure
utiliser ce type pour crer autant dinstances que
dsires
Accder les membres des instances
95
struct
structDate
Date
{{
int
int jour;
jour;
int
int mois;
mois;
int
int an;
an;
};};
struct
structLivre
Livre
{{
char
char titre[80];
titre[80];
char
char auteur[80];
auteur[80];
float
float prix;
prix;
};};
{{
};};
char
nom[80];
char
nom[80];
char
adresse[200];
char
adresse[200];
int
numero;
int
numero;
float
amende[10];
float
amende[10];
struct
struct Date
Date emprunt;
emprunt;
struct
struct Date
Date creation;
creation;
struct
structPret
Pret
{{
struct
struct
struct
struct
struct
struct
};};
Livre
Livre b;b;
Date
Date due;
due;
Membre
Membre *who;
*who;
96
Dclaration
avant ; .
struct
structDate
Datepaques;
paques;
struct
structDate
Datesemaine
semaine[7]
[7];;
struct
structDate
Datenouvel_an
nouvel_an=={{1,1,1,1,2001
2001};};
Initialisation .
97
struct
structMembre
Membre
{{
char
char
char
char
int
int
float
float
struct
struct Date
Date
struct
Date
struct
Date
};};
nom[80];
nom[80];
adresse[200];
adresse[200];
numero;
numero;
amende[10];
amende[10];
emprunt;
emprunt;
creation;
creation;
struct
mm=={{
structMembre
Membre
"Arthur
"ArthurDupont",
Dupont",
rue
de
Houdain,
rue de Houdain,9,9,7000
7000Mons",
Mons",
42,
42,
{{0.0
0.0},},
{{0,0,0,0,00},},
{{5,5, 2,2,2001
2001}}
};};
98
Structures
Nom
lment 0
pointeur
La structure
pointeur
valeur /pointeur
retour de fonctions
interdit
valeur /pointeur
assignation
interdit
possible
100
temp
temp==m;
m;
101
Par_valeur(struct
Par_valeur(struct Membre
Membrem);
m);
Par_reference(struct
Par_reference(struct Membre
Membre*m);
*m);
Par_valeur(m);
Par_valeur(m);
Par_reference(&m);
Par_reference(&m);
102
}}
printf("\nDate
printf("\nDatedaffiliation
daffiliation%d/%d/%d\n",
%d/%d/%d\n",
p->creation.jour,
p->creation.jour,p->creation.mois,
p->creation.mois,p->creation.an);
p->creation.an);
103
struct
structComplex
Complex add(struct
add(structComplex
Complexa,a,struct
structComplex
Complexb)
b)
{{
}}
struct
structComplex
Complex result
result==a;a;
result.real_part
result.real_part +=
+=b.real_part;
b.real_part;
result.imag_part
+=
b.imag_part;
result.imag_part += b.imag_part;
return
returnresult;
result;
struct
structComplex
Complex
struct
structComplex
Complex
struct
structComplex
Complex
c1
c1=={{1.0,
1.0,1.1
1.1};};
c2
c2=={{2.0,
2.0,2.1
2.1};};
c3;
c3;
c3
c3==add(c1,
add(c1,c2);
c2); /*/*c3
c3==c1
c1++c2
c2*/*/
104
TP
Enonc
Ecrire un programme permettant de :
Constituer un tableau de 20 Enseignants max(NE_max). La structure est la suivante :
struct {
char nom_pren[40];
// nom+pren
char nom[20];
char pren[20];
int NH[NM_max] ;
// NM_max=3 : nbre dheures pr NM_max matires
}
Le programme doit grer en boucle le menu de choix suivant:
12345-
Saisie et affichage
Construction et affichage
Modifier et affichage
Tri et affichage
Quitter
105
Tri bulles
while(???){
for j = 0 to . {
if tab[j] > tab[j+1] {
<on change tab[j] et tab[j+1]>
}
}
}
1
3
1
2
6
6
6
6
2
4
4
4
2
8
8
12 13
6
0
j
tab[j]
13
0
106
FILE *f;
/*dclare un descripteur f de fichier*/
107
FILE*
FILE*
FILE*
FILE*
FILE*
FILE*
in;
in;
out;
out;
append;
append;
in
in==fopen("autoexec.bat",
fopen("autoexec.bat","r");
"r");
out
out==fopen("autoexec.bak",
fopen("autoexec.bak","w");
"w");
append
=
fopen("config.sys",
append = fopen("config.sys","a");
"a");
/*/*
*/
*/
fclose(in);
fclose(in);
}}
fclose(out);
fclose(out);
fclose(append);
fclose(append);
108
fscanf(FILE*
fscanf(FILE*stream,
stream,const
constchar*
char*format,
format,...);
...);
fgetc(FILE*
fgetc(FILE*stream);
stream);
fgets(char*
fgets(char*buffer,
buffer,int
intsize,
size,FILE*
FILE*stream);
stream);
Fonctions dcriture
int
int
int
int
int
int
fprintf(FILE*
fprintf(FILE*stream,
stream,const
constchar*
char*format,
format,...);
...);
fputc(int
fputc(intch,
ch,FILE*
FILE*stream);
stream);
fputs(const
fputs(constchar*
char*buffer,
buffer,FILE*
FILE*stream);
stream);
int feof(FILE *f); /*renvoie une valeur non nulle si fin de fichier*/
109
f = fopen(monfichier.dat,w);
if (f !=NULL){
FILE *f;
f = fopen(monfichier.dat,r);
if (f!= NULL) {
fgets(titre,80,f);
while(!feof(f)) {
fscanf(f,%f %d,&x[i],&ind[i]);
i++;
}
}
fprintf(f,%s\n,titre);
for (i=0; i < n; i++ ) {
fprintf(f,%f %d\n, x[i],ind[i]);
}
Mon titre
fclose(f);
}
#include <stdio.h>
void main(void)
{
char titre[81];
float x[10];
int ind[10], i=0;
3.0 1
4.5 2
fclose(f);
}
7.3 3
La constante NULL (dfinie comme 0 dans stdio.h) rfre une adresse non dfinie
110
appelle f()
}
f(){
appelle g()
}
g(){
}
Cas I
Fichier PP.c
Fichier SP.c
main(){
appelle f()
}
f(){
appelle g()
}
g(){
Cas II
111
Directives du prprocesseur :
accs avant la compilation
Dclaration des fonctions
i=0;
fonc1(i) ;
fonc2(i) ;
}
int fonc1(int x) {
return x;
}
Programme
principal
Dfinitions des
fonctions
int fonc2(int x) {
return (x * x);
}
112
Fichier.h
#include Fichier.h
void main()
{
int i;
i=0;
fonc1(i) ;
fonc2(i) ;
}
int fonc1(int x) {
return x;
}
int fonc2(int x) {
return (x * x);
}
Programme
principal
Dfinitions des
fonctions
113
MANIPULATIONDESFICHIERS
// variableglobale
void main(void)
{
int
i = 5, j, k = 2; //lacales main
glob++;
func (i);
func (k);
}
double func(int v)
{
double d, f =v;
glob++;
f += glob;
return f;
}
//lacales func
#include <stdio.h>
int next(){
static value = 0;
return value++;
}
void main(void) {
printf("Appel 1 :
%d\n",next());
printf("Appel 2 :
%d\n",next());
}
Appel 1 :
0
114
Fichier "Module.h"
Fichier "Module.c"
extern int a;
#include "module.h"
void fct();
int a = 0;
void fct() { a++; }
Fichier "main.c"
#include <stdio.h>
#include "module.h"
void main(void) {
fct();
a++;
printf("%d\n",a);
}
// Rsultat affich : 2
115
Directives de compilation
Les directives de compilation permettent d'inclure ou d'exclure du programme des
portions de texte selon l'valuation de la condition de compilation.
116
Exemple :
#ifndef (BOOL)
#define BOOL char
#endif
#ifdef (BOOL)
BOOL FALSE = 0;
BOOL TRUE = 1;
#else
#define FALSE 0
#define TRUE 1
#endif
/* type boolean */
/* type boolean */
/* dfinis comme des variables */
/* dfinis comme des macros */
Utile pour les fichiers include.
#ifndef _STDIO_H_
#define _STDIO_H_
texte a compiler une fois
#endif
117
Listes chanes
Une liste est une structure de donnes constitue de cellules
chanes les unes aux autres par pointeurs.
Une liste simplement chane : une cellule est un
enregistrement qui peut tre dclare comme suit:
struct
structNode
Node{{
int
int
struct
structNode
Node
};};
data;
data;
*next;
*next;
/*/*les
lesinformations
informations*/*/
/*/*lelelien
lien*/*/
data;
data;
*next;
*next;
*prev;
*prev;
/*/*les
lesinformations
informations*/*/
/*/*lien
lienvers
verslelesuivant
suivant*/*/
/*/*lien
lienvers
versleleprcdent
prcdent*/*/
118
typedefstruct
typedefstructNode
Node{{
int
data;
int
data;
struct
structNode
Node *next;
*next;
}cellule;
}cellule;
cellule
cellule**new_node(int
new_node(intvalue)
value)
{{
cellule
cellule**p;
p;
pp==(cellule
(cellule*)malloc(sizeof(cellule));
*)malloc(sizeof(cellule));
p->data
p->data==value;
value;
p->next
p->next==NULL;
NULL;
}}
return
returnp;
p;
119
Denis\0
NULL
debut
Le dbut de la liste est indiqu par un pointeur indpendant (debut) et la fin par NULL
prec
Denis
NULL
120
Claire
Claire
Denis
Denis
NULL
NULL
debut
debut
OK?
prec
121
Alfred
Denis
NULL
debut
122
123
Exemple
LIFO
Last-In-First-Out
Le dernier lment ajout dans la
liste, est le premier en sortir.
Oprations:
Crer la pile,
Ajouter un lment (Push),
Effacer un lment (Pop),
Eliminer la pile .
124
PUSH procdure
Push(5)
Push(9)
NULL
Push(3)
Push(7)
Top
Top
Top
Top
POP procdure
Pop(7)
Pop(3)
Pop(9)
Pop(5)
NULL
Underflow risk
si
la
pile
est
vide
!!!
Top
Top
Top
Top
Top
Top
Top
126
Simulation de la factorielle
5! = ??
5! = 5*4!
4! = 4*3!
3! = 3*2!
2! = 2*1!
1! = 1*0!
0! = 1
0
1
2
3
4
5
127
Simulation de la factorielle
5! = ??
5! = 5*4!
0! = 1
4! = 4*3!
1! =
*1 = 1
3! = 3*2!
2! =
*1 = 2
2! = 2*1!
3! =
*2 = 6
1! = 1*0!
4! =
*6 = 24
0! = 1
5! =
*24 = 120
0
1
2
3
4
5
128
TP3
Crer une liste simplement chane dont chaque cellule contient les champs
suivants :
{
int
struct Node
data;
*next;
/* les informations */
/* le lien : pointeur sur la cellule suivante */
}
Le programme doit grer en boucle le menu de choix suivant :
1- Crer une liste avec insertion en tte de liste (avec affichage)
2- Sauver la liste
3- Insrer dans la liste (avec affichage)
4- Nettoyer la mmoire et sortir
129
1 : Cre une liste en insrant 2n, puis 2n-2, puis 2n-4, et enfin 0 qui sera
en tte de la liste. (Liste : 0,2,4,6,8,10, 2n.)
Push(6)
Push(4)
NULL
Push(2)
Push(0)
debut
Top
Top
Top
data;
data;
*prev;
*prev;
*next;
*next;
/*/*les
lesinformations
informations*/*/
/*/*lien
lienvers
versleleprcdent
prcdent*/*/
/*/*lien
lienvers
verslelesuivant
suivant*/*/
data
prev next
debut
fin
131
debut->prev = NULL;
data
prev next
debut->next = fin;
fin->prev = debut;
fin->next = NULL;
NULL
debut
NULL
fin
132
data
act->prev = fin;
prev next
act->next = NULL;
fin = act;
NULL
NULL
fin
debut
NULL
NULL
act
fin
debut
133
data
prev next
tmp->prev = act->prev ;
act->prev->next = tmp;
tmp->next = act;
act->prev = tmp;
tmp
NULL
NULL
act
debut
fin
134
tmp
NULL
NULL
fin
debut
NULL
NULL
fin
debut
135
Arbre binaire
136