Initiation C
Initiation C
1 Premiers Pas
1.1 Prologue
Ce cours utilise comme compilateur le Borland C 2.0. Celui-ci est disponible sur le
Web.
Voici pour exemple un premier programme qui fonctionne malgré le fait qu’il ne soit
pas normalisé. Celui-ci affiche le mot bonjour à l’écran.
Une fois le texte du programme frappé, il faut le compiler (Compile), c’est à dire en
analyser la syntaxe.
4. Build all qui permet de retraduire tous les codes source d’un projet (ensemble
de programmes liés les uns aux autres).
Pour notre part, nous n’utiliserons que Compile, le reste se faisant durant la
exe lors de l’exécution de la commande Run.
Certaines bibliothèques sont inclues dans des compilateurs ce qui permet à notre
programme de s’exécuter. Normalement, puts a besoin de la bibliothèque stdio.h. Pour
ajouter une bibliothèque, il suffit d’ajouter #include <nom de la bibliothèque> en début de
programme.
Le second point à corriger est l’absence de valeur de retour. La valeur de retour permet
à un programme ou à l’utilisateur de savoir si le programme que l'on exécute s’est
correctement terminé. 0 signifie une terminaison sans erreur.
int main ()
{
clrscr (); /* Efface l’écran */
puts ("Bonjour");
Corps du programme
getch (); /* Attendre */
return (0);
}
La valeur de retour n'est pas obligatoire, pour ne pas utiliser de valeur de retour on utilise
void main () à la place de int main (). void peut se traduire par "ne contenant rien".
Attention: dans ce cas, on utilise return; et non return (0).
Le programme devient donc :
#include <stdio.h>
#include <conio.h>
void main ()
{
clrscr (); /* Efface l’écran */
puts ("Bonjour");
getch (); /* Attendre */
return; /* Facultatif car c'est la dernière ligne (fin)*/
}
Exemple
Lorsque le compilateur C rencontre le mot clrscr, il regarde dans chacun des ".h"
déclaré par l'instruction #include si ce mot y est défini. Il trouve celui-ci dans la
conio.h et remplace donc ce mot par le code qui lui est associé au moment
de la compilation. A l'inverse, s'il ne le trouve pas, celui-ci émettra une erreur de
syntaxe.
/* stdio.h
Notre programme efface l’écran puis affiche bonjour et attend que l’on appuie sur une
touche afin que l’on puisse voir ce qu’il a écrit.
int main ()
{
/* Corps du programme */
getch () ; /* Facultatif mais permet de voir ce qui s’est produit à l’écran */
/* En attendant l'appui d'une touche */
return (0) ; /* Aucune erreur renvoyée */
}
{
Tabulation
Tout le code est frappé à cette hauteur Bloc de programme
}
Retrait de la tabulation
Tout le texte est maintenant frappé à cette hauteur.
Les commentaires peuvent être placés à n’importe quel endroit dans le programme. Ils
commencent par /* et se termine par */.
/* Commentaire */
main()
{
clrscr(); /* Efface l'écran */
puts("Au revoir "); /* Affiche Au revoir */
getch ();
}
#include <stdio.h>
#include <conio.h>
int main ()
{
clrscr (); /* Efface l'écran */
return 0; /* Revient */
}
10.1 Bibliothèques
Nous utiliserons la déclaration des bibliothèques suivantes :
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
/* dessin de la piste */
int i; /* variable de boucles */
int x1=0,x2=0,x3=0; /* La position des 3 chevaux */
int avance = 0; /* l’avance de chacun des chevaux */
time_t t; /* pour attente (partie offerte) */
Effacer l’écran.
Se positionner en (1,1)
Afficher : Sur quel cheval voulez vous parier (1,2 ou 3) ?
Faire
Sortie = 1 ;
Car = caractère saisi
1:
pari = 1;
coul1 = 2;
coul2 = 1;
coul3 = 1;
2:
pari = 2;
coul1 = 1;
coul2 = 2;
coul3 = 1;
3:
pari = 3;
coul1 = 1;
coul2 = 1;
coul3 = 2;
autrement :
sortie = 0
printf ("%c",0x7);
Positionnement en x1,11
Affichage du caractère "1"
Faire la même chose pour le cheval 2 sur la ligne 12 avec la couleur coul2 et la
position de ligne x2.
Aide : le cheval 1 était en ligne 11
Faire la même chose pour le cheval 3 sur la ligne 13 avec la couleur coul3 et la
position de ligne x3.
Aide : Le cheval arrivé en premier est celui dont la position est la plus grande.
int main ()
{
int i;
int x1=0,x2=0,x3=0;
int avance = 0;
time_t t;
int pari;
int premier;
int sortie;
int coul1,coul2,coul3;
char car;
switch (car)
{
case '1':
pari = 1;
coul1 = 2;
coul2 = 1;
coul3 = 1;
break;
case '2':
pari = 2;
coul1 = 1;
coul2 = 2;
coul3 = 1;
break;
case '3':
pari = 3;
coul1 = 1;
coul2 = 1;
coul3 = 2;
break;
default:
sortie = 0;
printf ("%c",0x7);
break;
}
} while (!sortie);
/* Efface l'écran */
clrscr ();
/* Dessin de la piste */
for (i=1; i<=80; i++)
{
gotoxy (i,10);
printf ("-");
gotoxy (i,14);
printf ("-");
}
/* Affichage du cheval 1 */
textcolor (coul1);
x1 += random (6) + 1;
gotoxy (x1,11);
cprintf ("1");
/* Affichage du cheval 2 */
textcolor (coul2);
x2 += random (6) + 1;
gotoxy (x2,12);
cprintf ("2");
/* Affichage du cheval 3 */
textcolor (coul3);
x3 += random (6) + 1;
gotoxy (x3,13);
cprintf ("3");
/* Attente */
for (i=0; i<5000; i++)
time (&t);
}
while ((x1<74) && (x2<74) && (x3<74));
{
if ((x2>x1) && (x2>x3))
premier = 2;
else
{
if ((x3>x1) && (x3>x2))
premier = 3;
else
premier = 0;
}
}
gotoxy (1,14);
if (premier == pari)
printf ("\nBravo vous avez gagné.");
else
{
if (premier == 0)
printf ("\nDésolé, il y a égalité entre deux chevaux…");
else
printf ("\nDésolé vous avez perdu.\nCheval n°%d
vainqueur",premier);
}
getch ();
return (0);
}
int main ()
{
printf ("Coucou c'est moi"); /* Affiche Coucou c'est moi à l'écran */
getch (); /* Attendre l'appui d'une touche */
}
On pourrait dire que la fonction printf est la même que l'instruction puts vu
précédemment mais il n'en est rien … Celle-ci est beaucoup, beaucoup, beaucoup
plus puissante.
Syntaxe:
La syntaxe de printf est très complexe et pourrait à elle seule faire l'objet d'un
cours, nous en verrons donc des applications au fur et à mesure des besoins.
2.2 Variable
Comme son nom l'indique une variable est quelque chose qui varie.
C'est vrai mais ce n'est pas suffisant.
Une variable peut être considérée comme une boîte dans laquelle on met des données que
l'on peut lire ou écrire.
Boîte [Variable]
La manière la plus facile de lire le contenu d'une variable est la fonction printf que l'on a
aperçu précédemment.
La manière la plus simple de donner une valeur à une variable est l'opérateur mathématique
=. Ecrire dans une variable ayant déjà une valeur revient à la modifier.
Une variable ne peut contenir qu'une seule chose à la fois. Si vous mettez une seconde
donnée dans la variable, la précédente est effacée.
int main ()
{
int i; /* i : variable de type entier */ Déclarations des variables
char car; /* car: variable de type caractère */
i = 65; /* i vaut 65 */
Ecriture dans les variables
car = 'E'; /* car vaut E */
return (0);
}
Explications :
On met dans la variable i la valeur 65.
On met dans la variable car la valeur de E.
Note : En informatique, tout n'est que nombre, je dis donc la valeur de E et non E car c'est
le code Ascii de E qui est sauvegardé dans cette variable. Nous reviendrons là dessus un
peu plus tard.
Exemple :
int i;
i =65;
printf ("Le caractère %d est %c",i,i);
car = 'E'; car = 'G'; car = 'h'; donnera au final pour valeur de car la valeur de 'h'.
Exemple :
! Pour afficher un % avec printf j'écrirai :
printf "La réduction était de 20 \%"
! Pour déclarer un caractère avec la valeur ' (prononcée cote en informatique et non pas
apostrophe (français)), on écrira :
char car;
car = '\'';
Coucou
17
Cou
1
2
3
456
C'est rigolo …
Rappel : Pour pouvoir afficher un caractère de syntaxe C, par exemple ", on utilise
le caractère \ comme préfixe à ce caractère. Pour obtenir un ", on utilise donc \ ".
! Faites afficher, en utilisant ce qui a été fait précédemment, les valeurs 70, 82,
185 et 30.
#include <stdio.h> clrscr ();
printf ("i vaut %d.\n",i);
int main () printf ("a vaut %d.\n",a);
{ printf ("b vaut %d.\n",b);
int i,a,b,c; printf ("c vaut %d.\n",c);
i=70; getch ();
a=82;
b=185; return 0;
c=30; }
int main ()
{
clrscr (); /* Efface l'écran */
/* Attente */
getch ();
return (0);
}
Pas à pas, nous allons maintenant réaliser notre petit programme de calculatrice.
Pour faire afficher le résultat il est possible d'utiliser la fonction printf directement ou
indirectement en utilisant une troisième variable. Pour plus de facilité, nous allons
utiliser un affichage direct. Celui-ci s'effectue de la façon suivante :
Pour saisir une variable, il est nécessaire d'utiliser la fonction scanf. La fonction scanf
s'utilise de la façon suivante :
Saisie de la valeur a : scanf ("%d", &a);
Comme pour printf, on reconnaît le %d pour la saisie d'un nombre décimal. Le &
devant le a signifie que l'on va écrire dans la variable a.
Nous allons maintenant saisir les variables a et b. Pour exemple, je mets ici le code
pour la saisie de a, la saisie de b reste à faire par vos soins à titre d'exercice.
/* Saisie de la valeur de a */
printf ("Valeur de a :\n");
scanf ("%d",&a);
Il est conseillé d'initialiser les variables avant de les utiliser, de ce fait, au début du
programme, après leur déclaration, assignez à a et à b la valeur de 0.
Exemple :
a = 0;
Si tout c'est bien passé, vous avez maintenant entre les mains une super calculatrice
N.B. Appuyez sur la touche Enter après avoir taper votre valeur.
Exemple :
int i = 10;
- Assigner une troisième valeur de type int (penser à l'initialiser à 0) que l'on nommera
bêtement s comme somme.
- Une fois les valeurs de a et b saisies, initialisez s avec la valeur de a + b. Comme en
mathématiques élémentaires.
- Affichez la valeur de s. On devrait avoir les même résultats qu'auparavant, off course.
Petite aide :
float a;
printf ("Saisie de a :");
scanf ("%f",&a);
printf ("\na vaut : %f",a);
getch ();
Pour un affichage plus agréable il est possible de fixer le nombre de chiffres après la
virgule de la façon suivante %.[nombre de chiffres après la virgule]f.
Exemple :
printf ("%.2f",a);
La fonction abs permet d'obtenir la valeur absolue d'un nombre entier. Utiliser cette
fonction pour calculer la valeur absolue de (a-b).
Exemple d'utilisation de abs :
S = abs (a-b);
La fonction ceil permet d'obtenir l'arrondi entier supérieur d'un nombre réel. Utiliser
cette fonction pour calculer l'arrondi supérieur de (a / b).
Exemple d'utilisation de ceil :
S = ceil (a/b);
int main ()
{
int a,b; /* Déclaration des variables */
int d; /* Différence entre les 2 nombres */
clrscr ();
printf("Calculatrice :\n\n");
printf("Valeur de a : ");
scanf("%d",&a);
printf("\n");
printf("Valeur de b : ");
scanf("%d",&b);
d=a-b;
printf("Valeur de a-b : %d\n",d); /* Affichage de la différence */
getch ();
return 0;
}
! Multiplication de 2 nombres
#include <stdio.h>
#include <conio.h>
int main ()
{
int a,b; /* Déclaration des variables */
int m; /* Résultat de la multiplication */
a=0; /* Initialisation des variables */
b=0;
clrscr ();
printf("Calculatrice :\n\n");
printf("Valeur de a : ");
scanf("%d",&a);
printf("\n");
printf("Valeur de b : ");
scanf("%d",&b);
m = a*b;
printf("Valeur de a*b : %d\n", m);
/* Affichage de la multiplication */
getch ();
return 0;
}
int main ()
{
float a,b; /* Déclaration des variables */
float m; /* Résultat de la multiplication */
clrscr ();
printf("Calculatrice :\n\n");
printf("Valeur de a : ");
scanf("%f",&a);
printf("\n");
printf("Valeur de b : ");
scanf("%f",&b);
m = a*b;
printf("Valeur de a*b : %f\n", m);
/* Affichage de la multiplication */
getch ();
return 0;
}
Pour l'addition :
m = a + b;
printf ("Valeur de a+b : %f", m);
Pour la soustraction :
m = a - b;
printf ("Valeur de a-b : %f", m);
! Calculer la somme a + b + c
#include <stdio.h>
#include <conio.h>
int main ()
{
float a,b,c,s; /* Déclaration des variables */
clrscr ();
printf("Saisie de a : ");
scanf("%f",&a);
printf("Saisie de b : "); /* Saisie variables flottantes */
scanf("%f",&b);
printf("Saisie de c : ");
scanf("%f",&c);
getch ();
return 0;
}
! Calculer la différence a - b - c
d = a-b-c; /* Calcul de la différence */
printf("Valeur de d : %.2f\n",d); /* Affichage de la différence */
! Calculer la multiplication a * b * c
m = a*b*c; /* Calcul de la multiplication */
printf("Valeur de m : %.2f\n",m); /* Affiche la multiplication */
! Calculer la division a / b / c
d = a/b/c; /* Calcul de la division */
printf("Valeur de d : %.2f\n",d); /* Affichage de la division */
! Calculer l'arrondi de a + b
c=ceil(a/b); /* Calcul de l'arrondi */
printf("Valeur de c : %f\n",c); /* Affichage de l'arrondi */
Ν Il aurait été possible d'utiliser %d du fait que l'arrondi est un nombre entier !
4 Conditions
Avec des Si on mettrait Paris en bouteille…
Rappel :
Dans un triangle rectangle, les longueurs côtés a ² + b²
sont définies comme le montre la figure ci-contre. b
a
Note :
≅ La racine carrée s'obtient par l'utilisation de la fonction sqrt (valeur)
contenue dans la bibliothèque math.h. (#include <math.h>)
≅ a² peut s'obtenir par a*a.
Méthodologie :
1. Rechercher les variables nécessaires et les déclarer dans le programme.
2. Faire saisir a au clavier.
3. Faire saisir b au clavier.
4. Effectuer l'opération de la racine carrée et afficher le résultat.
Libellé Opérateur
Inférieur <
Supérieur >
Equivalent ==
Différent !=
Inférieur ou égal <=
Supérieur ou égal >=
Libellé Opérateur
Et (and) &&
Ou (or) ||
Non (not) !
Ou Vrai Faux + 1 0
Vrai Vrai Vrai 1 2 1
Faux Vrai Faux 0 1 0
Et Vrai Faux * 1 0
Vrai Vrai Faux 1 1 0
Faux Faux Faux 0 0 0
4.2.4 Combinaison
Toutes les opérations logiques peuvent se combiner entre elles. La seule condition
d'utilisation d'un si (if) avec de telles combinaisons est de l'entourer de ().
Exemple :
if ((car == 'a') || (car == 'A'))
4.2.5 Astuce
Vous verrez souvent ce type de code écrit :
if (er)
{
/* Alors faire quelque chose */
}
4.4 Exercices
! Faites saisir une variable de type entière et indiquez à l'utilisateur si celle-ci est
positive ou négative ou nulle.
Aide :
if (a>0)
{
printf ("Valeur positive");
}
else
{
printf ("Valeur négative");
}
! Faites saisir une variable de type entière et indiquez à l'utilisateur si celle-ci est
positive, négative ou nulle.
! Faites saisir une variable de type caractère et indiquez à l'utilisateur si celle-ci est
une voyelle.
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main ()
{
float a; /* base du triangle */
float b; /* côté du triangle rectangle */
float p; /* valeur de l'hypoténuse (p pour Pythagore !) */
/* Effacer l'écran */
clrscr ();
/* Saisie de a */
printf ("Valeur de la base : ");
scanf ("%f",&a);
/* Saisie de b */
printf ("Valeur du côté : ");
scanf ("%f",&b);
/* Affichage du résultat */
printf ("L'hypoténuse mesure : %.2f",p);
return (0);
}
int main ()
{
/* Valeur que l'on va saisir */
int a = 0;
/* Efface l'écran */
clrscr ();
/* Saisie de a */
printf("Saisie de a : ");
scanf("%f",&a);
getch ();
return (0);
}
int main ()
{
/* Valeur que l'on va saisir */
char car;
/* Efface l'écran */
clrscr ();
/* Saisie du caractère a */
printf("Saisie du caractère : ");
scanf("%c",&car);
getch ();
return (0);
}
5 Remise en forme
5.1 Prologue
L'objet de ce cours est de réaliser un petit break dans l'apprentissage du C et de
s'attacher à voir que l'on est capable de réaliser avec le peu de moyen que l'on a.
L'exercice 4 est assez difficile et mérite surtout de bien réfléchir avant de se mettre au
clavier.
5.2 Exercice 1.
Réaliser un programme qui saisisse un nombre et indique à l'utilisateur si celui-ci est
plus grand ou plus petit qu'un autre nombre fixé par le programme.
Exemple :
si (nbre_saisi<10)
alors "plus petit"
Reprendre l'exercice du chapitre 4 qui disait si un nombre est positif, négatif ou nul.
Exemples:
1. Attente
getch ();
2. Saisie d'un caractère
char car;
car = getch ();
Exemple
char car;
int sortie;
do
{
clrscr ();
printf ("Tapez S pour sortir …");
Rappel :
Un nombre entier vaut la valeur logique vraie si celui-ci est différent de 0.
Un nombre entier vaut la valeur logique faux si celui-ci est égal à 0.
|| signifie un ou logique (or).
5.5 Exercice 2
Tapez l'exemple précédent, aménagez le, comprenez le, puis transformer le afin que
l'on sorte de la boucle uniquement lorsque l'utilisateur a tapé le nombre 10.
Attention La saisie d'un nombre ne se fait pas par getch mais par scanf …
Cf. Chapitre 3.
5.6 Exercice 3
Voici un petit exemple de programme qui permet d'obtenir des nombres aléatoires entre
0 et 100.
Notes :
random et randomize sont définis dans la bibliothèque <stdlib.h>.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nb_alea; /* Nombre aléatoire */
clrscr ();
randomize ();
getch ();
}
5.7.2 Programmation
Courage : Programmer le Jeu …
int main ()
{
int nb_choisi = 33;
int nb_saisi = 0;
/* Attente */
getch ();
return (0);
}
! §5.4
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main ()
{
int valeur;
do
{
clrscr ();
printf ("Votre nombre : ");
scanf ("%d",&valeur);
}while (valeur != 10);
return (o);
! §5.5
#include <stdio.h>
#include <stdlib.h> /* pour random */
#include <conio.h>
int main ()
{
int nb_hasard = 0;
int votre_nb = 0;
randomize ();
nb_hasard = random (101); /* Nombre entre 0 et 100 */
do
{
clrscr ();
printf ("\nTrouvé");
getch ();
return (0);
}
essai = 0;
gagne = 0;
randomize ();
do
{
clrscr ();
if (de1 == 4)
{
if (de2 == 2)
{
if (de3 == 1)
gagne = 1;
else
gagne = 0;
}
else
{
if (de2 == 1)
{
if (de3 == 2)
gagne = 1;
else
gagne = 0;
}
else
gagne = 0;
}
}
if (de2 == 4)
{
if (de1 == 2)
{
if (de3 == 1)
gagne = 1;
else
gagne = 0;
}
else
{
if (de1 == 1)
{
if (de3 == 2)
gagne = 1;
else
gagne = 0;
}
else
gagne = 0;
}
}
if (de3 == 4)
{
if (de2 == 2)
{
if (de1 == 1)
gagne = 1;
else
gagne = 0;
}
else
{
if (de2 == 1)
{
if (de1 == 2)
gagne = 1;
else
gagne = 0;
}
else
gagne = 0;
}
}
essai = essai + 1;
}
while ((!gagne) && (essai != 4));
if (gagne)
printf ("\nGagné !!!");
else
printf ("\nPerdu ...");
getch ();
}
main()
{
int de1, de2, de3;
int gagne;
int essai;
essai = 0;
randomize ();
do
{
clrscr ();
essai = essai + 1;
}
while ((!gagne) && (essai != 4));
if (gagne)
printf ("\nGagné !!!");
else
printf ("\nPerdu ...");
getch ();
Exemple:
char car;
• Faire
• Effacez l’écran
• Saisir une touche
• Tant Que (touche != S) et (touche != s)
• Faire
• Effacez l’écran
• Saisir un nombre
• Tant Que (nombre != 10)
car_min = 'a'
car = toupper (car_min);
printf ("%c",car);
affichera A
int main ()
{
char touche;
do
{
clrscr ();
a=getch ();
}while((touche!='S')&&(touche!='s'));
return (0);
}
! Exercice 1.2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int a = 0;
do
{
clrscr ();
printf("Saisie de a:");
scanf("%d",&a);
}while (a!=10);
return (0);
}
! Exercice 2.1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int a = 0;
do
{
clrscr ();
printf("Saisie de a:");
scanf("%d",&a);
} while ( (a!=1) && (a!=3) && (a!=5) && (a!=7) && (a!=9));
return (0);
}
! Exercice 2.2
Afin de faciliter la correction, j'utiliserai la fonction toupper qui
permet de transformer un caractère minuscule en majuscule.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
char a;
do
{
clrscr ();
printf("Tapez une lettre:");
a=toupper (getch());
}
while((a!='A')&&(a!='E')&&(a!='I')&&(a!='O')&&(a!='U')&&(a!='Y'));
return (0);
}
! Exercice 3.1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
char car;
int nb_frappes = 0; /* nombre de caractères frappés */
do
{
clrscr ();
car = getch (); /* 1 caractère frappé */
nb_frappes ++;
return (0);
}
! Exercice 3.2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int nbre;
int nb_frappes = 0; /* nombre de caractères frappés */
do
{
clrscr ();
nb_frappes ++;
return (0);
}
! Exercice 4.1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
char a;
int nb_voyelles = 0;
do
{
clrscr ();
printf("Tapez une lettre:");
a=toupper (getch());
if ((a=='A') || (a == 'E') || (a == 'I') || (a == 'O')
|| (a == 'U') || (a == 'Y'))
{
nb_voyelles ++;
}
} while (nb_voyelles != 10);
return (0);
}
! Exercice 4.2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int nbre;
int nb_nbre_premiers = 0;
do
{
clrscr ();
printf("Votre nombre : ");
scanf ("%d",&nbre);
return (0);
7 Gestion de l'écran
7.1 Prologue
Nous allons voir dans ce chapitre quelques fonctions permettant de se positionner et
d'afficher à l'écran. Pour utiliser ces fonctions nous aurons besoin de la bibliothèque
conio.h. (#include <conio.h>)
7.2 L'écran
7.2.1 Description
Un écran Dos se décompose de 80 colonnes et 25 lignes. Pour se positionner à un endroit
précis de l'écran, on utilise la fonction gotoxy (pos_x, pos_y);
pos_x allant de 1 à 80 et pos_y allant de 1 à 25.
L’origine est placée dans le coin haut gauche.
Origine Pos_x
(1,1)
Point
(40,12
Pos_y
Point
(80,25)
Pour faire afficher un caractère ou une chaîne de caractère à cet endroit, on utilise printf.
Exemple :
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
clrscr ();
gotoxy (70,25);
printf ("Coucou");
getch ();
return (0);
}
7.3.1 Définition
Switch … case permet l'exécution d'une série d'instructions dans le cas ou une variable a
une valeur précise.
On peut traduire switch … case par dans le cas où la variable vaut … faire …
En plus des cas où, il est possible d'ajouter le cas default qui signifie par défaut faire …
Exemple commenté
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char car;
clrscr ();
gotoxy (1,1);
printf ("Saisie d'une touche : ");
car = getch ();
gotoxy (1,3);
getch ();
return (0);
}
Exemple :
a = a + 5; s'écrit a+=5;
Quelques opérateurs
Opérateur Signification Exemple
a += val a = a + val a += 3
a -= val a = a – val a -= 7
a *= val a = a * val a *= 9
a /= val a = a / val a /= 11
Il existe bien d'autres opérateurs unaires notamment logique mais ceci dépassant l'étendue
de ce cours, je vous renvoie aux livres qui traite cela très bien.
Faire
Effacer l'écran.
Afficher le caractère # en position x,y
G ou g : x = x – 1 (x--)
D ou d : x = x + 1 (x++)
H ou h : y = y –1 (y--)
B ou b : y = y + 1 (y++)
S ou s : sortie = vrai
Autre : réaliser un beep
Effacer l'écran
Aide :
Pour réaliser un beep, écrivez printf ("%c",0x07);
Si x < 1 alors x = 80
Si x > 80 alors x = 1
Si y < 1 alors y = 25
Si y > 25 alors y = 1
Pour pouvoir utiliser ces touches, il faut donc faire un double switch de la façon
suivante :
switch (car)
{
case 0:
car = getch ();
switch (car)
{
case 'H':
y --;
break;
…
}
}
Complétez le programme pour qu'il fonctionne aussi avec les touches de direction.
int main ()
{
clrscr ();
gotoxy (12,7);
printf ("Bonjour, c'est moi et j'utilise le C");
gotoxy (23,18);
printf ("C'est bien, on peut faire ce que l'on veut");
getch ();
return (0);
}
int main ()
{
char car;
clrscr ();
gotoxy (1,1);
printf ("Saisie d'une touche :");
car = getch ();
gotoxy (1,3);
switch (car)
{
case 'g':
case 'G':
printf ("Gauche\n");
break;
case 'd':
case 'D':
printf ("Droite\n");
break;
case 'h':
case 'H':
printf ("Haut\n");
break;
case 'b':
case 'B':
printf ("Bas\n");
break;
default:
printf ("Rien à faire pour ce cas\n");
break;
getch ();
return (0);
}
int main ()
{
char car;
int x=0, y=0;
int sortie=1;
clrscr ();
do
{
clrscr ();
gotoxy (x,y);
printf ("#");
car=getch ();
car = toupper (car); /* Evite le test minuscule/majuscule */
switch (car)
{
case 'G':
x--;
if (x<1)
x = 80;
break;
case 'D':
x++;
if (x>80)
x = 1;
break;
case 'H':
y--;
if (y<1)
y = 25;
break;
case 'B':
y++;
if (y>25)
y = 1;
break;
case 'S':
sortie=0;
break;
default:
printf ("%c",0x07);
break;
}
} while (sortie==1);
return (0);
}
int main ()
{
char car;
int y=10,x=10;
int sortie = 0;
clrscr ();
do
{
car=getch ();
switch (car)
{
case 0:
car=getch();
switch(car)
{
case 'H':
y--;
break;
case 'P':
y++;
break;
case 'K':
x--;
break;
case 'M':
x++;
break;
}
break;
case 'S':
case 's':
sortie = 1;
break;
}
clrscr ();
gotoxy (x,y);
cprintf ("*");
} while (!sortie);
return (0);
}
8 Organigrammes et algorithmes.
8.1 Organigrammes.
Bien qu'inusité de nos jours, les organigrammes permettent d'avoir une approche visuel
que ne fournissent pas les algorithmes. Un organigramme se définit comme une
représentation graphique des structures de contrôle.
Nous ne verrons que les deux symboles suivants :
Début
Fin
Début
if (Condition) Vrai
{ Condition Instructions 1
Instructions 1;
} Faux
else
{ Instructions 2
Instructions 2;
}
Fin
Début
do
{ Instructions
Instructions;
}
while (Condition); Vrai
Condition
Faux
Fin
Début
Switch(variable)
{
Case valeur 1:
Instructions 1; Variable == valeur 1 Instructions 1
Break;
Faux
Case valeur 2:
Instructions 2;
Break; Variable == valeur 2 Instructions 2
…
} Faux
Fin
8.2 Exercice 1 : Et les shadoks crièrent : "Pourquoi tant que on a pas tout
compris, on continue ?"
• Si (gagne)
Ecrire "Gagné"
Sinon
{
Ecrire "Perdu"
Faire afficher le nombre nb_rech
}
En fait GREEN est définit comme valant 2. (cf. #define dans Initiation au C niveau 2).
Pour faire clignoter du texte, il faut ajouter la valeur BLINK à la valeur de la couleur ce
qui nous donne :
textcolor (2+128);
ou textcolor (GREEN+BLINK);
ou encore textcolor (130);
Exemple :
#include <conio.h>
int main ()
{
clrscr ();
textbackground (GREEN);
textcolor (RED);
cprintf ("Coucou");
getch ();
}
affiche "Coucou" en couleur rouge sur fond vert.
Test :
Au lieu de
clrscr ();
textbackground (GREEN);
écrivez :
textbackground (GREEN);
clrscr ();
Aucun commentaire ...
8.5 Exercice 2 :
Ecrivez un programme qui fait afficher "Je suis vert de peur" en bleu clignotant sur fond
jaune poussin. Eh oui, pas shadok pour rien.
int main ()
{
int nb_rech=0, nb_user=0;
int gagne=0;
int essai=0;
randomize ();
nb_rech= random (101); /* Nombre entre 0 et 100 */
clrscr ();
do
{
printf("Saisir un nombre entre 0 et 100 :");
scanf("%d",&nb_user);
if (nb_user<nb_rech)
{
printf("Le nombre à trouver est plus grand\n");
essai=(essai+1);
}
else
{
if(nb_user>nb_rech)
{
printf("Le nombre à trouver est plus petit\n");
essai=(essai+1);
}
else
{
gagne=1;
}
}
}while((essai!=5)&&(!gagne));
if (gagne)
printf("Gagné !");
else
printf("Perdu !");
getch ();
}
! Exercice 2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
clrscr ();
gotoxy(20,20);
textbackground (YELLOW);
textcolor (BLUE + BLINK);
cprintf ("Je suis vert de peur");
getch ();
}
int main ()
{
int d1,d2,d3,d4,d5;
randomize ();
clrscr ();
/* Affichage du tirage */
printf ("\nD1 : %d, D2 : %d, D3 : %d, D4 : %d, D5 : %d"
,d1,d2,d3,d4,d5);
/* Résultat */
if ((d1 == d2) && (d2 == d3) && (d3 == d4) && (d4 == d5))
printf ("\nGagné !");
else
printf ("\nPerdu !");
getch ();
}
9 Les boucles
9.1 Et les shadoks pédalèrent pendant 15 tours …
Pour faire effectuer un certain nombre de fois une tâche on utilise l'instruction for de la
façon suivante (avec i, une variable de type entier (int)).
Exemple:
#include <conio.h>
int main ()
{
int i;
clrscr ();
9.2 Syntaxe
De la même façon que le if le for ne nécessite pas d'accolade si le nombre d'instructions
à répéter est de 1.
Exemple :
On peut utiliser cette fonctionnalité dans le programme précédent en remplaçant :
for (i=0; i<15; i++)
{
printf ("Je me répète pour i valant %d\n",i);
}
par
for (i=0; i<15; i++)
printf ("Je me répète pour i valant %d\n",i);
9.3 Exercice 1
Utilisez une boucle pour i variant de 0 à 15 inclus pour afficher :
Aide
gotoxy (1,i+1); /* +1 car le coin haut gauche est aux coordonnées (1,1) */
textcolor (i);
cprintf ("Ceci est la couleur %d",i);
Exemple :
#include <conio.h>
int main ()
{
int i;
int j;
clrscr ();
9.5 Exercice 2:
En utilisant la double boucle, écrire un programme qui écrit 1 étoile, saute une ligne,
écrit 2 étoiles, saute une ligne, écrit 3 étoiles … jusqu'à 5 étoiles afin d'obtenir ceci :
*
**
***
****
*****
Aide
Sur la ligne n° 1, on affiche 1 * 2 – 1 = 1 étoile en position (42-1,1)
Sur la ligne n° 2, on affiche 2 * 2 -1 = 3 étoiles en position (42-2,2)
Sur la ligne n° 3, on affiche 3 * 2 – 1 = 5 étoiles en position (42-3,3)
On obtient donc :
for (j=0; j<(i*2-1); j++)
{
gotoxy (42-i+j,i);
printf ("*");
}
Aide
Pour faire afficher le caractère associé à un code Ascii, on écrit :
printf ("%d : %c", code_ascii, code_ascii);
int main ()
{
int i;
clrscr ();
getch ();
}
! Exercice 2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
int i;
int j;
clrscr ();
getch ();
}
int main ()
{
int i;
int j;
clrscr ();
printf ("\n");
}
textcolor (130);
gotoxy (41,3);
cprintf ("*");
getch ();
}
void main ()
{
int i;
int j;
clrscr ();
getch ();
}
void main ()
{
int i;
int j;
int car = 0;
clrscr ();
getch ();
}
1 Pointeurs et Fonctions
1.1 Variables : pointeurs et valeurs
Exemple :
char car = 'C';
printf ("%c",car);
Exemple :
char car = 'C';
int nbre = 12;
On ajoute "l" devant le d (%ld) et devant le x (%lx) afin de faire afficher un entier
long.
1.1.2 Pointeurs
Pour utiliser les adresses mémoire des variables à la place des variables elles-mêmes,
on utilise les pointeurs. Les pointeurs sont définis par un type et se déclarent de la
façon suivante :
type* variable;
ou
type *variable;
Le signe * indique l'utilisation d'un pointeur i.e. l'utilisation d'une adresse mémoire.
Le type permet simplement de savoir comment le C doit interpréter l'adresse mémoire
lors de sa lecture. Lors de l'utilisation des chaînes de caractères nous en verrons des
exemples.
Pour enregistrer une valeur dans une adresse mémoire on écrit :
*variable = <valeur>
Exemple:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char car='C';
char* ptr_car = NULL;
clrscr ();
printf ("Avant, le caractère est : %c",car);
ptr_car = &car; /* ptr_car = adresse de car */
*ptr_car = 'E'; /* on modifie le contenu de l'adresse mémoire */
printf ("\nAprès le caractère est : %c",car); /* i.e. on a modifié car */
getch ();
return (0);
}
ptr_car = &car; Signifie que l'on m'a donné l'adresse postale de M. car.
*ptr_car = 'E'; Signifie que je rentre chez M. car et que j'y dépose le caractère E.
printf ("%c",car); Signifie que l'on va lire ce qu'il y a dans la maison de M. et qu'on le
fait afficher.
Une fonction est un petit bloc de programme qui à l'image d'une industrie va
créer, faire ou modifier quelque chose.
Un bloc de programme est mis sous la forme d'une fonction si celui-ci est utilisé
plusieurs fois dans notre code (dans notre programme) ou simplement pour une
question de clarté (Imaginez un livre sans paragraphe).
A l'identique de notre fonction principale main (), une fonction s'écrit de la façon
suivante :
Corps du programme
Retour
}
1.2.2 Void
Le type void signifie indéfini, il est utilisé :
! comme type de sortie pour les fonctions qui ne retournent aucun résultat.
! dans la déclaration de pointeurs sur des zones mémoires dont on ne connaît pas
le type.
Exemples
/* Pointeur sur une zone mémoire indéfinie */
void* m_ptr;
Les variables globales sont modifiables et accessibles par toutes les fonctions sans
avoir besoin de les passer en paramètre. Il est de ce fait extrêmement dangereux
d'utiliser des variables globales.
Les variables locales ne sont modifiables et accessibles que dans la fonction où elles
sont déclarées. Pour les modifier ou les utiliser par une autre fonction, il est nécessaire
de les passer en paramètres.
val_retour est dans les deux cas une variable locale. Bien qu'elles aient le même nom
dans la fonction main et carre, les deux variables n'ont rien à voir entre elles.
#include …
int carre ()
{
int val_retour = 0;
val_retour = val * val;
return (val_retour);
}
void main ()
{
val = 2;
carre ();
printf ("Le carre de 2 est %d", carre ());
}
! Ces paramètres peuvent être utilisés en les déclarant dans les parenthèses
Exemple
void Affiche_Coucou (int x, int y)
{
gotoxy (x,y);
printf ("coucou");
}
void main ()
{
Affiche_coucou (10,12);
getch ();
}
! Ces paramètres peuvent être modifier à la condition qu'ils soient passés par adresse
c'est à dire que la fonction reçoive un pointeur.
Exemple
void Avance_Position (int* x)
{
*x = *x + random (6);
}
void main ()
{
int i=0;
int x=0;
getch ();
}
1.2.5 Piège !
Attention, les opérateurs unaires (avec une seule opérande) sur les pointeurs sont
dangereux.
En effet :
int* x;
*x++;
augmentera l'adresse de x (on va chez le voisin) et non la valeur, pour cela il faut
écrire :
(*x)++;
Note : Ctrl Lettre Lettre s’opère en appuyant sur la touche Ctrl et sans lâcher cette
touche en appuyant successivement sur les deux lettres.
1.2.7 Exercices
Réalisez une fonction Avance_cheval qui :
≅ prendra pour paramètres la position x, la position y, la couleur et le caractère
représentant le cheval.
≅ avancera le cheval en l'effaçant, le dessinant et mettant à jour sa position.
! Exercices 1.1.3
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char car='C';
char* ptr_car = NULL;
clrscr ();
printf ("Avant, le caractère est : %c",car);
ptr_car = &car;
*ptr_car = 'K';
printf ("\nAprès le caractère est : %c",car);
getch ();
return (0);
}
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int val = 10;
int *ptr_val = NULL;
clrscr ();
printf ("Avant, la valeur est : %d",val);
ptr_val = &val;
*ptr_val = 35;
printf ("\nAprès la valeur est : %d",val);
getch ();
return (0);
}
! Fonction Avance_cheval
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void Avance_cheval (int *pos_x, int pos_y, int coul, char cheval)
{
/* Effacement du cheval (position précédente) */
gotoxy (*pos_x,pos_y);
printf (" ");
/* Affichage du cheval */
textcolor (coul);
int main ()
{
int i;
int x1=0,x2=0,x3=0;
time_t t;
int pari;
int premier;
int sortie;
int coul1,coul2,coul3;
char car;
switch (car)
{
case '1':
pari = 1;
coul1 = 2;
coul2 = 1;
coul3 = 1;
break;
case '2':
pari = 2;
coul1 = 1;
coul2 = 2;
coul3 = 1;
break;
case '3':
pari = 3;
coul1 = 1;
coul2 = 1;
coul3 = 2;
break;
default:
sortie = 0;
printf ("%c",0x7);
break;
}
} while (!sortie);
/* Efface l'‚cran */
clrscr ();
/* Dessin de la piste */
for (i=1; i<=80; i++)
{
gotoxy (i,10);
printf ("-");
gotoxy (i,14);
printf ("-");
}
/* Attente */
for (i=0; i<5000; i++)
time (&t);
}
while ((x1<74) && (x2<74) && (x3<74));
gotoxy (1,14);
if (premier == pari)
printf ("\nBravo vous avez gagné.");
else
{
if (premier == 0)
printf ("\nDésolé il y a égalité");
else
printf ("\nDésolé vous avez perdu.\nCheval n°%d
vainqueur",premier);
}
getch ();
return (0);
}
Nous pouvons remarquer que le programme devient plus propre, plus clair.
! 5 chevaux
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void Avance_cheval (int *pos_x, int pos_y, int coul, char cheval)
{
/* Effacement du cheval (position pr‚c‚dente) */
gotoxy (*pos_x,pos_y);
printf (" ");
/* Affichage du cheval */
textcolor (coul);
*pos_x += random (6) + 1;
gotoxy (*pos_x,pos_y);
cprintf ("%c",cheval);
}
int main ()
{
int i;
int x1=0,x2=0,x3=0,x4=0,x5=0;
time_t t;
int pari;
int premier;
int sortie;
int coul1,coul2,coul3,coul4,coul5;
char car;
switch (car)
{
case '1':
pari = 1;
coul1 = 2;
coul2 = 1;
coul3 = 1;
coul4 = 1;
coul5 = 1;
break;
case '2':
pari = 2;
coul1 = 1;
coul2 = 2;
coul3 = 1;
coul4 = 1;
coul5 = 1;
break;
case '3':
pari = 3;
coul1 = 1;
coul2 = 1;
coul3 = 2;
coul4 = 1;
coul5 = 1;
break;
case '4':
pari = 4;
coul1 = 1;
coul2 = 1;
coul3 = 1;
coul4 = 2;
coul5 = 1;
break;
case '5':
pari = 5;
coul1 = 1;
coul2 = 1;
coul3 = 1;
coul4 = 1;
coul5 = 2;
break;
default:
sortie = 0;
printf ("%c",0x7);
break;
}
} while (!sortie);
/* Efface l'‚cran */
clrscr ();
/* Dessin de la piste */
for (i=1; i<=80; i++)
{
gotoxy (i,10);
printf ("-");
gotoxy (i,16);
printf ("-");
}
/* Attente */
for (i=0; i<5000; i++)
time (&t);
}
while ((x1<74) && (x2<74) && (x3<74) && (x4<74) && (x5<74));
gotoxy (1,17);
if (premier == pari)
printf ("\nBravo vous avez gagné.");
else
{
if (premier == 0)
printf ("\nDésolé il y a égalité entre deux chevaux.");
else
printf ("\nDésolé vous avez perdu.\nCheval n°%d
vainqueur",premier);
}
getch ();
return (0);
}
Les test opérés à la fin du programme ne sont pas très réjouissants mais nous sommes là pour
apprendre le C et non les méthodes d’optimisation.
2.1 Tableaux
2.1.1 Définition
Un tableau est un ensemble d'éléments consécutifs. Celui-ci peut être constitué de
plusieurs lignes et colonnes. Nous n'utiliserons dans un premier temps que les tableaux
à une seule ligne.
2.1.2 Déclaration
! Un tableau se déclare de la manière suivante :
<type> <nom du tableau> [<taille du tableau>];
Exemples
Déclaration d'un tableau de 10 caractères.
char tab_char [10];
Exemple
int table [5] [5]; représente un tableau d’entiers de 5 lignes * 5 colonnes.
2.1.3 Utilisation
On accède à un tableau en l'appelant par son nom et son numéro de case.
Exemple
Nom : tab_char Case : 3
tab_char [3] = 'C';
Exemple
Eric s'écrit dans un tableau de 5 caractères de la façon suivante E r i c 0.
E r i c 0
0 1 2 3 4
D'autre part, il est possible de déclarer une chaîne de caractères sans en spécifier la
longueur de départ de la façon suivante :
char chaine [] = "Eric";
C'est pratique dans la condition où l'on ne doit pas la réutiliser (on ne connaît sa taille
que par son contenu).
Exemple
sprintf (m_chaine, "%s","Eric"); remplira m_chaine par Eric0.
(Le 0 n'est là que pour vous rappeler que l'on a besoin du 0 pour terminer la chaîne)
Exemple
printf ("%s",chaine);
Exemple
char ch [] = "toto" ;
…
printf ("La longueur de %s est : %d", ch, strlen (ch)) ;
Affichera 4 à l’écran.
2.1.9 Exercices
En utilisant une boucle (for),
≅ Remplissez un tableau de 10 caractères avec les lettres de l'alphabet en
commençant par A (code ascii 65).
≅ Faîtes afficher la chaîne de caractères ainsi obtenue (n'oubliez pas de rajouter le 0).
≅ Faîtes afficher chaque caractère du tableau sous la forme "Caractère n° 0 : A".
Rappel :
Je peux écrire Tab_car [i] = code_ascii; où code_ascii est un entier représentant le
code Ascii du caractère désigné.
Aide :
Pour faire afficher 1 caractère, on utilisera une syntaxe du style
int pos /* Position dans le tableau */
printf ("Caractère n° %d : %c",pos, Tab_car [pos]);
2.2.1 Description
La fonction gets permet de saisir une chaîne de caractère validée par un Retour
Chariot.
Attention, bien que cette chaîne nécessite d’être validée par un retour chariot, celui-ci
n'est pas enregistré dans le tableau de caractères.
Exemple d'exécution
Saisissez une chaîne de caractère :
Bonjour !
return (0);
}
void main ()
{
char ma_chaine [30];
ma_saisie (ma_chaine);
return ();
}
On ne passe pas ici par le caractère & car en fait un tableau est une adresse mémoire sur
une suite de cases. Par contre, on peut passer par & en faisant ma_saisie (&chaine [0]),
&chaine [0] représentant l'adresse mémoire de la première case mémoire du tableau
C’est un peu compliqué mais il suffit de se dire, je passe un tableau donc un ensemble
de cases mémoire, donc je ne mets pas de &. Je transmets une case donc un élément
d’un type comme un autre donc je mets le &.
On peut facilement dire que le cas de dépassement de la taille d'un tableau est le bug le
plus fréquent rencontré en programmation C alors prenez gare …
N.B. Ce problème n'existe pas sous Turbo Pascal mais on ne peut pas concilier sécurité
et rapidité ce qui fait que le C est de loin plus rapide que Turbo Pascal. Il suffit de
s'imaginer qu'il est nécessaire d'effectuer un test à chaque assignation d'un élément du
tableau !!!
2.4 Exercices
Réaliser votre propre fonction de saisie de chaîne de caractères …
≅ Paramètres d'entrée : position x, y, chaîne de caractères, nombre de caractères
maximum.
Algorithme :
/* Amorçage de la boucle */
car = saisie d'un caractère
tant que
(car est différent d'un retour chariot (0x0D)) ET
(nombre de caractères saisis < nombre de caractères maximum))
faire
ajouter car dans le tableau
afficher car à l'écran
mettre à jour les positions dans le tableau et sur l'écran
car = saisie_car
fin du tant que
ajouter le 0 binaire de fin de chaîne.
Ajouter à votre fonction de saisie de caractères la gestion des touches backspace (code
Ascii 8) et flèche gauche (code Ascii 0 suivi du code Ascii 75). Ces touches
supprimeront le caractère qui précède en l'effaçant.
Pour vous aider, reportez-vous au chapitre 4 du cours Niveau 1.
⌠ Boucle for
En utilisant une boucle (for),
Remplissez un tableau de 10 caractères avec les lettres de l'alphabet en commençant
par A (code ascii 65).
Faîtes afficher la chaîne de caractères ainsi obtenue (n'oubliez pas de rajouter le 0).
Faîtes afficher chaque caractère du tableau sous la forme "Caractère n° 0 : A".
#include <stdio.h>
#include <stdlib.h>
void main ()
{
char tableau [11]; /* 10 caractères + 0 de fin de chaîne */
int i=0; /* compteur */
clrscr ();
/* Affichage de la chaîne */
printf ("Tableau : %s\n",tableau);
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
gotoxy (x,y);
car = getch ();
/* Affichage … l'écran */
printf ("%c",chaine [nb_car]);
void main ()
{
char chaine [11];
char message [] = "Votre saisie : ";
clrscr ();
gotoxy (1,3);
printf ("%s", message);
/* Affichage du résultat */
gotoxy (1,5);
textcolor (GREEN);
cprintf ("Votre saisie : %s",chaine);
void beep ()
{
sound (1000);
delay (100);
nosound ();
}
gotoxy (x,y);
car = getch ();
case 8:
{
if (nb_car>0)
{
x--;
nb_car--;
gotoxy (x,y);
default:
{
/* Affichage à l'écran */
printf ("%c",chaine [nb_car]);
void main ()
{
char chaine [11];
char message [] = "Votre saisie : ";
clrscr ();
gotoxy (1,3);
printf ("%s", message);
/* Affichage du résultat */
gotoxy (1,5);
textcolor (GREEN);
cprintf ("Votre saisie : %s",chaine);
Exemple :
La fonction initgraph provoque l'affichage de :
Ce que fait notre fonction.
Le préfixe far signifie une valeur longue du pointeur (peu importe). Pour notre
connaissance générale, il faut simplement savoir que c'est comme si les pointeurs
normaux ne pouvaient adresser du courrier que sur la France et les pointeurs far sur le
Monde. Les pointeurs far ont disparu avec les compilateurs 32 bits.
initgraph (…)
graphresult()
closegraph ()
Exercice :
En utilisant l'aide en ligne, essayez de comprendre l'utilisation des 3 fonctions.
Explications :
Par défaut, les programmes écrits en C fonctionnent en mode Texte. La
fonction initgraph permet de passer en mode graphique. Ce mode graphique demeure jusqu’à
la rencontre de le fonction closegraph qui arrêtera le mode graphique pour repasser en mode
Texte. Et la fonction graphresult alors ? Elle sert uniquement à savoir si le passage du mode
texte au mode graphique s’est bien passée.
Dans le cas présent, vous pouvez ouvrir le fichier Bgidemo.c qui se trouve dans le
répertoire exemple et regarder. C’est bizarre il y a des ressemblances avec ce qui suit.
La seconde phase consiste à essayer de comprendre puis de faire des tests et enfin de
se jeter à l’eau en passant au codage …
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du résultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
if (Initialize ()) /* Ouverture du mode graphique */
{
printf ("Impossible de passer en mode graphique");
return (1);
}
getch ();
closegraph (); /* Fermeture du mode graphique */
return 0;
}
Exercice :
A l'aide de l'aide en ligne comprenez le programme (simple …).
Je ne connais pas toutes les reliques d'écran et je ne veux pas connaître toutes les
reliques d'écran. Je peux tout de même vous dire que :
! Egavga.bgi sert à l'EGA et le VGA, c'est celui que nous utiliserons.
! Herc.BGI est utilisée pour les écrans Hercule (noir et blanc).
! Cga.bgi pour les écrans CGA.
Fonction principale
int main ()
{
toto () ;
}
Exercices
1. Tester la fonction.
Exemple
J'ouvre mon squelette et je rajoute ce qui est en gras
int main ()
{
if (Initialize ()) /* Ouverture du mode graphique */
{
printf ("Impossible de passer en mode graphique");
return (1);
getch ();
closegraph ();
return (0);
}
Regardez, comprenez …
3.5.2 Notations
Vous êtes arrivé maintenant à un stade auquel le C ne doit plus vous effrayer, je vous
décrits donc les fonctions comme elles le sont dans l’aide en ligne. Je vous rappelle
que :
" void signifie indéfini. void à l’entrée d’une fonction signifie donc qu’elle ne
renverra rien.
" far signifie loin. Une antiquité, faîtes comme si elle n’existait pas.
void far line (int x1, int y1, int x2, int y2);
void far circle (int x, int y, int radius);
void far rectangle (int left, int top, int right, int bottom);
Exercice :
Tester ces 3 fonctions dans un même programme.
9. Sortir
qui saisisse le choix de l'utilisateur et fait afficher ce qui est écrit (dans les cas 1,2,3).
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du r‚sultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
if (Initialize ()) /* Ouverture du mode graphique */
{
printf ("Impossible de passer en mode graphique");
return (1);
}
getch ();
closegraph (); /* Fermeture du mode graphique */
return 0;
}
⌠ Exercice 3.4.3
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du résultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
if (Initialize ()) /* Ouverture du mode graphique */
{
printf ("Impossible de passer en mode graphique");
return (1);
}
setcolor (7);
line (10,10,250,170);
setcolor (3);
circle (250,350,100);
setcolor (4);
rectangle (100,200,350,400);
getch ();
closegraph (); /* Fermeture du mode graphique */
return 0;
}
⌠ Exercice 3.5
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du r‚sultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
char car = ' ';
int couleur = 1; /* On évite le 0 car noir sur fond noir !!!! */
int sortie = 0;
do
{
/* Affichage du menu */
cleardevice ();
setcolor (couleur);
outtextxy (0,0,"1. Dessiner une ligne.");
outtextxy (0,10,"2. Dessiner un rectangle.");
outtextxy (0,20,"3. Dessiner un cercle.");
outtextxy (0,30,"4. Changer la couleur.");
outtextxy (0,50,"9. Sortir.");
case '2':
cleardevice ();
rectangle (100,200,350,400);
outtextxy (200,400, "Appuyez sur une touche.");
getch ();
break;
case '3':
cleardevice ();
circle (150,250,100);
outtextxy (200,400, "Appuyez sur une touche.");
getch ();
break;
case '4':
couleur ++;
if (couleur > 15)
couleur = 1;
break;
case '9':
sortie = 1;
break;
}
}
while (!sortie);
On utilisera généralement void main () pour des programmes de test et int main () pour des
vrais programmes.
4.2.1 Exemple
Tapez cet exemple et en vous appuyant sur l’aide en ligne, comprenez l’utilisation des
fonctions graphiques setlinestyle, setfillstyle, fillellipse.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<graphics.h>
int main ()
{
clrscr();
getch ();
4.3.1 Exemple
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<graphics.h>
int main ()
{
clrscr();
/* Barre 3D */
bar3d (50,50,200,200,13,1);
closegraph();
}
4.3.2 Explications
void far bar3d (int left, int top, int right, int bottom, int depth, int topflag);
L'aide de bar3d n'est pas explicite, en voici donc une explication plus complète
(extrait du Manuel de Référence) :
bar3d dessine une barre rectangulaire en trois dimensions (dans l'espace), et la remplit
à l'aide du motif et de la couleur de remplissage courants. Le contour dans l'espace de
cette barre est tracé dans le style et avec la couleur de tracé courants. La profondeur de
la barre est donnée en pixels par l'argument depth. L'argument topflag sert à
déterminer si la barre possède une face supérieure. Si topflag est non nul il y a une
face supérieure sinon il n'y en a pas (ce qui permet l'empilage de plusieurs barres).
Pour la profondeur de la barre, prendre par exemple 25 % de la barre.
On reconnaît dans topflag le fameux type vrai faux (vrai si différent de 0, faux sinon).
4.4.1 Exemple
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<graphics.h>
int main ()
{
clrscr();
/* Affiche le texte */
outtextxy (30,30,"Raven come back");
Le mot de syntaxe struct nécessiterait un cours à lui tout seul. Nous allons donc utiliser une
autre méthode pour connaître la taille des caractères. Relisez l’aide en ligne associée à
settextstyle et plus spécifiquement l’aide associée au paramètre charsize. Eh oui, nous avons
la clé de notre problème de taille de caractères, la taille en pixels des caractères est égal à
charsize * 8.
Dans l’exemple précédent où charsize était de 5 nous avons donc des caractères de 40x40
pixels.
Spécifications :
1. Dessiner le menu en mode graphique et en caractères gothiques.
2. Ajoutez un menu texte horizontal qui affiche un texte en horizontal en
caractères normaux (DEFAULT_FONT).
3. Ajoutez un menu texte horizontal qui affiche un texte en vertical en
caractères normaux (DEFAULT_FONT).
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du résultat de l'initialisation */
int main ()
{
char car = ' ';
int couleur = 1; /* On évite le 0 car noir sur fond noir !!!! */
int sortie = 0;
/* Couleur du contour */
setcolor (8);
/* Ellipse pleine */
fillellipse (30,30,15,15);
/* Attente */
getch ();
closegraph (); /* Fermeture du mode graphique */
return 0;
}
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du r‚sultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
char car = ' ';
int couleur = 1; /* On évite le 0 car noir sur fond noir !!!! */
int sortie = 0;
/* Couleur du contour */
setcolor (4);
/* Ellipse pleine */
bar3d (50,50,200,200,0,1);
/* Attente */
getch ();
closegraph (); /* Fermeture du mode graphique */
return 0;
}
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du résultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
char car = ' ';
int couleur = 1; /* On évite le 0 car noir sur fond noir !!!! */
int sortie = 0;
/* Couleur du contour */
setcolor (4);
/* Affichage du texte */
outtextxy (30,30, "Coucou");
/* Attente */
getch ();
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int Initialize(void)
{
int GraphDriver = DETECT; /* Driver de carte graphique */
int ErrorCode; /* Rapport des codes erreurs */
int GraphMode=0;
ErrorCode = graphresult();
/* Lecture du r‚sultat de l'initialisation */
return ( 1 ); /* Problème */
}
}
int main ()
{
char car = ' ';
int couleur = 1; /* On évite le 0 car noir sur fond noir !!!! */
int sortie = 0;
/*
La taille des caractères est maintenant de 3*8 = 24 pixels
Afin de laisser de la place pour mon rectangle j'‚cris donc
une ligne tous les 30 pixels et … 10 pixels du bord de l'‚cran
*/
do
{
/* Affichage du menu */
cleardevice ();
setcolor (couleur);
outtextxy (10,30,"1. Dessiner une ligne.");
outtextxy (10,60,"2. Dessiner un rectangle.");
outtextxy (10,90,"3. Dessiner un cercle.");
outtextxy (10,120,"4. Changer la couleur.");
case '2':
cleardevice ();
rectangle (100,200,350,400);
outtextxy (200,400,"Appuyez sur une touche");
getch ();
break;
case '3':
cleardevice ();
circle (150,250,100);
outtextxy (200,400,"Appuyez sur une touche");
getch ();
break;
case '4':
couleur ++;
if (couleur > 15)
couleur = 1;
break;
case '5':
cleardevice ();
case '6':
cleardevice ();
case '9':
sortie = 1;
break;
}
}
while (!sortie);
5 Fichiers et Structures
5.1 Bases sur les fichiers
Un fichier représente tout ce qui est enregistré sur votre disque dur ou presque, on va dire tout
ce qui porte un nom. Il est possible de créer, de lire ou d’écrire dans des fichiers. Il faut noter
cependant que certains fichiers par contre peuvent être protégés en lecture, en écriture ou les
deux.
Exemple
#include <conio.h>
#include <io.h>
#include <fcntl.h>
int main ()
{
int h_fic;
char ligne [80];
int nb_car_lus;
int i;
/* effacement de l'écran */
clrscr ();
/* Ouverture du fichier */
h_fic = open ("c:\\test.txt ", O_CREAT);
/* Fermeture du fichier */
close (h_fic);
getch ();
return (0);
}
Analysons l’ensemble
/* Ouverture du fichier */
h_fic = open ("c:\\test.txt", O_CREAT);
La fonction open permet d'ouvrir un fichier, le second paramètre est son mode
d'ouverture, ici O_CREAT signifiant ouverture s'il existe ou création s'il n'existe pas. Par
contre O_CREAT seul ne permet pas d'écrire dans le fichier offrant ainsi une sécurité
supplémentaire. La fonction open renvoie –1 si l'on a pas réussi à ouvrir notre fichier et
renvoie un handle (poignée) sur le fichier sinon.
What is an handle ?
Un lien sur quelque chose. On appelle ceci une poignée car comme avec un sac, vous
le prenez par la poignée pour le porter.
La fonction eof permet de savoir si l'on a atteint la fin du fichier. Regardez l'aide pour
comprendre le while (!eof (…))
La fonction read permet de lire des octets (ici transformés en char). Elle prend pour
paramètre le handle de fichier, la zone de mémoire dans laquelle on va recevoir les données et
la taille maximale que l'on veut lire (attention au dépassement (cf. chapitre 2)).
getch ();
return (0);
}
/* Fermeture du fichier */
close (h_fic);
La fonction write permet d'écrire des octets sur le fichier. Les paramètres sont le handle de
fichiers, les octets à écrire et la taille à écrire.
Essai, laissez 80 au lieu de nb_car_lus. Regardez, avec un peu de chance, vous allez trouver
des morceaux de texte non désirés, eh oui, personne ne vous a dit que votre chaîne de départ
était vide !
Regardez.
Attention, l'utilisation de O_CREAT permet de créer le fichier en mode lecture seul, pour
l’ouvrir en plus avec des droits d’écriture il faut lui associer O_RDWR (lecture/écriture) ou
O_WRONLY (écriture seule) de la façon suivante :
open ("c:\\test.txt", O_CREAT | O_RDWR).
Exemple
#include <conio.h>
#include <io.h>
#include <fcntl.h>
int main ()
{
int position;
int h_fic;
char ligne [80];
int nb_car_lus;
int i;
int taille;
/* effacement de l'écran */
clrscr ();
/* Ouverture du fichier */
h_fic = open ("c:\\test.txt", O_CREAT);
getch ();
return (1);
}
/* Taille du fichier */
taille = filelength (h_fic);
printf ("Taille du fichier : %d\n",taille);
printf ("\n");
}
/* Fermeture du fichier */
close (h_fic);
getch ();
return (0);
}
5.5 Structures
Nous avons vu, dans le chapitre précédent, l'utilisation des structures. Nous allons maintenant
voir la définition et l'utilisation d'une structure.
5.5.1 Déclaration
2 choix se proposent à nous.
Solution 1 :
struct
{
/* Définition de la structure */
} nom de la variable qui aura comme forme cette structure;
Solution 2 :
typedef struct
{
/* Définition de la structure */
} nom de la structure;
<nom de la structure> nom de la variable qui aura comme structure cette structure.
Exemple
typedef struct
{
char nom [40];
char prenom [20];
int age;
} elt_fiche_nom;
elt_fiche_nom une_fiche ;
elt_fiche_nom une_seconde_fiche ;
elt_fiche_nom est le nom de la stucture, la macro typdef signifie définition d'un type, de ce
fait là elt_fiche_nom se comporte exactement comme un autre type de données (int par
exemple).
5.5.2 Utilisation
struct
{
char nom [40];
char prenom [20];
int age;
} fiche_nom;
fiche_nom une_fiche;
fiche_nom une_seconde_fiche;
une_fiche.age = 20;
Exemple
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
int main()
{
typedef struct
{
char nom [40];
char prenom [20];
int age;
} fiche;
fiche ma_fiche;
getch ();
return (0) ;
}
fiche ma_fiche;
int h_fic ;
int i;
/* Fermeture du fichier */
close (h_fic);
/* --------------------------------- */
/* Lecture des éléments du fichier */
/* --------------------------------- */
/* Ouverture du fichier */
h_fic = open ("c:\\fiche.dat", O_RDONLY);
/* Fermeture du fichier */
close (h_fic);
getch ();
return 0;
}