Académique Documents
Professionnel Documents
Culture Documents
1. Introduction
Le langage C a été conçu afin de réécrire de façon portable et en langage évolué le système
d'exploitation UNIX. En 1972, Dennis Ritchie, s'inspirant d'Algol 60 et du langage B de Ken
Thompson, donne ainsi naissance au langage C. En 1973, UNIX est réécrit en langage C par D.
Ritchie et K. Thompson.
Bien que le langage C n'ai pas été développé à la base pour concurrencer les langages existant à
l'époque (Fortran et Pascal, par exemple), le succès qu'a connu UNIX, notamment auprès des
universités, a fortement contribué à sa popularité. Il s'est vite imposé comme LE langage de
programmation par excellence d'UNIX.
En 1978, Brian Kernighan et Dennis Ritchie publient une définition du langage C qui restera
pour longtemps la norme de référence.
FSM Page 1
Support langage C
Il reste alors à rassembler les codes intermédiaires (dans le cas où le programme est découpé en
plusieurs fichiers sources) et à les lier aux diverses librairies. C'est le rôle de l'éditeur de liens
(linker) qui produit le code exécutable du programme.
Le langage C distingue les minuscules, des majuscules. Les mots réservés du langage C
doivent être écrits en minuscules.
Le langage C possède assez peu d'instructions, il fait par contre appel à des bibliothèques,
fournies avec le compilateur.
FSM Page 2
Support langage C
Remarque: En langage C, le type char est un cas particulier du type entier : un caractère est un
entier de 8 bits. Les caractères alphanumériques s'écrivent entre ‘ ‘.
Exemples:
Le caractère 'a' a pour valeur 97 (son code ASCII).
Le caractère 'A' a pour valeur 65 (son code ASCII).
Un réel est composé : d'un signe, d'une mantisse et d'un exposant. Le langage C distingue 3
types de réels:
Type Description Taille mémoire
Float réel standard 4 octets
Double réel double précision 8 octets
réel quadruple
long double 16 octets
précision
5. Les constantes
FSM Page 3
Support langage C
Une constante est une valeur qui apparaît littéralement dans le code source d'un programme, le
type de la constante étant déterminée par la façon dont la constante est écrit.
1ère méthode: déclaration d'une variable, dont la valeur sera constante pour tout le programme.
Exemple : main()
{
const float PI = 3.14159;
float perimetre, rayon = 8.7;
perimetre = 2 * rayon * PI;
....
}
6. Les initialisations
Le langage C permet l'initialisation des variables dans la zone des déclarations :
7. Les opérateurs
FSM Page 4
Support langage C
d = c + 'a' - 'A';
Les caractères sont des entiers sur 8 bits, on peut donc effectuer des opérations. Dans
l’exemple ci-dessus, on transforme la lettre majuscule G en la lettre minuscule g.
Opérateurs relationnels :
Attention à ne pas confondre l'opérateur de test d'égalité "==" avec l'opérateur d'affection "=".
Opérateurs logiques booléens :
&& ET logique
|| OU logique
! négation logique
& ET
| OU
^ OU exclusif
~ Complément à un
<< Décalage à gauche
>> Décalage à gauche
Exemple 1:
n = 23 ; /* n = 00010111 en binaire */
p = n << 2; /* p = n décalé de 2 bits à gauche = 01011100 = 92 */
q = n >> 1; /* q = n décalé de 1 bit à droite = 00001011 = 11 */
Exemple 2:
Considérons par exemple les entiers a =77 et b = 23 de type unsigned char (i.e. 8 bits). En base
2 il s'écrivent respectivement 01001101 et 00010111.
Valeur
Expression Binaire Décimale
a 01001101 77
FSM Page 5
Support langage C
b 00010111 23
a&b 00000101 5
a|b 01011111 95
a^b 01011010 90
~a 10110010 178
b << 2 01011100 92 multiplication par 4
b << 5 11100000 224 ce qui dépasse disparaît
b >> 1 00001011 11 division entière par 2
8. Incrémentation et décrémentation
Le langage C autorise des écritures simplifiées pour l'incrémentation et la décrémentation de
variables :
i = i+1; ≡ i++;
i = i-1; ≡ i--;
Le langage C autorise des écritures simplifiées lorsqu'une même variable est utilisée de chaque
côté du signe = d'une affectation. Ces écritures sont à éviter lorsque l'on débute l'étude du
langage C car elles nuisent à la lisibilité du programme.
a= a+b; ≡ a+= b;
a= a-b; ≡ a-= b;
a= a & b; ≡ a&= b;
a= a / b; ≡ a/= b;
Exemple :
int i = 3, j = 2;
float x;
x = (float) i/j; ==> x = 1.5
int i=0x1234, j ;
float s, r=86.7 ;
j = (int) r ;
s = (float) i ;
FSM Page 6
Support langage C
Exemple : sqrt(16) = 4
Code ASCII :
HE DE CH HE DE CH HE DE CH HE DE CH
X C R X C R X C R X C R
NU
00 0 20 32 SP 40 64 @ 60 96 `
L
SO
01 1 21 33 ! 41 65 A 61 97 a
H
ST
02 2 22 34 " 42 66 B 62 98 b
X
ET
03 3 23 35 # 43 67 C 63 99 c
X
EO
04 4 24 36 $ 44 68 D 64 100 d
T
EN
05 5 25 37 % 45 69 E 65 101 e
Q
06 6 AC 26 38 & 46 70 F 66 102 f
FSM Page 7
Support langage C
K
BE
07 7 27 39 ' 47 71 G 67 103 g
L
08 8 BS 28 40 ( 48 72 H 68 104 h
09 9 HT 29 41 ) 49 73 I 69 105 i
0A 10 LF 2A 42 * 4A 74 J 6A 106 j
0B 11 VT 2B 43 + 4B 75 K 6B 107 k
0C 12 FF 2C 44 , 4C 76 L 6C 108 l
0D 13 CR 2D 45 4D 77 M 6D 109 m
0E 14 SO 2E 46 . 4E 78 N 6E 110 n
0F 15 SI 2F 47 / 4F 79 O 6F 111 o
DL
10 16 30 48 0 50 80 P 70 112 p
E
DC
11 17 31 49 1 51 81 Q 71 113 q
1
DC
12 18 32 50 2 52 82 R 72 114 r
2
DC
13 19 33 51 3 53 83 S 73 115 s
3
DC
14 20 34 52 4 54 84 T 74 116 t
4
NA
15 21 35 53 5 55 85 U 75 117 u
K
SY
16 22 36 54 6 56 86 V 76 118 v
N
ET
17 23 37 55 7 57 87 W 77 119 w
B
CA
18 24 38 56 8 58 88 X 78 120 x
N
19 25 EM 39 57 9 59 89 Y 79 121 y
SU
1A 26 3A 58 : 5A 90 Z 7A 122 z
B
ES
1B 27 3B 59 ; 5B 91 [ 7B 123 {
C
1C 28 FS 3C 60 < 5C 92 \ 7C 124 |
1D 29 GS 3D 61 = 5D 93 ] 7D 125 }
1E 30 RS 3E 62 > 5E 94 ^ 7E 126 ~
DE
1F 31 US 3F 63 ? 5F 95 _ 7F 127
L
FSM Page 8
Support langage C
1. Fonctions d’affichage
Ce n'est pas une instruction du langage C, mais une fonction de la bibliothèque stdio.h.
Syntaxe :
printf( " chaine de caractère " , paramètres );
Exemple :
printf("La valeur de x est %d ", x );
Exemple :
#include <stdio.h>
#include <conio.h>
main()
{
char c;
c = 65; /* c = caractère alphanumérique ‘A’ (65 = code ASCII de ‘A’) */
printf("%d\n", c); /* affichage du code ASCII en décimal et retour à la ligne */
printf("%o\n", c); /* affichage du code ASCII en base huit et retour à la ligne */
printf("%x\n", c); /* affichage du code ASCII en hexadécimal et retour à la ligne */
printf("%c\n", c); /* affichage du caractère ‘A’ et retour à la ligne */
getch();
}
FSM Page 9
Support langage C
Exemple :
Algorithmique C
Variables #include<stdio.h>
x, a, b : entier #include<conio.h>
r : réel
ch : caractère main()
Début {
x2 int x = 2, a = 47, b = 123 ;
r 3.57 float r = 3.57 ;
a 47 char ch = ‘m’ ;
ch ‘m’
b 123 printf(" x = %d ", x);
écrire("x = ", x) printf(" r = %f ", r);
écrire("r = ", r) printf(" a = %d ", a);
écrire("a = ", a) printf(" ch = %c ", ch);
écrire("ch = ", ch) printf(" b = %d ", b);
écrire("b = ", b) getch();
Fin }
printf("x = %d , r = %f , a = %d , ch = %c et b = %d ", x , r , a , ch , b );
2. Fonctions de saisie
FSM Page 10
Support langage C
La fonction getch, appartenant à la bibliothèque conio.h, permet la saisie clavier d'un caractère
alphanumérique. La saisie s'arrête dès que le caractère a été frappé.
Les variables à saisir sont formatées, le nom de la variable est précédé du symbole & désignant
l'adresse de la variable.
La saisie s'arrête avec "RETURN" (c'est à dire LF, son code ASCII = 10 = 0x0A), les éléments
saisis s'affichent à l'écran. Tous les éléments saisis après un caractère d'espacement (espace,
tabulation) sont ignorés.
Syntaxe :
scanf( " format " , paramètres );
Exemple :
scanf(" %d ", &x );
Format Paramètre
FSM Page 11
Support langage C
Si l'utilisateur saisie 97 tout va bien, alpha devient le caractère dont le code ASCII vaut 97,
c.a.d. le caractère ‘a’. Par contre, si l'utilisateur saisie ‘a’, sa saisie est ignorée.
La fonction getchar permet la saisie d'un caractère (char). Elle appartient à la bibliothèque
stdio.h. Les deux écritures suivantes sont équivalentes :
char c; char c;
printf("entrer un caractère: "); printf("entrer un caractère: ");
scanf("%c", &c); c = getchar();
‘’’’’’’’
FSM Page 12
Support langage C
Chapitre 3
FSM Page 13
Support langage C
Algorithmique Langage C
si (condition) if (expression)
alors {....; } /*bloc1
bloc1 d’instructions*/
d’instruction
organigramme
finSi
: Remarque :
Les {} ne sont pas nécessaires lorsque les blocs ne comportent qu’une seule instruction.
Exemple
Ecrire un programme qui permet d’afficher le maximum et le minimum de deux entiers
A et B saisie au clavier.
#include<stdio.h>
Void main()
{
int A, B, max,
min;
printf("Donner A:");
scanf("%d", &A);
printf("Donner B:");
scanf("%d", &B);
FSM Page 14
Support langage C
if (A > B)
{
max = A ;
min = B;
}
else
{
max = B ; min = A;
}
printf("le max = %d et min = %d\n", max, min) ;
}
#include<stdio.h>
main()
{
char operation ;
int r, a, b ;
printf("Entrez un signe d’operation : ") ;
scanf("%c", &operation ) ;
printf("Entrez a : ") ;
scanf("%d", &a ) ;
printf("Entrez b : ") ;
scanf("%d", &b ) ;
if (operation == ’+’ || operation == ’p’)
r = a + b ;
else if (operation == ’*’ || operation == ’m’)
r = a * b ;
else if (operation == ’/’ || operation == ’f’)
r = a / b ;
else if (operation == ’-’ || operation == ’d’)
r = a - b ;
else
printf("Non valide ") ;
printf("%d %c %d = %d ", a, b, operation , r) ;
}
FSM Page 16
Support langage C
scanf("%d", &b ) ;
switch (operation)
{
case ’+’ :
case ’p’ : r = a + b ; break;
case ’*’ :
case ’m’ : r = a * b ; break;
case ’/’ :
case ’f’ : r = a / b ; break;
case ’-’ :
case ’d’ : r = a - b ; break;
default : printf("Non valide!!!") ;
}
printf("%d %c %d = %d ", a, b, operation , r) ;
}
– Les ne sont pas nécessaires lorsque le bloc ne comporte qu’une seule instruction.
– Les 3 instructions du for ne portent pas forcément sur la même
variable. Exemple 1 :
– for(i = 0 ; i<10 ; i++)
FSM Page 17
Support langage C
{
............; /* bloc d’instructions */
............;
............;
}
– La boucle for( ; ; ) est une boucle infinie (répétition infinie du bloc d’instructions).
– Utilisation de variables différentes :
resultat = 0;
for(i = 0 ; resultat < 30 ; i++)
{
Exemple 2 :
............; /* bloc d’instructions */
............;
............;
resultat = resultat + 2 * i;
Ecrire un programme qui permet de calculer la somme des 50 premiers nombres entiers.
int i, somme = 0;
FSM Page 18
Support langage C
Le bloc d’instruction sera exécuté tant que la condition est vérifiée (ou non nulle). Le
test se faisant après, le bloc est exécuté au moins une fois même si l’expression est
nulle à la première
évaluation.
Remarque
:
Les {} ne sont pas nécessaires lorsque le bloc ne comporte qu’une seule instruction.
Exemple :
Réécrire l’exemple 2 de la boucle for en utilisant la boucle do...while.
int i = 0, somme = 0;
do
{
somme = somme + i;
i = i+1;
}
while ( i < 50 );
printf("Somme = %d\n", somme);
FSM Page 19
Support langage C
lieu avant l’exécution de l’instruction, celle-ci peut ne pas être exécutée si l’expression
est nulle
à la première
évaluation. Remarque
:
– Les {} ne sont pas nécessaires lorsque le bloc ne comporte qu’une seule
instruction.
– On peut rencontrer la construction suivante : while (condition) ; terminée par un ;
et sans
la présence du bloc d’instructions. Cette construction signifie : ”tant que la
condition est vraie attendre”.
expr1 ; expr1 ;
for(expr1 ;expr2 while(expr2){ do{
;expr3) ≡ instructions ; ≡ instructions ;
instructions ; expr3 ; expr3 ;
} }while(expr2) ;
Dans le cas où une boucle commande l’exécution d’un bloc d’instructions, il
peut être
intéressant de vouloir sortir de cette boucle alors que la condition de passage est
encore va- lide. Ce type d’opération est appelé une rupture de séquence. Les ruptures
de séquence sont utilisées lorsque des conditions multiples peuvent conditionner
l’exécution d’un ensemble d’ins- tructions.
Les ruptures de séquence sont réalisées par quatre instructions qui correspondent à leur
niveau de travail :
– continue
– break
– goto
Break
On a vu le rôle de l’instruction break au sein l’instruction switch. L’instruction
break peut, plus généralement, être employée à l’intérieur de n’importe quelle boucle.
Elle permet d’inter- rompre le déroulement de la boucle, et passe à la première
instruction qui suit la boucle. En cas de boucles imbriquées, break fait sortir de la
boucle la plus interne.
Exemple : Soit le programme suivant :
main()
{
int i;
for (i = 0; i < 5 ; i++)
{
printf("i = %d\n", i);
if (i == 3)
break;
}
printf("valeur de i a la sortie de la boucle = %d\n", i);
}
Résultat d’exécution :
i= 0i= 1i = 2i = 3
valeur de i a la sortie de la boucle = 3.
3.3.2 Continue
L’instruction continue permet de passer directement au tour de boucle suivant, sans
exécuter les autres instructions de la boucle.
Exemple : Soit le programme
suivant :
main(
)
{
int i;
for (i = 0; i < 5; i++)
{
FSM Page 1
if (i == 3)
continue;
printf("i = %d\n", i);
}
printf("valeur de i a la sortie de la boucle = %d\n", i);
}
Résultat d’exécution :
i= 0
i=1
i=2
i=4
valeur de i a la sortie de la boucle
= 5.
Goto
L’instruction goto permet d’effectuer un saut jusqu’à l’instruction étiquette
appelée label correspondant. Un label est une chaı̂ne de caractères suivie du double
point ” : ”.
Exemple :
main()
{
start :
... /* instructions */
...
goto stop; /* goto avant la définition de l’étiquette stop */
... /* instructions */
...
stop
:
... /* instructions */
goto start; /* goto après la définition de l’étiquette start */
...
}
Break et continue dans une boucle for :
for(expression 1 ; expression 2 ; expression 3)
{
instruction
1; break;
instruction
2; continue;
instruction
3;
}
FSM Page 2
Break et continue dans une boucle while :
while(condition)
{
instruction
1; break;
instruction
2; continue;
instruction 3;
}
FSM Page 3
}
while(condition) ;
FSM Page 4
Chapitre 4
Les Tableaux
FSM Page 5
int compteur[4][5]; // 4 lignes, 5
colonnes float nombre[2][10]; // 2
lignes, 10 colonnes
Utilisation
Un élément du tableau est repéré par ses indices. En langage C les tableaux
commencent aux indices 0. Les indices maximum sont donc (dim1-1) et (dim2-1).
Appel
nom[indice1][indi
ce2] Exemples :
int tab[3][4];
tab[0][0] = 5;
printf("%d",
tab[i][j]);
scanf("%f",
&tab[i][j]);
FSM Page 6
int i;
/* saisie du tableau*/
for( i=0; i<10; i++ ){
printf("nombre[%d] = ",
i); scanf("%f",
&nombre[i]);}
/* affichage du tableau*/
for( i=0; i<10; i++ )
printf("nombre[%d] = %f ",i,nombre[i]);
}
– Utilisation de la boucle while :
main()
{
float nombre[10];
int i;
i=0;
/* saisie du tableau*/
while(i<10){
printf("nombre[%d] = ",
i); scanf("%f",
&nombre[i]); i++;}
/* affichage du tableau*/
i=0;
while(i<10){
printf("nombre[%d] = %f ",i,nombre[i]);
i++;}
}
2. Calcul de la moyenne d’un tableau : Ecrire un programme permettant de saisir
un tableau de 10 entiers, de calculer et d’afficher leur moyenne.
main
()
{
int
tab[10];
int i,s;
float
moy;
/* saisie du
tableau*/
for(i=0;i<10;i++){
printf("tab[%d] =
",i); scanf("%d",
&tab[i]);}
/* calcule de la moyenne */
for(i=0; i<10; i++)
s = s+
tab[i];
FSM Page 7
moy = s / 10;
/* affichage de la moyenne */
printf("Moyenne du tableau = %f", moy);
// ou bien printf("Moyenne du tableau = %f", float(s/10)
);
}
3. Recherche du maximum :
Ecrire un programme permettant de saisir les moyennes de 30 étudiants, de
calculer et d’afficher la meilleur moyenne.
main()
{
float moy[30];
int i;
float max;
/* saisie du tableau*/
for(i=0; i<10; i++)
{
printf("moy[%d] = ",i);
scanf("%f", &moy[i]);
}
max = moy[0] ;
/* recherche du maximum */
for(i=0; i<10; i++)
if (moy[i] >
max)
max =
moy[i];
/* affichage du maximum */
printf("Maximum du tableau = %f", max);
}
4. Saisit et affichage d’un tableau à 2 dimension :
Ecrire un programme permettant de saisir un tableau de réels de taille 5x10 :
main()
{
float nombre[5][10];
int i,j;
/* saisie du tableau*/
for( i=0; i<5; i++ )
for( j=0; j<10; j++ ){
printf("nombre[%d][%d] = ",
i); scanf("%f",
&nombre[i][j]);}
/* affichage du tableau*/
for( i=0; i<5; i++ ){
for( j=0; j<10; j++ )
FSM Page 8
printf("nombre[%d][%d] = %f ", i, j, nombre[i][j] );
printf("\n")}
}
FSM Page 9
Chapitre 5
5.1 Déclaration
Une chaı̂ne est un tableau de caractères dont le dernier élément significatif est le
caractère
’\0’. Il faut donc différencier la longueur maximale de la chaı̂ne (c’est à dire la dimension
donnée lors de la définition) de sa longueur réelle (c’est à dire le nombre de caractères
jusqu’au ’\0’).
char
nom[dim]
Exemple :
char texte[dim] ;
Le compilateur réserve (dim-1) places en mémoire pour la chaı̂ne de caractères. En effet,
il ajoute toujours le caractère NULL (’\0’) à la fin de la chaı̂ne en mémoire
5.2 Initialisation
– char chaine[]=”HELLO” ;
H E L L O \0
– char chaine[6] = ”HELLO” ;
H E L L O \0
– char chaine[8] = ”Hello” ;
H E L L O \0 0 0
– char chaine[5] = ”HELLO” ;
⇒ Erreur pendant l’exécution
5.3 Affichage
On peut utiliser la fonction printf avec le format %s :
char texte[10] = "BONJOUR";
printf("Voici le texte: %s\n", texte);
On peut aussi utiliser la fonction
puts :
puts(texte); // printf("%s\n",texte);
FSM Page 10
5.4 Saisie
On peut utiliser la fonction scanf avec le format le format %s. On n’écrit pas le
symbole &. On peut aussi utiliser la fonction gets.
char texte[10];
printf("entrer un texte: ");
scanf("%s", texte); /* gets(texte); */
Remarques :
– La fonction scanf ne permet pas la saisie d’une chaı̂ne comportant des espaces :
les ca- ractères saisis à partir de l’espace ne sont pas pris en compte mais rangés
dans le tampon d’entrée. Pour saisir une chaı̂ne comportant des espaces, il faut
utiliser la fonction gets.
– A l’issue de la saisie d’une chaı̂ne de caractères, le compilateur ajoute ’\0’ en
mémoire
après le dernier
caractère.
Exemples :
char lieu[25];
int jour, mois, annee;
printf("Entrez lieu et date de naissance :");
scanf("%s %d %d %d", lieu, &jour, &mois, &annee);
FSM Page 11
5.6 Fonctions permettant la manipulation des
chaı̂nes
Les bibliothèques fournies avec les compilateurs contiennent de nombreuses
fonctions de traitement des chaı̂nes de caractères. En BORLAND C++, elles
appartiennent aux bibliothèques string.h ou stdlib.h. En voici quelques exemples de
fonctions de la bibliothèque string.h :
– strlen(< s >) Fournit la longueur de la chaı̂ne sans compter le ’\0’ final
– strcpy(< s >, < t >) Copie < t > vers < s >
– strcat(< s >, < t >) Ajoute < t > à la fin de < s >
– strcmp(< s >, < t >) Compare < s > et < t > lexicographiquement et fournit
un résulta t :
– négatif si < s > précède < t >
– zéro si < s > est égal à < t >
– positif si < s > suit < t >
– strncpy(< s >, < t >, < n >) Copie au plus ¡n¿ caractères de < t > vers < s
>
– strncat(< s >, < t >, < n >) Ajoute au plus ¡n¿ caractères de < t > à la fin
de < s >
– strchr(< s >, < c >) Trouve la première occurrence du caractère c dans la
chaı̂ne s, c’est
à dire la première fois où il apparaı̂t
– strrev (< s >) Inversion de l’ordre de la chaı̂ne s
– strupr (< s >) Conversion minuscule-majuscule de la chaı̂ne s
FSM Page 12