Академический Документы
Профессиональный Документы
Культура Документы
Le C en 20 heures
II
Avant de commencer
Louvrage que vous tenez dans les mains ou que vous consultez sur votre
cran a pour objectif de vous faire dcouvrir, par la pratique, la programmation en langage C.
Il a t test par de nombreux tudiants qui navaient aucune connaissance pralable de ce langage. En 20 30 heures de travail, ils sont tous
parvenus au terme de leur apprentissage. Si vous ne connaissez encore
rien la programmation et que vous dsirez apprendre, vous serez donc
probablement trs intress(e) par le contenu de cet ouvrage : il est trs
facile daccs et destin aux grands dbutants.
Il existe une multitude de faons de programmer un ordinateur, qui
dpendent du matriel dont vous disposez, du systme dexploitation
que vous utilisez et du langage de programmation que vous choisirez.
Nous avons fait le choix dun systme dexploitation libre : G NU/Linux
et du langage C, trs rpandu, largement enseign, et finalement assez
simple dans ses constructions. Nanmoins, mme si vous nutilisez pas
G NU/Linux, vous pouvez sans risque vous lancer dans la lecture de cet
VI
VII
CHAPITRE
Premiers pas
1. Systme dexploitation et C
Pour pouvoir raliser des programmes en C, il est ncessaire de sappuyer sur un systme dexploitation. Le systme dexploitation utilis est
ici G NU/Linux. Nanmoins, la quasi-totalit de ce qui est dcrit ici peut
tre ralis en utilisant dautres systmes dexploitation.
Cet ouvrage nest pas une introduction lutilisation de G NU/Linux.
Nous nvoquerons donc que les outils ncessaires la programmation
en C.
Le C en 20 heures
Premiers pas
Le C en 20 heures
3. Exemple de programme
Voici un premier programme. Il est fonctionnel, mme sil nest pas normalis 1 . Il affiche le mot Bonjour lcran. laide de votre diteur de
texte (dans la fentre Scite donc), tapez le texte qui se trouve lintrieur
du cadre suivant :
main () {
puts ("Bonjour");
getchar ();
}
Premiers pas
4. Normalisation du programme
Jusqu prsent, nous avons fait un peu dans le sale . Nous nous en
rendrons compte en demandant au compilateur dtre plus bavard. Lancez
la commande :
gcc -o programme1 programme1.c -Wall
Le C en 20 heures
Les remarques du compilateur vous paraissent peut-tre peu comprhensibles (voire offensantes) et cest normal.
Loption de compilation -Wall permet de dclencher la production de
messages soulignant toute technique autorise mais discutable , en deux
mots : viter.
Nous allons donc normaliser ce programme.
Fondamentalement, le langage C nest quun nombre restreint dinstructions et un ensemble de bibliothques. Dans ces dernires, le compilateur trouve les fonctions et les applications qui lui permettent de crer
un programme excutable. Cest un peu ce que vous faites lorsque vous
recherchez dans une encyclopdie pour raliser un expos.
Certaines bibliothques (les plus courantes) sont incluses par dfaut ce
qui permet notre programme de se compiler 1 .
La fonction puts est stocke dans la bibliothque standard dentressorties, incluse par dfaut. Nanmoins, lutilisation dune bibliothque ncessite que nous informions le compilateur de notre souhait de lutiliser : il
suffit dajouter #include <fichier en-tte bibliothque> en
dbut de programme 2 .
Ainsi, puisque nous utilisons la fonction puts, qui est dans la librairie
standard dentres/sorties, nous indiquerons en dbut de programme 3 :
#include <stdio.h>
Un autre point corriger est lajout de la ligne return 0. Tout programme doit renvoyer une valeur de retour, tout la fin. Cette valeur de
retour permet de savoir si le programme que lon excute sest correctement termin. En gnral 0 signifie une terminaison sans erreur. Enfin, il
1. Pour tre exact, cest ldition de liens qui a ici le mrite de fonctionner.
2. Le nom ajout ici nest pas exactement celui de la bibliothque, mais celui du fichier
den-tte (lextension .h est mis pour le mot anglais header qui signifie en-tte) qui correspond la bibliothque.
3. stdio vient de STanDard Input Output.
Premiers pas
Le C en 20 heures
ARG. */
list ARG. */
__format,
ARG. */
7. Complments
Explicitons notre programme :
#include <stdio.h>
int main () {
puts ("Bonjour");
getchar (); /* Permet dattendre la frappe dune touche */
return 0;
}
Premiers pas
8. Squelette de programme
On peut dfinir le squelette dun programme C de la faon suivante :
/* Dclaration des fichiers denttes de bibliothques */
int main () {
/* Dclaration des variables (cf. chapitres suivants...) */
/* Corps du programme */
getchar(); /* Facultatif mais permet
dattendre lappui dune touche */
return 0; /* Aucune erreur renvoye */
}
9. Blocs
La partie de programme situe entre deux accolades est appele un bloc.
On conseille de prendre lhabitude de faire une tabulation 1 aprs laccolade. Puis retirer cette tabulation au niveau de laccolade fermante du bloc.
Ainsi, on obtient :
int main () {
Tabulation
Tout le code est frapp cette hauteur
}
Retrait de la tabulation
Tout le texte est maintenant frapp cette hauteur.
Cette mthode permet de contrler visuellement la fermeture des accolades et leurs correspondances 2 .
10. Commentaires
Bien commenter un programme signifie quune personne ne connaissant
pas votre code doit pouvoir le lire et le comprendre. Les commentaires
1. La touche de tabulation TAB est la touche du clavier gauche de la touche A .
Cette touche sert dcaler le texte.
2. Sous Scite, CTRL + E permet didentifier laccolade associe celle pointe.
10
Le C en 20 heures
sont indispensables dans tout bon programme. Ils peuvent tre placs
nimporte quel endroit. Ils commencent par /* et se terminent par */ :
/* Commentaire */
Premiers pas
11
13. retenir
lissue de ce chapitre, il serait souhaitable de :
Se souvenir que lditeur que lon utilise dans cet ouvrage sappelle
Scite ;
Connatre les fonctions puts et getchar qui apparaissent dans le
programme suivant :
#include <stdio.h>
int main () {
puts ("Bonjour");
getchar (); /* Permet dattendre la frappe dune touche */
return 0;
}
CHAPITRE
Variables (partie 1)
Les programmes prcdemment raliss taient statiques sans aucune variation et ne peuvent tre donc
dune grande utilit. Il nous faut donc maintenant voir
comment rendre ces programmes dynamiques, en introduisant la notion de variable.
Allez votre rythme, limportant est de comprendre. . .
1. Objectif
Afin de stocker des valeurs, calculer, effectuer un traitement quelconque, il est ncessaire denregistrer de manire temporaire des donnes.
Cet enregistrement ncessite la dclaration dun lieu de la mmoire qui
servira ce stockage : une variable.
13
14
Le C en 20 heures
3. Notion de variable
Comme son nom lindique, une variable est quelque chose qui varie.
Cest vrai mais ce nest pas suffisant. Une variable peut tre considre
comme une bote dans laquelle on met des donnes. Il est possible de lire
le contenu de cette bote ou dcrire des donnes dans celle-ci.
La manire la plus immdiate de lire le contenu dune variable est de
simplement mentionner son nom.
La faon la plus simple daffecter une valeur une variable est loprateur daffectation =.
Essayer dutiliser une variable laquelle nous navons
encore affect aucune valeur peut donner nimporte quel
rsultat (si on affiche le contenu dune variable non initialise par exemple, on pourra obtenir nimporte quelle
valeur lcran).
15
Variables (partie 1)
5. Application : exemples
Premier exemple, avec des variables du type entier
Lisez le programme, ainsi que les explications associes.
#include <stdio.h>
int main () {
int i; /* i : variable de type entier */
int j; /* j : variable de type entier */
i=22; /* i vaut 22 */
j=i; /* on recopie la valeur de i dans j */
/* donc j vaut aussi 22 prsent */
printf ("i vaut %d\n", i);
/* Affiche la valeur de i */
16
Le C en 20 heures
17
Variables (partie 1)
18
Le C en 20 heures
une correspondance entre les lettres (que nous autres, tres humains,
comprenons) et leur codage par la machine. En rsum, chaque fois
que nous manipulerons la lettre A, pour lordinateur, il sagira de la
valeur numrique 65. . .
7. Exercices
Dans les exercices qui suivent, vous devez utiliser ce que nous venons
de voir sur les variables, les caractres, et sur printf.
Exercice n1 Dclarer, afficher (a)
Dclarez des variables avec les valeurs suivantes 70, 82,
185 et 30 puis affichez le contenu de ces variables.
Exercice n2 Dclarer, afficher (b)
Faites la mme chose avec les caractres c, o, u, C, O, U.
Une fois que vous avez votre propre solution, comparez avec celle qui
se trouve la fin du chapitre. . .
Variables (partie 1)
19
9. Caractres spciaux
Certains caractres ( % par exemple) ncessitent dtre prcds par
le caractre \ pour pouvoir tre affichs ou utiliss.
Pour afficher un % avec printf, nous cririons :
printf("La rduction tait de 20\%");
20
Le C en 20 heures
10. Exercices
Exercice n4 Okay !
Ralisez un programme qui permet dobtenir laffichage
suivant :
C
e
s
t
Ok i vaut : 1
("i
("a
("b
("c
return 0;
}
vaut
vaut
vaut
vaut
%d.\n",i);
%d.\n",a);
%d.\n",b);
%d.\n",c);
21
Variables (partie 1)
("a
("b
("c
("d
("e
("f
vaut
vaut
vaut
vaut
vaut
vaut
%c.\n",a);
%c.\n",b);
%c.\n",c);
%c.\n",d);
%c.\n",e);
%c.\n",f);
return 0;
}
22
car = e;
printf ("\n%c",car);
car = s;
printf ("\n%c",car);
car = t;
printf ("\n%c",car);
printf ("\nOk i vaut : %d\n",i);
return 0;
}
12. retenir
Exemples de types de variables :
char permet de dfinir une variable de type caractre.
int permet de dfinir une variable de type entier.
Le C en 20 heures
CHAPITRE
Variables (partie 2)
Les quelques dfinitions de variables vues prcdemment nous ont permis de dfinir des caractres et des
nombres. Mais que seraient les nombres sans les mathmatiques et sans une bonne calculatrice ? quoi
nous serviraient ces programmes si nous devions saisir les variables dans nos codes ?
1. Objectif
Dans ce chapitre nous allons utiliser le langage C comme une simple
calculatrice et faire des additions, des multiplications. . .
Nous allons voir quafin de pouvoir utiliser la bibliothque mathmatique du langage C (#include <math.h>), il est ncessaire dajouter au
moment de la compilation 1 : -lm (lisez bien `m) ; ce qui nous donne :
1. Pour tre prcis, cest plutt ltape ddition de liens qui ncessite cette option, mais
nous y reviendrons. . .
23
24
Le C en 20 heures
Exercice n2 Somme
Compltez le programme prcdent en :
dclarant 2 variables a et b de type int (entier) ;
assignant ces deux variables les valeurs 36 et 54 ;
faisant afficher le rsultat de la somme de a+b (attention, ncrivez pas le rsultat 90 dans votre programme !).
Pour faire afficher le rsultat, il est possible dutiliser la fonction
printf en utilisant une troisime variable. Mais pour tre plus concis,
Variables (partie 2)
25
26
Le C en 20 heures
Vous pouvez tester ce programme et vous vous apercevrez que curieusement, le programme se finit alors que
vous navez mme pas eu le temps dappuyer sur la
Variables (partie 2)
27
28
Le C en 20 heures
Variables (partie 2)
Notez que pour utiliser ces deux fonctions mathmatiques, il faut ajouter #include <math.h> dans le source
et ajouter loption -lm dans la commande de compilation.
Exercice n6 Absolument !
Utilisez cette dernire fonction pour calculer la valeur
absolue de (a-b).
Exercice n7 Arrondissez
La fonction ceilf permet dobtenir larrondi entier suprieur dun flottant. Utilisez cette fonction pour calculer
larrondi suprieur de (a/b).
29
30
Corrig de lexercice n2 Somme
#include <stdio.h>
#include <math.h>
int main () {
int a,b;
a=36;
b=54;
printf("Valeur de a+b : %d\n",a+b);
getchar();
return 0;
}
Le C en 20 heures
Variables (partie 2)
31
32
Le C en 20 heures
8. retenir
#include <stdio.h>
// ne pas oublier pour lutilisation des fonctions mathmatiques
#include <math.h>
int main () {
float pi=3.14159;
int i=10;// dclaration + initialisation
int j;// dclaration seule (pas dinitialisation)
// Attention, bien mettre %f et non pas %d
printf ("pi vaut environ: %f",pi);
printf("\n i vaut:%d\n",i);
printf("\n entrez une valeur:");
scanf("%d",&j);// Attention ne pas oublier le &
printf("\n vous venez dentrer %d",j);
return 0;
}
CHAPITRE
Conditions
1. Objectif
Dans ce chapitre, nous allons voir comment introduire des conditions
dans nos programmes, de manire ce que selon les circonstances, telle
ou telle partie du code soit excute.
33
34
Le C en 20 heures
a2 + b2
Conditions
35
Une fois que vous tes satisfait(e) de votre solution, vous pourrez comparer avec la solution qui se trouve la fin de ce chapitre.
Les conditions sexpriment avec des oprateurs logiques dont nous allons expliquer tout de suite la signification et lutilisation.
36
Le C en 20 heures
4. Oprateurs de comparaison
Les oprateurs de comparaison servent comparer deux nombres entre
eux :
Signification
Infrieur
Suprieur
gal
Diffrent
Infrieur ou gal
Suprieur ou gal
Oprateur
<
>
==
!=
<=
>=
37
Conditions
5. Oprateurs logiques
Les oprateurs logiques permettent de combiner des expressions logiques.
Libell
Et (and)
Ou (or)
Non (not)
Oprateur
&&
||
!
6. Vrai ou faux
La valeur Vrai peut tre assimile la valeur numrique 1. En programmation C, la valeur Vrai est associe toute valeur non nulle.
La valeur Faux peut tre assimile la valeur numrique 0.
Loprateur Ou (||) correspond alors une addition :
Ou
Vrai
Faux
Vrai
Vrai
Vrai
Faux
Vrai
Faux
+
1
0
1
2
1
0
1
0
38
Le C en 20 heures
Vrai
Vrai
Faux
Faux
Faux
Faux
*
1
0
1
1
0
0
0
0
39
Conditions
Par exemple :
int i1=1;
int i2=0;
printf("i1 || i2 = %d",i1||i2);
/* affichera 1 car : vrai||faux=vrai et vrai vaut 1 */
printf("i1 && i2 = %d",i1&&i2);
/* affichera 0 car : vrai&&faux=faux et faux vaut 0 */
printf("contraire(1)=%d",!(1));
/* affichera 0 car : !(vrai)=faux et faux vaut 0 */
7. Combinaison
Toutes les oprations logiques peuvent se combiner entre elles. Il faut
nanmoins veiller aux diffrentes priorits des oprateurs et il faut que la
condition dans sa totalit soit entoure de ().
Les exemples suivants montrent ce qui est possible et ce qui ne lest
pas :
Correct
if (car == a)
Incorrect
if car == a
Correct
if ( car == a || car == A)
Incorrect
if (car == a) || (car == A)
Correct
Incorrect
if (c == a || c == A) && (c2 == G)
40
Le C en 20 heures
Dans
limmdiat,
(er) ! ! !
prfrez
if (err !=0)
if
8. Accolades
Les accolades entourant les blocs dinstructions dune condition
peuvent tre omises si le bloc nest constitu que dune seule instruction.
Voici une version lourde :
/* VERSION LOURDE : */
if (car == b) {
printf ("car vaut b.");
}
else {
printf ("car est diffrent de b.");
}
Conditions
9. Exercices
41
42
Le C en 20 heures
Conditions
43
if (a > 0)
printf("la variable a est positive\n");
/* Sinon a est nulle */
else
printf("la variable a est nulle\n");
}
getchar ();
return 0;
}
11. retenir
La valeur Vrai peut tre assimile la valeur numrique 1 ou toute
valeur non nulle.
La valeur Faux peut tre assimile la valeur numrique 0.
Ne pas oublier les parenthses lorsquil y a un if :
if a > 0 // ne sera pas compil !!!
printf ("Valeur positive");
else
printf ("Valeur ngative");
44
if (a > 0)
printf ("Valeur positive");
else
printf ("Valeur ngative");
Le C en 20 heures
CHAPITRE
Mise au point
1. Objectif
Lobjet de ce chapitre est de raliser une pause dans lapprentissage du
C et de sattacher ce que lon est capable de raliser avec le peu de
moyens que lon a.
Ce chapitre est constitu de trois exercices de difficult croissante. Ils
nous permettront dapprendre utiliser une nouvelle fonction et de raliser un exercice complet de programmation.
45
46
Le C en 20 heures
Par exemple :
si (nbre_saisi < 10)
alors crire "plus petit"
getchar();
char car;
car = getchar();
47
Mise au point
48
Le C en 20 heures
49
Mise au point
5. Oprateur modulo
Loprateur qui donne le reste de la division entire (oprateur modulo)
est not % en C. Ainsi, 10%2 vaut 0 car la division entire de 10 par 2
donne 5 et il ny a pas de reste. En revanche, 10%3 vaut 1 car la division
entire de 10 par 3 donne 3 et il reste 1.
Par exemple :
int z;
z=10%2;
printf("10 modulo 2=%d\n",z);
z=10%3;
printf("10 modulo 3=%d\n",z);
. . . va nous afficher :
10 modulo 2=0
10 modulo 3=1
6. Nombres pseudo-alatoires
Voici un petit exemple de programme qui permet dobtenir des nombres
pseudo-alatoires entre 0 et 99 :
#include <stdio.h>
#include <stdlib.h> // sert pour les fonctions
, srand et rand
#include <time.h>
int main() {
int nb_alea=0;
/* Initialisation du gnrateur de nombres
base sur la date et lheure */
srand (time (NULL));
50
Le C en 20 heures
srand (time (NULL)) permet dinitialiser le gnrateur de nombres pseudo-alatoire. Nous reviendrons
sur ce point par la suite.
rand() renvoie un nombre entier compris entre 0 et
RAND_MAX.
rand()%100 est donc le reste de la division entire
dun nombre pseudo-alatoire (ventuellement trs
grand) par 100, cest dire un nombre compris entre
0 et 99. . .
#include <stdio.h>
#include <stdlib.h>
int main() {
/* Pour notre information */
printf ("RAND_MAX : %ld\n", RAND_MAX);
return 0;
}
Mise au point
Cest plus !
Entrez votre nombre: 25
Cest moins !
...
Gagn !!!
51
52
Le C en 20 heures
}
while (valeur != 10);
return 0;
}
CHAPITRE
Nous savons maintenant raliser de nombreux programmes, or malgr tout, les outils nous manquent
pour raliser toutes les tches que nous souhaiterions.
53
54
Le C en 20 heures
1. Objectifs
Vous trouverez beaucoup dexercices dans ce chapitre o plusieurs
petites aides de programmation seront donnes notamment en ce qui
concerne lincrmentation et la dcrmentation dune variable.
2. Boucle While
De la mme faon que :
do {...} while(condition);
char car = ;
while ((car != s) && (car != S)) {
car = getchar ();
}
Donne seule, la ligne : while(condition); signifie tant que condition est vraie, on revient
la mme ligne soit sur soi mme.
Si la condition est toujours vraie, on tombe alors dans un
puits (le programme reste bloqu). Sinon, on passe immdiatement la ligne/instruction suivante.
55
Exercice n1 Touche-touche
Traduisez en langage C, compltez avec les variables ncessaires, compilez, excutez, comprenez :
Faire
Saisir une touche
Tant Que (touche != S) et (touche != s)
4. Fonction toupper()
Le problme de la comparaison de la minuscule et de la majuscule de
lexercice 1 peut tre contourn par lutilisation de la fonction toupper
qui transforme un caractre minuscule en majuscule. Pour lutiliser, il faut
inclure le fichier den-tte ctype.h par : #include <ctype.h>.
La fonction toupper sutilise de la faon suivante :
#include <stdio.h>
#include <ctype.h>
int main () {
char car;
char car_min;
car_min = a;
car = toupper (car_min);
printf ("%c",car);
56
Le C en 20 heures
return 0;
}
Ce programme affichera : A
int i;
i=1;
i=i+1;
printf("i vaut: %d",i); // affichera 2
57
(ici 1) et lui ajoute 1. Le rsultat est stock dans la case mmoire associe
i. Finalement, i vaudra 2.
Pour gagner du temps, le langage C nous permet de remplacer une expression comme : i=i+1 par lexpression suivante : i++ qui fera exactement la mme chose.
int i;
i++; /* Incrmente le compteur i */
i--; /* Dcrmente le compteur i */
7.
58
Le C en 20 heures
8. Incrmentations, pr-incrmentations. . .
Nous avons vu quincrmenter dsignait la mme chose quaugmenter
la valeur dune variable de 1 :
i++; i=i+1;
59
60
Le C en 20 heures
ou bien :
#include <stdio.h>
int main () {
int nbre = 0;
printf("Tapez un chiffre impair pour arrter ...\n");
61
62
Le C en 20 heures
63
64
Le C en 20 heures
10. retenir
Voici un exemple de programme qui rsume ce qui a t vu dans ce
chapitre. Ce programme doit afficher lcran tous les nombres pairs infrieurs 100 :
#include <stdio.h>
int main () {
int i=0;
while (i != 100) {
if (i%2==0) /* reste de la division de i par 2 */
printf("%d ",i);
/* pas de else ni de {} ici, cest inutile...*/
i++;
}
return 0;
}
CHAPITRE
Boucles
1. Objectifs
Dans ce chapitre, nous tudierons la possibilit de raliser des actions
un certain nombre de fois.
66
Le C en 20 heures
Par souci de simplicit, nous dirons simplement que la suite dinstructions suivante :
for (i=0; i<15; i++) {
instr;
}
3. Syntaxe
De la mme faon que le if, le for ne ncessite pas daccolades sil
ny a quune instruction rpter.
67
Boucles
par :
for (i=0; i<15; i++)
printf ("Je me rpte pour i valant %d\n",i);
Par exemple :
#include <stdio.h>
int main () {
int i;
int j;
for (i=0; i<5; i++){
printf("\nJe suis dans la boucle i, i vaut %d\n"
, ,i);
for (j=3; j>0; j--)
printf("Je suis dans la boucle j, j vaut %d\n"
, ,j);
}
return 0;
}
68
Le C en 20 heures
Exercice n1 toiles
En utilisant une double boucle, crire un programme qui
affiche une toile, passe la ligne, affiche deux toiles,
passe la ligne, affiche trois toiles. . . jusqu cinq toiles
afin dobtenir ceci :
*
**
***
****
*****
69
Boucles
Instructions :
Affichage du tronc
Exercice n3 Tronc
Pour poursuivre le sapin, il nous faut maintenant dessiner le tronc. crivez la suite du programme en dessinant
le tronc laide du caractre @. Vous devriez obtenir ceci
(juste pour le tronc) :
@@@
@@@
@@@
6. Table Ascii
Les codes Ascii (cest--dire les nombres qui reprsentent les caractres
en informatique) vont de 0 255.
Exercice n4 Code Ascii
crivez un programme qui fait afficher, sur des lignes
successives, les codes A SCII avec les caractres qui leur
70
Le C en 20 heures
correspondent (vous pouvez commencer laffichage partir du code 32 et vous arrter au code 127).
Pour faire afficher le caractre associ un code A SCII,
vous utiliserez linstruction ci-dessous (le %3d signifie que
le nombre va tre affich en utilisant un emplacement qui
fait trois caractres de long) :
printf ("%3d : %c", code_ascii,
code_ascii) ;
Par exemple :
int i = 65;
printf("%3d : %c", i, i); // affichera 65 : A
Boucles
71
72
Corrig de lexercice n4 Code Ascii
#include <stdio.h>
#include <stdlib.h>
int main () {
int i;
int j;
for (i=32; i<128; i++)
printf("%3d %c\n",i,i);
return 0;
}
Le C en 20 heures
Boucles
8. retenir
Retenez lquivalence entre les deux programmes suivants :
for (i=1; i<100; i=i+2) {
printf("i vaut:%d",i);
}
i=1;
while (i<100) {
printf("i vaut:%d",i);
i=i+2;
}
73
CHAPITRE
Pointeurs et fonctions
1. Objectifs
Dans ce chapitre, nous manipulerons deux notions essentielles du langage C : les pointeurs et les fonctions. . .
75
76
Le C en 20 heures
2. Binaire, octets. . .
Binaire
Lordinateur ne comprend que des 0 et des 1. On dit quil travaille
en base 2 ou binaire (tout simplement parce que ce systme de numration est particulirement adapt la technologie lectronique utilise pour
construire les ordinateurs). Au contraire des machines, les humains prfrent gnralement la base 10, cest dire le systme dcimal.
La table ci-dessous donne lcriture binaire et dcimale de quelques
nombres.
Binaire
Dcimal
0
1
10
11
100
101
110
111
1000
1001
1010
0
1
2
3
4
5
6
7
8
9
10
...
255
...
11111111
Nous voyons dans cette table que le nombre 7 est donc reprsent par
trois symboles 1 qui se suivent : 111.
Chacun de ces 1 et 0 sappelle un bit (contraction
de langlais binary digit : chiffre binaire). Par exemple, le
nombre 1010001 est compos de 7 bits.
77
Pointeurs et fonctions
Base 10
0
2
4
6
8
10
12
14
Base 16
1
3
5
7
9
B
D
F
Base 10
1
3
5
7
9
11
13
15
78
Le C en 20 heures
Pointeurs et fonctions
79
80
Le C en 20 heures
ptr_car = &car ;
*ptr_car = E ;
printf ("%c",car) ;
car
ptr_car
C
100
?
110
81
Pointeurs et fonctions
car
ptr_car
C
100
100
110
Finalement, la ligne :
*ptr_car = E; /* on modifie le contenu de ladresse mmoire */
car
ptr_car
E
100
100
110
82
Le C en 20 heures
Exercice dapplication
Exercice n1 Intelligent
Ralisez un programme quivalent qui change une valeur numrique (int) de 10 35.
Pointeurs et fonctions
83
return 0;
}
Nous verrons par la suite que dans certains cas, on ne peut pas se passer des pointeurs, notamment pour certaines manipulations au sein des
fonctions. . .
4. Fonctions
Une fonction est un petit bloc de programme qui limage dune industrie va crer, faire ou modifier quelque chose. Un bloc de programme est
mis sous la forme dune fonction si celui-ci est utilis plusieurs fois dans
un programme ou simplement pour une question de clart. De la mme
manire que nous avions dfini la fonction main, une fonction se dfinit
de la faon suivante :
<type de sortie> <nom de la fonction> (<paramtres dappels>) {
Dclaration des variables internes la fonction
Corps de la fonction
Retour
}
Comme indiqu prcdemment, il ne faut pas mettre les < et >, qui ne sont
l que pour faciliter la lecture.
Voici un exemple de fonction qui renvoie le maximum de deux
nombres :
int maximum (int valeur1, int valeur2) {
int max;
if (valeur1<valeur2)
max=valeur2;
else
max=valeur1;
return max;
}
84
Le C en 20 heures
05. if (valeur1<valeur2)
06.
max=valeur2;
07. else
08.
max=valeur1;
09. return max;
10. }
11.
12. int main () {
13. int i1,i2;
14. printf("entrez 1 valeur:");
15. scanf("%d",&i1);
16. printf("entrez 1 valeur:");
17. scanf("%d",&i2);
18. printf("max des 2 valeurs :%d\n",maximum(i1,i2));
19. return 0;
20. }
Pointeurs et fonctions
85
Type void
Le mot void signifie vide. Le type void est notamment utilis comme
type de sortie pour les fonctions qui ne retournent aucun rsultat (quon
appelle aussi procdures).
Exemple :
/* Fonction affichant un caractre */
void affiche_car (char car) {
printf ("%c",car);
}
86
Le C en 20 heures
87
Pointeurs et fonctions
return 0;
}
88
Le C en 20 heures
Il faut donc retenir que les paramtres dune fonction sont passs par
valeur et que modifier ces paramtres ne modifie que des copies des variables dorigine.
Pour pouvoir modifier les variables dorigine, il ne faut plus passer les
paramtres par valeur, mais par adresse, en utilisant les pointeurs, comme
cest le cas dans lexemple qui suit.
#include <stdio.h>
void avance_Position (int* pointeur_int) {
*pointeur_int = *pointeur_int + 2;
}
int main () {
int x=0;
printf("Position de dpart : %d\n",x);
avance_Position (&x);
printf("Nouvelle position : %d\n",x);
return 0;
}
Nom de la variable
Contenu mmoire
Adresse mmoire (0x)
pointeur_int
10
20
89
Pointeurs et fonctions
appel
de
la
fonction
Nom de la variable
Contenu mmoire
Adresse mmoire (0x)
x
0
10
pointeur_int
10
20
90
Le C en 20 heures
Nanmoins, la bonne pratique (celle qui donne les programmes les plus
simples comprendre et les plus faciles dboguer) serait dcrire :
#include <stdio.h>
int calcule_double (int a){
a=a+a;
return a;
}
int main () {
int i=2;
i=calcule_double(i);
printf("i vaut prsent :%d",i);
return 0;
}
Exercice n2 Encore un
Modifiez le programme prcdent afin davoir disposition une fonction qui prend en paramtre un pointeur vers
un entier et modifie lentier point en lui ajoutant 1.
Pointeurs et fonctions
91
92
Le C en 20 heures
return y;
}
int main () {
int i1,i2;
i1=123;
i2=1267;
printf("max : %d\n",max(i1,i2));
printf("min : %d\n",min(i1,i2));
return 0;
}
on lui prfrera la version suivante o les prototypes des fonctions disponibles figurent en dbut de code (un peu comme une table des matires) :
#include <stdio.h>
/* PROTOTYPES : */
int max (int x, int y);
int min (int x, int y);
int max (int x, int y) {
if (x<y)
return y;
else
return x;
}
int min (int x, int y) {
if (x<y)
return x;
else
return y;
}
int main () {
int i1,i2;
i1=123;
i2=1267;
printf("max : %d\n",max(i1,i2));
printf("min : %d\n",min(i1,i2));
return 0;
}
Pointeurs et fonctions
93
94
Le C en 20 heures
}
// Dessin du tronc du sapin
void tronc (int pos_t) {
int i=0, j=0;
for (j=1; j<=3; j++) {
for (i=1; i<=pos_t; i++)
printf (" ");
printf ("@@@\n");
}
}
int main () {
int nb_lig = 15;
ramure (nb_lig);
tronc (nb_lig - 2);
return 0;
}
6. retenir
Les diffrentes bases de numration
Il est souhaitable de retenir que :
Pointeur
Un pointeur est une variable faite pour contenir une adresse mmoire,
souvent ladresse dune autre variable.
Structure dun programme C
Pour finir, voici deux programmes qui reprennent lessentiel de ce qui a
t vu :
Pointeurs et fonctions
#include <stdio.h>
int main () {
int i=100;
int *pointeur_sur_i=NULL;
pointeur_sur_i=&i;
*pointeur_sur_i=200;
printf ("i vaut prsent %d\n",i);
return 0;
}
95
CHAPITRE
Vous tes dornavant capable de dcouper un problme en morceaux de manire le rendre plus simple
et plus facilement transformable en langage C. Par
ailleurs, les pointeurs vous ont permis de toucher de
loctet et le fonctionnement intrinsque de la mmoire.
Pour autant, nous pouvons remarquer que nous avons
laiss jusqualors une structure de ct, et que nous
utilisons tous les jours : les mots ou les phrases. Eh
bien ! les voici.
1. Objectifs
En C, une chane de caractres est quivalente un tableau de caractres.
Ce chapitre introduit ces deux notions (chanes et tableaux) tout en vous
faisant approcher de la gestion de la mmoire.
97
98
Le C en 20 heures
2. Tableaux
Dfinition
Un tableau est un ensemble dlments rangs en mmoire dans des
cases conscutives.
Numro de case
Contenu
0
A
1
B
2
C
3
D
4
E
5
F
6
G
7
H
Utilisation
On accde une case du tableau en mettant le nom du tableau, suivi
dun crochet ouvrant [ puis un numro de case et un crochet fermant :
] . Cela donne, par exemple :
99
/* dclarations */
int tab_int[10]; /* tableau de 10 cases (0 9)
dentiers */
char tab_char[10]; /* tableau de 10 cases (0 9)
de caractres */
/* utilisation */
tab_char[3]=C; /* Initialisation de la case 3
(la quatrime) de tab_char */
tab_int[6]=10; /* Initialisation de la case 6
(la septime) de tab_int */
tab_int[7]=tab_int[6] * 2; /* La case 7 (la huitime)
contiendra donc 20 (10*2) */
3. Chanes de caractres
Les chanes de caractres sont des tableaux de caractres suivis du 0
(zro ; ne pas confondre avec le caractre O de Oscar par exemple. . . )
qui est considr lui aussi comme un caractre. Une chane scrit donc :
contenu utile de la chane + valeur 0.
Eric scrit dans un tableau de 5 caractres de la faon suivante (lusage du \0 sera expliqu par la suite) :
Caractre
Code A SCII
Case
\0
69
114
105
99
100
Le C en 20 heures
De cette faon, la chane fera exactement la longueur ncessaire pour stocker Eric et le 0 final soit 4+1=5 octets.
Affichage dune chane de caractres
Une chane de caractres saffiche grce la commande printf et le
format %s.
Ainsi :
printf("%s",chaine);
101
#include <stdio.h>
#include <string.h>
int main () {
char ch [] = "toto" ;
printf("La longueur de %s est : %d",ch,strlen(ch));
return 0;
}
On voit donc que tab et &tab[0] sont gaux. En revanche, le programme suivant est incorrect :
char tab[10];
tab="coucou";
102
Le C en 20 heures
#include <stdio.h>
#include <string.h>
int main(void) {
char line[80];
strcpy(line,"un exemple de chaine initialise...");
printf ("%s\n",line);
return 0;
}
Une
recopie
de
la
chane
un exemple de chaine
initialise... caractre par caractre est effectue en dmarrant ladresse o line se trouve stocke en mmoire (le \0 final est
copi lui aussi).
Enfin, si lon souhaite lire une chane directement au clavier, on peut
utiliser la fonction scanf :
#include <stdio.h>
int main(void) {
char line[80];
printf("veuillez entrer votre chaine:");
scanf("%s",line);
/* scanf("%s",&line[0]) ferait la mme chose */
printf("la chaine saisie vaut :%s",line);
return 0;
}
Notons que les chanes de caractres saisies de cette manire ne peuvent comporter ni espaces, ni tabulations.
Exercice
Exercice n1 Affichez une chaine de caractres
Lisez lintgralit de lexercice avant de dmarrer. . .
En utilisant une boucle for, remplissez un tableau de
10 caractres avec les lettres de lalphabet en commenant par A (code A SCII 65) ; le tableau devra donc
contenir ceci :
103
Case
9 10
Contenu A B C D E F G H I J 0
104
Le C en 20 heures
for (i=A;i<=Z;i++){
tab_alpha[pos_tab]=i;
pos_tab++;
}
tab_alpha[26]=0;
printf("%s\n",tab_alpha);
return 0;
}
105
gets( line );
/* La frappe de lutilisateur sera enregistre dans
line, on suppose quil ne frappera pas plus de
80 caractres, sinon les problmes vont commencer */
printf( "\nLa chane saisie est : \n%s\n", line );
return 0;
}
Notons quil ny a quun seul passage la ligne (celui affich par la fonction printf).
Passage dune chane de caractres en paramtres
Pour passer un tableau (et donc une chane de caractres) en paramtre
une fonction, nous devons simplement donner ladresse du dbut du
tableau. Les deux fonctions suivantes sont donc quivalentes :
int ma_saisie (char chaine[]) {
/* ...Faire ce quil faut... */
return 0;
}
int main () {
char ma_chaine [30];
ma_saisie (ma_chaine);
return 0;
}
106
Le C en 20 heures
107
La fonction strncpy
La fonction strncpy (<s>, <t>, <n>) est presque similaire
strcpy mais copie au plus <n> caractres de la chane <t> au dbut
de <s>.
#include <stdio.h>
#include <string.h>
int main () {
char chaine1[20]="Bonjour ";
char chaine2[20]="Edouard";
strncpy(chaine1,chaine2,2); /* recopie 2 caractres de chaine2
ladresse de chaine1 */
printf("%s\n",chaine1);
return 0;
}
. . . affichera :
Ednjour
La fonction strncat
La fonction strncat (<s>, <t>, <n>) ajoute au plus <n> caractres de la chane <t> la fin de <s>.
#include <stdio.h>
#include <string.h>
int main () {
char chaine1[20]="Bonjour ";
char chaine2[20]="Edouard";
strncat(chaine1,chaine2,2); /* ajoute les 2 premiers caractres
de chane2 la fin de chaine1 */
printf("%s\n",chaine1);
return 0;
}
. . . affichera :
Bonjour Ed
108
Le C en 20 heures
La fonction strcmp
La fonction strcmp (<s>, <t>) compare les chanes de caractres
<s> et <t> de manire lexicographique et fournit un rsultat :
nul (0) si <s> est gale <t>
ngatif si <s> prcde <t>.
Par exemple, strcmp("AAAA","BBBB") renverrait -1
positif si <s> suit <t>.
Par exemple, strcmp("BBBB","AAAA") renverrait +1
Les fonctions sprintf et sscanf
Nous terminerons par deux fonctions trs utiles : sprintf et sscanf.
sprintf(<chaine cible>,<chaine de
formatage>,<expr1>,<expr2>,...)
109
5. Tableaux 2 dimensions
Un tableau 2 dimensions se dclare de la faon suivante :
<type> <nom du tableau> [<taille dimension 1>]
[<taille dimension 2>] ;
Par exemple :
int table[5][5]; /* reprsente un tableau dentiers de 5
lignes et 5 colonnes.*/
Ou bien :
float tab[3][2]= {{ 1.2, -1.3 },
{ 8.5, 12.4 },
{ -123.0, 4.0 }};
110
Le C en 20 heures
111
6. Zro
Nous en avons souvent parl de cette valeur 0 et nous allons y consacrer
un petit paragraphe tellement il peut nous jouer des tours.
Quels sont les zros que nous avons rencontrs ?
Le caractre "0"
Il y a le caractre zro, caractre au code ASCII dfini par la valeur
dcimale 48.
#include <stdio.h>
int main () {
char car=0;
printf ("Code ascii de 0 : %d (0x%x)\n", car, car);
return 0 ;
}
Fin de chane 0
Zro nous permet aussi de terminer une chane de caractres.
#include <stdio.h>
int main () {
char joke[5];
char moi[5]="eric";
joke[0]=l;
112
Le C en 20 heures
joke[1]=i;
joke[2]=n;
joke[3]=u;
joke[4]=x;
printf ("Variable joke : %s\n", joke);
printf ("Variable moi : %s\n", moi);
printf ("Fin de chane de moi : %d\n", moi [4]);
joke[5]=0;
printf ("Variable joke corrige : %s\n", joke);
return 0 ;
}
}
Valeur du pointeur ptr : (nil) 0 0x0
113
114
Le C en 20 heures
7. Correction de lexercice
8. retenir
Voici pour finir un petit programme qui reprend lessentiel de ce qui a
t vu. Il permet de lire une chane de caractres (chaine1) au clavier
puis de recopier cette chane dans une autre (chaine2) et de lafficher
lcran :
#include <stdio.h>
#include <string.h>
int main () {
char chaine1[81]; /* 80 caractres + \0 */
char chaine2[81];
115
CHAPITRE
10
Structures et fichiers
118
Le C en 20 heures
2. Structures
Une structure est un objet compos de plusieurs champs qui sert reprsenter un objet rel ou un concept. Par exemple une voiture peut tre
reprsente par les renseignements suivants : la marque, la couleur, lanne, etc.
Nous pouvons dfinir une structure ainsi :
Solution 1 :
struct nom_de_la_structure {
/* Dfinition de la structure */
} nom_du_type;
Cependant, la rptition du mot-cl struct est rapidement ennuyeuse. Nous prfrerons donc souvent la syntaxe suivante.
Solution 2 :
119
Structures et fichiers
typedef struct {
/* Dfinition de la structure */
} nom_du_type;
#define LONGUEUR 40
typedef struct {
char nom [LONGUEUR];
char prenom [LONGUEUR];
int age;
} personne;
personne p;
120
Le C en 20 heures
Par exemple :
#include <stdio.h>
typedef struct {
char nom [40];
char prenom [20];
int age;
} personne;
int main () {
personne p;
printf("Veuillez entrer le nom de la personne:");
scanf("%s",p.nom);
printf("Veuillez entrer le prnom de la personne:
, ");
scanf("%s",p.prenom);
printf("Veuillez entrer lge de la personne:");
scanf("%d",&p.age); /* ne pas oublier le & !!! */
printf("Voici les caractristiques de cette
, personne:\n");
printf("nom=%s\n",p.nom);
printf("prenom=%s\n",p.prenom);
printf("age=%d\n",p.age);
return 0;
}
Structures et fichiers
121
Explications :
Ligne 4 : une variable p_fichier est cre ; elle va pointer sur un
type FILE. Sans entrer dans les dtails, le type FILE est un type structure (vu au paragraphe prcdent) qui permet de dcrire un fichier.
Ligne 9 : lutilisateur va saisir une chane au clavier. Cette dernire
sera stocke dans la variable nom_fichier. Supposons pour fixer les
ides que lutilisateur tape au clavier familles.txt. Le fichier qui
sera par la suite cr portera ce nom.
ligne 12 : fopen va crer une sorte de lien entre le fichier du
disque dur qui sintitule familles.txt et la variable p_fichier.
Ainsi dans la suite, vous allez faire des oprations sur la variable
p_fichier et toutes ces oprations seront rpercutes au niveau du
122
Le C en 20 heures
Structures et fichiers
123
La fonction fgets lit partir du fichier au maximum maxligne -1 caractres et les stocke dans la chane de caractres ligne.
La lecture sarrte sur \n qui est alors inclus dans la chane. La chane
est complte par \0. La fonction renvoie NULL si la fin de fichier est
atteinte.
Voici un exemple de programme qui va simplement afficher le contenu du fichier essai.txt lcran (lisez-le
puis tudiez la remarque qui le suit) :
#include <stdio.h>
/* Dfinition de constante */
#define maxligne 100
char ligne[maxligne];
FILE *p_fichier;
int main() {
p_fichier=fopen("essai.txt","r");
while (! feof(p_fichier)) {
fgets(ligne,maxligne,p_fichier);
if (! feof(p_fichier))
printf("Jai lu :%s\n",ligne);
}
fclose(p_fichier);
return 0;
}
124
Le C en 20 heures
4. Fichiers et structures
Voici un exemple qui mle fichiers et structures :
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char nom [40];
char prenom [20];
int age;
} personne;
int main() {
FILE *p_fichier; /* pointeur fichier */
/* Crer et remplir le fichier */
p_fichier = fopen("essai.txt","w");
if (p_fichier == NULL) {
printf("\aImpossible de crer le fichier \n");
exit(-1); // Abandonner le programme
}
personne p;
printf("Veuillez entrer le nom de la personne:");
scanf("%s",p.nom);
printf("Veuillez entrer le prnom de la personne:");
scanf("%s",p.prenom);
printf("Veuillez entrer lge de la personne:");
scanf("%d",&p.age); /* ne pas oublier le & !!! */
fprintf(p_fichier, "%s\n",p.nom);
fprintf(p_fichier, "%s\n",p.prenom);
Structures et fichiers
fprintf(p_fichier, "%d\n",p.age);
fclose(p_fichier);
return 0;
}
125
CHAPITRE
11
1. Objectif
Lobjectif de ce chapitre est de vous aider traquer les bugs et les
corriger ;-). . .
128
Le C en 20 heures
Erreur la compilation
Une erreur de syntaxe lors de la compilation est provoque la suite de
lexcution de la commande gcc -o :
Vous tapez gcc -o essai essai.c pour le programme suivant :
#include <stdio.h>
int main () {
floatt f ;
return 0 ;
}
129
Erreur dexcution
Une erreur dexcution est provoque lors de lexcution du programme, cest dire lorsque la compilation et ldition de liens se sont
bien ralises mais quil y a un problme lorsque lon teste lexcutable.
#include <stdio.h>
int main () {
float f=1/0;
return 0 ;
}
La compilation ne pose pas de problmes. Lors de lexcution du programme (./essai), lordinateur affiche un
message du type : Floating point exception. En effet, une division par zro est interdite.
3. Un phnomne surprenant. . .
130
Le C en 20 heures
Essayez :
#include <stdio.h>
int main () {
printf ("Je suis ici\n") ;
while (1)
;
return 0 ;
}
131
while (1)
;
return 0 ;
}
Corriger le bug
La phase prcdente vous a permis de savoir do venait le problme,
en revanche, celle-ci ne la pas corrig.
Prenons lexemple suivant :
#include <stdio.h>
int main () {
int i,j;
i=0;
j=0;
printf("1) Je suis ici\n") ;
if ((i==0) && (i=j)) {
printf("2) Je suis ici\n");
...
}
return 0 ;
}
132
Le C en 20 heures
5. Bonne chasse. . .
133
Soit vous voyez tout de suite lerreur. . . soit vous ajoutez des mouchards :
#include <stdio.h>
int main () {
int i=0;
printf("1-) Je suis ici\n") ;
scanf("%d",i);
printf("2-) Je suis ici\n");
return 0 ;
}
Ces mouchards vous permettront rapidement de voir que le problme provient de la ligne scanf("%d",i) car seul le message 1) Je suis
ici saffiche et pas le message 2) Je suis ici 1 .
Le problme vient donc de i qui vaut 0. . . le scanf va tenter de stocker
ce que vous venez dentrer au clavier ladresse mmoire 0 (NULL) !
Cette dernire est rserve au systme dexploitation, do lerreur. . .
Il en va de mme du programme ci-dessous qui pourrait poser des problmes du fait que lon risque de sortir des bornes du tableau.
#include <stdio.h>
#define TAILLE 10
int main () {
int tab[TAILLE];
tab[TAILLE+10]=100;
return 0 ;
}
1. Noubliez pas les \n dans vos printf pour la raison voque plus haut. . .
134
Le C en 20 heures
Le debugger ddd
Ce debugger est trs efficace pour trouver les erreurs de segmentation.
Copiez, compilez, excutez le programme suivant.
#include <stdio.h>
#include <string.h>
int main () {
int * p=NULL;
*p=123;
printf("\n je suis ici...\n");
}
Le programme ne fonctionne pas et provoque une erreur de segmentation. Nous allons donc le dbugger avec ddd.
Faites :
gcc -o essai essai.c -g
ddd essai
fermez les petites fentres parasites qui apparaissent au lancement de ddd
cliquez sur le bouton run (il faut parfois chercher un
peu dans les menus). . .
Loption -g de la ligne de compilation permet de compiler le programme en y incluant les informations supplmentaires utiles au dbogage.
135
Lorsque vous faites p=NULL ;, vous placez donc la valeur 0 dans cette
variable. Ceci signifie que p pointe sur un lment mmoire qui nest pas
accessible par votre programme en criture. Or, vous faites *p=123 ; qui
revient vouloir crire la valeur 123 ladresse NULL.
Le debugger ddd vous indique alors quelle ligne a provoqu lerreur de
segmentation. Sur un programme de plusieurs centaines, voire plusieurs
milliers de lignes, cette aide est particulirement apprciable.
Moralit : en cas derreur de segmentation, tentez tout
dabord un ddd. . .
136
Le C en 20 heures
137
138
Le C en 20 heures
7. Solutions
Corrig de lexercice n1 Erreur moyenne
#include <stdio.h>
int main () {
int i, somme=0;
for (i=0 ; i<10 ; i++) {
printf("i=%d\n",i) ;
somme = somme + i;
}
printf("La moyenne vaut:%f",(float) somme/i) ;
return 0 ;
}
8. retenir
On retiendra que pour trouver un bug, la mthode est toujours la mme :
1. on tente de le reproduire tous les coups et on note la squence,
2. on cherche isoler le plus prcisment possible lendroit o le problme est apparu en injectant des mouchards (trace),
3. dans le cas dune erreur de segmentation, on tente dutiliser un debugger.
139
Le debugger ddd
Pour utiliser ddd :
Compilez le programme avec loption -g selon : gcc -o
programme programme.c -g
CHAPITRE
12
Complments
Malgr tous les enseignements et un programme fonctionnel, il nous est encore ncessaire dapprendre,
car souvent les problmes sont plus complexes que
simples.
1. Objectif
Ce chapitre vous propose daborder quelques notions plus complexes
quil est ncessaire de comprendre mais o seule la pratique sera votre
vritable allie.
2. Conversions de type
Pour convertir un type en un autre, on ralise ce que lon appelle un
cast . Imaginons que nous souhaitions convertir un nombre du type
float en un entier du type int. Voici comment procder :
141
142
Le C en 20 heures
int main () {
float f;
int i;
f=3.1415;
i=(int) f; /* rsultat dans i : 3 */
/* donc la partie dcimale est perdue... */
return 0 ;
}
Complments
143
4. Fonction putchar
Le programme suivant :
#include <stdio.h>
int main () {
char c=A;
putchar(c);
return 0 ;
}
144
Le C en 20 heures
#include <stdio.h>
int main () {
char c=A;
printf("%c",c);
return 0 ;
}
145
Complments
Exemple :
Soit la dclaration des variables suivantes :
short tab1[10];
char tab2[5][10];
Instructions
Valeurs
Remarques
retournes
sizeof(tab1)
20
sizeof(tab2)
50
sizeof(double)
Gnralement !
sizeof("bonjour")
sizeof(float)
Gnralement !
146
Le C en 20 heures
char * pointeur_sur_chaine;
char * pointeur_sur_float;
pointeur_sur_chaine = (char *) malloc(1000*sizeof(char));
pointeur_sur_float = (float *) malloc(10000*sizeof(float));
Complments
147
148
Le C en 20 heures
149
Complments
150
Le C en 20 heures
Complments
151
152
Le C en 20 heures
{
matrice [i][j]=valeur;
valeur++;
}
affiche_matrice(matrice[3][3]);
}
En conclusion, vous devez considrer tous les warnings comme des erreurs et les liminer (cela ne concerne cependant pas les warnings provenant de lusage de gets mme si cette considration dpend de lusage
qui en est fait au sein de votre programme).
9. C obscur
Un peu dhistoire 1
LInternational Obfuscated C Code Contest (en franais : Concours
international de code C obscur) est un concours de programmation organis chaque anne depuis 1984 ( lexception de 1997, 1999, 2002 et
2003).
Lorigine de ce concours vient dune discussion entre dveloppeurs sur le
code abominable dont ils devaient faire la maintenance dans leur travail
quotidien.
Cest, ce que vous risquez de rencontrer dans votre vie de dveloppeur.
Pour plus dinformations sur le sujet : http:// www.de.ioccc.org.
1. http://fr.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest.
Complments
153
Un petit exemple
Le premier lment dobfusctation est de constater que le C ne tient pas
compte des espacements comme vous pouvez le constater ci-dessous !
%
typedef unsigned char t;t*F="%c",l[]="|\\/=_ \n](.\0(),*(.(=(}*.)[[*.",N=\n,*
r;typedef(*H)();extern H Ar;Q(a){return(a|-a)>>31;}H S(c,a){return(H)(a&~c|(int
)Ar&c);}extern t*ist;V(t*u){*u^=*u&2^(*u>>7)*185;}Z(t*u,t n){*u-=n;}e(t c,H h){
R(h,Q(*
r^c));}
I(){r=l
+7-4*Q(
getchar
()^*l);
}R(H h,
int
c){Ar=S
(c,h);main()
;}P(){r
++;}z()
{
O(&N);}
O(t*c){
printf(
F,+*c);
}T(){r=
"This is not a function\n"
;}w(U){
U=Z(r,8
);
r-=~Q(*
r/8-4);
return 0;
}M(){r=
ist-68;
}
h(){t G
=r[1]-r
[2]^*r;
G^=30;V
(&G);e(
0,(O(&G
),P(P(*
r++)),z));}g(){M();R(h,0);}f(){P(O(r));e(f,g);}p(){P();e(a,f);}d(){P(O(r));
e(n,p);}c(u){u=r[-2];T(Ar=d);R(f,Q(u^"));}n(){e(w(O(l+*r%8)),c);}a(){I();R(
n,0);}main(){S(Q(Ar),a)();}H
Ar;t*ist="Rene Magritte"-(1898-1967);
154
Le C en 20 heures
#include <stdio.h>
int main ()
{
printf("Bonjour "),printf("Bien plus lisible\n"),printf("Nest
, ce pas\n");
int a=1,b=2,c=0;c=a+=2,a+b;
printf("a: %d b: %d c: %d\n",a,b,c);
return 0;
}
$ ./monprog
Bonjour Bien plus lisible
Nest ce pas
a: 3 b: 2 c: 3
Hexadcimal
Le langage C est proche de la machine, donc autant dire que cela ne le
drange pas si nous lui parlons en hexadcimal.
#include <stdio.h>
int main ()
{
printf("\x42\x6f\x6e\x6a\x6f\x75\x72\n");
return 0;
}
$ ./monprog
Bonjour
Oprateur ternaire
Le langage C possde un oprateur ternaire un peu exotique qui peut
tre utilis comme alternative if - else et qui a lavantage de pouvoir tre intgr dans une expression.
Lexpression suivante : <expr1> ? <expr2> : <expr3> est traduite
comme ceci :
Si <expr1> est non nulle, alors la valeur de <expr2> est fournie
comme rsultat.
Sinon, cest la valeur de <expr3> qui est fournie comme rsultat.
155
Complments
La suite dinstructions :
if (a>b)
maximum=a;
else
maximum=b;
Loprateur ternaire peut nuire la lisibilit dun programme, mais utilis avec prcaution, il fournit des solutions lgantes et concises.
Par exemple :
printf("Vous avez %i carte%c \n", n, (n==1) ? :
, s);
1 - a >= 2\n");
2 - a < 2\n");
3 - a >= 2\n")
2\n");
CHAPITRE
13
1. Objectifs
Le but de ce chapitre est de vous montrer quelques problmes accompagns de leur solution.
On apprend beaucoup de choses en lisant des programmes finis ;-)
2. Convertisseur francs/euros
Voici un programme qui produit une petite table de conversion
francs/euros.
157
158
Le C en 20 heures
#include <stdio.h>
#define TAUX 6.55957
int main () {
float francs=0;
while (francs<=10) {
printf("%4.1f francs = %.2f euros\n",francs,francs/TAUX);
francs=francs+0.5;
}
return 0;
}
Lexcution donnera :
0.0
0.5
1.0
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
5.5
6.0
6.5
7.0
7.5
8.0
8.5
9.0
9.5
10.0
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
francs
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0.00
0.08
0.15
0.23
0.30
0.38
0.46
0.53
0.61
0.69
0.76
0.84
0.91
0.99
1.07
1.14
1.22
1.30
1.37
1.45
1.52
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
euros
159
160
Le C en 20 heures
2
4
6
8
10
12
14
16
18
20
3
6
9
12
15
18
21
24
27
30
4
8
12
16
20
24
28
32
36
40
5
10
15
20
25
30
35
40
45
50
6
12
18
24
30
36
42
48
54
60
7
14
21
28
35
42
49
56
63
70
8
16
24
32
40
48
56
64
72
80
9
18
27
36
45
54
63
72
81
90
10
20
30
40
50
60
70
80
90
100
161
En fait, seule ladresse de la 1re case du tableau est passe en paramtre la fonction max_Tableau
La ligne qui suit le #include est la dclaration de la
fonction max_Tableau. En effet, lappel la fonction
(dans main) figure avant la dfinition de la fonction. Dans
une telle situation, il est ncessaire dannoncer au compilateur lexistence de la fonction en prcisant le type de
variables en paramtres, et le type de variable renvoy.
#include <stdio.h>
#define TAILLE 10
int main () {
int i,j;
i=0;
j=TAILLE-1;
162
Le C en 20 heures
while (i<j) {
printf("i=%d j=%d\n",i,j);
i++, j--;
}
return 0;
}
163
164
Le C en 20 heures
Tableau initial :
Indice de la case :
Valeur stocke :
0
12
1
10
2
4
3
5
4
6
5
7
6
8
7
9
8
10
9
1
1
12
2
4
3
5
4
6
5
7
6
8
7
9
8
10
9
1
1
4
2
12
3
5
4
6
5
7
6
8
7
9
8
10
9
1
...
Au bout dun parcours complet du tableau, on obtient :
0
10
1
4
2
5
3
6
4
7
5
8
6
9
7
10
8
1
9
12
Nous constatons que le tableau est mieux tri, mais a nest pas
encore parfait. Dans le pire des cas (tableau tri dans lordre dcroissant)
n-1 passages seront ncessaires et suffisants pour trier un tableau de taille
n.
Cette mthode de tri porte un nom, il sagit du tri bulles.
165
166
Le C en 20 heures
8. Jeu de la vie
Historique
John Horton Conway est un mathmaticien qui a exerc lUniversit
de Cambridge puis Princeton. Trs prolifique en matire de jeux mathmatiques, il dcrivit en 1970 le jeu de la vie, visant modliser dune
faon simplifie lvolution dorganismes vivants.
Rgles du jeu
Le jeu de la vie se joue normalement sur un damier infini. Chaque case
est occupe par une cellule qui peut tre vivante ou morte. chaque gnration, chaque cellule peut natre, mourir, ou rester dans son tat. Les
rgles qui permettent de passer dune gnration lautre sont prcises et
167
ont t choisies avec soin pour que lvolution des organismes soit intressante et semble imprvisible. En premier lieu, notons que sur un damier
infini, chaque case a exactement huit voisins (si on considre aussi les voisins par une diagonale 1 ). Les rgles du jeu de la vie sont les suivantes :
une cellule vivante ayant exactement 2 ou 3 voisins vivants survit la
gnration suivante.
une cellule vivante ayant de 4 8 cellules voisines vivantes meurt
dtouffement la gnration suivante.
une cellule vivante ayant zro ou une cellule voisine vivante meurt
disolement la gnration suivante.
sur une case vide ayant exactement 3 voisins vivants, une cellule natra la gnration suivante.
Notons que cest lensemble de la gnration actuelle qui doit tre pris
en compte pour ltablissement de ltat des cellules la gnration suivante.
Voici un exemple de figure sur un petit damier. Les cellules qui devront
mourir la gnration suivante sont grises (cette figure porte un nom, il
sagit dun planeur) :
168
Le C en 20 heures
Images obtenues
Si nous faisions une version graphique, voici ce que nous pourrions obtenir (figures 13.2 13.3) :
169
Certaines configurations rapparaissent spontanment sur un damier initialement alatoire, comme les planeurs mentionns ci-dessus. Des centaines de figures sont ainsi recenses pour leur comportement plus ou
moins remarquable (le lecteur intress pourra faire des recherches trs
fructueuses sur Internet).
Proposition de programme
Nous allons considrer que toutes les cellules sont stockes dans une
matrice (notre damier ne sera donc pas infini). Pour une case m[i][j],
les huit voisins sont :
m[i-1][j], m[i+1][j], m[i][j-1], m[i][j+1]
m[i-1][j-1], m[i+1][j+1], m[i+1][j-1], m[i-1][j+1]
170
Le C en 20 heures
1. Rappelez-vous quaccder un tableau en dehors de ses bornes est une erreur frquente, et assez difficile dtecter.
171
172
Le C en 20 heures
/****************************************/
/* Initialisation de la matrice */
void init(int matrice [][TAILLE_SUR_MATRICE ]) {
/****************************************/
int i,j;
for(i=0; i<TAILLE_SUR_MATRICE; i++) {
for(j=0; j<TAILLE_SUR_MATRICE; j++) {
if (i<=j && i>0 && j<=7)
matrice[i][j]=1;
else
matrice[i][j]=0;
}
}
/* On pourrait aussi faire une initialisation alatoire */
}
/****************************************/
/* Calcul du nombre de voisins vivants */
int nombre_voisins (int matrice[][TAILLE_SUR_MATRICE ],
int ligne, int colonne) {
/****************************************/
int compte=0; /* compteur de cellules */
int i,j;
/* On additionne les 9 cellules centres en ligne,colonne */
for (i=ligne-1;i<=ligne+1;i++)
for(j=colonne-1;j<=colonne+1;j++)
compte=compte+matrice[i][j];
/* Puis on retire celle du milieu... */
compte -= matrice[ligne][colonne];
173
174
Le C en 20 heures
return compte;
}
/****************************************/
/* Correspond ltape n+1 */
void mise_a_jour(int matrice[ ][TAILLE_SUR_MATRICE ]) {
/****************************************/
int i,j;
int nbr_voisins;
int matrice_densite[TAILLE_SOUS_MATRICE][TAILLE_SOUS_MATRICE];
/* matrice qui comptabilise le nombre de voisins */
/* et cela, case par case */
for(i=0; i< TAILLE_SOUS_MATRICE; i++)
for(j=0; j< TAILLE_SOUS_MATRICE; j++)
matrice_densite[i][j]=nombre_voisins(matrice,i+1,j+1);
/* i+1 et j+1 car on passe de la SOUS_MATRICE la MATRICE */
for(i=0; i< TAILLE_SOUS_MATRICE; i++)
for(j=0; j< TAILLE_SOUS_MATRICE; j++) {
nbr_voisins=matrice_densite[i][j];
if(nbr_voisins==2)
matrice[i+1][j+1]=1;
else if (nbr_voisins==0 || nbr_voisins==4)
matrice[i+1][j+1]=0;
}
}
/****************************************/
/* Affichage lcran des cellules vivantes */
void affiche_matrice(int matrice[ ][TAILLE_SUR_MATRICE ]) {
/****************************************/
int i,j;
for(i=1; i<=TAILLE_SOUS_MATRICE; i++) {
ligne(7);
for(j=1; j<= TAILLE_SOUS_MATRICE; j++)
if (matrice[i][j]==1)
printf("|%c",*);
else
printf("|%c",|);
printf("|\n");
}
ligne(TAILLE_SOUS_MATRICE);
}
/****************************************/
/* Trac dune ligne */
void ligne(int largeur) {
/****************************************/
int i;
for(i=0; i<largeur; i++)
printf("+-");
printf("+\n");
175
Lexcution de ce programme en mode non-graphique est un peu frustrante. Ladaptation ncessaire pour dessiner rellement les cellules
lcran est cependant assez simple (fondamentalement, il faut uniquement
modifier la procdure affiche_matrice pour obtenir un affichage diffrent).
CHAPITRE
14
En deuxime lecture. . .
et compiler en tapant :
gcc -o essai essai.c -lm
177
178
Le C en 20 heures
Fonction
exp(x)
log(x)
log10(x)
pow(x,y)
sqrt(x)
fabs(x)
floor(x)
ceil(x)
sin(x)
cos(x)
tan(x)
Explication
fonction exponentielle
logarithme naturel
logarithme base 10
xy
racine carre de x
valeur absolue
arrondir en moins
arrondir en plus
sinus de x
cosinus de x
tangente de x
Exemple
y=exp(x)
y=log(x)
y=log10(x)
z=pow(x,y)
y=sqrt(x)
y=fabs(x)
floor(1.9) renverra 1
ceil(1.4) renverra 2
y=sin(x)
y=cos(x)
y=tan(x)
2. Pointeurs et structures
Voici un programme qui utilise un pointeur sur une structure :
#include <stdio.h>
typedef struct {
char nom [40];
char prenom [20];
int age;
} personne;
int main () {
personne p;
personne * pointeur_sur_une_personne;
printf("Veuillez entrer le nom de la personne:");
scanf("%s",p.nom);
printf("Veuillez entrer le prnom de la personne:");
scanf("%s",p.prenom);
printf("Veuillez entrer lge de la personne:");
scanf("%d",&p.age); /* ne pas oublier le & !!! */
pointeur_sur_une_personne=&p;
printf("Voici les caractristiques de cette personne:\n");
printf("nom=%s\n",(*pointeur_sur_une_personne).nom);
En deuxime lecture. . .
179
Notez que cette seconde criture (plus pratique lusage) repose sur une
flche qui est construite avec le signe moins (-) et le signe suprieur (>).
Supposons que votre programme soit utilis sur internet et quun utilisateur malveillant entre une chane de caractres plus grande que 10 caractres, par exemple ABCDEFGHIJKLMNOPQR . Dans ce cas, lexcution,
votre programme va recopier partir de ladresse de la variable chaine
les caractres A, B, . . . jusqu R. Ds lors, les zones mmoires qui suivent
la variable chaine seront crases. Ceci explique que le compilateur vous
indique un warning.
Pour y remdier, vous pouvez utiliser :
char buffer[128];
fgets(buffer, 128, stdin);
en sachant que stdin (mis pour standard input cest dire entre standard) dsigne le plus souvent le clavier.
fgets prsente une particularit que navait pas gets :
elle place un \n la fin de la chane qui a t lue (juste
avant l\0).
180
Le C en 20 heures
int i=123;
fprintf(stdout,"%d",i);
En deuxime lecture. . .
char mois[12][10]={"janvier","fvrier","mars","avril","mai",
"juin","juillet","aot","septembre","octobre","novembre",
"dcembre"};
Il est possible daccder aux diffrentes chanes de caractres dun tableau, en indiquant simplement la ligne
correspondante.
Lexcution des trois instructions suivantes. . .
char mois[12][10]= {"janvier","fvrier","mars","
, avril",
"mai","juin","juillet","aot","septembre",
"octobre","novembre","dcembre"};
int i = 4;
181
182
Le C en 20 heures
Verbe : programmer
je programme
tu programmes
il ou elle programme
nous programmons
vous programmez
ils ou elles programment
En deuxime lecture. . .
183
6. Pointeurs et tableaux
Nous allons prsent examiner les liens trs troits quil y a entre pointeurs et tableaux. En fait, nous allons voir qu chaque fois que vous manipulez des tableaux, comme par exemple la ligne contenant le printf
du programme ci-dessous, le langage C va transformer votre instruction
tableau[i] en se servant de pointeurs. . .
int tableau[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for (i=0;i<10;i++)
printf("%d ",tableau[i]);
Comme nous lavons dj constat prcdemment, le nom dun tableau reprsente ladresse de son premier lment. En dautres termes :
&tableau[0] et tableau sont une seule et mme adresse.
En simplifiant, nous pouvons retenir que le nom dun tableau est un
pointeur constant sur le premier lment du tableau.
En dclarant un tableau tableau de type int et un
pointeur p sur int,
int tableau[10];
int *p;
184
Le C en 20 heures
Si p pointe sur une case quelconque dun tableau, alors p+1 pointe sur
la case suivante.
Ainsi, aprs linstruction : p = p+1 ;
le pointeur p pointe sur tableau[1],
*(p+1)
*(p+2)
...
*(p+i)
...
*(tableau+i)
185
En deuxime lecture. . .
dsigne ladresse de
dsigne ladresse de
dsigne le contenu de
tableau[0]
tableau[i]
tableau[i]
Si p = tableau, alors :
p
p+i
*(p+i)
dsigne ladresse de
dsigne ladresse de
dsigne le contenu de
tableau[0]
tableau[i]
tableau[i]
186
Le C en 20 heures
int main() {
int tableau[5] = {-4, 4, 1, 0, -3};
int positifs[5];
int i,j; /* indices courants dans tableau et positifs */
for (i=0,j=0 ; i<5 ; i++)
if (*(tableau+i)>0){
*(positifs+j) = *(tableau+i);
j++;
}
return 0;
}
187
En deuxime lecture. . .
7. Tableaux de pointeurs
Attention, nous allons compliquer un peu les choses. . .
Si nous avons besoin dun ensemble de pointeurs du mme type, nous
pouvons les runir dans un tableau de pointeurs.
Dclaration dun tableau de pointeurs :
<Type> *<NomTableau>[<N>]
188
Le C en 20 heures
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main() {
char * jours[7];
int i;
for (i=0;i<7;i++) {
jours[i]=(char *) malloc(9);
}
strcpy(jours[0],"lundi");
strcpy(jours[1],"mardi");
strcpy(jours[2],"mercredi");
// ...
return 0;
}
En deuxime lecture. . .
189
190
Le C en 20 heures
191
En deuxime lecture. . .
case 5:
le premier message\n");
le second message\n");
9. dition de liens
Jusqu prsent, nous construisions nos programmes excutables en
entrant la commande suivante :
gcc -o essai essai.c
En ralit, cette commande ralise deux oprations : la compilation proprement dite, et ldition de liens (si la compilation sest termine avec
succs). Pour raliser uniquement ltape de compilation, il faut entrer :
gcc -c essai.c
Cette tape a pour effet de gnrer le fichier essai.o qui ne contient pour
le moment que le code objet qui correspond au source compil, mais qui
ne lie pas les appels de fonctions des bibliothques extrieures telles que
printf, scanf, feof, sqrt leur code respectif.
Ltape suivante, appele dition de liens, est ralise en entrant la commande :
gcc -o essai essai.o -lm
192
Le C en 20 heures
Lors de cette tape, les rfrences aux fonctions appeles dans le fichier objet sont ajoutes. Pour cela, les fonctions utilises sont recherches automatiquement dans les bibliothques standard (on y trouvera
printf, scanf. . . ) et dans les bibliothques spcifies dans la commande (ici -lm qui dsigne la bibliothque mathmatique et qui permettra
de trouver une rfrence la fonction sqrt par exemple) 1
En deuxime lecture. . .
193
194
Le C en 20 heures
Compilons le :
gcc -o principal principal.c
En deuxime lecture. . .
195
int b=15;
int c=minimum(a,b);
printf ("Minimum entre %d et %d : %d",a,b,c);
return 0;
}
On remarquera que les < > de linclude se sont transforms en " " pour
indiquer que le .h est rechercher sur le rpertoire courant et non dans
les librairies C.
La compilation du programme fonctionne bien sauf au moment de la ralisation de ldition de liens.
$ gcc -c principal.c
$ gcc -o principal principal.o
principal.o: In function main:
principal.c:(.text+0x29): undefined reference to minimum
collect2: ld returned 1 exit status
La raison pour laquelle cette dernire ne fonctionne pas est quil nexiste
pas de fichier binaire (.o) contenant la fonction minimum contrairement
ce qui a t annonc.
Corrigeons cela tout de suite en crant un fichier minimum.c :
#include "minimum.h"
/* Cet appel est ncessaire */
int minimum (int a, int b)
{
if (a > b)
return (b);
else
return (a);
}
196
Le C en 20 heures
Lintrt de cette mthode nest pas forcment trs vidente sur cet
exemple mais imaginez un programme disposant de centaines de fonctions !
CHAPITRE
15
Exercices
1. Objectifs
Ces quelques exercices avec corrigs vous permettront de vous familiariser un peu plus avec le langage C. Dans tous ces exercices, on supposera
que lutilisateur ne fait pas derreur de saisie.
2. Jeu de morpion
Principe
Il sagit du morpion classique que lon pourrait reprsenter comme ceci :
197
198
Le C en 20 heures
X O .
X O X
O . O
199
Exercices
3. Jeu de pendu
Principe
Le but du jeu est de deviner en moins de 7 essais un mot que seul lordinateur connat.
Pour mener bien votre mission, vous allez proposer une lettre :
si la lettre est correcte alors, celle-ci saffiche sa place dans le mot
deviner ;
200
Le C en 20 heures
Exemple
Supposons que le mot deviner soit bonjour .
Vous proposez la lettre o , cette dernire se trouve dans le mot, lordinateur affiche donc *o**o**. Si vous proposez ensuite la lettre u ,
lordinateur affiche : *o**ou*.
Si vous vous sentez laise, ne lisez pas ce qui suit et essayez de programmer le jeu. Dans le cas contraire, le dtail des diffrentes tapes vous
aidera sans doute raliser le programme.
Un peu daide
Point de dpart
Commencez par crire un programme qui dclare une variable contenant le mot trouver : motAtrouver et une autre contenant une chaine
de mme longueur remplie avec des * : motCherche.
Algorithme
Un tour de jeu se compose des phases suivantes :
Saisie dun caractre
Initialisation des caractres correspondant
dans le mot cach
Si aucun caractre na t trouv
nombre dessais -1
Si motAtrouver == motCherche GAGNE
Si nombre dessais == 0 PERDU
201
Exercices
Amliorations possibles
Libre vous dajouter ce que vous voulez. Voici quelques suggestions :
4. Balle rebondissante
On souhaite raliser un programme qui permettrait de faire rebondir une
balle sur les bords de lcran. La balle doit pouvoir rebondir sur un cran
de la forme suivante (figure de gauche) :
Afin de faciliter la programmation, on rajoute une couronne dtoiles
qui permettra de simplifier les tests lorsque la balle arrivera sur un bord
(figure de droite).
202
Le C en 20 heures
Lorsquelle arrive sur un bord vertical, il suffit dinverser le sens de dplacement selon laxe des ordonnes. De mme, si la balle arrive sur un
bord horizontal, on inverse le sens du dplacement selon laxe des abcisses.
Pour tester si on arrive sur un bord, il est possible de
faire :
if (grille[nouvelle_pos_x][nouvelle_pos_y]==*)
Naturellement il est aussi possible de tester les coordonnes nouvelle_pos_x et nouvelle_pos_y pour savoir
si on arrive sur un bord.
Essayez de complter le programme suivant . . .
#include <stdio.h>
#include <string.h>
/*******PROTOTYPES DES FONCTIONS **********/
/* Initialise la grille de faon ce quelle contienne ce quil
y a la figure de droite
*/
void init_grille (char grille[][10],int pos_balle_x,int
, pos_balle_y) ;
/* Affiche le rectangle dtoiles et la balle (tout ceci en mme
temps et non pas le rectangle puis la balle...)
*/
void affiche_grille (char grille[][10]);
/*10 lignes 10 colonnes*/
/* Calcule la nouvelle position de la balle en fonction de
lancienne position de la balle (old_pos_balle_x,
, old_pos_balle_y)
et du vecteur de dplacement (deplacement_x, deplacement_y).
*/
void calcule_position_balle (char grille[][10], int *pos_balle_x,
int *pos_balle_y, int *deplacement_x, int *
, deplacement_y);
/************* IMPLEMENTATION DES FONCTIONS ****************/
void init_grille (char grille[][10], int pos_balle_x,int
, pos_balle_y) {...}
void affiche_grille (char grille[][10]) {...}
void calcule_position_balle (char grille[][10], int *pos_balle_x,
203
Exercices
}
}
Amliorations
Comme on peut le constater, le mouvement de la balle est cyclique,
introduisez un dplacement alatoire de 1 case tous les x tours o x est un
nombre alatoire entre 0 et 9.
5. Solutions
Le morpion
#include <stdio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
void dessine_plateau (int plateau[][3]) {
int i=0,j=0;
printf ("\n-------\n");
204
Le C en 20 heures
for (i=0;i<3;i++) {
for (j=0;j<3;j++) {
printf("|");
switch(plateau[i][j]) {
case 0:
printf(" ");
break;
case 1:
printf("O");
break;
case 2:
printf("X");
break;
}
}
printf ("|\n");
printf ("-------\n");
}
}
int fin_jeu (int plateau[][3]) {
int i=0,j=0;
for (i=0;i<3;i++) {
for (j=0;j<3;j++) {
if (plateau [i][j]==0) {
return FALSE;
}
}
}
return TRUE;
}
int saisie_donnee (char *invite) {
int valeur;
do {
printf ("%s", invite);
scanf ("%d",&valeur);
} while (( valeur <1) || (valeur >3));
return (valeur);
}
int gagne (int plateau[][3]) {
int i=0;
// Test sur les lignes
for ( i=0; i<3; i++) {
if (( plateau[i][0] >0) && ( plateau[i][0] == plateau[i][1] )
, && ( plateau[i][1] == plateau[i][2] )) {
puts ("GAGNE");
return TRUE;
Exercices
205
}
}
// Test sur les colonnes
for ( i=0; i<3; i++) {
if (( plateau[0][i] >0) && ( plateau[0][i] == plateau[1][i] )
, && ( plateau[1][i] == plateau[2][i] )) {
puts ("GAGNE");
return TRUE;
}
}
206
Le C en 20 heures
Le pendu
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
char lireCaractere() {
char chaine[2];
gets(chaine);
return chaine[0];
}
int main() {
int i=0;
int coups=7;
char motAtrouver[]="BONJOUR";
char lettreSaisie= ;
int lettre_trouvee=FALSE;
char gagne=FALSE;
char* motCherche;
motCherche=malloc (sizeof (motAtrouver));
memset (motCherche,*,sizeof (motAtrouver));
motCherche[sizeof (motAtrouver)-1]=0;
printf("Jeu de pendu \n");
Exercices
do {
// Aucune lettre trouve
lettre_trouvee=FALSE;
// Saisie dune lettre et mise en majuscule
printf("\nVotre lettre : ");
lettreSaisie=lireCaractere();
// Comparaison avec le mot secret
for(i=0; i<strlen (motAtrouver); i++) {
if(lettreSaisie==motAtrouver[i]) {
motCherche[i]=lettreSaisie;
lettre_trouvee=TRUE;
}
}
printf("%s", motCherche); //on affiche le mot cache
if (!lettre_trouvee) {
coups--;
}
printf("\nIl vous reste %d coups.\n ", coups );
gagne=! strcmp(motAtrouver, motCherche);
}
while(!gagne && coups>0);
if ( gagne )
puts ("GAGNE");
else
puts ("PERDU");
getchar();
free (motCherche);
return 0;
}
207
208
Le C en 20 heures
Balle rebondissante
#include <stdio.h>
#include <string.h>
/************PROTOTYPES DES FONCTIONS **************/
/* Initialise la grille de faon ce quelle contienne ce quil
y a la figure de droite
*/
void init_grille (char grille[][10],int pos_balle_x,int
, pos_balle_y) ;
/* Affiche le rectangle dtoiles et la balle (tout ceci en mme
temps et non pas le rectangle puis la balle...)
*/
void affiche_grille (char grille[][10]); /* 10 lignes 10 colonnes
, */
/* Calcule la nouvelle position de la balle en fonction de
lancienne position de la balle (old_pos_balle_x,
, old_pos_balle_y)
et du vecteur de dplacement (deplacement_x, deplacement_y).
*/
void calcule_position_balle (char grille[][10], int *pos_balle_x,
int *pos_balle_y, int *deplacement_x, int *
, deplacement_y);
/***************** IMPLEMENTATION ******************************/
void init_grille(char grille[][10],int pos_balle_x,int
, pos_balle_y){
int ligne, colonne;
memset (grille, ,100);
for (colonne=0; colonne <10; colonne++) {
grille [0][colonne]=*;
grille [9][colonne]=*;
}
for (ligne=0; ligne<10; ligne++) {
grille [ligne][0]=*;
grille [ligne][9]=*;
}
grille [pos_balle_x][pos_balle_y]=O;
}
void affiche_grille (char grille[][10]) {
int ligne, colonne;
for (ligne=0; ligne<10; ligne++ ) {
for (colonne=0; colonne <10; colonne++) {
printf ("%c",grille[ligne][colonne]);
}
Exercices
209
printf ("\n");
}
}
void calcule_position_balle (char grille[][10], int *pos_balle_x,
int *pos_balle_y,int *deplacement_x,int *
, deplacement_y) {
int theo_pos_x=0;
int theo_pos_y=0;
// On efface lancienne balle
grille[*pos_balle_x][*pos_balle_y]= ;
printf ("Position actuelle : %d / %d\n",*pos_balle_x,*
, pos_balle_y);
printf ("Dplacement : %d / %d\n",*deplacement_x,*deplacement_y)
, ;
// On calcule la future position thorique de la balle
theo_pos_x = *pos_balle_x + *deplacement_x;
theo_pos_y = *pos_balle_y + *deplacement_y;
// En fonction de la position thorique de la balle
// on modifie les vecteurs de dplacement
if (grille[theo_pos_x][theo_pos_y]==*) {
// Si on tape sur laxe vertical
if (( theo_pos_x == 0 ) || ( theo_pos_x == 9 ))
*deplacement_x = - *deplacement_x;
// Si on tape sur laxe horizontal
if (( theo_pos_y == 0 ) || ( theo_pos_y == 9 ))
*deplacement_y = - *deplacement_y;
}
// On calcule la nouvelle position de la balle
*pos_balle_x += *deplacement_x;
*pos_balle_y += *deplacement_y;
printf ("Nouvelle Pos : %d/%d\n",*pos_balle_x,*pos_balle_y);
// On met la balle dans la grille
grille[*pos_balle_x][*pos_balle_y]=O;
}
int main () {
int pos_balle_x=4, pos_balle_y=4; /* position balle au dpart */
int deplacement_x=1, deplacement_y=1; /* dplacement balle */
char grille[10][10] ; /* grille qui contiendra 3 caractres : */
/* * ou O ou le caractre espace */
init_grille (grille, pos_balle_x, pos_balle_y) ;
210
Le C en 20 heures
while (1) {
system("clear");
affiche_grille(grille);
calcule_position_balle (grille, &pos_balle_x, &pos_balle_y, &
, deplacement_x, &deplacement_y);
usleep(500000) ; /* Pause de 500 000 micro secondes donc 1/2
, seconde */
}
}
ANNEXE
...
32:
40:
48:
56:
64:
72:
80:
88:
96:
104:
(
0
8
@
H
P
X
33:
41:
49:
57:
65:
73:
81:
89:
97:
105:
!
)
1
9
A
I
Q
Y
a
i
34:
42:
50:
58:
66:
74:
82:
90:
98:
106:
"
*
2
:
B
J
R
Z
b
j
35:
43:
51:
59:
67:
75:
83:
91:
99:
107:
#
+
3
;
C
K
S
[
c
k
36:
44:
52:
60:
68:
76:
84:
92:
100:
108:
...
211
$
,
4
D
L
T
\
d
l
37:
45:
53:
61:
69:
77:
85:
93:
101:
109:
%
5
=
E
M
U
]
e
m
38:
46:
54:
62:
70:
78:
86:
94:
102:
110:
.
6
F
N
V
^
f
n
39:
47:
55:
63:
71:
79:
87:
95:
103:
111:
/
7
?
G
O
W
_
g
o
ANNEXE
Bon savoir
Type de donne
Signification
Taille
(en octets)
1
4
char
int
caractre
entier
float
flottant (rel)
double
flottant double
213
Plage de valeurs
128 127
2147483648
2147483647
3.4 1038
3.4 1038
1.7 104932
1.7 104932
214
Le C en 20 heures
Format
Conversion en
%d
%f
%lf
%c
%s
int
float
double
char
char*
Format
Conversion en
%d
%f
%f
%c
%s
int
float
double
char
char*
215
Bien des erreurs pourraient tre vites en matrisant ce tableau :
Erreur
Version correcte
if (i=0)
if (i==0)
scanf ("%d",n);
scanf ("%d",&n);
if (a & b)
if (a && b)
var=0; ptr=NULL;
tab[i,j]
tab[i][j]
char c ;
char c ;
printf ("%s",c);
printf ("%c",c);
char * s;
char * s;
printf ("%c",c);
printf ("%s",c);
216
Le C en 20 heures
char chaine[3]="12345";
char chaine[6]="12345";
ou mieux :
char chaine[]="12345";
char chaine[]=12345;
char chaine[]="12345";
Oprateurs de comparaison . . . . . . . . . . . .
Oprateurs logiques . . . . . . . . . . . . . . . .
Loprateur ou . . . . . . . . . . . . . . . . . . .
Loprateur ou : analogie avec laddition . . . . .
Loprateur et . . . . . . . . . . . . . . . . . . .
Loprateur et : analogie avec la multiplication . .
Oprateurs : formulations correctes et incorrectes
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
37
37
37
38
38
39
.
.
.
.
.
.
.
76
77
80
81
81
88
89
218
Le C en 20 heures
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
164
164
164
164
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
178
184
184
185
185
2
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
167
168
169
170
219
Avant de commencer
1
iv
Premiers pas
1. Systme dexploitation et C . . . . . .
2. Utiliser un diteur sous G NU/Linux . .
3. Exemple de programme . . . . . . . .
4. Normalisation du programme . . . . .
5. Petit mot sur ce quest une bibliothque
6. Un exemple de fichier en-tte . . . . .
7. Complments . . . . . . . . . . . . .
8. Squelette de programme . . . . . . . .
9. Blocs . . . . . . . . . . . . . . . . .
10. Commentaires . . . . . . . . . . . .
11. Exercice dapplication . . . . . . . .
12. Corrig de lexercice du chapitre . . .
13. retenir . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
4
5
7
7
8
9
9
9
10
10
11
Variables (partie 1)
1. Objectif . . . . . . . . . .
2. Affichage : la fonction printf
3. Notion de variable . . . . .
4. Dclaration dune variable .
5. Application : exemples . .
6. Utilisation de % dans printf
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
14
14
15
15
17
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
221
222
Le C en 20 heures
7. Exercices . . . . . . . . . . . . .
8. Rutilisation dune variable . . . .
9. Caractres spciaux . . . . . . . .
10. Exercices . . . . . . . . . . . . .
11. Corrigs des exercices du chapitre
12. retenir . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
18
18
19
20
20
22
Variables (partie 2)
1. Objectif . . . . . . . . . . . . .
2. Exercice de mise en bouche . . .
3. Dclaration de variables . . . . .
4. Saisie des variables . . . . . . .
5. Les types flottants . . . . . . . .
6. Dautres fonctions utiles . . . . .
7. Corrigs des exercices du chapitre
8. retenir . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
24
24
25
28
28
29
32
Conditions
1. Objectif . . . . . . . . . . . . . . .
2. Exercice de mise en bouche . . . . .
3. Condition : Si Alors Sinon . . . . . .
4. Oprateurs de comparaison . . . . .
5. Oprateurs logiques . . . . . . . . .
6. Vrai ou faux . . . . . . . . . . . . .
7. Combinaison . . . . . . . . . . . .
8. Accolades . . . . . . . . . . . . . .
9. Exercices . . . . . . . . . . . . . .
10. Corrections des exercices du chapitre
11. retenir . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
34
35
36
37
37
39
40
41
42
43
Mise au point
1. Objectif . . . . . . . . . . . . . . . .
2. Plus petit ou plus grand . . . . . . . .
3. Retour sur getchar() . . . . . . . . . .
4. Boucle : Faire . . . Tant que (condition)
5. Oprateur modulo . . . . . . . . . . .
6. Nombres pseudo-alatoires . . . . . .
7. Corrigs des exercices du chapitre . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
45
45
46
46
47
49
49
51
.
.
.
.
.
.
.
.
223
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
54
54
54
55
56
56
57
58
60
64
Boucles
1. Objectifs . . . . . . . . . . . . . . . . . .
2. Et les Shadoks pdalrent pendant 15 tours
3. Syntaxe . . . . . . . . . . . . . . . . . .
4. Notion de double boucle . . . . . . . . . .
5. Et les Shadoks ftrent Nol. . . . . . . . .
6. Table Ascii . . . . . . . . . . . . . . . .
7. Corrigs des exercices du chapitre . . . . .
8. retenir . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
65
66
67
68
69
70
73
Pointeurs et fonctions
1. Objectifs . . . . . . . . . . . . .
2. Binaire, octets. . . . . . . . . . .
3. Variables : pointeurs et valeurs . .
4. Fonctions . . . . . . . . . . . .
5. Corrigs des exercices du chapitre
6. retenir . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
75
75
76
78
83
93
94
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
98
99
106
109
111
114
114
224
10 Structures et fichiers
1. Les types synonymes
2. Structures . . . . . .
3. Bases sur les fichiers .
4. Fichiers et structures .
Le C en 20 heures
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
117
117
118
120
124
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
127
127
129
130
132
132
138
138
12 Complments
1. Objectif . . . . . . . . . . . . . . . .
2. Conversions de type . . . . . . . . . .
3. Usage trs utile des conversions de type
4. Fonction putchar . . . . . . . . . . . .
5. Allocation dynamique de mmoire . .
6. Avez-vous bien compris ceci ? . . . . .
7. Sur lutilit des pointeurs . . . . . . .
8. Un mot sur les warnings . . . . . . . .
9. C obscur . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
141
141
141
142
143
144
148
148
151
152
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
157
157
157
159
160
160
161
163
166
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
225
14 En deuxime lecture. . .
1. Quelques fonctions mathmatiques
2. Pointeurs et structures . . . . . . .
3. En finir avec les warnings du gets .
4. Sortie standard : stdout . . . . . .
5. Tableaux de chanes de caractres .
6. Pointeurs et tableaux . . . . . . . .
7. Tableaux de pointeurs . . . . . . .
8. Choix multiples avec switch . . .
9. dition de liens . . . . . . . . . .
10. Utilit des prototypes . . . . . . .
11. Utilit des librairies : 1+1=1 . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
177
177
178
179
180
180
183
187
189
191
192
193
15 Exercices
1. Objectifs . . . . . .
2. Jeu de morpion . .
3. Jeu de pendu . . . .
4. Balle rebondissante
5. Solutions . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
197
197
197
199
201
203
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
211
Bon savoir
213