Académique Documents
Professionnel Documents
Culture Documents
Objectif
Obj tif : écrire
é i un système
tè d’exploitation
d’ l it ti (UNIX)
Inspiré du langage B (K.Thompson)
Normalisé ANSI 1989, ISO1999 et ISO2011
Présentation du Langage C
Premier programme :
main : tête précise que ce qui suit
est « programme principal ».
main()
i ()
prog principal délimité par { }
{
" " guillemets ou double quote pour les
printf("bonjour ") ; chaines de caractères.
} ; obligatoire après chaque instruction.
1
main()
{
printf("bonjour \n") ; \n caractère fin de ligne
printf("monsieur ") ; }
3
Lire des informations de types quelconques : scanf
main()
{ int n,p ;
printf(" donnez deux nombres : ") ;
scanf("%d
( %d ",&n,&p)
, , p) ; & : opérateur
p signifie
g adresse de
printf(" leur somme est %d ",n+p) ; }
Remarque : si vous omettez & qui précède les noms de variables, le compilateur ne
détectera aucune erreur
erreur, les informations seront rangées dans des emplacements
aléatoires.
Instruction if
main()
{ int a,b,q,r ;
printf("
p ( donnez deux entiers : ")) ; donnez deux entiers : 37 8
scanf(" %d %d ",&a,&b) ; division de 37 par 8
if (b !=0) 37 = 8 * 4 + 5
{ q=a/b
q ; r=a%b ;
printf(" division de %d par %d \n ",a,b) ;
printf(" %d=%d*%d+%d ",a,b,q,r) ; }
else printf(" diviseur nul ") ; }
Types de variable :
- char Æ caractères
- int Æ entiers
- short [int] Æ entiers courts
- l
long [i t] Æ entiers
[int] ti llongs
- float Æ nombres décimaux
- double Æ nombres décimaux de précision supérieure
- long double Æ nombres décimaux encore plus précis
- unsigned int Æ entier non signé
6
Types de base en Langage C
T
Type d
description
i i taille
ill Vl
Valeurs li
limites
i
Types Entiers : long entier long 4 octets -231 ≤ n ≤ 231 -1
unsigned long entier long non signé 0 ≤ n ≤ 232
short entier court signé 2 octets -215 ≤ n ≤ 215 -1
unsigned short entier court non signé 0 ≤ n ≤ 216
char caractère signé
g 1 octet -27 ≤ n ≤ 27 -1
unsigned char caractère non signé 0 ≤ n ≤ 28
int entier signé dépend de la machine
unsigned int entier positif 2 ou 4 Octets
#include<stdio.h>
main()
{
short int n;
n =10+ 0xFF;
printf(" Première Valeur : %d \n ",n);
n =10 + 0xFFFF;
printf("
i tf(" S
Seconde
d VValeur
l : %d \n
\ ",n);
" )
}
7
Les types caractères : le type char est un cas particulier du type entier(8bits),
exemple : b → 98
main() {
char u,v;
puts( bonjour );
puts("bonjour");
u=65;v='A';
printf("premier affichage de u :%d \n ",u);
printf("deuxième
p ( affichage
g de u :%c \n ",u);
, );
printf("premier affichage de v :%d \n ",v);
printf("deuxième affichage de v :%c \n ",v);
}
8
Entrées-Sorties conversationnelles :
9
gabarit d’affichage: Les entiers sont affichés par défaut sans espaces
avant ou après.
après Les flottants avec six chiffres après le point.
point Pour agir sur
l’affichage, un nombre est placé après % et précise le nombre de caractère
minimum à utiliser.
printf("%3d" , n ); n = 20 ^20
n=3 ^^3
3
n = -5200 -5200
Les p
possibilités de la fonction scanf : Les p principaux
p codes de conversion :
– c : char
– d : int
– u : unsigned int
– hd : short int
– hu : unsigned short
– ld : long
– lu : unsigned long
– f ou e : float écrit en notation "décimale" ou "exponentielle''
– Lf ou le
l : double
d bl é écrit
it en notation
t ti "dé
"décimale"
i l " ou ‘'‘'exponentielle''
ti ll ''
– s : chaîne de caractères dont on fournit l'adresse.
10
Opérateurs & Expressions :
– classiques (arithmétique, relationnels, logiques).
– moins
i classiques(manipulation
l i ( i l ti d de bit
bits…))
priorité :
+ - : unaire ;
* / ; binaire ;
+ - : binaire ;
p
parenthèses
float double
main() main()
{ int n ; { int n ;
signed char c ; unsigned char c ;
c=’\xfe’; c=’\xfe’;
n=c+1;
n c 1; n=c+1;
n c 1;
printf ("%d", n); } printf ("%d", n); }
-128…..0…….127 0……255
-1 255
12
Opérateurs Relationnels:
+ + i ; pré incrémentation
i + + ; post incrémentation
sii i = 5
n = ++i - 5 ; i=6
n=1
n = i++ - 5 ; i 6
i=6
n=0
14
Opérateurs de manipulations de bits : (type entier)
Type
yp Opérateur
p Signification
g
binaire & Et
binaire | Ou
binaire ^ Ou exclusif
binaire << Décalage à gauche
binaire >> Décalage à droite
unaire ~ Complément à 1
i=i+k; i+=k;
a=a*b; a*=b;
n = n << 3 ; n << = 3 ;
16
Opérateur conditionnel ? :
Considérons l’expression
p :
if ( a > b ) max = a ;
else max = b ;
sera remplacé par :
max = a > b ? a : b ;
priorité
z = (x = y ) ? a : b ; z = x = y ? a : b ; va être évaluée
affecte y à x , et si cette valeur est non z = x = (y ? a : b) ; si y ≠ 0 affecter a
nulle, affecter a à z, sinon affecter à x et z, sinon affecter b à x et z.
b à z.
q=n<p; 1
q = n= =p ; 0
q = p%n + p>n ; 5=4+1
x=p/n; 1
x = (float) p / n ; 1.8
x = (p+0.5) / n ; 1.9
x = (int)(p+0.5) / n ; 1
q = n * (p > n ? n : p) 25
q = n * (p < n ? n : p) 45
18
12- Priorité des Opérateurs :
Instruction for :
f t 1
fact=1;
for(i=1;i<=n;i++)
fact=fact*i;
printf(" Factoriel %d ",fact);
" fact);
main() tour 1
{ int i ; tour 2
for(i=1;i<=4 ;i++) tour 3
{ printf("tour %d \n”,i); bonjour
if (i < 3 ) continue; tour 4
printf(" bonjour \n”); bonjour
} }
22
main() donnez un nb >0 : 2
{ int n ; son carré est : 4
do { donnez un nb > 0 : -5
printf("donnez un nb>0 : ”); svp > 0
scanf("%d",&n);
scanf( %d ,&n); donnez un nb >0 : 0
if (n < 0 ) { printf(" svp >0 : \n ”); son carré est : 0
continue; }
printf(" son carré est : %d \n ",n
printf( n*n);}
n);}
while (n) ; }
- notion de pprototype
yp : déclaration entête d’une fonction.
double som(double, double) ;
- Le type void : sert à spécifier qu’une fonction ne retourne pas de résultat, et
améliore
éli la
l lisibilité.
li ibilité
ex : void optimist () ;
void ecris(int) ;
même si elle retourne une valeur, C ne fait pas de control.
25
Arguments transmis par valeurs :
echange(int a,a int b) main()
{ int c ; { int n = 10 , p = 20 ;
printf(" début echange : %d%d \n",a,b); printf(" avant appel : %d%d \n ",n,p);
c=a; echange(n p) ;
echange(n,p)
a=b; printf(" après appel : %d%d \n ",n,p);
b=c; }
printf(" fin echange : %d%d \n ",a,b);
printf( ,a,b); avant appel : 10 20
} début echange : 10 20
fin echange : 20 10
après
p appelpp : 10 20
Dépassement d’indice :
int t [[5][3]
][ ] ; [0]
son t [0][1]
t[0][5] → t[1][2]
arrangement [2]
mémoire : [0] Initialisation de tableau :
t [1] [1]
[2] int tab[3][4]={{1,2,3,4},{5,6,7,8},
... {
{9,10,11,12}};
}}
[0]
t [4][
] [1] int tab[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;
[2]
28
Notion de pointeurs (opérateurs * et &) :
int *ad ; /* réserve comme étant pointeur
p sur un entier */
int n =20 ; n 20
n 20
ad = &n;
ad
n 30
*ad = 30 ;
add
pointeurs dans les tableaux : fonction qui calcule la somme des éléments
d’un tableau de taille quelconque
int t[10] ; int som(int t[ ], int nb) ;
alors les notations suivantes sont équivalentes : { int i, s = 0;
t ⇔ &t[0] for (i =0 ; i < nb ; i++)
t+1 ⇔ &t[1] s+=t[i];
t+i ⇔ &t[i] return s ; }
t[i] ⇔ *(t+i)
appel de cette fonction se fait :
pour int t[3][4]; int t1[30], t2[15] ;
[0] ⇔ t[0][0];
t[0] [0][0] s11 = som (t1,30)
( 1 30) ;
t[1] ⇔ t[1][0]; s2 = som (t2,15) ;
30
XI. LES CHAINES DE CARACTERES(C ne dispose de string) :
1. Constantes chaîne de caractères :
main ()
{ char *adr ;
adr
d = "bonjour"
"b j " ;
do printf ("%c ",*adr) ; Octet nul:
while (*adr++)
( adr ) ; } caractère de fin
2. Initialisation tableaux caractères :
char ch[20] ;
ch= "bonjour" ; n’est pas correct
Par contre : char ch[20] ={‘b’,’o’,’h’,’j’,’0’,’4’,’5’,’\0’}
3 Tableaux de pointeurs sur chaînes :
3.
main () { int i ;
char *jour[7]= { "lundi","mardi",…."dimanche"} ;
printf ("donnez un entier entre 1 et 7"} ;
scanf ("%d",&i) ;
printf (("le
le jour numéro %d de la semaine est %s" %s ,i,jour
i jour [i-1])
[i 1]) ; }
donnez un entier entre 1 et 7 :3
le jour numero 3 de la semaine est mercredi 31
4. Fonctions gets, puts et le code format %s :
main( ) {
char nom[20], prénom [20], ville[25] ;
printf (("quelle
quelle est votre ville : ")) ;
gets(ville) ;
printf (("donnez
donnez votre nom et prénom : ")) ;
scanf ("%s%s", nom ,prénom) ;
printf (("bonjour
bonjour cher %s%s qui habite à ", prénom,
prénom nom) ;
puts(ville) ;
}
Quelle est votre ville: paris
Donnez votre nom et prénom: dupont yves
Bonjour cher yves dupont qui habite paris
¾ Fonctions strlen(chaine) retourne la longueur(lenght) d
d’une
une
chaîne.
32
Remarques :
33
5. Fonctions de concaténation de chaînes : (prototypes dans string.h)
( , source)) : recopie
strcat(but, p la seconde à la suite de la p
première chaîne.
main( ) {
char ch1[50]= "bonjour" ;
char * ch2= "monsieur" ; avant : bonjour
après : bonjourmonsieur
printf ("avant : %s\n",ch1) ;
strcat (ch1,ch2) ;
printf ("après :%s",ch1) ; }
strncat(but,source,lgmax)
(b l ) contrôle
ôl sur nombre
b ded caractères
è quii seront
concatènés.
char ch1[50]= "bonjour"
bonjour ;
char *ch2="monsieur" ;
avant : bonjour
printf (("avant : %s\n",ch1)
p , ); après : bonjourmonsie
strncat (ch1,ch2,6) ;
printf ("après : %s",ch1) ;
34
6. Fonctions de comparaisons : (prototype dans string. h)
strcmp (chaine1
(chaine1, chaine2) :Compare chaine1 et chaine2 et retourne une
valeur entière :
¾ Positive si chaine1>chaine2
¾ Nulle si chaine1= chaine 2 ( même suite de caractères)
¾ Négative si chaine1 < chaine 2
Exemple :
strcmp ("bonjour"
( bonjour ,"monsieur")
monsieur ) negative
strcmp ("paris2", "paris10") positive
strncmp (chaine1,chaine2, lgmax) : limite la comparaison au nombre de
caractère indiqué par l’entier lgmax
Exemple
p :
strncmp("bonjour","bon",4) positive
p( j )
strncmp("bonjour","bon",2) nulle
35
7. Fonctions de copie de chaîne : (prototype dans string.h)
strcpy(destin,source)
st cpy(dest ,sou ce) : Recopieecop e sou
sourcece da
dans
s des
destin,, il es
est nécessaire
écessa e que
la taille soit suffisante pour accueillir la chaîne à recopier.
strncpy (destin, source, lgmax) : Limite la recopie au nombre de caractère
précisé :
si lg(source) < lgmax alors caractère ‘\0’ sera copié sinon le caractère ‘\0’ ne
sera pas copié.
Exemple :
main()
i () {
char ch1[20]="xxxxxxxxxxxxxxxxxxx";
char ch2[20];
printf("donnez un mot : "); donnez un mot : bon
gets(ch2); bon
strncpy(ch1,ch2,6); donnez un mot :bonjour
printf(" %s",ch1); bonjouxxxxxxxxxxxxx
}
36
8. fonction de rechercher dans une chaîne (string.h):
strchr (chaîne, caractère) : recherche la première position du caractère
dans la chaîne retourne l’adresse en cas succès ou pointeur nul sinon.
strrchr (chaîne, caractère) : même chose mais en explorant la chaîne à
partir de la fin.
p
strstr (chaîne,sous-chaine) : recherche première occurrence de sous
chaîne.
strpbrk (ch1,ch2)
(ch1 ch2) : recherche dans ch1 la première occurrence d d’un
un char
quelconque de ch2.
9. fonctions de conversion : (prototype dans stdlib.h) :
Ch î ⇒ valeur
Chaîne l numérique
éi : il existe
i t ttrois
i ffonctions
ti permettent
tt t dde convertir
ti
une chaîne en une valeur numérique (int, long,double)
atoi (chaîne): fournit résultat de type int.
atol (chaîne): fournit résultat de type long.
atof (chaîne): fournit résultat de type double.
Valeur numérique ⇒ chaîne :
itoa (entier, chaîne, base) pour entier int
ltoa (entier, chaîne, base) pour entier long
ltoa (entier, chaine,base) pour entier unsigned long
37
Exemple :
#include<stdio.h>
#include<string.h>
#define c 'e'
#define sch "re"
#define voy "aeiou"
main( ) {
char mot[40];
printf("donnez
i tf("d un mot
t : ")
");
gets(mot);
printf(" premiere occurence de %c en %s \n
printf( \n",c,strchr(mot,c));
c strchr(mot c));
printf(" derniere occurence de %c en %s \n",c,strrchr(mot,c));
printf(" premiere occurence de %s en %s
\n",sch,strstr(mot,sch));
printf(" premiere occurence de l'une des lettres %s en
% \ "
%s\n",voy,strpbrk(mot,voy));
b k( )) }
38
Exemple 1: donnez une chaine :123
#include <stdlib.h> val int 123
main() { char ch[40] ; vall ddouble
bl 11.230000e+002
230000 +002
donnez une chaine : -123.45
int n; val int -123
do { printf ("donnez une chaine: ") ; val double -1.234500e+002
d
donnez une chaine
h i : bof
b f
gets (ch); val int 0
printf ("val int : %d\n",n=atoi(ch)); val double 0.000000e+000
printf("val double :%e\n",atof(ch)); }
while (n); }
Exemple 2 :
#include <stdlib.h>
donnez un nbre et base : -123 10
main() { -123
char ch[50]; donnez un nbre et base : 200 16
C8
int nn,b;
b; donnez un nbre et base : 35 36
do { z
printf("donnez un nbre et une base: "); donnez un nbre et base : 0 0
scanf("%d%d"
scanf( %d%d ,&n,&b)
&n &b) ;
printf("%s\n" , itoa(n,ch,b)); }
while (n); }
39
XII. LES STRUCTURES :
1. structures (déclarations)
1 (dé l i ): 2. déclaration de variables :
2
struct enreg art1,art2 ;
struct enreg
ou struct enreg {
{ int numero ; i t numero ;
int
int qte ; int qte ;
float prix ; float prix ;
}; } art1,art2 ;
3. utilisation
3 tili ti d des champs
h d’
d’une structure
t t :
art1.numero=15 ;
printf (("%e"
%e ,art1.prix)
art1 prix) ;
scanf("%e,&art2.prix) ;
art1.numero++ ; /* . plus prioritaire que ++ et autre */
art1=art2 ;
struct enreg art1= { 15,285,253.75} initialisation
I iti li ti statique
Initialisation t ti sontt par déf
défautt à zéro,
é automatique
t ti ne sontt pas
initialisées donc aléatoire.
40
4. déclaration de types synonymes: typedef
Déclaration:
éc a a o typedef
ypede int eentier
e ;
int n,p ; ⇔ entier n,p;
typedef int *ptr ;
int *p1,*p2 ; ⇔ ptr p1,p2;
typedef int vecteur [3]:
int v[3] w[3]; ⇔ vecteur vv,w;
v[3],w[3]; w;
Application aux structures :
struct enregg{
int numéro ;
int qte ;
float prix ; }
typedef struct enreg s_enreg ;
s enreg art1,art2
s_enreg art1 art2 ; ou bien
typedef struct {
int numero;;
int qte ;
float prix ; } s_enreg ; s_enreg art1,art2 ; 41
5. Exemple de structures :
sstruct
uc pe
personne
so e { cchar a nom[30]
o [30] ; char
c a pprenom[20]
e o [ 0] ;
float heures[31] ; } employe ,courant ;
employe.heure[4] : 5eme élément tableau heure
employe.nom [0] : premier caractère champ nom
&courant.heure[4] : @ 5eme élément tableau heure
courant nom : @ tableau nom
courant.nom
struct point { char nom ;
int x,y
,y ; } ;
struct point coubre[50] ;
courbe[i].nom=…;
courbe[4].x=…;
struct date { int jour,mois,année ;} ;
struct personne { char nom [30] ;char prenom [20] ;
struct date. date_embauche ;
struct date. date_pposte ; } employe,courrant
p y , ;
employe.date_embauche.année=1998 ;
courant.date_embauche= employe.date_poste ; 42
6. structure transmise en argument de fonction :
43
XIII. La gestion dynamique :
Outils de base de la gestion dynamique: malloc & free (stdlib.h et alloc.h):
Exemple :
# include <stdlib.h>
…………….
char * adr;
float *pi ;
………….
pi=(float*)malloc
pi (float )malloc (size of (foat));
adr = malloc(50);
*pi= 3.14;
……………
………..
for (i=0;i<50;i++)
(i 0;i<50;i++)
free (pi);
*(adr+i) = ‘x’;
Rq: ne plus appeler pi après free
44
pointeur & tableaux : on peut créer un tableau avec malloc() :
float *t;
foat *t = (float*)malloc(10*sizeof (foat)) ;
if (t!=null) { int i; t=(float*)malloc(10*sizeof(float));
for (i=0; i<10; i++);
t[i]=I;
free(t);
………..
float * p =t;; /* p
pointeur sur élément du tableau */
int i ;
for ( i=0, i<10,i++)
{ *p=i;
p=p+1;}
free(t) ;}
………...
char *pcar.
p
pcar=(char*)malloc(10*sizeof(char));
45
tableau de structures:
typedef
ypede sstruct
uc { c char
a nom[20];
o [ 0]; char
c a prenom
p e o [20];
[ 0]; } fiche;
c e;
fiche *pf;
pf= (fiche*) malloc (15* sizeof (fiche));
printf(" nom :%s" , pf[5].nom) ;
free(pf) ;
……
struct point { int x; int y;};
struct ppoint ppi;;
p.x=3 ; p.y=4 ;
struct point *q;
q->x=3; q->y=4;
liste chainée:
Déclaration:
struct element { int num;
float x;;
float y;
struct element *suivant ; } 46
Exemple 1:
struct liste {
char chaine[16];
struct liste * p
psuivant ;};
struct liste *nouveau ;
struct liste *tete ;
tete =NULL ;
ajout d’un élément :
nouveau=(liste*)malloc( sizeof (struct liste)) ;
nouveau -> psuivant = tete ;
t t nouveau ;
tete=
Exemple 2 :
typedef struct cellule { int elt ;
struct cellule * suiv ;
} Liste ;
Liste *l=NULL ; /* initialisation liste chainée */
47
fonction inseretete : insère un nouvel élément en tête de la liste l et retourne
un pointeur sur la liste.
Liste * insereentete (int x, Liste*l)
{ Liste *c
c;
c= (liste *)malloc(sizeof(liste)) ;
if (c!
(c!= NULL) { c
c->elt=
elt x; //* assignation de x *//
c->suiv=l; /* assignation du suivant */
ll=c
c; //* chainage
chainage*//
} return(l) ;}
fonction appartient: qui renvoie 1 si la valeur x appartient à la liste, 0 sinon.
int appartient (int x, liste*l) ;
{ if (l
(l== NULL) return 0 ;
else if (l->elt==x) return 1;
else return(appartient(x,l
return(appartient(x,l->suiv));
suiv)); }
48