Cours C
Cours C
INTRODUCTION AU C ET
MÉTHODES NUMÉRIQUES
Chaker LARABI
[email protected]
PLAN DU COURS
1
02/02/2023
INTRODUCTION
POURQUOI LE LANGAGE C ?
2
02/02/2023
Source : www.tiobe.com
5
HISTOIRE DU C
3
02/02/2023
►En C il faut obligatoirement déclarer explicitement toutes les variables qu'on utilise.
►La déclaration d'une variable réserve une petite boîte dans la mémoire de la bonne
taille pour mettre une valeur de ce type, mais n'y met aucune valeur d'initialisation !
◆ Après int i; la valeur de i est aléatoire.
4
02/02/2023
Principe
► Les nombres sont représentés en mémoire sur des bits.
► Le nombre de bits dédiés à chaque nombre définit ses limites.
► Les limites sont de natures différentes selon que l’on encode des nombres entiers ou réels.
Architectures
4 bits Intel 4004 (1971)
8 bits MOS Technology 6502 (NES 1985), Sharp x80 (GameBoy 1989)
16 bits Intel 8086 (1978), 65C816 (Super Nintendo 1990)
32 bits Intel x86 (1985), AMD Athlon K5 (1995), R3000A (Playstation 1994)
64 bits Athlon 6 (2003), Pentium 4 (2004), ARMv8-A (2011)
10
5
02/02/2023
► Donner la représentation
Exercicebinairesdes dnombres
14 d13 suivants
d12 d11: d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 I Ces
Exercice
Donner la représentation binaire des nombres suivants : Entie
Exercice
Donner la représentation binaire des nombres suivants : Entier
x signe 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 I n
Entiers M
Donner la représentation 14 binaire
13 des2nombres
212 11
210 2suivants
9
28 27: 26 25 24 23 22 21 20
x signe 2
5 2 I M c
14
x 5signe 2 2 2 2 2 2 2 27 26 25 24 23 22 21 20
13 12 11 10 9 8
I Mêm c
-10 I D
5 -10 Icom
37 Dd
-10 37 I Déc d
37 de u
11 5 / 44
5 / 44
5 / 44
Limitation des entiers en C
Limitation des entiers en C
Limitation des entiers en C
Taille et intervalle
ensurNOMBRES ENTIERS EN C
Taille et intervalle
Nombres entiers I Entier
TailleIetEntier
Cp bits
intervalle
sur p bits
I Signé entre 2p 1 et 2p 1 1
Entiers
Entiers signés
signés I I Entier surentre
Signé p bits 2p 1 et 2p 1 1
I Non signé entre 0 et 2p 1
Bits Usage I I Signé
Nonentre 2p 1 0etet2p2p1 11 Intervalle
signé entre Déc.
8 char⇤ , int8It Représentation exacte et règles
-128 arithmétiques
à 127 respectées dans 3l’intervalle.
16
I I
int⇤ (min), int16Non et 2p et1-32
t signé entre 0 exacte
Représentation règles
768arithmétiques
à 32 767 respectées dans 5l’intervalle.
32 int⇤ , long⇤ (min)I Représentation
, int32 t exacte-2et
147 483 648
règles à 2 147 483respectées
arithmétiques 647 10
dans l’intervalle.
64 long⇤ , long long, Codeint64 t -9 223 372 036 854 775 808 à 9 223 372Sortie
source 036 854 775 807 19
Code sourcei=127;
int8_t Sortie
./ex_int
►∗ Le nombre de bits12 pour
1 1
char, short,
int8_t
int32_t i=127; int, long dépend du compilateur C 12et i=127
j=127; du système.
./ex_int
I ⇤ Code
Le nombre source
de bit Sortie
pour char, short, int, long dépend du compilateur C et du
23 int32_t
► Les types int*_t1 indépendant j=127;ont été définis dans le standard C99.
du système
printf("i=%d\n",i); 23 i=127
i+1=-128
int8_t i=127; 1 ./ex_int
système. 34 printf("i=%d\n",i);
i=i+1; 34 i+1=-128
j=127
► Ces types nécessitentint32_t j=127; i=127
45 la i=i+1;
déclaration du header <stdint.h>
2 2
4 j=127
20 I Les types int*
3
printf("i+1=%d\n",i);
tprintf("i=%d\n",i);
indépendant du système ont été définis dans j+1=128 C99.
le55 standard
3 i+1=-128
5 6 printf("i+1=%d\n",i);
printf("j=%d\n",j); j+1=128
6 j+3000000001=-1294967168
i=i+1;
I Ces types nécessite
4 4 j=127
d0 67 printf("j=%d\n",j);
la déclaration du header <stdint.h>
j=j+1; 6 j+3000000001=-1294967168
Entiers non signés
5 printf("i+1=%d\n",i); 5 j+1=128
78 j=j+1;
printf("j+1=%d\n",j); Exemple de déclaration
6
89
printf("j=%d\n",j);
printf("j+1=%d\n",j); 6 j+3000000001=-1294967168
► Même intervalle7mais commençant
j=j+1; à 0.
j=j+3000000000 ;
1 #include <stdint.h>
Entiers non signés 9
10 j=j+3000000000 ; Exemple de déclaration
printf("j+3000000001=%d\n",j);
► Déclarés en précédant
8 l’identifieur de unsigned ou comme uint*_t.
printf("j+1=%d\n",j); 2 int i;
10 printf("j+3000000001=%d\n",j); 3 int64_t j=2014;
20 j=j+3000000000 ;
I Même intervalle
9
mais 1 #include <stdint.h> 4 unsigned long k;
10 printf("j+3000000001=%d\n",j);int i;
commençant à 0. 2
7 / 44
3 int64_t j=2014;
I Déclarés en précédant l’identifieur 4 unsigned long k;
7 / 44
5 / 44 6 / 44
6
02/02/2023
Nombres entiers en C
Entiers signés
Bits Usage LIMITATION DES ENTIERS EN C
Intervalle Déc.
8 ⇤
char , int8 t -128 à 127 3
16 int⇤Taille
(min),et intervalle
int16 t -32 768 à 32 767 5
32 int⇤ , long ⇤ (min)
► Entier sur 𝑝, bits
int32 t -2 147 483 648 à 2 147 483 647 10
64 long⇤ , ► long
Signélong, int64
entre −2 t 2-9
"#$ et "#$223
− 1 372 036 854 775 808 à 9 223 372 036 854 775 807 19
► Non signé entre 0 et 2" − 1
I ⇤
Le nombre de bit exacte
► Représentation char,
pour et règlesshort, int, respectées
arithmétiques long dépend du compilateur C et du
dans l’intervalle.
système.
Source Sortie
I Les types int* t indépendant du système ont été définis dans le standard C99.
I Ces types nécessite la déclaration du header <stdint.h>
i=127
i+1=-128
j=127
Entiers non signés Exemple de déclaration
j+1=128
j+3000000001=-1294967168
I Même intervalle mais 1 #include <stdint.h>
commençant à 0. 2 int i;
3 int64_t j=2014;
I Déclarés en précédant l’identifieur 4 unsigned long k;
13 unsigned ou comme uint* t.
de
6 / 44
I Flottant◆32
Chiffres significatifs : 2 ≈ 2.2.10 → 15 chiffres
−52 −16
bits (s : 1 bits, m : 23 bits, e : 8 bits, d=28 1 1=127)
◆ Min/max en valeur absolue : 2.22.10−308, 1.79.10308
I Chi↵res significatifs : 2 23 ⇡ 1.10 7 ! 7 chi↵res
I Min/max en valeur absolue : 1.10 38 , 3.4.1038
I Flottant
14 64 bits (s : 1 bits, m : 52 bits, e : 11 bits, d=211 1 1=1023 )
I Chi↵res significatifs : 2 52 ⇡ 2.2.10 16 ! 15 chi↵res
I Min/max en valeur absolue : 2.22.10 308 , 1.79.10308
8 / 44
7
02/02/2023
Opérations en virgule flottante Flottants
Soient x1 et x2 deux nombres flottants.
Addition
I L’addition nécessite queOPÉRATIONS I De la mê
ENaient
les deux nombres VIRGULE
le mêmeFLOTTANTE
exposant.
I Si e1 = e2 , on additionne les mantisses. compilat
Soient 𝑥$ et 𝑥% deux nombres flottants. I Les type
I Si e1 6= e2 , on décale la mantisse du nombre le plus petit pour qu’ils aient le
Addition <math.h
même►exposant, ensuite on additionne les mantisses.
L’addition nécessite que les deux nombres aient le même exposant. I La précis
I Si après
► Si l’addition la mantisse
𝑒$ = 𝑒%, on additionne m > 2, on la décale vers la droite et on ajoute 1 à
les mantisses. le codag
l’exposant.
► Si 𝑒$ ≠ 𝑒%, on décale la mantisse du nombre le plus petit pour qu’ils aient le même exposant, ensuite on Code source
additionne les mantisses.
I Attention si les nombres sont d’un ordre de grandeur très di↵érents ! 1 float_t x=
► Si après l’addition la mantisse m > 2, on la décale vers la droite et on ajoute 1 à l’exposant.
2 printf("x=
► Attention si les nombres sont d’un ordre de grandeur très différents ! 3 x=x+1e-8;
Multiplication 4 printf("x+
Multiplication
5 x=x+1e50;
printf("x+
x1 x2 = m1 m2 2e1 +e2 2d 6
7 double_t y
► On effectue le produit des mantisses et la somme des exposants. 8 printf("y=
I On e↵ectue le deproduit
► Si 𝑚 sort des
l’intervalle, mantisses
on décale et et
la mantisse lachange
somme des exposants.
l’exposant. 9 y=y+1e-8;
I si m sort de l’intervalle, on décale la mantisse et change l’exposant. 10 printf("y+
11 y=y+1e50;
15 12 printf("y+
9 / 44
11 / 44 8
Les pointeurs
Définition
02/02/2023
LES POINTEURS
Définition
► Un pointeur est une variable dont la valeur (un entier) est l’adresse mémoire d’une autre variable (ou d’une série
de valeurs).
► L’accès à la valeur pointée par l’adresse est fait avec l’opérateur *.
Source Sortie
i=10, p=0
i=10, p=1568687836
i=5, p=1568687836
i=4, p=1568687836
17
CHAINES DE CARACTÈRES
► Ce sont des pointeurs vers une suite de caractères imprimables (type char).
► Nombreuses fonctions de gestion définies dans <string.h>.
► Se termine par le caractère \0. Elle a donc un octet de plus que la liste de caractères imprimables.
Premier texte
abcdefghijklmnopqrstuvwxyz
18
9
02/02/2023
TABLEAUX 1D ET MÉMOIRE
Les tableaux utilisent les pointeurs pour accéder à une suite de valeurs voisines en mémoire. L’opérateur utilisé
pour la déclaration et l’accès aux données est [ ].
Allocation et déclaration
► Taille donnée : type_t p[n];
◆ Initialise un tableau vers n cases mémoires du type type_t
Source Sortie
p1->1,2,5,10,17,26,37,50,65,82,
p2->1,2,3,4,5,6,7,8,9,10,
19
TABLEAUX N-DIMENSIONNELS
Source Sortie
m1:
0,1,2,
1,2,3,
2,3,4,
m2:
1,2,3,
4,5,6,
7,8,9,
20
10
02/02/2023
TABLEAUX ET POINTEURS
► Les tableaux peuvent être vus comme des pointeurs à l’adresse fixée.
► Un pointeur peut récupérer l’adresse d’un tableau et avoir accès aux données mais doit utiliser un indexage
linéaire (warning compilateur).
Source Sortie
m[0][0]=1
*p=1
p[0]=1
m[2][1]=8
*(p+2*3+1)=8
p[2*3+1]=8
21
Source Sortie
Etudiant:
Nom: Toto
Note: 12.500000
22
11
02/02/2023
► #include <stdio.h>, en-tête standard contenant les déclarations des fonctions d’entrées-sorties (dont
Code source Sortie
printf). 1 struct etud 1 ./ex_struct
{ Etudiant:
► int est le type renvoyé par la fonction main. 2 2
3 char nom[50]; 3 Nom: Bibi
► main est le nom de la fonction principale, aussi 4appelée point
floatd’entrée
note; du programme. 4 Note: 12.500000
5 };
► Les parenthèses après main indiquent qu’il s’agit6 d’une fonction.
7 typedef struct etud Etudiant;
► Les accolades { et } entourent les instructions constituant
8 le corps de la fonction main.
9 Etudiant e;
► Un point-virgule ; termine l’instruction. 10 strcpy(e.nom,"Bibi");
11 e.note=12.5;
12
23 13 printf("Etudiant:\nNom: %s\nNote:
%f",e.nom,e.note);
17 / 44
Entrée/Sortie écran
ENTRÉE/SORTIE
printf ÉCRAN
I Imprime une chaı̂ne de caractères à Type Format
printf int, long %d,%ld
l’écran (terminal).
► Imprime une chaîne de caractères à l’écran (terminal). unsigned int %u
I Chaı̂nes de caractères formatées en
float,double %f, %lf
► Chaînes de caractères formatées en insérant des valeurs contenues
insérant dans
des valeurs des variables.
contenues dans char %c
► Exemple : des variables. char* %s
I Exemple :
Input: printf("Color %s, Number %d, Float %5.2f", "red", 123456, 3.14);
scanf scanf
► Permet de demander à l’utilisateur du programmeId’entrer
Permet des données. à l’utilisateur du programme d’entrée des données.
de demander
► Même format que printf, passage de la variableIà modifier
Même formatpointeur
par à scanf("format",
que printf, &variable);
passage de la variable à modifier par pointeur.
int i; à scanf("%d",&i); | float t; à scanf("%f",&t);
I Préférer le passage d’information par ligne de commande.
► Utiliser getchar() pour lire un caractère.
19 / 44
► Préférer le passage d’information par ligne de commande.
24
12
02/02/2023
► Des paramètres (séparés par des espaces) peuvent être donnés lors de l’exécution du programme.
► Les paramètres donnés en ligne de commande sont passés à la fonction main.
► argc est un entier donnant le nombre de paramètres et argv est un tableau de pointeurs vers ces paramètres.
Source Sortie
Sans paramètre
Nombre de params: 1
Param. 0: ./a.out
Avec paramètres :1 "Hello world"
Nombre de params: 3
Param. 0: ./a.out
Param. 1: 1
Param. 2: Hello world
25
ENTRÉE/SORTIE FICHIER
Écriture de fichier avec fputs
► Le type FILE permet de gérer la lecture/écriture dans un fichier à l’aide des fonctions fopen, fputs, fgets,
fscanf, fclose .
► Un fichier doit être ouvert avec fopen et fermé avec fclose pour être écrit sur le disque.
Source Sortie
fichier_example.txt
Texte de test
Sur deux lignes
Lecture de fichier
► fgets permet de lire une chaine de caractères de taille connue à partir d’un pointeur fichier.
► fscanf permet de lire une chaine de caractères formatée.
26
13
02/02/2023
◆ Un argument reçu par une fonction est considéré comme une variable locale.
◆ Si une variable locale a le même nom qu’une variable locale (à éviter !!!), cette dernière sera utilisée.
► Variable statique
◆ Une variable déclarée comme static (static int i;) maintient sa valeur à travers les fonctions.
► Variable registre
◆ Une variable déclarée comme register (register int k;) indique au compilateur qu’elle sera utilisée fréquemment et
un registre pourrait lui être dédié.
27
PROGRAMME C ET FONCTIONS
28
14
02/02/2023
FONCTIONS EN C
► Les fonctions permettent d’exécuter simplement une suite d’instructions (avec des paramètres).
► Elles sont définies par leur nom, liste de paramètres d’entrée et type de sortie.
► Si on veut modifier plusieurs variables dans une fonction on passe en paramètre des pointeurs vers les variables à
modifier.
Source Sortie
i=0, carre(i)=0
i=1, carre(i)=1
i=2, carre(i)=4
i=3, carre(i)=9
i=4, carre(i)=16
29
► Une fonction peut être déclarée sans sa définition. Ceci permet son utilisation sans avoir sa définition (dans un
autre fichier *.c par exemple)
► Il faut un point virgule à la fin de la déclaration (pas de la définition).
► Les directives compilateur #include "fichier.h" permettent de déclarer les fonctions pour une
utilisation dans le code (parfois utilisé pour la définition des fonctions).
► La définition des fonctions est souvent faite dans un fichier fichier.c associé au fichier fichier.h.
Source Sortie
carre.h Exp_fct.c
i=0, carre(i)=0
i=1, carre(i)=1
i=2, carre(i)=4
carre.c i=3, carre(i)=9
i=4, carre(i)=16
30
15
02/02/2023
EXERCICE 1
Analyse du problème
► Nom :
31
RÉCURSION
► Une notion est dite récursive quand elle fait référence à elle-même soit de manière directe ou indirecte.
► Méthode :
◆ Le paramétrage consiste à mettre en évidence les éléments dont dépend la solution, en particulier la taille du problème.
◆ cas triviaux : 1! = 0! = 1
◆ décomposition : n! = n* (n-1)!
Source Sortie
facto(3)=6
facto(5)=120
facto(7)=5040
32
16
02/02/2023
POINTEUR DE FONCTION EN C
Source Sortie
f1(2)=4.000000
f2(2)=0.909297
33
BIBLIOTHÈQUES STANDARD DU C
► Ce sont un ensemble de fonctions et de fichiers d’entête qui sont présents sur tous les systèmes.
► Ils forment la bibliothèque standard ANSI C.
► Liste des entêtes/fonctions les plus utiles, mais documentation détaillée sur le web.
34
17
02/02/2023
Source Sortie
i=-10, j=3
x=3.142 ou x=3.141590e+00
Nom: toto
35
Source Sortie
Prénom, Nom
36
18
02/02/2023
Source Sortie
round(3.14)=3.000000
log(2)=0.693147
exp(1)=2.718282
sqrt(2)=1.414214
sin(1)=0.841471
37
37
OPÉRATEURS ARITHMÉTIQUES EN C
► Une expression (¹ instruction) indique une action à mener (expression = élément syntaxique).
► Une expression représente une donnée élémentaire (constante, variable, un élément d’un tableau, le résultat d’un calcul, …).
◆ Les opérandes doivent être des valeurs numériques. ◆ ++i pré-incrémentation (incrémentationàopération).
Source Sortie
38
38
19
02/02/2023
Ces opérateurs sont utilisés pour tester une condition booléenne (branchement ou boucle) et pour combiner les
conditions.
► Comparaisons ► Opérations booléennes Exemples
39
OPÉRATEURS D’AFFECTATION EN C
► Une expression (¹ instruction) indique une action à mener (expression = élément syntaxique).
► Une expression représente une donnée élémentaire (constante, variable, un élément d’un tableau, le résultat d’un calcul, …).
◆ Les opérandes doivent être des valeurs numériques. ◆ ++i pré-incrémentation (incrémentationàopération).
40
40
20
02/02/2023
CONDITION IF
Source Sortie
41
CONDITION SWITCH
Source Sortie
12
Le nombre a est égal à une autre
valeur
42
21
02/02/2023
BOUCLE FOR
► La boucle exécute les instructions tant que condition est vraie, iteration est exécuté à chaque tour de la
boucle.
► La boucle for est en général utilisée lorsque l’on connait le nombre d’itérations a priori.
► Exemple d’itérations avec une variable entière :
43
BOUCLE WHILE
Source Sortie
s=1, i=1
s=4, i=2
s=9, i=3
s=16, i=4
s=25, i=5
► Souvent remplacée par une boucle for en C car cette dernière est extrêmement puissante.
44
22
02/02/2023
Boucle for
BOUCLE DO…WHILE
I Format en C : for (initialisation;condition;iteration){instructions};
eurs valeurs. I La boucle exécute les instructions tant que condition est vraie, iteration
► Format en C : do {instructions} while (condition);
est exécuté à chaque tour de la boucle.
► La boucle exécute les I
instructions
La boucle au for
moins
estune
en fois avantutilisée
général de vérifier la condition.
lorsque l’on connait le nombre d’itérations à
ex_switch
nombre a est egal a 1 ou 2 priori.
Source I Exemple d’itérations avec une variable Sortie
entière :
Code source Sortie
1 int nb=5; 1 ./ex_for
2 for (int i=0;i<nb;i++) s=1, i=1
2 i=0, i*i=0
3 printf("i=%d, i*i=%d\n",i,i*i); s=4, i=2
3 i=1, i*i=1
s=9, i=3
4 i=2, i*i=4
s=16, i=4
5 i=3, i*i=9
s=25, i=5
6 i=4, i*i=16
Exercice 2 : Somme
EXERCICE
Coder une fonction C calculant la2 valeur
: SOMME
entière
dition est vraie. n
X
► Coder une fonction C calculant la valeur entière sommecarre(n) = i2
i=0
ex_while
, i=1
, i=2 Analyse du problèmeAnalyse du problème Solution
, i=3 ► Nom : I Nom :
6, i=4
5, i=5 ► Entrée : I Entrée :
► Sortie : I Sortie :
► Mise en œuvre : I Mise en oeuvre :
boucle se termine.
tte dernière est extrêmement
35 / 44 36 / 44
46
23