Title: Le langage C en une leon
1Le langage C en une leçon
2Mise en garde
- Un cours exhaustif sur le langage C est en
général une formation sur plusieurs jours à temps
complet - Les planches qui vont suivre sont destinées à
éclairer les syntaxes utilisées dans les projets
en langage C
3Ressources
- Support de cours de Patrick Corde sur le site de
l IDRIS www.idris.fr(chercher dans les
supports de cours sur les langages) - Ouvrage de référence The C programming
language , publié en 1978 par Brian Kernighan et
Dennie Ritchie, une seconde édition a été publiée
en 1988.
4Généralités
- Langage successeur du langage B dans les années
60, premières normes en 1978 puis norme ANSI en
1989 et ISO en 1990. - Langage de base sous UNIX
- Langage généraliste de syntaxe simple
- Langage compilé (et non interprété)
- Usage des pointeurs, récursivité
5Intérêts du langage (cf. IDRIS, P. Corde)
- Langage polyvalent permettant le développement de
systèmes d'exploitation, de programmes
applicatifs scientifiques et de gestion. - Langage structuré.
- Langage évolué qui permet néanmoins d'effectuer
des opérations de bas niveau (ltlt assembleur
d'Unix gtgt). - Portabilité (en respectant la norme !) due à
l'emploi de bibliothèques dans lesquelles sont
reléguées les fonctionnalités liées à la machine.
- Grande efficacité et puissance.
- Langage permissif
6Comment créer un programme exécutable ?
(fichiers sources)
1) Compilation
(fichiers objets)
2) Edition des liens
0) Ecriture des fichiers sources .c 1)
Compilation cc -c prog_principal.c (idem pour
les sous programmes) 2) Liens cc
prog_principal.o sous_prog1.o sous_prog2.o -o
prog_executable 3) Reste à lancer prog_executable
La procédure de compilation est souvent
automatisée à l aide d un fichier nommé
Makefile
7Types de variables manipulées en C
- Toutes les variables doivent être explicitement
typées (pas de déclaration implicite comme en
fortran) - Il y a globalement trois (quatre?) types de
variables - Les entiers int, short int, long int
- Les réels float, double, long double
- Les caractères char
- Rien void
- exemples short int mon_salaire double
cheese char avoileNB la présence d une
ou plusieurs étoiles devant le nom de la
variables indique un pointeur, dans nos
applications il s agira en général de
tableaux.ex double mat permet de définir une
matrice
8Les structures
- Il est possible de créer des ensembles de
variables regroupées sous le même nom, on parle
de variables agglomérées. - Exemple struct individu char nom30char
prenom50int age - Utilisation struct individu eleve,professeur,di
recteureleve.nom einstein eleve.prenom
albert eleve.age 25 - On peut utiliser des tableaux de structures, des
pointeurs de structures ...
9Le programme principal
- La fonction main contient le programme
principal - Le programme exécutable binaire commence par
exécuter les instructions de ce programme
principal - Sans fonction main, il est impossible de générer
un programme exécutable
10Structure d un programme
- Un programme est composé de plusieurs fonctions
qui échangent et modifient des variables - Chaque fonction, y compris la fonction main,
comprend les éléments suivants - Directives du préprocesseur
- Déclaration d objets externes (variables,
fonctions) - Interface de la fonction
- Bloc d instructions
11Exemple de fonction
/Directives du preprocesseur/ include
ltmath.hgt include ltstdio.hgt define MAX(a,b) ((a)
gt (b) ? (a) (b)) / Variables externes,
globales, déclarées dans le programme principal
/ extern double a extern long int
imax extern double rho extern double
fphy extern double fnum void flux_numerique
(void) / Interface de la fonction / / Debut
de bloc d instructions / long int i /
Variable locale / / Schema decentre /
for (i 0 i lt imax-1 i)
fnumi 0.5(fphyi fphyi1) -
0.5fabs(a)(rhoi1-rhoi) /
Fin de bloc /
12Quest-ce quun bloc d instructions ?
- Un bloc débute par une accolade ouvrante et se
termine par une accolade fermante - Il contient des déclarations de variables
internes au bloc et des instructions - Les instructions peuvent être elles aussi des
blocs ou des commandes du langage C. - Les lignes d instructions se terminent par des
points virgules.
13Directives du préprocesseur
- include ltmath.hgt insère les interfaces des
fonctions mathématiques comme par exemple fabs()
qui évalue la valeur absolue d un réel - include ltstdio.hgt entrées sorties standard
- define chaine1 chaine2 remplacement littéral
de la chaîne de caractères chaine1 par chaine2
14Interface d une fonction
- Syntaxe générale type_retourné
nom_de_fonction (paramètres)Le type retourné
ainsi que le type des paramètres définit
l interface ou le prototype de la
fonction.Exemples - void main(void)
- void sauve(double rho,long int imax,char
filename,long int num) - int somme(int a, int b)
- NB Si une fonction f1 fait appel à une fonction
f2, f1 doit avoir connaissance de linterface de
f2. Ceci se fait en rappelant linterface de f2
dans le fichier contenant f1 (voir le code
d advection linéaire)
15Boucles et branchements
- La boucle while while(test)
instructions - exemple
int i i 0
while (i lt 10) printf( i d
\n ,i) i
Tant que i est inférieur à 10, écrire i à
l écran, incrémenter i
16- La boucle do while do
instructions while (test) - permet d exécuter au moins une fois les
instructions avant d évaluer le test
17- La boucle for for (initialisation test
instruction) instructions - Exemple for (i 0 i lt 50 i)
printf( i d\n ,i)
Commencer à i 0, tant que i lt 50 ,
exécuter l instruction printf et incrémenter i
18Les tests
- Syntaxes
- if (expression_test) bloc d instructions 1Si
expression_test est vraie on exécute le bloc
d instructions 1, sinon on passe à la suite. - if (expression_test) bloc d instructions
1else bloc d instructions 2Si expression_test
est vraie on exécute le bloc d instructions 1
sinon on exécute le bloc 2.
19Tests (suite)
- Enchaînement de if if (expression_test1) bloc_d
_instructions_1else if (expression_test2) bloc_d
_instructions_2 else if (expression_test3) bloc_
d_instructions_3... else
bloc_d_instructions_final
20Expressions évaluées dans les tests
- if (a b) erreur fréquente, expression
toujours vraie ! - if (a b) a égal à b
- if (a ! b) a différent de b
- if (a gt b) a supérieur à b
- if ((a gtb)(agt0)) a supérieur ou égal à b et
a positif - if ((altb)(agt0)) a inférieur ou égal à b ou a
positif - ...
21Visibilité des variables
- Les variables déclarées à l intérieur du bloc
d une fonction sont visibles à l intérieur
du bloc uniquement - Le variables déclarées à l extérieur du bloc
d une fonction sont globales et accessibles à
toutes les fonctions du fichier en question
22- EXEMPLE tout le texte suivant est dans le même
fichierint a / variable globale a / void
fct1(double a) a 0.5 / Modif du paramètre
local a /void fct2(void) double aa
0.5 / Modif de la variable locale a /void
fct3(void) a 1 / Modif de la variable
globale a /
23Visibilité des variables (suite)
- Il peut être nécessaire que plusieurs fonctions
accèdent aux mêmes variables. Pour cela, ces
variables doivent être visibles des deux
fonctions. On peut alors - passer les variables en question dans les
paramètres des fonctions - travailler sur des variables externes globales
24Exemple variables globales
/ programme principal main.c / int a,b
/ Variables globales a et b / int
somme(void) / sous programme externe
/ void main(void) int c a 10.0 b 5.0 c
somme( ) / Appel au sous programme
externe /
Le sous programme somme n a pas de paramètres
car il va travailler sur les variables globales
a et b
25Exemple variables globales externes (suite)
/ sous programme somme.c dans un fichier
séparé du programme principal / extern int
a extern int b int somme(void) int c /
variables locale c / c a b return c
le calcul de la somme est effectué sur les
variables globales externes au fichier,
déclarées dans main.c
26Exemple passage de paramètres
/ programme principal main.c / int somme(int a,
int b) / prototype du sous programme
externe somme / void
main(void) int a,b,c / Variables locales
a, b et c / a 10.0 b 5.0 c somme( a,b)
/ Appel au sous programme externe /
La fonction somme dispose ici de deux
paramètres a et b
27Exemple passage de paramètres (suite)
/ sous programme somme.c / int somme(int a, int
b) int c / variable locale c / c a
b return c
Dans ce cas, les variables a et b ne sont pas
globales. On parle ici de passage d argument
par valeur le sous programme somme effectue
une copie locale des variables a et b que lui
transmet le programme principal et travaille
ensuite sur ces copies. Conséquence les
variables a et b sont locales au sous
programme somme.
28L allocation dynamique de mémoire(les tableaux)
- Le programme doit disposer d un espace mémoire
où ranger les éléments d un tableau - Il se peut qu on ne sache pas le nombre
d éléments à stocker dans un tableau avant
l exécution du programme. On a alors deux
solutions - On surdimensionne le tableau en question en
évaluant une taille maximale raisonnable de
celui-ci - On alloue dynamiquement la mémoire au moment où
on en a besoin (on peut aussi ensuite la
restituer) usage de la fonction malloc
29Allocation de mémoire (suite)
include ltstdlib.hgt void main(void) double
tab / déclaration d un tableau de taille
variable (en réalité c est un pointeur) /
double tabfixe50 / Tableau de taille fixe, 50
éléments / int imax imax 10 / taille
du tableau calculée à l exécution / tab
(double ) malloc((imax1)sizeof(double))
tab0 0.0 tab10 5.0 / tabi est le
ième élément du tableau / tabfixe5
tab0 ...
Réserver (imax1) espaces mémoire de la taille
d un réel de type double
On définit ainsi un tableau 1D nommé tab de
variables réelles en double précision. Les
indices valides des éléments vont de 0 à imax.
30Déclaration des tableaux à deux dimensions
(matrices)
- Il y a deux manières de déclarer les tableaux 2D
- On connaît a priori la taille du tableau ex
double tab5040définit un tableau nommé tab
de 50 par 40 éléments.Les indices vont de 0 à 49
pour la première dimension et de 0 à 39 pour la
seconde - On ne connaît pas la taille du tableau ex
double tab / Il faut ensuite allouer un
espace mémoire au tableau
/
31Déclaration d un tableau (suite)
? Le C ne manipule simplement que des tableaux
1D (des vecteurs). ? Il sensuit quun tableau
2D (matrice) sera considéré comme un vecteur
dont chaque élément est un vecteur. ? Ce
principe peut être étendu à des tableaux à n
entrées.
32Représentation d un tableau 2D
Pointeurs vers des vecteurs tableau 1D dont
chaque élément pointe vers un vecteur
tab24, tab2 est ladresse du début du
vecteur dindice 2, cest un pointeur vers
tab20
33Déclaration des tableaux (suite)
/Exemple de tableau avec allocation de mémoire
dynamique / double tab / déclaration
d un tableau 2D de réels / int imax,
jmax imax 50 jmax 40 / Allocation de
mémoire pour la première dimension / tab
(double) malloc((imax1)sizeof(double)) /
Allocation de mémoire pour la seconde dimension
/ for(i 0 i lt imax i) tabi (double
) malloc((jmax1)sizeof(double))
34Qu est-ce qu un pointeur ?
- Syntaxe on utilise l étoile , ex double
desneiges - Un pointeur contient l adresse ou est stockée la
variable de type pointeur dans l exemple
ci-dessus, desneiges est l adresse ou l on
stocke la variable desneiges de sorte que l on
peut écrire
desneiges 10.0 mais ce qui suit est
incorrect
desneiges 10.0 / erreur /car desneiges est
une adresse... - Les tableaux, comme nous l avons vu auparavant,
disposent d une syntaxe un peu particulière
35L opérateur de référence
- Lorsquune variable n a pas été déclarée en tant
que pointeur, on peut tout de même accéder à son
adresse à l aide de l opérateur Si on
définit une variable par double cheese ,
alors l adresse de cette variable est
cheese - Pour les tableaux, si on a défini double
tab , alors tab est l adresse du premier
élément du tableau soit tab00
36Les entrées sorties printf, scanf
- Le prototype de ces fonctions est dans ltstdio.hgt
- printf permet d afficher du texte à l écran
- scanf permet d entrer du texte au clavier
- fprintf et fscanf permettent de lire et d écrire
dans des fichiersLe programme de résolution de
léquation dadvection linéaire scalaire donne de
nombreux exemples dusage de ces fonctions
37printf, scanf (suite)
- Ces fonctions utilisent des formats qui
permettent de lire/écrire des variables de
différents types e , f réelsle, lf
réels de type doubled entiersld entiers
long ints chaîne de caractèresc un
caractère
38printf, scanf (suite)
- Le caractère \ (backslash) permet d utiliser
certains caractères non imprimables , les
plus utilisés sont les suivants \n fin de
ligne\t tabulation horizontale\a sonnerie
39printf, scanf exemples
includeltstdio.hgt int i printf(" i d
\n",i) / Imprime i valeur de i et va à la
ligne / fscanf(infile, "d ",i) / lit dans
le fichier infile la valeur de i,
on passe à fscanf
l adresse de i
c est à dire i / nb Comme fscanf doit
modifier la variable i, le paramètre passé à
la fonction est l adresse de la variable i.
40La suite ...
- Il reste de nombreux points à détailler
- boucles et branchement switch, break, goto,
continue - les fichiers le type FILE ...
- les bibliothèques standards stdio.h, math.h,
stdlib.h - les structures
- les pointeurs (pointeurs de structure, de
fonction ), - les conversions de type, typedef
- plus un peu de pratique.