Académique Documents
Professionnel Documents
Culture Documents
1
2
Chapitre 1
# include<math.h>
#include <graphics.h>
3
4 CHAPITRE 1. LES BIBLIOTHÈQUES ET NOTIONS DE BASE
Les noms des fonctions et des variables en C sont composés d’une suite de
lettres et de chiffres. Le premier caractère doit être une lettre. Le symbole ’_’
est aussi considéré comme une lettre.
— 0,1,2,...,9,A,B,...,Z,_ ,a,b,...,z
— Le premier caractère doit être une lettre (ou le symbole ’_’)
— C distingue les majuscules et les minuscules.
— Nom_de_variable’ est différent de ’nom_de_variable’
Remarques :
Avant de pouvoir utiliser une variable, nous devons nous intéresser à deux
caractéristiques de son type numérique :
— le domaine des valeurs admissibles
— le nombre d’octets qui est réservé pour une variable
Le tableau suivant résume les caractéristiques des types numériques entiers de
C:
Précision Nombre
Définition mantisse Nombre min Nombre max d’octets
float simple 6 3.4 × 10−38 3.4 × 1038 4
double double 15 1.7 × 10−308 1.7 × 10308 8
double long suppl 19 3.4 × 10−4932 1.1 × 104932 10
int main ()
{
// d e c l a r a t i o n s
int a ;
int b , c , d ; // d e c l a r a t i o n of servel v a r i a b l e s with same type
float x ;
double y ;
// i n s t r u c t i o n s
return 0;
}
En général. nous avons le choix entre plusieurs types et nous devons trouver celui
qui correspond le mieux au domaine et aux valeurs à traiter. Voici quelques règles
générales qui concernent la traduction des déclarations de variables numériques
du langage algorithmique en C :
— La syntaxe des déclarations en C ressemble à celle du langage algorith-
mique. Remarquez quand même les points-virgules à la fin des déclara-
tions en C.
— entier : Nous avons le choix entre tous les types entiers (inclusivement
char) dans leurs formes signed ou unsigned. Si les nombres deviennent
trop grands pour unsigned long, il faut utiliser un type rationnel (p.ex :
double)
— réel : Nous pouvons choisir entre les trois types rationnels en observant
non seulement la grandeur maximale de l’exposant, mais plus encore le
nombre de chiffres significatifs de la mantisse.
— caractère : Toute variable du type char peut contenir un (seul) carac-
tère. En C, il faut toujours être conscient que ce caractère n’est autre
chose qu’un nombre correspondant à un code (ici : code ASCII). Ce
1.2. TYPES DE VARIABLES 9
int main ()
{
// d e c l a r a t i o n s
int a = 10;
float b = 3.4;
// i n s t r u c t i o n s
return 0;
}
En utilisant l’attribut const, nous pouvons indiquer que la valeur d’une variable
ne change pas au cours d’un programme :
int main ()
{
// d e c l a r a t i o n s
const int MAX = 767;
// i n s t r u c t i o n s
return 0;
}
variable = expression
Le terme gauche de l’affectation peut être une variable simple, un élément de ta-
bleau mais pas une constante. Cette expression a pour effet d’évaluer expression
et d’affecter la valeur obtenue à variable.
10 CHAPITRE 1. LES BIBLIOTHÈQUES ET NOTIONS DE BASE
Les opérateurs classiques sont l’opérateur unaire ainsi que les opérateurs
binaires :
+ addition
− soustraction
∗ multiplication
/ division
% reste de la divison (modulo)
Ces opérateurs agissent de la façon attendue sur les entiers comme sur les
flottants. Notons qu’il n’y a pas en C d’opérateur effectuant l’élévation à la
puissance. De façon générale, il faut utiliser la fonction pow(x, y) de la librairie
math.h pour calculer xy .
&& et logique
|| ou logique
! négation logique
Comme pour les opérateur de comparaison, la valeur retournée par ces opéra-
teurs est un int qui vaut i si la condition est vraie et 0 sinon.
— a+ = b
— −=
— ∗=
— /=
— %=
— &=
=
—
— |=
— <<=
— >>=
Pour tout opérateur op, l’expression :
expression1 op = expression2
et equivalente à :
int main ()
{
// d e c l a r a t i o n s
int a = 3 , b , c ;
b = ++ a ; /* a et b valent 4 */
c = b ++; /* c vaut 4 et b vaut 5 */
return 0;
}
12 CHAPITRE 1. LES BIBLIOTHÈQUES ET NOTIONS DE BASE
Une expression peut être constituée d’une suite d’expression séparées par les
virgules : expression1, expression2,. . .
Cette expression est alors évaluée de gauche à droite. Sa valeur sera la valeur
de l’expression de droite. Par exemple, le programme
main ()
{
int a , b ;
b = (( a = 3) , ( a + 2) ) ;
printf ( " \ n b = % d \ n " ,b ) ;
}
imprime b = 5
affecte à m le maximum de a et de b.
main ()
{
int i = 3 , j = 2;
printf ( " % f \ n " ,( float ) i / j ) ;
}
else if ( expression - n )
instruction - n
else
instruction
}
{
case constante -1 :
liste d ’ instructions 1
break ;
default :
liste d ’ instructions
break ;
}
Tant que expression est vérifiée (i.e.,non nulle),instruction est exécutée. Si ex-
pression est nulle au départ, instruction ne sera jamais exécutée. instruction
peut évidemment être une instruction composée. Par exemple, le programme
suivant imprime les entiers de 1 à 9.
i = 1;
while ( i < 10)
{
printf ( " \ n i = % d " ,i ) ;
i ++;
1.4. LES BOUCLES 15
Ici, instruction sera exécutée tant que expression est non nulle. Cela signifie
donc que instruction est toujours exécutée au moins une fois. Par exemple, pour
saisir au clavier un entier entre 1 et 10 :
int a ;
do
{
printf ( " \ n Entrez un entier entre 1 et 10 : " ) ;
scanf ( " % d " ,& a ) ;
}
while (( a <= 0) || ( a > 10) ) ;
A la fin de cette boucle, i vaudra 10. Les trois expressions utilisées dans une
boucle for peuvent être constituées de plusieurs expressions séparées par des
virgules. Cela permet par exemple de faire plusieurs initialisations à la fois. Par
exemple, pour calculer la factorielle d’un entier, on peut écrire :
int n , i , fact ;
for ( i = 1 , fact = 1; i <= n ; i ++)
fact *= i ;
printf ( " % d ! = % d \ n " ,n , fact ) ;
16 CHAPITRE 1. LES BIBLIOTHÈQUES ET NOTIONS DE BASE
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 ) ;
}
imprime à l’écran :
i=0
i=1
i=2
i=3
valeur de i a la sortie de la boucle = 3
main ()
{
int i ;
for ( i = 0; i < 5; i ++)
{
printf ( " i = % d \ n " ,i ) ;
1.5. LES INSTRUCTIONS DE BRANCHEMENT NON CONDITIONNEL17
if ( i == 3)
break ;
}
printf ( " valeur de i a la sortie de la boucle = % d \ n " ,i ) ;
}
imprime
i=0
i=1
i=2
i=4
valeur de i a la sortie de la boucle = 5
où nombre éléments est une expression constante entière positive. Par exemple,
la déclaration int tab[10] ; indique que tab est un tableau de 10 éléments de
type int. Cette déclaration alloue donc en mémoire pour l’objet tab un espace
de 104 octets consécutifs.
Pour plus de clarté, il est recommandé de donner un nom à la constante
nombre éléments par une directive au préprocesseur, par exemple :
#def ine nombreéléments 10
On accède à un élément du tableau en lui appliquant l’opérateur []. Les
éléments d’un tableau sont toujours numérotés de 0 à nombre − éléments − 1.
Le programme suivant imprime les éléments du tableau tab :
19
20 CHAPITRE 2. LES TYPES COMPOSÉS
# define N 10
main ()
{
int tab [ N ];
int i ;
...
for ( i = 0; i < N ; i ++)
printf ( " tab [% d ] = % d \ n " ,i , tab [ i ]) ;
}
0
le compilateur complète toute chaîne de caractères avec un caractère nul
00 . Il faut donc que le tableau ait au moins un élément de plus que le nombre
de caractères de la chaîne littérale.
# define N 8
char tab [ N ] = " exemple " ;
main ()
{
int i ;
for ( i = 0; i < N ; i ++)
printf ( " tab [% d ] = % c \ n " ,i , tab [ i ]) ;
}
{
for ( j = 0; j < N ; j ++)
printf ( " tab [% d ][% d ]=% d \ n " ,i ,j , tab [ i ][ j ]) ;
}
}
struct complexe {
double reelle ;
double imaginaire ;
};
int main ( void ) {
struct complexe z ;
double norme ;
printf ( " entrer la partie r e l de nombre " ) ;
2.1. LES TABLEAUX 23
return 0;
}
possède deux membres, actif qui est codé sur un seul bit, et valeur qui est
codé sur 31 bits.Tout objet de type struct registre est donc codé sur 32 bits.
Toutefois, l’ordre dans lequel les champs sont placés à l’intérieur de ce mot de 32
bits dépend de l’implémentation. Le champ actif de la structure ne peut prendre
que les valeurs 0 et 1. Aussi, si r est un objet de type struct registre, l’opération
r.actif += 2 ; ne modifie pas la valeur du champ. La taille d’un champ de bits
doit être inférieure au nombre de bits d’un entier. Notons enfin qu’un champ de
bits n’a pas d’adresse ; on ne peut donc pas lui appliquer l’opérateur &.
# define VRAI 1
# define FAUX 0
typedef int BOOLEAN ;
mais bien entendu, ce sera à la charge du programmeur d’assurer que les va-
riables b1 et b2 ne prennent comme valeurs que VRAI ou FAUX.
Chapitre 3
Fonctions
La première ligne de cette définition est l’en-tête de la fonction. Dans cet en-
tête, type désigne le type de la fonction, c’est-à-dire le type de la valeur qu’elle
retourne. Contrairement à d’autres langages, il n’y a pas en C de notion de
procédure ou de sous-programme. Une fonction qui ne renvoie pas de valeur est
une fonction dont le type est spécifié par le mot-clef void. Les arguments de la
fonction sont appelés paramètres formels, par opposition aux paramètres effec-
tifs qui sont les paramètres avec lesquels la fonction est effectivement appelée.
Les paramètres formels peuvent être de n’importe quel type. Leurs identifica-
teurs n’ont d’importance qu’à l’intérieur de la fonction. Enfin, si la fonction ne
25
26 CHAPITRE 3. FONCTIONS
return ( expression ) ;
La valeur de expression est la valeur que retourne la fonction. Son type doit être
le même que celui qui a été spécifié dans l’en-tête de la fonction. Si la fonction
ne retourne pas de valeur (fonction de type void), sa définition s’achève par :
return ;
int n ;
void fonction () ;
void fonction ()
{
n ++;
printf ( " appel numero % d \ n " ,n ) ;
return ;
}
main ()
{
int i ;
for ( i = 0; i < 5; i ++)
3.4. DURÉE DE VIE DES VARIABLES 29
fonction () ;
}
}
n ++;
printf ( " appel numero % d \ n " ,n ) ;
return ;
}
main () {
int i ;
for ( i = 0; i < 5; i ++)
fonction () ;
}
Les variables locales a une fonction ont une durée de vie limitée a une seule
exécution de cette fonction. Leurs valeurs ne sont pas conservées d’un appel au
suivant.
Il est toutefois possible de créer une variable locale de classe statique en
faisant précéder sa déclaration du mot-clef static :
static type nom - de - variable ;
Une telle variable reste locale a la fonction dans laquelle elle est déclarée, mais sa
valeur est conservée d’un appel au suivant. Elle est également initialisée a zéro
a la compilation. Par exemple, dans le programme suivant, n est une variable
locale a la fonction secondaire fonction, mais de classe statique.
int n = 10;
void fonction () ;
void fonction ()
{
static int n ;
n ++;
printf ( " appel numero % d \ n " ,n ) ;
return ;
}
main () {
int i ;
for ( i = 0; i < 5; i ++)
fonction () ;
}