Vous êtes sur la page 1sur 63

MEA3

TP/TD de Programmation C

2016-2017

Sommaire

ENVIRONNEMENT DE PROGRAMMATION VISUAL STUDIO2


TP 1 : INITIATION AU LANGAGE C

TP 2 : STRUCTURES DE CONTRLE

11

TP 3 : TABLEAUX A UNE DIMENSION

12

TP 4 : ALGORITHME DU PLUS COURT CHEMIN (LEE)

13

TP 5 : VARIABLES ET FONCTIONS

15

TP 6 : STRUCTURES ET FICHIERS

17

TP 7 : STRUCTURES DE DONNEES

19

TP 8 :RECURSION

20

TP 9 : LISTE CHAINEES

21

TP COMPLEMENTAIRES

22

EXERCICES COMPLEMENTAIRES

27

ANNEXE : INTRODUCTION AU SYSTEME WINDOWS/MS-DOS

46

Environnement de programmationVisual Studio


A) Cration dun projet
1. Ouvrir le logiciel Microsoft Visual Studio 2005

MenuDmarrer / Tous les Programmes /MEA/Microsoft Visual Studio2005


2. Cration du projet

Menu Fichier / Nouveau / Projet

Dans la fentre qui souvre Nouveau Projet , dvelopper larborescence Visual C++ en cliquant sur la croix. Slectionner
Win32, puis dans la fentre de droite choisir Application Console Win32 .
Entrer le nom de votre projet (par exemple ici, Premier Projet). Choisir galement la localisation de lenregistrement de
votre projet (nous vous conseillons de tout enregistrer dans votre rpertoire personnel, sur le disque rseau). Cliquer sur OK.
3. Configuration du projet
Choisir longlet Paramtres de lapplication dans loutil de configuration de lapplication Win32.
Choisir le paramtre une application de type Console, et cocher la caseProjet Vide dans les options additionnelles. Cliquer
ensuite sur Terminer.
Le projet est maintenant configurer pour programmer en C : cette procdure devra tre rigoureusement reproduite pour tout
nouveau projet.
4. Cration / Ajout de fichier(s) source(s)
Nous allons maintenant rajouter un fichier source notre projet.
Faire un clic droit sur Sources, choisir Ajouter, Ajouter un nouvel lment.
Appuyer sur la croix pour dvelopper larborescence Visual C++.
Slectionner licne Fichier C++ et donner un nom votre fichier (par exemple Premier Programme) ainsi que la
localisation de ce fichier sur le disque dur (par dfaut, il indique le rpertoire correspondant votre projet, nous vous
conseillons de conserver ce paramtre). Pour terminer, cliquer sur Ajouter.
5. Edition du programme
Le programme ouvert est vide, et vous devez alors saisir dans la fentre ddition votre programme. Ici par exemple, nous
allons faire un programme qui ralise laddition de deux nombres entiers.
Exercice : Recopiez pour commencer les quelques lignes de C qui suivent :
void main (void)
{
int a=2;
int b=6
int c=0;
c=a+b;
}

Ca y est ! Vous avez crit votre premier programme.


Pour terminer, sauvegarder votre travail :

MenuFichier, Sauvegarder Premier Programme.cpp

B) Compilation et excution dun programme


Pour tre excut par votre ordinateur, le programme doit tre traduit en langage machine : cest le langage que comprend le
microprocesseur. Cest le compilateur qui est charg de cette tche. Son rle est tout dabord de vrifier la bonne criture de
votre programme (analyse syntaxique) puis de le traduire en langage machine.
6. Compilation du Programme

Menu Build, puis lancer la commande Compile (ou Ctrl + F7)

Si votre programme est crit correctement (c'est--dire, suivant les rgles du langage C), le compilateur vous indique que la
tche de compilation na pas provoqu derreurs (fentre du bas).
Si vous remarquez des erreurs, appuyez sur F4 et corrigez les.
7. Edition des Liens

Menu Build, puis lancer la commande Build Solution(ou F7)

Une fois que le programme ne comporte plus derreur, il est ncessaire deffectuer ce quon appelle ldition des liens. En
effet, les programmes en C utilisent gnralement des bibliothques de fonctions prdfinies et prcompiles (par exemple, la
bibliothque stdio.h contient la fonction printf()). Lors de la phase ddition des liens, le compilateur va ajouter le
code objet correspondant cette fonction printf() au code gnr lors de la phase prcdente. Cette phase peut galement
gnrer des erreurs si les correspondances entre les librairies et les fonctions utilises sont incorrectes.
8. Excution du programme

Menu Debug, puis lancer la commande Start Without Debugging (ou CTRL+F5)

Si tout est crit correctement, le compilateur gnre alors un fichier excutable (qui se termine par .exe) et indique que la
gnration sest droule sans erreurs.
Vous pouvez alors lancer lexcution du programme, en vous rendant dans le menu Debug / Excuter (marqu par une
icne reprsentant un point dexclamation ou CTRL+F5).
Exercice : Quest-ce que vous remarquez lexcution du programme ?
Afin de visualiser le rsultat obtenu par notre programme, nous allons ajouter une fonction qui permet de visualiser sur
lcran une chane de caractres. Pour cela ajouter la ligne suivante au bon endroit dans votre programme :
printf("a=%d, b=%d, a+b = %d\n",a,b,c);

Faire la compilation et ldition des liens. Si vous observez des erreurs, corrigez-les
Une fois que le programme ne comporte plus derreurs et que ldition des liens sest droule correctement, excuter votre
programme.
Une console souvre et doit afficher le rsultat de votre calcul. Dans lexemple propos, on obtient un affichage tel quil est
reprsent ci-dessus.

C) Monsieur, a marche pas


Et oui Vous remarquerez trs rapidement quun programme marche rarement du premier coup. Ne vous inquitez pas, cela
arrive tous les programmeurs, mme aux plus expriments Pensez aussi que vous tes de futurs ingnieurs et que votre
rle sera entre autres de trouver des solutions des problmes : pour cela il suffit dun peu de patience et de mthode.
Durant ces sances de TP, vous allez tre confronts 2 types de problmes :
1. Le compilateur indique que le programme contient des erreurs
2. Le programme se compile correctement, mais lexcution a plante ou vous nobtenez pas le bon rsultat
Dans le premier cas, il suffit de comprendre les messages du compilateur pour corriger une une chaque erreur produite lors
de lcriture du code.

Conseil :
Afin de ne pas vous retrouver avec des dizaines voire des centaines derreurs la compilation, je vous suggre vivement de
compiler rgulirement votre programme.
Une erreur "vraie" peut ventuellement dclencher plusieurs messages d'erreur. La correction de cette seule erreur enlvera
donc tous les messages. De mme, parfois le compilateur "se perd" et gnre beaucoup plus de messages que d'erreurs,
certains de ces messages tant errons. Il est donc conseill de corriger la 1ere erreur (attache au 1 er message), de
recompiler etc jusqu' ce qu'il n'y ait plus d'erreurs.

Dans le deuxime cas, il faut se munir dun autre outil quon appelle le dbogueur .

Dboguer un programme
Comme nous lavons vu dans le paragraphe prcdent, le compilateur permet didentifier des erreurs de langage. Parmi les
difficults que vous allez rencontrer, il se peut que votre programme passe ltape de compilation avec succs, mais que votre
programme ne sexcute pas comme prvu.
N

Exercice :Cet exercice consiste crer un programme qui permet de faire le calcul suivant :
Le rsultat attendu avec N=10 est 55.

somme i
i1

Tapez le code suivant dans lditeur de texte de Visual Studio (partez du projet existant) :
#include<stdio.h>
void main (void)
{
int i;
int N=10;
int somme=0;
for(i=1;i<=N; i++);
{
somme=somme+i;
}
}

printf("somme=%d\n",somme);

Compilez et fates ldition des liens de ce programme (touche F7).


Excutez le programme (Ctrl+F5) :Quel est le rsultat obtenu ?

Dans un programme relativement court, on peut rapidement identifi les erreurs, en insrant par exemple des printf() qui
affichent les rsultats des oprations effectues. Mais ds quun programme gagne en complexit, il va devenir trs difficile
de contrler les valeurs de toutes les variables. En gnral, on va donc attendre le rsultat final, et sil ne correspond pas au
rsultat attendu, on va dboguer le programme.

Linterface de Visual Studio permet un dbogage relativement ais des programmes. La premire tape du dbogage consiste
insrer des points darrt :
1. Insertion de Points darrts
Pour insrer un point darrt, cliquez simplement dans la marge gauche de la fentre ddition lendroit o vous voulez
que le programme sarrte lors de lexcution. Un point rouge apparat alors lendroit o vous avez cliqu.
Dans cet exemple, on va mettre un point darrt au niveau de la boucle for, puis excuter en mode pas pas le programme.
2. Lancement du mode Debug

Menu Debug, puis lancer la commande Start Debugging(ou F5)

Lexcution du programme commence, puis sarrte au point spcifi : le mode Debug permet alors de contrler les valeurs
des variables. Dans la fentre en bas gauche, on observe les valeurs des variables dans le programme au moment de larrt
de lexcution :
Variable
i
somme

Valeur
0
-858993460

Type
int
int

3. Excution en mode pas pas


On va maintenant excuter en mode pas pas tout le programme. Pour cela, aller dans le menu Debug et essayez les
diffrentes possibilits :

Step Into (F11)


Step Over (F10)
Step Out (SHIFT+F11)
Restart (CTRL+SHIFT+F5)

- Le Step Into permet de rentrer lintrieur dun bloc dinstructions pour en vrifier la bonne fonctionnalit. Un bloc
dinstructions sera soit un ensemble dinstructions dlimits par des accolades, soit des fonctions.
- Pour viter de rentrer dans un bloc, vous pouvez faire un Step Over : dans ce cas, les instructions dun bloc sont excutes
en mode normal jusqu linstruction suivant la fin du bloc.
- Enfin, si vous tes entrs dans un bloc dinstruction ou une fonction pour une excution pas pas, mais que vous voulez en
sortir, vous pouvez alors faire un Step Out, qui vous permet de venir linstruction suivant le bloc.
- Quand vous avez plusieurs points darrt, vous pouvez lancer lexcution en mode Debug plusieurs fois : lexcution
sarrtera systmatiquement au prochain point darrt.

Exercice :Pour comprendre exactement ce quil se passe, dmarrez le dbogage ds la premire instruction (insrer un point
darrt en face de linstruction int i ;) et excutez en mode pas pas avec la commande Step Over (touche F10).
Relevez sur un papier le rsultat des oprations : reprez lerreur, corrigez l, et relancez une excution en mode pas pas
pour voir si lerreur est corrige.

Conseil :
Utilisez de prfrence le Step Over (touche F10) lorsque vous ne voulez pas rentrer dans le dtail de lexcution de fonctions
tels que le printf()

D) Raccourcis utiles
Edition :
Ctrl + a : Tout slectionner
Ctrl + c : Copier
Ctrl + x : Couper
Ctrl + p : Coller
Ctrl + z : Annuler
Ctrl + y : Refaire
Ctrl + s : Sauver
Ctrl + K + Ctrl F : Alignement automatique

Compilation :
Ctrl + F7 : Compiler
F7 : Build
Ctrl + F5 : Excuter

Debug:
F5: Debug
F11: Step Into
F10: Step Over
Shift + F11: Step Out

Aide:
Placer le curseur sur un mot, et faire F1

E) Remarque finale
La programmation est un exercice qui peut paratre complexe au dbut, et qui ncessite une grande rigueur. Vous avez des
outils (compilateurs, aides de la librairie MSDN) qui peuvent vous tre dune grande utilit pour corriger des erreurs et viter
de les commettre par la suite. Votre professeur est l galement pour vous aider : nhsitez pas poser des questions !
Dans tous les cas, avant de foncer tte baisse dans lcriture dun programme, rflchissez bien aux objectifs, et posez sur le
papier lorganigramme de votre programme en dcomposant le problme en sous problmes.
Enfin, faites attention aux noms que vous donnez vos variables, et abusez des commentaires ! Ils peuvent vous aider
comprendre plus facilement et plus rapidement quelques lignes de codes dont vous auriez oubli le rle

Rappel :
Les commentaires en C sont dlimits par des balises :
/* pour commencer un commentaire
*/ pour terminer un commentaire
Comme vous voluez dans un environnement ddi au C++, vous avez galement la possibilit de faire des commentaires de
fin de ligne qui souvrent simplement par un double slash : //

TP 1 : INITIATION AU LANGAGE C
PROBLEME 1
Crez un nouveau projet et copiez le fichier se trouvant dans le rpertoire
PublicEns\PublicMEA\MEA3\MEA3-Info\TP1\probleme2.cpp. Corriger les
erreurs de syntaxe ventuelles et lancer le programme avec le jeu
d'essais propos.
A-t-il le comportement attendu ? Sinon, le modifier en consquence.
/* inclusion de la librairie mathmatique
# "math.h"
main ();
/* programme de calcul des racines de l'quation axx + bx + c =0*/
/* on acquiert les coefficients a,b,c */
/* le programme itre sur plusieurs jeux de valeurs a,b,c */
/* il s'arrete lorsque a = b = c = 0 */
float a,b,c;
printf("\ndonner la valeur de a");
scanf("%f\n",a);
printf("\ndonner la valeur de b");
scanf("%f\n",b);
printf("\ndonner la valeur de c);
scanf("%f\n",c);
printf("\n")
while((!(a==0) || !(b==0) || !(c==0))
{
/* calcul du discriminant
delta = b * b - 4 * a *c
if delta = 0 printf ("racine double %f \n)
else
if delta > 0
{
sq = sqrt (delta);
x1 = -b + sq / 2 *a ;
x2 = -b - sq / 2 *a ;
printf ("premire racine relle %f\n", x1);
printf ("deuxime racine relle %f\n", x2)
}
else
sd = sqrt (-delta);
x1 = -b / 2 * a;
x2 = sd / 2 *a ;
printf("premire racine complexe %f +i %f",x1,x2);
printf("deuxime racine complexe %f -i %f",x1,x2);
printf("\ndonner la valeur de a");
scanf("%f\n",a);
printf("\ndonner la valeur de b");
scanf("%f\n",b);
printf("\ndonner la valeur de c);
scanf("%f\n",c);
printf("\n");
}
}

On prendra comme jeu d'essais :

a
1
1
0
2

b
10
-2
1
1

c
1
1
1
1

Vous remarquerez que la fonction scanf() qui permet de saisir une valeur au clavier et de la stocker en mmoire
est indique comme tant dsapprouve . En effet, vous pourrez vous-mme faire lexprience de certains
inconvnients de cette fonction plus tard.
En attendant, vous avez 2 possibilits pour supprimer les avertissements obtenus :
Soit vous remplacez simplement la fonction scanf() par scanf_s() qui est la version scurise de scanf() et
approuve par le compilateur
Soit vous allez dans les proprits du projet pour indiquer au compilateur que vous ntes pas concerns par
ces avertissements : pour cela, clic droit sur le nom du projet, Proprits, Proprits de Configuration, C/C++,
Prprocesseur et ajouter Prprocesseur dfinitions la valeur _CRT_SECURE_NO_DEPRECATE

PROBLEME 2 : Pyramide
Crer un programme permettant d'afficher un triangle isocle form
d'toiles de N lignes (N tant fourni au clavier):
Nombre de lignes : 8
*
*o*
*ooo*
*ooooo*
*ooooooo*
*ooooooooo*
*ooooooooooo*
***************

PROBLEME 3 : Dtection de squence


Crer un nouveau projet et crire un programme qui lit des caractres
entrs au clavier (donnes d'entre), et cela jusqu' ce que les trois
caractres 'f', 'i' et 'n' - minuscules - ou 'F', 'I' et 'N' - majuscules aient t saisis successivement. On n'acceptera pas les mlanges de
lettres minuscules et majuscules. (Il n'y a pas de donnes de sortie).
Indication : mmoriser en permanence les trois derniers caractres lus.

10

TP 2 : STRUCTURES DE CONTRLE
On veut faire afficher un damier de n par n cases. Les cases noires (resp.
blanches) sont reprsentes par p * p un caractre C1 (resp. C2). Par
exemple pour n=4, p = 3, C1=&, C2=+, le programme doit afficher :
&&&+++&&&+++
&&&+++&&&+++
&&&+++&&&+++
+++&&&+++&&&
+++&&&+++&&&
+++&&&+++&&&
&&&+++&&&+++
&&&+++&&&+++
&&&+++&&&+++
+++&&&+++&&&
+++&&&+++&&&
+++&&&+++&&&

Les nombres n et p, les caractres C1 et C2 sont choisis par l'utilisateur


(n et p sont supposs tre infrieurs ou gaux 9).
Question 1 : On crira ce programme de telle faon que :
- l'entre des donnes soit "scurise" en ce sens qu'en cas de faute de
frappe lors de l'acquisition des nombres n et p, le programme ne s'arrte
pas mais qu'au contraire il demande nouveau les valeurs n ou p (par
exemple on frappe sur la touche "U" au lieu de la touche "8"). De faon
similaire, on s'assurera que le nombre n est pair et que les caractres C1
et C2 sont diffrents.
- aprs chaque affichage, le programme "recommence". Il s'arrtera
lorsque la valeur donne n est nulle.
Question 2 :
Ecrire trois versions de la partie affichage du damier proprement dit
n'utilisant que des structures itratives ("pour", "tant que", "jusqu' ce
que"). L'excution de ces trois versions sera contrle par un menu
interactif. Par exemple sur l'cran s'affichera le teste suivant :
Voulez-vous afficher le damier :
- en utilisant la structure pour (rponse a ou A)
- en utilisant la structure tant que (rponse b ou B)
- en utilisant la structure pour (rponse c ou C)
- acqurir de nouvelles valeurs pour n, p, C1 et C2 (rponse d ou D)

Si la rponse est a, b ou c le damier sera affich puis le menu


rapparatra. Si la rponse est d on redemandera les paramtres du
problme puis le menu rapparatra. Si la rponse est autre, le menu
rapparatra.
Indications : l'impression se fait caractre par caractre. Pour ce faire on
peut utiliser soit la fonction printf() soit la fonction putchar(). Par
exemple pour imprimer la lettre 'a', on peut crire :
11

Soit putchar ('a');


Soit printf("%c",'a');

12

TP 3 : TABLEAUX A UNE DIMENSION


Exercice 1 :
a. Saisir une chane de caractres.
b. Aprs la saisie, calculer (sans utiliser de fonction) et afficher la
longueur de la chane de caractres.
Exercice 2 :
a. Saisir, caractre par caractre, une chaine compose exclusivement de
chiffres et afficher la chaine saisie. Le programme vrifiera que chaque
caractre entr au clavier est bien un chiffre compris entre '0' et '9'.
b. Convertir le tableau de caractres en un tableau de nombres entiers et
afficher ce tableau.
c. Convertir le nombre entr sous forme de chane de caractres en
nombre entier et lafficher.
Exercice 3 :
a. Saisir un nombre entier positif compos de 5 chiffres maximum.
b. Convertir ce nombre en une chane de caractres.
c. Afficher la chane convertie.
Exercice 4 :
a. Saisir deux chanes de caractres
b. Comparer, caractre par caractre, ces deux chanes et dterminer si
elles sont identiques ou leur ordre lexicographique.
Exercice 5 :
Un palindrome est un mot qui reste le mme qu'on le lise de gauche
droite ou de droite gauche (par exemple, PIERRE n'est pas un
palindrome, alors que OTTO est un palindrome).
a. Ecrire un programme qui vrifie si une chane simple (sans espace)
introduite au clavier est un palindrome.
b. Faire la mme chose, mais cette fois avec une phrase complte (avec
espaces et/ou ponctuation).
Exercice 6 :
Refaire les exercices prcdents avec les fonctions de la bibliothque
stdlib.h et string.h .

13

14

TP 4 : ALGORITHME DU PLUS COURT CHEMIN (LEE)


Dans un labyrinthe, on recherche un chemin, le plus court possible, allant
d'une case de dpart (Xd,Yd) une case d'arrive (Xa,Ya), donnes.
1. Reprsentation
On reprsente le labyrinthe par un tableau rectangulaire T[M][N]
d'entiers (M<=60 et N<=60, tous les deux plus petits pendant la mise au
point). On emploiera le codage suivant :
T[X][Y]
Signification
-1
"case bloque par un obstacle"
0
"case libre non encore traverse"
r>0
"case libre traverse au pas "r"
-2
"case du segment de chemin dj trace.
Conditions de cheminement :
On regarde le tableau T comme une carte gographique. D'une case (i,j)
on peut passer seulement ses quatre voisines Nord, Sud, Est et Ouest,
si elles existent (attention au voisinage des bords) et si elles sont libres
d'obstacle.
2. Algorithme
2.1 Phase d'expansion
On marque "1" la case de dpart. On fixe lp=1 (longueur parcourue).
En balayant tout le tableau dans un ordre quelconque, on marque "lp+1"
toutes les cases libres d'obstacle, non dj traverses et adjacentes par le
Nord, le Sud, l'Est ou l'Ouest une case numrote "lp". Puis on
incrmente lp.
Cette opration est rpte jusqu' ce que la case d'arrive soit
atteinte (cas o le chemin existe) ou bien jusqu' ce que l'excution d'un
balayage du tableau s'achve sans qu'aucune case supplmentaire n'ait
t marque (cas o le chemin n'existe pas : les cases de dpart et
d'arrive sont spares par des obstacles incontournables).
2.2 Phase de remonte ou de trac
Quand un chemin existe, on le trace en remontant de la case d'arrive
la case de dpart.
On mmorise la longueur du chemin trouv : lp = T[Xa][Ya]. C'est la
distance entre (Xd,Yd) et (Xa,Ya) pour les conditions de cheminement
adoptes. Puis on marque comme appartenant au chemin ("-2") la case
d'arrive, qui est donc la case initiale de la remonte.
Alors, tant que la dernire case marque n'est pas la case de dpart, on
en recherche une voisine qui soit marque "lp-1" (on sait qu'il en existe
une, car autrement la prcdente ne serait pas marque lp), on la marque
"appartenant au chemin" et on dcrmente lp.

15

3. Prsentation des rsultats


Pour visualiser l'cran le labyrinthe et le chemin, on convertit chaque
valeur entire du tableau T en un seul caractre imprimable selon la
convention :
'0' = Obstacle
'*' = Case du chemin
'.' = Case libre hors chemin
Remarques :
Pour simplifier le traitement des cases se trouvant sur le bord du labyrinthe, on pourra
entourer celui-ci d'obstacles. Ainsi toute case "utile" du labyrinthe possde 4 voisins.
On pensera au cas o il n'existerait pas de chemin.
4 Modification de la phase dexpansion (Facultatif)
Afin damliorer la phase dexpansion on utilisera une file. Au lieu de
balayer lensemble du tableau pour retrouver les cases marques "lp", les
cases nouvellement marques sont alors stockes dans une file.
Initialement la file contient la case dpart. Ecrire le programme
correspondant en utilisant :
- Une fonction qui ajoute un lment la file,
- Une fonction qui retire un lment,
- Une fonction qui teste si la file est vide
Complment : Comment gnrer des nombres alatoires ?
Le programme suivant permet de gnrer un nombre entier compris
entre a et b de manire rellement alatoire :
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
int Rand( int a, int b)
{
int nRand ;
nRand= a + (int) ( (float)rand() * (b-a+1) / (RAND_MAX-1)) ;
return nRand;
}
void main()
{
int i;
srand((unsigned)time(0));
for (i=0; i<10; i++)
{
printf("nRand[%d]=%d\n",i,Rand(-100,100));
}
}

Testez ce programme et utilisez cette fonction pour gnrer les obstacles


de manire alatoire dans le programme prcdent.

16

17

TP 5 : VARIABLES ET FONCTIONS

Rappels :
- L'instruction du pr-processeur #define X Ypermet de dfinir l'lment
X qui sera substitu par Y dans le reste du programme. Par exemple :
#define pi 3.14159

Surface= R * R * pi ; /* quivalent R*R*3.14159 */

- Lors du droulement d'un programme, dans la fonction main(), ou dans


une autre fonction, un branchement peut tre fait vers une autre
fonction. Aprs l'excution de la fonction appele, un nouveau
branchement se fait, en sens inverse, pour revenir l'endroit o le cours
s'tait interrompu. Pour effectuer le traitement, la fonction appele utilise
des valeurs (nombres, caractres, ...) qui sont, soit communes
l'ensemble des fonctions (variables globales), soit transmises par la liste
des paramtres dlimite par des parenthses et attache au nom de la
fonction, soit dfinies au sein mme de la fonction (variables locales).
- Les paramtres d'une fonction sont un ensemble de valeurs qui, au
moment de l'appel, sont recopies sur une pile mmoire (allocation
dynamique). Vu de l'intrieur de la fonction, les paramtres sont des
variables locales qui disparaissent automatiquement aprs l'excution,
tout comme les autres variables dfinies dans le corps de la fonction. Par
consquent, aprs la fin d'excution d'une fonction, les variables passes
en argument conservent les valeurs qu'elles avaient avant l'appel la
fonction.
...
int Fonction1(int j)
/* j prend la valeur de la variable au moment de l'appel c-a-d i=1 */
{
j = j*2 /* j devient gal 2 */
if (condition) l = j ;
else
l = 0 ;
return l ;
}
...
void main()
{
...
int i=1 ; /* i est initialise 1 */
int k ;
k = Fonction1(i) ;
/* i vaut toujours 1 */
...
}

18

- On peut et on doit renvoyer une valeur d'une fonction qui n'est pas
dclare void. L'instruction de retour (return) prcise une valeur de
retour (voir exemple ci-dessus). Si la fonction ne doit pas retourner de
valeur, elle est dclare void.
void Procedure1 (int i, ...) { /* ne contient pas d'instruction return */ }

- Il est parfois utile de conserver les modifications apportes la valeur


d'un argument aprs la fin d'excution d'une fonction. Puisque cela n'est
pas prvu originellement par le langage, il faut non pas utiliser
directement les variables traiter mais plutt leur adresse.
void Procedure2(int val, int *ad)
/* val prend la valeur de i, ad prend la valeur de &j */
{
val++ ;
(*ad)++ ;
}
void main()
{
.
int i=1;
int j=1 ;
Procedure2(i,&j) /* attention on utilise &j et non directement j */
/* i vaut toujours 1, j vaut 2*/
}

Quand on appelle Procedure2(), val++ incrmente une copie locale du


premier argument rel i, alors que (*ad)++ incrmente le deuxime
argument rel j (i est passe par valeur, j est passe par rfrence).
- Une variable statique (static int i ;) reste locale la fonction dans
laquelle elle est dclare mais conserve sa valeur d'un appel l'autre de
la fonction.

Exercices :
Copier le fichier VarEtFonc.c
Y:PublicMEA\MEA1-Info\

se

trouvant

dans

le

rpertoire

1/ Corriger les erreurs de compilation et d'excution


2/ Ecrire une fonction Appartient()qui permettra de vrifier si un entier
appartient ou pas un ensemble. Elle sera appele partir de
Intersectiont1t2()et de Uniont1t2()et permettra d'viter la duplication
du code de vrification d'appartenance dans ces deux fonctions.
3/ Proposer trois nouvelles versions possibles de Acquisition()
permettant de compter et d'afficher le nombre d'appels cette fonction.
La premire version utilisera une variable globale (l'affichage du nombre
d'appels tant externe Acquisition()), la deuxime version utilisera une
variable locale Acquisition() (l'affichage du nombre de passages tant
19

interne la fonction), la troisime version utilisera le passage par


argument (l'affichage du nombre de passages tant externe ou interne
la fonction).
Le compte rendu de TP doit contenir le listing de VarEtFonct.c aprs
correction, les listings des 3 nouvelles versions de Acquisition() o l'on
expliquera quelles sont les modifications correspondantes apporter au
programme principal pour utiliser ces nouvelles fonctions.

20

TP 6 : STRUCTURES ET FICHIERS
But
Lobjectif de ce TP est de dvelopper un programme permettant de trier
et compter les mots qui sont contenus dans un fichier texte.
Notions utilises
* Les chanes de caractres
* Les fichiers
* Les structures
Cahier des charges
Il s'agit de lire un fichier contenant du texte, de trier les mots par ordre
lexicographique croissant, puis d'afficher la liste trie des mots du texte
en indiquant pour chacun d'entre eux leur nombre d'occurrences. Plus
prcisment, le programme doit permettre :
- louverture en lecture dun fichier contenant un texte, fichier dont le
nom est indiqu sur la ligne de commande. Dans le cas o l'utilisateur
omettrait de donner un nom de fichier d'entre sur la ligne de commande,
le programme demande l'utilisateur d'indiquer le texte directement par
le clavier ; il faudra alors terminer la saisie avec une indication de "fin de
fichier".
- le tri des mots et le nombre d'occurrences de chaque mot ; le tri utilise
la dichotomie pour chercher la place d'un mot avant de l'insrer dans le
tableau tri s'il n'existait pas encore, ou bien d'incrmenter son nombre
d'occurrences.
- laffichage lcran de la liste trie des mots, un mot par ligne, avec
pour chaque mot, son nombre d'occurrences.
Indications
1/ Exemple de lecture dun fichier
#include "stdio.h"
void main() {
FILE * fic;
char c;
// ouverture du fichier
fic=fopen("texte.txt","r");
// boucle sur les caractres lus
while((c=fgetc(fic)) != EOF) {
// dans cette boucle, c contient successivement chaque caractre lu
printf("%c",c);
}
}

21

22

2/ La fonction strtok()dclare dans string.hpermet de dcouper une


chane de caractres en "morceaux" en se basant sur des sparateurs.
Pour commencer ce TP, vous pouvez partir du programme ci-dessous qui
lit une ligne envoye au clavier et la dcoupe avec la fonction strtok().
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[]
= " ,\t\n";
char *token;
void main( void )
{
printf( "%s\n\nTokens:\n", string );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}}

3/ La fonction strcmp() prototype dans string.hcompare des chanes de


caractres selon l'ordre lexicographique.
4/ La fonction strlen() prototype dans string.h permet de connatre la
longueur d'une chane de caractres.
Consignes
Pour coder le mot du texte et le nombre d'occurrences de ce mot dans le
texte, on utilisera la structure de donnes suivante :
typedef struct CompteMot
{
char mot[20];
int nbOcc;
}CompteMot;

On utilisera un tableau statique pour CompteMot. On peut lire le texte ligne


par ligne avec la fonction fgets().
Exemple d'excution
Supposons que le programme ait t lanc avec un seul argument
indiquant le nom d'un fichier contenant le texte suivant :
Bonjour, comment vas-tu ? Trs bien. Et toi, comment vas-tu ?

Alors, nous obtiendrons comme rsultat :


Bonjour : 1 fois
Et : 1 fois
Trs : 1 fois
bien : 1 fois
comment : 2 fois
toi : 1 fois
tu : 2 fois
vas : 2 fois

23

TP 7 : Structures de donnes
On veut crer un rpertoire tlphonique lectronique. Les
informations mmorises sont le nom de la personne et son numro de
tlphone (considr comme un entier dans le programme). Pour ce faire,
on utiliseraune liste chaine statique appeleAnnuaire dans laquelle
chaque lment contient les informations relatives une personne. Le
chainage seffectuera en fonction de lordre alphabtique.
Principe de la liste chaine statique avec une structure Exemple ,
compose dun champ Nom (tableau de caractres), et un champ Suivant
(entier).
struct Exemple {
char Nom[20] ;
int Suivant;
};
Convention :
- Un lment de la liste qui na pas de successeur aura son
champ Suivant -1 .
- On utilise deux identificateurs dindex, Vide et Pleine, qui
permettent de reprer lindex du premier lment de la liste
Pleine et de la liste Vide
- Sil ny a aucun lment dans la liste, Pleine est -1
- Si la liste est complte, Vide est -1
Exemple :
On dfinit dans le programme principal une liste Exemple de taille 5 :
struct Exemple Liste[5] ;
int Vide=0 ;
int Pleine=-1 ;
La liste vide est initialise de la manire suivante :
Nom
Liste[
0]
Liste[
1]
Liste[
2]
Liste[
3]
Liste[
4]

Suiva
nt
1

-1
24

25

On ajoute un lment dont le nom est Alain , la liste devient :


Nom
Liste[
0]
Liste[
1]
Liste[
2]
Liste[
3]
Liste[
4]

Alai
n
/

Suiva
nt
-1
2

-1

Vide=1
Pleine=0
On ajoute un nouvel lment dont le nom est Zizou , la liste devient :
Nom
Liste[
0]
Liste[
1]
Liste[
2]
Liste[
3]
Liste[
4]

Alain

Suiva
nt
1

Zizo
u
/

-1

-1

Vide=2
Pleine=0
On ajoute un nouvel lment dont le nom est Bernard , la liste
devient :
Nom
Liste[
0]
Liste[
1]
Liste[
2]
Liste[
3]
Liste[

Alain

Suiva
nt
2

Zizou

-1

Bern
ard
/

-1

26

4]
Vide=3
Pleine=0
On supprime llment 0 ( Alain ) de la liste, la liste devient :
Nom
Liste[
0]
Liste[
1]
Liste[
2]
Liste[
3]
Liste[
4]

Suiva
nt
3

Zizou

-1

Bern
ard
/

-1

Vide=0
Pleine=2
Etc.
1/ Dfinir un type de donnes Personne permettant de mmoriser les
informations relatives une personne tellesque son nom et son numro
de tlphone.
2/ Dfinir un tableau de personnes, de taille fixe, nommAnnuaire.
3/ Ecrire une fonction Acquisition() qui permet l'acquisition au clavier
du nom de la personne et de son numro de tlphone.
On vrifiera dans cette fonction que :
- le nom de la personne ne dpasse pas 30 caractres
- le numro de tlphone est un nombre positif
Si ces conditions sont vrifies, la valeur de retour de la fonction vaut 1,
et le nom et le numro de la personne sont renvoys au programme
appelant. Dans le cas contraire, un message d'erreur est envoy
l'oprateur et la valeur de retour de la fonction vaut 0.
4/ Ecrire une fonction Ajoute() qui ajoute Annuaireun nom et un numro
de tlphone associ. Si le nom de la personne ne figurait pas dans
Annuaire, un nouvel lment est ajout la liste, sil figurait dj, le
numro de tlphone existant est remplac par le nouveau numro de
tlphone. Cette fonction doit galement permettre de mettre jour le
chainage des lments en fonction de lordre alphabtique.

27

5/ Ecrire une fonction Affiche() qui affiche le contenu de l'annuaire dans


lordre alphabtique.
7/ Ecrire une fonction Recherche() qui, pour un nom de personne donn,
affiche :
- son numro de tlphone si le nom figure dans l'annuaire
- le message "pas de personne ce nom" si le nom ne figure pas
dans l'annuaire.
8/ Ecrire une fonction Efface() qui, pour un nom de personne donn
supprime llment de la liste. Si la personne n'existe pas le message "pas
de personne ce nom" est affich.
9/ Ecrire un programme principal constitu d'un menu permettant :
- d'ajouter une personne l'annuaire
- d'afficher le contenu de l'annuaire dans l'ordre alphabtique
- de supprimer une personne de l'annuaire
- de consulter le numro de tlphone d'une personne
- de sortir du programme
NB : On supposera qu'il n'y a pas d'homonymes et que chaque personne
n'a qu'un numro de tlphone.

28

TP 8 : RECURSION
Exercice1 : VOYAGEUR DE COMMERCE
Le problme du voyageur de commerce : Soit n villes relies par des
routes de longueur di,j (chaque ville est suppose relie par une route
chaque autre ville. Le problme consiste trouver un chemin passant par
toutes les villes une fois et une seule revenant au point de dpart, et dont
la longueur totale soit minimale.
Pour rsoudre ce problme on utilisera une mthode "brutale" consistant
gnrer tous les chemins, calculer la longueur de chaque chemin et
enfin choisir le plus court.
Structures de donnes
Les distances entre les N villes seront mmorises dans une matrice
Dist[N][N]. Ces donnes sont stockes initialement dans un fichier dont la
premire ligne donne la dimension N. Chaque ligne suivante du fichier
correspond une ligne de la matrice.
Un chemin entre les villes sera reprsent par un tableau Chemin de N
cases, chaque case contenant le numro d'une ville.
Par exemple
1 4 3 2 : reprsente le chemin 1->4->3->2->1
Pour N = 4, on devra gnrer tous les chemins, soit :
1234
1243
1324
1342
1423
1432
Remarque : Pour N villes, il y a (N-1)! chemins. Donc, pour mettre au
point votre programme vous commencerez avec des petites valeurs de N.
Chaque fois qu'un chemin est gnr, on calcule sa longueur. Si sa
longueur est plus courte que celle du meilleur chemin dj trouv, ce
chemin devient le meilleur chemin.

29

Exercice2 : TRIANGLE DE PASCAL


Ecrire un programme qui construit le triangle de PASCAL de degr N et
le mmorise dans une matrice carre P de dimension N+1.
Exemple: Triangle de Pascal de degr 6:
n=0

n=1

n=2

n=3

n=4

n=5

10

10

n=6

15

20

15

Exercicecomplmentaire : DTERMINANTDUNE MATRICE


On veut calculer le dterminant d'une matrice M. Pour ce faire, on utilise
la formule suivante :
n

D e t( M ) (1) i 1 mi ,1 de t(M i )
i 1

dans laquelle Mi est la matrice M prive de la ligne 1 et de la colonne i et


mi,1 et llment de la ligne i et de la colonne 1 de la matrice M.
Dans un premier temps, saisir les valeurs au clavier lors de lexcution du
programme, et afficher la valeur du dterminant lcran.
Dans un deuxime temps, vous pourrez crire un fichier texte contenant
la matrice M , puis crer un deuxime fichier et crire la matrice M ainsi
que son dterminant dans ce nouveau fichier. Les fichiers 1 et 2 seront
choisis par l'utilisateur des 2 faons suivantes.
- soit les noms des fichiers sont donns sur la ligne de commande.
Par exemple :
pgm fichier1 fichier2

- soit les noms des fichiers ne figurent pas sur la ligne de


commande, et le programme demande l'utilisateur le nom des fichiers.
NB : pour accder aux mots donns sur la ligne de commande, utiliser
argc et argv

30

Mthode:
Calculer et afficher seulement les valeurs jusqu' la diagonale principale
(incluse). Limiter le degr entrer par l'utilisateur 13.
Construire le triangle ligne par ligne:
- Initialiser le premier lment et l'lment de la diagonale 1.
- Calculer les valeurs entre les lments initialiss de gauche droite en
utilisant la relation:
Pi,j = Pi-1,j + Pi-1,j-1
- Raliser le mme exercice, mais cette fois en faisant le calcul de
manire rcursive.

31

TP 9 : LISTES CHAINEES
On souhaite crer une application permettant de saisir une liste
dtudiant sans en connatre le nombre au dpart. Cette liste est cre le
jour de la rentre.
On opte pour une structure de liste chane dont chaque enregistrement
possde :
- Le nom de ltudiant
- Le numro de la carte tudiant
- La moyenne aux examens
- Un pointeur SUIV pointant vers ladresse de lenregistrement
suivant
1/ Crer la liste chane correspondante. Pour cela on utilisera une fonction
Ajout()permettant dajouter un lment la liste.
2/

Suite la rentre certains tudiants, ne sont pas


prsents. Il est donc ncessaire de les supprimer de la liste. Pour cela on
utilisera une fonction Supprimer() permettant de supprimer un lment
de la liste.

3/

Il est maintenant ncessaire de trier cette liste


par ordre alphabtique : utiliser un algorithme simple de tri (tri bulle
par exemple) pour trier la liste. (on utilisera une fonction Tri()). Une fois
la liste trie par ordre alphabtique, crer une fonction InverseListe(),
permettant dinverser la liste.

4/

Une fois que la liste est trie, il est possible quun


tudiant supplmentaire arrive en cours danne : modifier alors la
fonction Ajout() afin de linsrer directement au bon emplacement dans
la liste.

5/

En fin danne, une fois les moyennes calcules,


on dsire conserver la liste uniquement avec les tudiants qui ont une
moyenne suprieure ou gale 12/20. On utilisera une fonction
PromoFinale() pour faire les modifications ncessaires la liste. La liste
chane rsultante sera donc la liste finale des tudiants admis en
deuxime anne.

6/

On dsire maintenant fusionner 2 listes : par


exemple une liste de la promotion actuelle entrant (obtenu partir de
promo_final) en 2me anne et une liste des recrutements extrieurs
entrant directement en 2me anne. On utilisera pour cela une fonction
Fusion().

32

33

TDs/TPs COMPLEMENTAIRES

Vous trouverez ci-joint une liste dexercice afin de prparer au mieux les
TD/TP et ventuellement les examens dinformatique. Attention la liste
nest pas forcment classe par ordre de difficult
Exercice 1Donner la structure dun programme permettant de donner tous les
nombres parfaits infrieur p donn.
Aide : un nombre est parfait si et seulement si il est gale la somme de
ses diviseurs (hormis lui mme)
Exemple : diviseurs de 6 = 1, 2, 3, 6 => 1+2+3 = 6. 6 nombre parfait.
Exercice 2- La multiplication " la russe"
La technique de multiplication dite " la russe" consiste diviser par 2 le
multiplicateur(et ensuite les quotients obtenus), jusqu un quotient nul,
noter les restes, et multiplierparalllement le multiplicande par 2. On
additionne alors les multiples obtenus du multiplicandecorrespondant aux
restes non nuls.
Exemple : 68 123 (= 8364)
multiplicande
M2
123
246
492
984
1968

multiplicateur
m2
68
34
17
8
4

reste
m mod 2
0
0
1
0
0

3936

7872

somme partielle

(0 123) + 0
(0 246) + 0
(1 492) + 0
(0 984) + 492
(0 1968) +
492
(0 3936) +
492
(1 7872) +
492
68 123 = 8364

Eectuer les multiplications suivantes selon cette technique.


64 96 (= 6144)
45 239 (= 10755)
Donner l'organigramme d'un prgm effectuant cette multiplication
34

Exercice 3- Calcul du PGCD mthode 1


On utilisera les proprits suivantes pour calculer le PGCD de 2 nombres
A et B :
PGCD (A,A) =A
PGCD (A,B) = PGCD (A-B,B) si A > B
PGCD (A,B) = PGCD (B,A)
Exemple :
PGCD (36,21) = PGCD(36-21,21)=PGCD(15,21)=
PGCD(6,15)=PGCD(6,9)=PGCD (6,3) =PGCD(3,3) =3
Donner l'organigramme de ce programme
Exercice 4- Calcul du PGCD par la mthode d'Euclide
On considre que pgcd(a,0) = a et que pour b 0 pgcd(a,b) = pgcd(b, a
mod b). On progresse dans l'algorithme en diminuant chaque tape les
nombres considrs par calcul du modulo.
Par exemple, le PGCD de 1071 et de 1029 l'aide de l'algorithme
d'Euclide :
1071 = 1029 1 + 42
1029 = 42 24 + 21
42 = 21 2 + 0
Il faut prendre le dernier reste avant le zro, donc PGCD(1071 ; 1029) =
21
Donner l'organigramme de ce programme
Exercice 5- Analyse d'un texte.
On lit un texte dans un fichier lettres par lettre. On suppose que l'on
utilise une fonction qui lit un caractre et renvoie la valuer du caractre
lu. Elle renvoie 0 la fin du fichier.
Donne l'organigramme d'un pgm qui calcule le nombre de caractres et
de mots du texte.
Exercice 6Donner lorganigramme dun programme permettant de calculer le nombre lu rebours d'un
nombre positif entr au clavier.
Exemple: Entre: 1234 Affichage: 4321
Exercice 735

Donner lorganigramme dun programme qui permet de calculer la somme, le produit et la


moyenne d'une suite de chiffres non nuls entrs au clavier, sachant que la suite est termine
par zro.
Retenez seulement les chiffres (0, 1 ... 9) lors de l'entre des donnes.
Exercice 8Donner l'organigramme et le programme qui dtermine si une anne est
bissextile. L'utilisateur doit entrer l'anne.
Rappel : uneanne est bissextile si elle est divisible par 4. Ex: 2012 tait
bissextile
Exception 1 : si elle est divisible par 100 elle n'est pas bissextile. Ex :
1900 n'tait pas bissextile
Exception 2 : si elle est divisible par 400 elle est bissextile. 2000 tait
bissextile
Exception 3 : si elle est divisible par 10000, elle n'est pas bissextile.
10000 ne sera pas bissextile.
Donner l'organigramme d'un pgm qui calcule le nombre de jours couls
entre un edate donne et le 1er janvier de cette anne.
Donner l'organigramme d'un programme qui calcule le nombre de jours
sparant 2 dates.
Exercice 9Donner l'organigramme d'un pgm qui donne la valeur maximale et la
valeur minimale d'une suite de nombres donns positifs entrs au clavier.
L'acquisition s'arrte lorsque on donne un nombre ngatif
Exercice 10Donnerl'organigrammeetcrirelecodeCd'unpgmquicalculeleproduitdedeuxnombres
suivantlamthodesuivante:
a*b=a*(b1)+asibestimpair
a*b=(2*a)*(b/2)sibestpairestpositif
Exemple;
3*7

=36*6+36
=72*3+36
=72*2+108
=144*1+108
=144*0+252
=252

Exercice 11-

36

Ecrire un programme permettant de saisir une chane de caractres


compose uniquement de caractres '0' et de caractres '1'. Cette chane
de caractres reprsente le codage binaire d'un entier.
Le programme affichera ensuite :
1/ une chane de caractres reprsentant le complment 2 de l'entier
2/ la valeur de l'entier sous forme dcimale
Exemple :
chane saisie : 11010
complment 2 : 00110
valeur de l'entier : -6

Remarque : on supposera que l'entier est cod sur 32 caractres au


maximum
Prrequis : notion de tableau

Exercice 12On dsire crire un programme qui trie et affiche un ensemble de


vecteurs du plan, par ordre croissant, selon la valeur de leur norme
euclidienne. Pour cela, on utilise la fonction qsort, dclare dans le fichier
stdlib.h, qui ralise un tri rapide ("quick sort"), et qui a l'en-tte suivant :
void qsort(void *tab,size_t nb_elem,size_t taille,int (*compare)(const void
*,const void *))

Remarques :
La fonction qsort est "doublement gnrique" : d'une part, elle peut trier
des lments de type quelconque ; d'autre part, elle peut trier des
lments (de mme type) selon n'importe quel critre de comparaison.
Le mot-cl const signifie que les deux objets points par les deux
paramtres de type void * ne peuvent pas tre modifis l'intrieur de la
fonction pointe par compare. Cela vise viter tout "effet de bord".
La fonction qsort ralise le tri (croissant) du tableau d'adresse tab,
comportant nb_elem lments de taille octets. Pour cela, qsort va
effectuer diffrentes comparaisons entre les lments du tableau, en
appelant une fonction de comparaison donne par l'utilisateur. Cette
fonction de comparaison devra retourner :
Une valeur ngative si l'lment point par son premier paramtre est
infrieur l'lment point par son second paramtre (au sens d'un
certain ordre).
Une valeur nulle si les deux lments sont gaux.
Une valeur positive si le premier lment est suprieur au second.
Aprs avoir dfini le type vecteur par :
typedef struct vect
{

37

double x;
double y;
} vecteur;

Raliser les tches suivantes :


1/ Ecrire la fonction norme, qui retourne la valeur de la norme
euclidienne d'un vecteur dont l'adresse est passe en paramtre, d'entte :
double norme(const vecteur *v)

2/ Ecrire la fonction compare_norme, d'en-tte :


int compare_norme(const void *v1,const void *v2)

qui compare les normes euclidiennes des deux vecteurs points par v1 et
v2.
3/ Ecrire un programme permettant de lire les coordonnes tapes au
clavier d'au plus 100 vecteurs, puis de les afficher l'cran, une fois
tris.
Prrequis : fonctions, pointeurs
Exercice 13Ecrire un programme qui permet de trouver les boucles dans une liste
chans de pointeurs de type bool findLoop(Instance *ip). Le
programme renvoie 1 si il a trouv une boucle sinon 0. Pour tester le
programme, crer une structure de type :
typedef struct _Instance
{
instance *next ;
} Instance

puis faire un programme qui gnre une liste dInstances avec et sans
boucle de type :
Instance *chainlist(int sizeList, bool doLoop)

Le programme final sera du type :


int main (void)
{
Instance *ip ;
bool
loop ;
int
size ;
bool
doLoop ;
printf("entre la taille de la liste\n ") ;
scanf("%d ", &size) ;
printf("faire une liste avec boulce 0/oui, 1/non ") ;
sacanf("%d ", &doLoop) ;

38

ip = chainlist(size, doLoop)
loop = findLoop(ip) ;
If (loop == doLoop)
{
printf("mon programme marche, je suis le meilleur\n ") ;
}
else
{
printf("il faut continuer a travailler mes TP\n ") ;
}
}

Faire un test avec (size, doLoop) = (5, TRUE) et (size, doLoop) = (5,
FALSE).
Exercice 14Ecrire un programme contenant une fonction rcursiveCalcul() qui :
-

lit un nombre entier positif entr au clavier


effectue la somme de ce nombre avec les nombres saisis
prcdemment (on utilisera une variable de type entier que l'on
appellera somme pour mmoriser le rsultat courant)

Le calcul se termine lorsque le nombre saisi est gal 0.


Le rsultat final est affich l'cran.
Note : On pourra utiliser le passage d'argument par adresse pour la
variable somme.
Exercice 15Ecrire une fonction rcursive (et le programme principal associ)
permettant de traduire un nombre romain en un nombre sous la forme
dcimale. La fonction ne vrifiera pas la validit du nombre romain.
Rappels :
M = 1000 D = 500 C = 100 L = 50 X = 10 V = 5
Exemple : I II III IV V VI VII VIII IX X XI XII
LX
1 2 3 4 5 6 7
8
9 10 11 12
50 60
LXX LXXX XC C
D
M
70
80
90 100 500 1000

I=1
XX

XXX

20

XL

30

L
40

Principe :
Si un chiffre romain est suivi d'un chiffre romain de valeur suprieure, la
valeur de ce chiffre se soustrait, sinon la valeur de ce chiffre s'additionne.

39

Exemple : VIII = 5 + 3 = 8. XX = 10 + 10 = 20. LXVII = 50 + 10 + 5 + 2


= 67. IV = 5 - 1 = 4. XL = 50 - 10 = 40.
Ce systme n'est pas employ pour les milliers (M).
Exercice 16-

Diagonale de Cantor

On numrote chaque point du plan de coordonnes (x; y) (o x et y sont des entiers naturels) par le
procd suggr sur la figure ci-dessous :

crire une fonction numero(x,y), dfinie de faon rcursive, qui retourne le numro du point de
coordonnes (x; y).

Exercice 17-

Analyse dun fichier

A l'aide du programme "Bloc-notes" crer un fichier "texte.txt" contenant


un texte quelconque compos de lettres, caractres de ponctuation,
chiffres etc (vous pouvez copier un texte trouv sur Internet, de
prfrence en anglais).
Ecrire un pgm "analyse" qui :
- lit le fichier "texte.txt"
- compte le nombre N1 de lettres contenues dans ce fichier
- compte le nombre N2 de blancs, tabulations, retours chariot.
- compte le nombre N3 de mots "FIN" ou "fin"
- qui affiche le texte d'origine en remplaant les lettres par des
majuscules.
- qui affiche la somme des caractres chiffres contenus dans le texte
On se servira du gabarit suivant pour lire les caractres dans le fichier.
#include "stdio.h"
void main() {

40

FILE * fic;
char c;
// ouverture du fichier
fic=fopen("texte.txt","r");
// boucle sur les carctres lus
while((c=fgetc(fic)) != EOF) {
// dans cette boucle, c contient successivement chaque caractre lu
printf("%c",c);
// complter le programme ici.
}
// et ici .
}

Exercice 18-

tableaux une dimension

Un tableau est un ensemble d'lments de mme type et a toujours une


dimension finie. Dans ce TP, on se propose de manipuler successivement
des tableaux d'entiers et des tableaux de caractres. On fera au moins les
trois premiers exercices.
1 : A partir de donnes de type entier entres au clavier, crire un
programme P1 qui remplit un tableau TAB1 de type tableau d'entiers
positifs ou nuls, de telle sorte que les donnes dans le tableau soient
ranges dans l'ordre croissant tout instant. Au pralable, on aura
initialis toutes les cases du tableau la valeur -1, la valeur -1 dans une
case d'un tableau signifiant par convention que la case est "vide". On
fixera la dimension du tableau M1=50. L'acquisition des nombres
s'arrte soit lorsque le tableau est plein soit lorsqu'on donne un nombre
ngatif. Remarque : si le tableau n'est pas compltement rempli, les cases
"vides" seront marques par la valeur -1.
Exemple : si les valeurs donnes sont successivement 3, 1, 5,-4
-1 -1
3 -1
1 3
1 3

-1
-1
-1
5

-1
-1
-1
-1

-1
-1
-1
-1

-1
-1
-1
-1

0
Remarque : il ne s'agit pas de trier le tableau une fois celui-ci rempli,
mais de rajouter chaque valeur sa bonne place dans le tableau en
"dcalant" si ncessaire les autres valeurs.
2:En utilisant le programme P1, et donc un tableau TAB1 dans lequel N
lments sont rangs dans l'ordre croissant, crire un programme P2 qui
lit les donnes de TAB1 et range uniquement les Np entiers pairs dans
un tableau TAB2 de telle sorte que ces lments se retrouvent dans un
ordre dcroissant. On fixera la dimension du tableau TAB2 M2=30 et
41

on vrifiera la condition Np < M2 c.--d. que si Np > M2 on ne copiera


que les M2 plus grandes valeurs paires. Dans le cas contraire, TAB2 sera
complt par des valeurs 1.
3:A partir de deux tableaux TAB1 et TAB2 dans lesquels les lments de
type entier sont rangs dans l'ordre croissant (on se servira du
programme P1 pour construire TAB1 et TAB2), crire un programme P3
qui range toutes les donnes de TAB1 et TAB2 dans un troisime tableau
TAB3, de telle sorte que les donnes dans le tableau TAB3 soient ranges
dans l'ordre croissant. Remarque : le nombre de valeurs ranges dans
TAB1 et TAB2 peut tre diffrent. On ne fera pas de tri sur TAB3.
4 :A partir d'un tableau d'entiers TABI dans lequel sont ranges des
donnes non tries, crire un programme P5 qui prend les donnes de
TABI et les range dans l'ordre croissant dans un deuxime tableau TABF.
Le tableau initial TABI pourra contenir plusieurs fois les mmes valeurs.

Exercice 19-

Tri par dichotomie

Il existe diffrentes mthodes de tri. On se propose ici de mettre en


uvre un tri par dichotomie .
Pour cela, on considre la premire valeur du tableau A appele pivot. On
place le pivot la place k de telle faon que :
- pour tout i<k, A[i]<=A[k]=pivot
- pour tout i>k, A[i]>A[k]=pivot
On recommence la mme opration sur les deux sous-tableaux A[1],..,A[k1] et A[k+1],....,A[n]. Puis, pour chacun d'eux sur 2 sous-tableaux,
etc...
On arrte de traiter un sous-tableau lorsqu'il ne contient qu'un seul
lment ou lorsque tous ses lments sont gaux. Pour grer les
intervalles successifs du tableau sur lesquels on applique la
dichotomie on utilisera une implantation rcursive.

Exercice 20a/ Donner l'organigramme et un programme, utilisant une boucle while,


qui affiche une table de conversion des degrs Farenheit en degrs
Celsius, de la forme suivante :
Farenh.
0
20
40
60
.

Celsius
17
6
4
15

42

.
.
300

148

Les bornes (0 et 300 dans le cas ci-dessus) sont donnes par l'utilisateur.
On vrifiera que la borne infrieure est rellement infrieure la borne
suprieure. Dans le cas contraire, un message d'erreur sera affich.
Remarque :
La conversion Farenheit (F) - Celsius (C) est assure par la formule
suivante :
C=(5/9)*(F-32)

Dans le tableau prcdent, les valeurs numriques affiches sont


toutes entires
b/ Reprendre l'exercice prcdent en remplaant la boucle while par une
boucle for.
Exercice 21Ecrire un programmequi demande la hauteur d'une pyramide et qui
affiche celle-ci en utilisant la fonction afficheCar().
Exemple : une pyramide de hauteur 4
*
***
*****
*******
Exercice 22Donner l'organigramme et le programme permettant d'afficher le losange
suivant form d'toiles et despaces de N lignes (N est fourni au clavier):
Nombre de lignes : 8
*
***
*****
*******
*****
***
*
Exercice 23Ecrire un programme qui permette d'acqurir des nombres positifs au
clavier. L'acquisition s'arrte lorsque on donne un nombre ngatif. Le
pgm affiche alors les valeurs maximales et minimales donnes.
Exercice 2443

Ecrire un programme permettant de trouver tous les p premiers


nombres premiers o p est donn par lutilisateur.
Aide : un nombre est premier si et seulement si il nexiste pas de diviseur
infrieur ou gale la partie entire de sa racine.
Exercice 25- Calcul de : mthode stochastique

Le principe de cette mthode consiste tirer alatoirement un grand


nombre de points l'intrieur du carr C dlimit par les points (0,0) et
(1,1). La proportion des points intrieurs au quart de disque D de rayon 1
et de centre (0,0) tend vers le rapport des surfaces de D sur C, c'est-dire /4. Le programme effectue donc une boucle qui tire un point au
hasard et incrmente un compteur si le point se trouve tre intrieur D.
II-1 Ecrire la fonction tirage() qui effectue le tirage alatoire dun point,
et vrifie sil appartient ou pas au quart de disque D. Cette fonction
renverra 1 si le point appartient D, et 0 dans le cas contraire.
II-2 Ecrire le programme principal pour quil excute 10.000 tirages, et
quil affiche la valeur estime de chaque itration.
II-3 Dans le cas o une prcision donne sur est recherche, que
pourrait tre le critre darrt du programme?

Rappels :
2
2
- Un point est intrieur D si et seulement si x y 1 .
- La fonction rand()renvoie un entier compris entre 0 et la constante
prdfinie MAX_INT

Exercice 26On se propose de calculer l'intgrale d'une fonction entre deux bornes a
et b, tel que :

b 3

dx

a 1 x

On utilisera la mthode de calcul dite des rectangles (voir figure 1). On


dfinit un pas suffisamment petit appel pas correspondant la 10 000
me partie de l'intervalle considr et on effectue la somme discrte des
aires des rectangles inscrits entre la courbe et l'axe des abscisses.
Ecrire le programme du calcul de l'intgrale en utilisant la mthode cite
prcdemment.
44

Note : le programme principal doit se prsenter sous la forme d'une


simple boucle d'itration grce laquelle on calcule, par cumul, une
variable somme correspondant la somme des aires lmentaires
dfinies par le dcoupage de l'intervalle en 10 000 lments de largeur
gale pas. A titre d'exemple la premire valeur calcule sera l'aire du
rectangle au point a, I[0]=f(a) * (a-b)/10000.
F(x)
I[0]

pas

x
a

x
b

Exercice 27Ecrire une fonction MIN et une fonction MAX qui dterminent le
minimum et le maximum de deux nombres rels selon les prototypes
suivant :
a/ float MIN (float, float)
float MAX (float,float)
b/ void MIN (float, float, *float)
void MIN (float, float, *float)
Ecrire un programme principal se servant des fonctions MIN et MAX pour
dterminer le minimum et le maximum de quatre nombres rels entrs au
clavier et ce pour les versions de prototype.
Exercice 28Ecrire un pgm qui calcule le produit de deux entiers en utilisant le
principe suivant :
a * b = a * (b-1) + a si b est impair
a * b = (2 * a) * (b / 2) si b est pair et diffrent de 0
Ainsi on se ramne ne faire que des multiplications et divisions par 2 en
plus des additions.
Exemple :
36 * 7
= 36 * 6 +36
= 72 *3 +36
= 72 *2 + 108
= 144 *0 + 252
= 252
Exercice 29Ecrire un pgm se comportant comme une calculatrice, cd excutant une
boucle sur :
1. lecture d'une ligne suppose contenir un entier, un oprateur et
une entier (ex : 1+2). Les oprateurs sont +, -, *, /, %
2. calcul de la valeur de l'expression
45

3. affichage du rsultat l'cran


On aura intrt utiliser la fonction sscanf pour extraire les oprandes et
l'oprateur de la ligne lue.
Exercice 30Donner l'organigramme et le programme qui lit la dimension N d'un
tableau T du type int (dimension maximale: 50 composantes), remplit le
tableau par des valeurs entres au clavier et affiche le tableau.
Copiez ensuite toutes les composantes strictement positives dans un
deuxime tableau TPOS et toutes les valeurs strictement ngatives dans
un troisime tableau TNEG. Afficher les tableaux TPOS et TNEG.
Exercice 31Ecrire un programme qui construit le triangle de PASCAL de degr N et
le mmorise dans une matrice carre P de dimension N+1.
Exemple: Triangle de Pascal de degr 6:
n=0

n=1

n=2

n=3

n=4

n=5

10

10

n=6

15

20

15

Mthode:
Calculer et afficher seulement les valeurs jusqu' la diagonale principale
(incluse). Limiter le degr entrer par l'utilisateur 13.
Construire le triangle ligne par ligne:
- Initialiser le premier lment et l'lment de la diagonale 1.
- Calculer les valeurs entre les lments initialiss de gauche droite en
utilisant la relation:
Pi,j = Pi-1,j + Pi-1,j-1
Exercice 32Ecrire un programme permettant de saisir un tableau de 10 nombres
entiers puis qui fait appel une fonction renvoyant la somme de tous les
lments du tableau.
Exercice 3346

Ecrire un programme qui effectue la transposition tA d'une matrice A de


dimension N et M en une matrice M et N.
a) La matrice transpose sera mmorise dans une deuxime matrice
B qui sera ensuite affiche.
b) La matrice A sera transpose par permutation des lments
c) Pour les questions a et b, donner la complexit du programme mis
en uvre.
Rappel :
tA = t

abcd
ifgh
ij kl

aei
bfj
cgk
dhl

Exercice 34Soit la squence :


int tab[10];
int *p,i;
for (i=0;i<10;i++) tab[i]=0;
i=5;
p=tab; /* Equivalent : p=&tab[0]; */
p=tab+i; /* Equivalent : p=&tab[i]; */

A l'aide d'une reprsentation graphique, indiquer les modifications


apportes au tableau tab par la squence d'instructions suivante, et ce
aprs chaque instruction :
(*p)++;
(p++);
(*p)++;
(*(p+2))++;
(*(tab+2))++;

Exercice 35On considre un tableau de personnes (nom, prnom, numro dans la


rue, rue, code postal, ville, numro de tlphone),
a) Crer la structure correspondante,
b) faire un programme de recherche automatique de toutes les
informations sur les personnes rpondant une valeur d'une
rubrique donne (tous les PATRICK par exemple). On suppose
que le tableau est dj initialis.
Exercice 3647

On veut crire un programme qui calcule la somme suivante :


b

S (a, b) sin (i ) i
i a

Le calcul de S(a,b) doit se faire en utilisant une fonction fct(). Le


programme principal se charge de demander lutilisateur de saisir au
clavier deux entiers a et b, puis appelle la fonction en lui passant a et b
comme paramtres. Le rsultat est stocke dans une variable c.
I-1 Quel doit tre le type de la valeur retourne par la fonction ? Ecrivez
la fonction, ainsi que le programme principal en commentant votre
solution.
I-2 Est-il possible de modifier les variables locales main() a ou b partir
de la fonction ? Pourquoi ?
I-3 Dfinissez une variable compteur locale main(), et modifiez la
fonction fct() (utilisation de pointeur) pour que compteur stocke le
nombre total dadditions effectues depuis le lancement du programme.
Exercice 37Faire la somme conscutive de 2 entiers contenus dans un tableau t1 et
retourner le rsultat de la somme dans deuxime tableau t2. On
supposera dans un premier temps que le tableau t1 est de longueur paire.
Exercice 38Mme exercice que prcdemment mais on sort du programme lorsquun
terme du tableau t1 est gal zro.
Exercice 39Donner lorganigramme dun programme permettant de compter le
nombre de lignes, le nombre de caractres et le nombre de mots lus dans
un fichier
Exercice 40Ecrire un programme qui :
a. lit au clavier des informations dans un tableau de structures de type
point dfini comme suit :
struct point {
int num ;
float x ;
float y ;}

48

Le nombre dlments du tableau sera fix par une instruction #define


(qui permet de dfinir un constante avant le main()).
b. Affiche lcran lensemble des informations prcdentes.
Raliser la mme chose que dans lexercice prcdent, mais en
prvoyant, cette fois une fonction pour la lecture des informations et une
fonction pour laffichage.
Exercice 41Ecrire un programme qui se contente denregistrer squentiellement
dans un fichier une suite de nombre entier quon lui fournit au clavier.
Exercice 42Ecrire un programme qui lit une chane de caractres CH et qui convertit
toutes les majuscules dans des minuscules et vice-versa.
Le rsultat sera mmoris dans la mme variable CH et affich aprs la
conversion.
Exercice 43Ecrire un programme qui supprime la premire occurrence d'une chane
de caractres OBJ dans une chane de caractres SUJ.
Exemples:

PHON
EI
T

ALPHONSE
PIERRE
TOTALEMENT

ALSE
PIERRE
OTALEMENT

HELLO

HELLO

Exercice 44Ecrire un programme qui lit 10 phrases d'une longueur maximale de 200
caractres au clavier et qui les mmorise dans un tableau de pointeurs
sur char en rservant dynamiquement l'emplacement en mmoire pour
les chanes. Ensuite, l'ordre des phrases est invers en modifiant les
pointeurs et le tableau rsultant est affich.
Exercice 45Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50
caractres) et attribue leurs adresses un tableau de pointeurs MOT.
Effacer les 10 mots un un, en suivant l'ordre lexicographique et en
49

librant leur espace en mmoire. Afficher chaque fois les mots restants
en attendant la confirmation de l'utilisateur (par 'Enter').
Exercice 46On veut coder un algorithme de cryptage trs simple : on choisit un
dcalage (par exemple 5), et un a sera remplac par un f, un b par un g,
un c par un h, etc. On ne cryptera que les lettres majuscules et
minuscules sans toucher ni la ponctuation ni la mise en page. On
procde comme suit :
Ecrire une procdure void crypt( char *p ) de cryptage
d'un caractre.
Ecrire le main qui appellera la fonction crypt sur
l'ensemble du message et imprimera le rsultat.
Exercice 47On veut savoir si une lettre est prsente dans une chane de caractres et
le nombre de fois que cette lettre apparat dans la chane.
Ecrire une fonction void min2maj( char *p ) qui
transforme une chane de caractres quelconque en une
chane identique mais dont tous les caractres sont des
majuscules.
Ecrire une fonction int parcours( char *p , char c )
renvoyant le nombre de fois que la lettre se trouve dans
la chane de caractres.
Ecrire le programme principal main().
Exercice 48Un palindrome est un mot qui reste le mme qu'on le lise de gauche
droite ou de droite gauche (par exemple, PIERRE n'est pas un
palindrome, alors que OTTO est un palindrome). Ecrire de deux faons
diffrentes, un programme qui vrifie si une chane CH introduite au
clavier est un palindrome.
En utilisant uniquement le formalisme tableau.
En utilisant des pointeurs au lieu des indices numriques.
Exercice 49Tri bulle (bubblesort) : il consiste faire glisser la plus petite valeur au
dbut du tableau. Si deux valeurs adjacentes A[i] et A[i+1] sont telles
que A[i] > A[i+1] on les change. Ainsi aprs un premier passage la
valeur la plus "lgre" monte au dbut du tableau. On recommence en
ne considrant plus que A[2],A[3],...,A[n].
50

Exercice 50Soit le programme tp3_ex4.c que vous trouverez dans le rpertoire


Y:PublicMEA\MEA1-Info\PourTP3. Dans un premier temps, lire et
excuter le programme. Ensuite, crire la partie 2 du programme (la
description de cette partie se trouve dans le fichier tp3_ex4.c) en utilisant
uniquement les adresses des tableaux s et t pour les parcourir ou
modifier leur contenu.
Exercice 51Un problme de planning
En dbut danne, dans une universit, chacun des M tudiants sinscrit
k cours parmi N.
On se propose dtablir la chronologie de lensemble des cours sous
forme de sessions. Une session est un ensemble de cours pouvant se
drouler simultanment. Deux cours peuvent se drouler simultanment
lorsque aucun tudiant nest inscrit ces deux cours. Dans le cas
contraire, les cours sont dits en conflit.
- Chaque cours est rfrenc par un entier compris entre 1 et N.
- Chaque tudiant est rfrenc par un entier compris entre 1 et M.
- On supposera M et N infrieurs respectivement 100 et 1000.
On suppose donn les ensembles INSCRIPTION des cours suivis sous
forme dun tableau de M par N o INSCRIPTION[i][j] = 1 si l'tudiant i
est inscrit au cours j, 0 dans le cas contraire.
Soit CONFLIT un tableau 2 dimensions pour lequel CONFLIT[c] est
lensemble des cours en conflit avec le cours c. On utilisera pour
CONFLIT la mme convention que celle utilise pour INSCRIPTION :
CONFLIT[c1][c2]= 1 si c1 et c2 sont en conflit, CONFLIT[c1][c2]= 0
sinon soit SESSION[s] lensemble des cours se droulant la session s.
On veut dterminer les ensembles SESSION sans chercher minimiser le
nombre de sessions connaissant les ensembles INSCRIPTION.
Pour se faire, on utilise lalgorithme suivant dans lequel RESTE dsigne
lensemble des cours non encore placs dans une session, ses la session
en cours de construction et CONFLIT_S lensemble des cours en conflit
avec lun des cours placs dans cette session ses.
a- initialisations :
- Pour chaque cours c, tablir CONFLIT[c]
- ses = 0
- RESTE = lensemble des cours
b- Tant que RESTE faire :
- ses = ses +1
/* construction de la session ses*/

51

- choisir un cours c0 appartenant RESTE


- retirer c0 de RESTE
- placer le cours c0 dans la session ses
- CONFLIT_S = CONFLIT[c0] {c0}
- Pour tout cours c dans RESTE et qui nest pas en conflit avec la session
ses, faire :
- rajouter c la session ses
- CONFLIT_S = CONFLIT_S CONFLIT[c] {c}
- retirer c de RESTE

Questions :
On suppose dans la suite que N et M connus au moment de la
compilation
- Ecrire les dclarations de constantes, types et variables ncessaires
l'implantation de lalgorithme.
- Ecrire le programme pour :
- Remplir le tableau INSCRIPTION ;
- Ecrire lalgorithme permettant de donner le nombre N de
cours effectivement choisis et M le nombre d'tudiants ;
- Implanter lalgorithme ci dessus ;
Afficher lcran le nombre de sessions et pour chaque session
lensemble
des
cours
la
composant.
Exercice 52Un fichier contient une squence (de longueur inconnue) d'galits entre les sommes des
nombres entiers positifs (un par ligne). A titre d'exemple, considrons le fichier suivant :
2+3+12+8=9
2+3+4=9
22=3+4+5+10
3+5+1=4+44
Notez que les galits peuvent tre soit correctes (les trois premires) soit fausses (la dernier).
Ecrire une fonction C qui prend en paramtre le nom du fichier et renvoie la fraction des
galits correctes. Dans cet exemple, la fonction doit retourner 0,75.
Suggestion : vous pouvez utiliser des fonctions telles que atoi, strtok,fgets
Exercice 53Ecrire une fonction qui permet de transformer un vecteur d'entiers en
une chaine de caractres. La fonction reoit le pointeur de dbut du
vecteur, sa dimension et le pointeur de dbut de la chaine de caractres
destination :
void ecrirevecteur (int v[], int dim, car s[]);
La chaine s devra contenir les nombres prsents dans le vecteur spars
par des virgules
V=
12 7 8 45 2 9 8 Exemple :
S= "12, 7, 8, 45, 2, 9, 8"
Version 1 : on utilisera la fonction sprintf qui permet d'crire dans une
chaine de caractres et dont le fonctionnement est identique celui de la
fonction printf.
52

Son gabarit est intsprintf(char*chaine,constchar*format [,argument] ... ) o


*chaine est l'adresse de la chaine destination.
Version 2 : on n'utilisera pas la fonction sprintf. Il est conseill dcrire
une fonction qui transforme un nombre entier en une chaine de
caractres.
Exercice 54Ecrire un programme capable de trouver un mot l'intrieur d'une
matrice de caractres. Le programme devra tout d'abord demander
l'utilisateur la matrice de caractres de dimension NxN (N sera demand
l'utilisateur). Il demandera ensuite le mot rechercher, la longueur M
du mot devra tre infrieure N. Le programme devra rechercher la
prsence du mot l'intrieur de la matrice, horizontalement de gauche
droite et de droite gauche et verticalement de haut en bas et de bas en
haut.
Si le motest trouv, le programme affichera les coordonnes du caractre
de dbut de la chaine et sa direction. Si le mot n'est pas trouv, un
message sera affich.
Exemple de matrice et de mots trouvs:

Exercice 55crire un programme pour afficher une chane de caractres (reu partir du clavier)
surplusieurs lignes de longueur K (K choisiaussi par lutilisateur) de faonjustifie.
La chane doit tre compose demaximum 3000 caractres et le nombre de caractres par
ligne doit tre entre 20 et 80.
Exemple. Chaine introduite :
L'avantaged'treintelligent,c'estqu'onpeuttoujoursfaire
l'imbcile,alorsquel'inverseesttotalementimpossible
K=25

Rsultat :
L'avantaged'tre
intelligent,c'estqu'on
peuttoujoursfaire
l'imbcile,alorsque
l'inverseesttotalement
impossible

53

Exercice 56crire une fonction SupprimeDoublons qui prend une liste de valeurs entires(dj tries dans
l'ordre croissant) et qui supprime tous les nuds qui contiennent les mmes valeurs.
Idalement, la liste ne doit tre parcourue qu'une seule fois.Il faut bien supprimer de la
mmoire les nuds effacs.
Par exemple, si vous avezla liste suivante :
0, 1, 1, 3, 4, 4, 5, 6, 6, 6, 7, 9
le programme modifiera la liste de faon avoir :
0, 1, 3, 4, 5, 6, 7, 9
crire aussi la fonction main qui appellera la fonction Remplir (vois ci dessous), puis qui
affiche le contenu de la liste, puis la fonction SupprimeDoublons, et nouveau on affichera le
contenu de la liste.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct liste {
int n;
struct liste* next;
};
void remplir (struct liste** tete)
{
int i, v=0;
struct liste *t;
srand (time(NULL));
*tete=(struct liste*)malloc(sizeof(struct liste));
t=*tete;
for (i=0; i<50; i++) {
t->n=v;
t->next=(struct liste*)malloc(sizeof(struct liste));
t=t->next;
v+=((int)rand())%5;
}
t->n=v;
t->next=NULL;
}

Exercice 57Ecrire un programme en C qui reoit en entre une squence dentiers positifs non nuls (le 0
est considr comme terminateur de la squence). Montrer lcran lensemble de valeurs
distinctes reues, chacune accompagne par sa frquence d'apparition dans la squence
d'entre.
Par exemple, si vous recevez la squence suivante :
12
10
8
10
10
12
3
0
54

le programme affiche:
12: 28,6%
10: 42,8%
8: 14,3%
3: 14,3%
Utiliser une liste pour mmoriser les lments de la squence. Chaque nud de la liste
contient 3 lments : le nombre faisant partie de la squence, sa frquence, et le pointeur au
nud suivant. Pour chaque valeur reue, le programme va chercher dans la liste si la valeur
est dj prsente. Dans ce cas, le programme va incrmenter la frquence correspondante. Si
la valeur nest pas dans la liste, on rajoutera (en tte de la liste) la nouvelle valeur.
Exercice 58Passage d'une fonction comme paramtre d'une autre
fonction
Il est possible de dfinir des variables ayant le type "pointeur de
fonction". La valeur d'une telle variable est l'adresse en mmoire du
dbut du code excutable d'une fonction, et sa dclaration s'crit selon
l'une des deux syntaxes suivantes :
type_fonction (*nom_variable)(paramtres_de_la_fonction);
type_fonction (*nom_variable)(types_paramtres_de_la_fonction);

Pour lire de telles dclarations sans risque de confusion, on a intrt


procder en plusieurs tapes.
Exemple :
int (*p_f)(float r); ou int (*p_f)(float);

Pour comprendre cette dclaration, on pourra procder de la manire


suivante :
p_f :le nom de la variable dclare estp_f
*p_f: la variablep_fest un pointeur.
(*p_f)() : l'objet point est une fonction.
int (*p_f)(float r), ou int (*p_f)(float) : l'objet point est une fonction
retournant un entier, ayant un seul paramtre de type flottant.
Attention :
Il ne faut surtout pas oublier les parenthses autour de *p_f, sans quoi le
compilateur comprendrait quep_fest une fonction retournant un pointeur
sur un entier, ayant un seul paramtre de type flottant !
L'intrt essentiel de telles variables est de pouvoir passer des
fonctions en paramtres une fonction. Dans un cas de ce genre, le
paramtre formel doit tre de type "pointeur de fonction".
Exemple :
Le programme ci-aprs permet de calculer la valeur approche de la
drive d'une fonction trigonomtrique (cos, sin ou tan), en un point choisi
par l'utilisateur. On utilise pour cela l'identit suivante, permettant le
calcul approch de la drive d'une fonction f au point x pour EPSILON
suffisamment petit :
f'(x) == (f(x+EPSILON)-f(x-EPSILON))/(2*EPSILON)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPSILON 0.001
double derivee(double (*p_f)(double),double x)

55

/* Calcul de la drive d'une fonction par une expression approche. */


{
return(((*p_f)(x+EPSILON)-(*p_f)(x-EPSILON))/(2*EPSILON));
}
int main(void)
{
char reponse='\n';
double x;
do
{
printf("Drives des fonctions trigonomtriques :\n");
printf("\t[c]osinus\n");
printf("\t[s]inus\n");
printf("\t[t]angente\n");
printf("\t[q]uitter\n");
printf("\tVotre choix (c,s,t ou q) : ");
fflush(stdout);
if (reponse!='\n')
while (getchar()!='\n') ;
scanf("%c",&reponse);
if ((reponse=='c')||(reponse=='s')||(reponse=='t'))
{
printf("En quel point voulez-vous calculer la drive : ");
fflush(stdout);
scanf("%lf",&x);
}
printf("\n");
switch (reponse)
{
case 'c' : printf("Rsultat
break;
case 's' : printf("Rsultat
break;
case 't' : printf("Rsultat
break;
case 'q' : break;
default : printf("Tapez c,
}
} while (reponse!='q');
exit(0);

: %f\n\n",derivee(&cos,x));
: %f\n\n",derivee(&sin,x));
: %f\n\n",derivee(&tan,x));
s, t ou q !\n\n");

Remarque:
Bien que cela puisse paratre surprenant, il n'y a aucune diffrence, tant
la compilation qu' l'excution, entre les deux syntaxes d'appel
suivantes :
derivee(&cos,x)
derivee(cos,x)

Exercice 59CRYPTOGRAPHIE - CRYPTANALYSE


(Lisez entirement lnonc avant de commencer !)
Les deux parties suivantes peuvent tre traites de manire indpendante (seule la dernire question de la partie
2 sappuie sur une fonction de la partie 1). Il est conseill de faire deux projets spars afin damliorer la
lisibilit des programmes.

56

PARTIE 1 : CRYPTOGRAPHIE
La Rotation Csar est un algorithme de cryptage simpliste utilis pour censurer des propos choquants sur les
serveurs de News sur Internet (Usenet). Le principe de ce cryptage consiste exercer une rotation de l'alphabet
de 13 positions vers l'avant. Cette transformation ne concerne que les majuscules et minuscules non accentues.
Les lettres accentues, les nombres et tous les autres signes demeurent inchangs. Le tableau suivant illustre
la transformation pour les lettres minuscules:
aest transform en n, ben o, etc.

Une transformation similaire s'applique aux majuscules: 'A' est transform en 'N', 'B' en 'O', etc.

Ecrire une fonction voidEncryptLigne1(char *T) effectuant la rotation de Csar.Etablissez dj


sur papier la formule mathmatique permettant d'effectuer la transformation (aussi bien sur des lettres
minuscules, que des majuscules). Comme il s'agit d'effectuer un cycle sur 26 lettres pensez la fonction
modulo (%). Si vous ny arrivez pas par le biais de cette formule, remarquez plus simplement que vous
pouvez traiter l'alphabet en deux moitis ( la premire moiti on ajoute 13, la deuxime on enlve 13).
N'oubliez pas non plus que les caractres en C (variables de type char) sont considrs comme des nombres
et qu'on peut donc leur appliquer des oprations arithmtiques, ainsi charc=e+2;est une instruction
valable (et c vaut g).

2-

Proposer une mthode (ou une fonction) pour dcrypter une chaine de caractres crypte par la mthode
de Csar.

3-

Ecrire une nouvelle fonction de chiffrement par rotation, c'est--dire acceptant tout type de dcalage de
valeur dec : void EncryptLigne2(char *T, int dec)(il faut utiliser loprateur modulo %)

4-

Proposez une fonction pour dcrypter une chaine de caractre crypte par la fonction
EncryptLigne2().

5-

Les mthodes de chiffrement par transposition sont facilement cassables (cf. exercice suivant). Pour
renforcer la robustesse de notre programme de cryptographie, on propose de raliser une fonction de
substitution utilisant une cl secrte sous la forme dun mot, ZEPHIR dans le tableau suivant. Ecrire une
fonction1char**LUT(char *cle) qui gnre sous forme de Look-Up-Table (LUT) la table de
correspondance, cest--dire qu un caractre donn correspond un autre caractre. Ecrire galement la
fonction void AfficheLUT( char **l) qui affiche la LUT gnre.

Lettre
normale

Lettre
crypte

6- Ecrire une nouvelle fonction de chiffrement sappuyant sur le tableau de correspondance gnr par la
fonction LUT(): void EncryptLigne3(char *T, char *cle)

1 Utilisez une double allocation dynamique sur un pointeur char **, et renvoyer ce pointeur.
57

7- Ecrire une fonction void EncryptFile(FILE *in, FILE *out, int methode)qui permet par
lappel de la fonction EncryptLigne()de crypter un fichier texte par la mthode choisie par lutilisateur.
Le nom du fichier crypter ainsi que la mthode de cryptage (Csar, dcalage ou substitution avec cl de
chiffrement) seront demands lutilisateur dans la fonction main(). Le fichier crypt correspondant sera
crit dans un fichier texte de sortie et galement affich dans la console.
8- Ecrire une fonction voidDecryptFile(FILE *in, FILE *out, int methode)qui permet de
dcrypter un fichier texte par la mthode choisie. Le nom du fichier crypter et le numro de la mthode
seront demands lutilisateur dans la fonction main(). Le fichier crypt correspondant sera crit dans un
fichier texte de sortie et galement affich dans la console.
9- Faire le programme principal et un menu permettant lutilisateur de crypter ou de dcrypter un fichier par
la mthode de son choix.
PARTIE 2 : CRYPTANALYSE
Les algorithmes type rotation de Csar , ou plus gnralement les algorithmes de chiffrement par substitution,
sont des algorithmes de cryptage assez simples casser . Apartir d'une analyse statistique des symboles du
message chiffr, il est possible didentifier des lettres et de remonter, avec un peu de mthode, jusquau message
dorigine. Une premire approche pour casser ces algorithmes peut consister rechercher le symbole le plus
frquent dans le message chiffr et le remplacer par le symbole le plus frquent dans le langage du texte clair.
Par exemple le "e" est le symbole le plus utilis dans les textes franais et anglais.
Nous allons tenter de mettre en place cette analyse statistique sur un texte chiffr par substitution.
1- Dfinissez dans un premier temps une structure de donneSymbole permettant de stocker un caractre et
son nombre doccurrences (utilisez le typedef struct)
2- Faire une fonction Symbole* FileStat(FILE *fich ,int *nbSymbole) qui permet de
construire partir de fich la liste des symboles. La variable *nbSymbole est un pointeur permettant de
rcuprer dans le programme principal le nombre total de symboles prsents dans le texte.Pour ranger le
tableau de symboles, vous utiliserez lallocation dynamique de mmoire. Faire le programme permettant de
lireet de stocker les symboles en mmoire. Les symboles autres que des lettres ne seront pas mmoriss et
les lettres minuscules et majuscules seront considres quivalentes. Pour chaque symbole ajout, initialiser
son nombre doccurrence 1, si le symbole existe dj, incrmenter son nombre doccurrences.
3- Dans le programme principal, programmez laffichage de lensemble des symboles prsents dans le texte,
leur occurrence et leur probabilit dapparition (qui est un nombre rel gal 1 sur le nombre
doccurrences).
Symbole
Symbole
Symbole
Symbole

0: i Nb Occurence: 9190
Proba: 0.1267
1:
x Nb Occurence: 7036
Proba: 0.0970
2:
e Nb Occurence: 5709
Proba: 0.0787
3:
s Nb Occurence: 5629
Proba: 0.0776

4- Faire une fonction de tri void Tri(Symbole *t, int nbSymbole) qui prendra en entre un
pointeur sur Symbole (ou sur un tableau de symboles) et le nombre total de Symboles. Cette fonction
permettra de classer dans lordre des frquences dcroissantes lensemble des symboles. Vous pouvez
utiliser lalgorithme de tri de votre choix.
5- Affichez dans le programme principal le rsultat du tri des symboles par frquence dcroissante.
6- Afin de voir sil peut sagir dun chiffrement par dcalage et partir du rsultat du tri prcdent, on calcule
pour les 4 symboles les plus frquents le dcalage correspondant avec les symboles les plus frquents en
franais et en anglais (e, s, a, n en franais, et e, t, o, a en anglais voir les tableaux ci-dessous).

Statistiques Lettres Franaises


3

8.11 %

7.68 %

58

0.81 %

5.20 %

3.38 %

2.92 %

4.28 %

0.83 %

1.28 %

17.69 %

6.43 %

1.13 %

8.21 %

8.87 %

2.93 %

2.15 %

1.19 %

7.44 %

4.11 %

0.14 %

0.74 %

5.23 %

13.05 %

6.64 %

2.88 %

6.46 %

7.24 %

1.28 %

1.39 %

9.02 %

0.18 %

0.06 %

5.85 %

2.77 %

0.02 %

0.53 %

6.77 %

1.00 %

5.99 %

0.26 %

0.23 %

1.49 %

2.29 %

0.12 %

0.42 %

0.30 %

3.60 %

1.51 %

2.62 %

0.09 %

Statistiques Lettres Anglaises

4
A
7.81 %
N
7.28 %
En francais :
Symbole 0:i Proba: 0.1267 Decalage avec e: 4
Symbole 1: x Proba: 0.0970 Decalage avec s: 5
Symbole 2: e Proba: 0.0787 Decalage avec a: 4
Symbole 3: s Proba: 0.0776 Decalage avec n: 5
En anglais
Symbole 0:
Symbole 1:
Symbole 2:
Symbole 3:

:
i
x
e
s

Proba:
Proba:
Proba:
Proba:

0.1267
0.0970
0.0787
0.0776

Decalage
Decalage
Decalage
Decalage

avec
avec
avec
avec

e:
t:
o:
a:

4
4
16
18

7- Ensuite, appliquez un dcalage (vous pouvez rutiliser les fonctions de la partie 1) sur les lettres minuscules
et les lettres majuscules correspondant aux valeurs trouves (4, 5, 16,18). Affichez le rsultat dans la console
et dans un fichier texte pour voir si le fichier est lisible.

Rappels:
/*Ouverture d'un fichier en lecture*/
FILE *fichier1=fopen("lpp.txt", "r");
/*Boucle pour rcuprer les lignes de "fichier1" et de les stocker dans chaine*/
/*La boucle s'arrte lorsque le pointeur de lecture atteint la fin du fichier*/
while(!feof(fichier1))
{
char chaine[100];
fgets(chaine,100,fichier1);
}
fclose(fichier1);
/*Ouverture d'un fichier en criture*/
FILE *fichier2=fopen("clair.txt", "w");
/*Ecriture de la chaine de caractere zephir dans le fichier2*/
charchaine[10]= "zephir";
fprintf(fichier2,"%s",chaine);
fclose(fichier2);

59

ANNEXE : INTRODUCTION AU SYSTEME WINDOWS/MS-DOS

1. Systme de gestion de fichiers


a) Quest ce quun fichier ?

Unfichierestunesuitedoctets2(de0plusde2Go)stockesurundisque.Lesdisques
ontpournoma:,c:,p:,etc...Aucunestructurenestimposeunfichierparlesystme,et
aucune signification nest attache son contenu la signification des octets dpend
uniquement des programmes qui manipulent le fichier. Windows reconnat deux grandes
catgoriesdefichiers.
Lesfichiersordinairesourgulierssontdesfichierssurdisquedontlecontenuestnon
structuretcorresponddoncunesuitedecaractrescaractriseparsalongueur(quipermet
enparticulierdedtecterlafindefichier).
Les rpertoires voient leur contenu interprt par un certain nombre de fonctions du
systme:ilspermettentdestructurerlensembledesfichiersenarborescenceetdfinissentun
mcanismededsignationdesfichiersindpendantdeleurlocalisationdanslestablesdu
systmeetsurledisque.
Unrpertoirenestriendautrequunfichiercontenantunelistedechanesdecaractres
ounomsdefichier.Lorganisationquisensuitestdoncarborescenteetsuppose,pourtre
oprationnelle,lexistenceduneorigine.symbolique.Cetteorigineestlenomdudisque.
b) Rfrence absolue ou relative

La figurecicontre fournit unexemple darborescencedefichiers.Pourtout fichier, il


existeaumoinsuncheminmenantdelaracinejusqului.Lalistedesliensphysiquesquil
faututiliserpourarrivercefichierlidentifiesansambigut:elleconstitueun chemin
daccslong(fullpathname)ourfrenceabsoluedufichier.Silesliensrencontrssurun
chemindelaracineversunfichiersontsuccessivementU,paul,travailettoto.c,larfrence
absoluedufichierscritsymboliquement P:U\paul\travail\toto.c.Unerfrenceabsolue
commencetoujoursparlenomdudisque.
Afindefaciliterlesreprages,toutprocessus(activitdanslesystme)estassociun
rpertoiredetravail.Ladsignationdunfichierparrapportaurpertoiredetravailest
appele rfrencerelative (shortpathname)etscritsous laformedunesuitedeliens
sparsparlecaractre\:ellecorresponduncheminallantdurpertoiredetravailun
fichier.Larfrenceabsoluedunfichiersedduitdunerfrencerelativeenluiajoutanten
prfixelarfrenceabsoluedurpertoiredetravail.Ainsi,danslexempleprcdent,sile
rpertoiredetravailestP:\U\paul,lefichierdontnousavonsdonnlarfrenceabsolueaura
commerfrencerelativetravail\toto.c.
Cetypedereprageestencorefacilitparunmcanismepermettantderemonterdans
larborescence.Lelien.. contenudansunrpertoireesttoujoursassociau rpertoire
unique dontilestledescendant.Deplus,lelien. estutilisparlerpertoirepourse
dsigner lui mme. Ainsi, ..\claude\C est une rfrence relative parfaitement valide si le
rpertoiredetravailest,parex. P:\U\denise. Demme,etbienquellessoientinutilement
compliques,lesrfrences..\.\denise\..\..\softoujeux\..\travail\toto.csontvalides
2Octet : une quantit dinformation de 8 bits. Pour nous, un octet est quivalent un
caractre.
60

2. Commandes de base MS-DOS/WINDOWS-NT

Lescommandesdebasesontcellesquipermettentdobtenirdesinformationsgnralesou
demanipulerlenvironnementimmdiatdelutilisateur:rpertoirecourant,fichiers,tches.
EllessontutilisesdanslesfentresMSDOS
cd

rpertoire
change le rpertoire de travail.
dir[ fichier]
Pour chaque fichier qui est un rpertoire, dir donne la liste des noms de fichiers quil contient. Pour chaque
fichier ordinaire, dir rpte son nom. Dans les deux cas, les options permettent de demander des informations
supplmentaires sur les fichiers. Par dfaut, la sortie est trie par ordre alphabtique. Si aucun fichier nest
donn en argument, cest le rpertoire courant (.) qui est trait. Par dfaut encore, les rfrences implicites de
fichiers (cest--dire dans les rpertoires explors) commenant par le caractre . ne sont pas traites
type [ fichier ]
copie le contenu des fichiers donns en paramtre sur la sortie standard (l'cran). L'arrt du dfilement est
obtenu en appuyant simultanment sur les touches ctrl et s. Pour continuer afficher le contenu du fichier,
faire nouveau ctrl s.

copyficSourceficCible (voirgalementlacommandexcopy)
copyficSource1[ficSource2]repCible
Copie de fichiers. Dans la premire forme prsente, ni ficSource, ni ficCible ne sont des rpertoires ni ne
correspondent au mme nom : cp copiera le contenu de ficSource dans ficCible. Si ficCible existe, copy
crasera son contenu
La deuxime forme permet de copier plusieurs fichiers dans le rpertoire repCible. Les noms des fichiers sont
conservs dans le nouveau rpertoire. Cest une erreur que lun des ficSource soit un rpertoire ou que
repCible nen soit pas un ou nexiste pas.

renamesourcecible
rename dplace le fichier nomm source vers cible. Il sagit dun changement de nom du fichier. Source et cible
doivent tre des noms diffrents. Si cible existe dj, son contenu prcdent est dtruit

delfichier:destructiond'unfichier.
mkdirrpertoire:crationd'unrpertoire
rmdir rpertoire : suppression d'un rpertoire et de toute l'arborescence de fichiers qu'il contient.

printfichier:impressiondefichier.Attentionlefichiernedoitcontenirquedescaractres
imprimables.
help:aidesurtouteslescommandes.Donnelalistedescommandes;
helpnomdecommande:aidesurunecommandeparticulire
Remarques:
toutescescommandesadmettentdenombreusesoptions.Pouravoirledtaildeces
optionsutiliserlacommandehelp
EndehorsdesfentresMSDOS,l'quivalentdelaplupartdecescommandespeut
treeffectuparl'explorateurWindows.
ListecompltedescommandesMSDOS/WINDOWSNT:
ACLCONV
AT
ATTRIB
BREAK
CALL
CD
CHCP
CHDIR
CHKDSK
CLS

Convertit les listes de contrle d'accs (ACL) de LANMAN Serveur OS/2.


Planifie l'excution de commandes ou programmes sur un ordinateur.
Change ou affiche les attributs d'un fichier.
Active ou dsactive le contrle de CTRL+C.
Appelle un fichier de commandes depuis un autre fichier de commandes.
Change de rpertoire ou affiche le rpertoire en cours.
Change la page de code active ou affiche son numro.
Change de rpertoire ou affiche le nom du rpertoire en cours.
Vrifie un disque et affiche un relev d'tat.
Efface l'cran.

61

CMD
COMP
CONVERT
COPY
DATE
DEL
DIR
DISKCOMP
DISKCOPY
DOSKEY
ECHO
ENDLOCAL
ERASE
EXIT
FC
FIND
FINDSTR
FOR
FORMAT
GOTO
GRAFTABL
HELP
IF
KEYB
LABEL
MD
MKDIR
MODE
MORE
MOVE
PATH
PAUSE
POPD
PRINT
PROMPT
PUSHD
RD
RECOVER
REM
REN
RENAME
REPLACE
RESTORE
RMDIR
SET
SETLOCAL
SHIFT
SORT
SUBST
START
TIME
TITLE
TREE
TYPE
VER
VERIFY
VOL
XCOPY

Lance une nouvelle instance de l'interprteur de commandes de Windows NT.


Compare les contenus de deux fichiers ou groupes de fichiers.
Convertit des volumes FAT ou HPFS en volumes NTFS. Vous ne pouvez pas convertir le lecteur courant.
Copie un ou plusieurs fichiers.
Affiche ou modifie la date.
Supprime un ou plusieurs fichiers.
Affiche la liste des fichiers d'un rpertoire.
Compare les contenus de deux disquettes.
Copie le contenu d'une disquette sur une autre.
Rappelle des commandes entres, permet de les modifier et de crer des macros.
Affiche des messages l'cran ou active/dsactive l'affichage des commandes.
Stoppe la localisation des modifications de l'environnement dans un fichier de commandes.
Supprime un ou plusieurs fichiers.
Quitte l'interprteur de commandes (CMD.EXE).
Compare deux fichiers ou groupes de fichiers, et affiche la diffrence.
Cherche une chane de caractres dans un ou plusieurs fichiers.
Cherche des chanes de caractres dans un ou plusieurs fichiers.
Excute une commande sur chaque fichier d'un groupe de fichiers.
Formate un disque pour utilisation avec Windows NT.
Poursuit l'excution d'un fichier de commandes une ligne identifie par une tiquette.
Permet Windows NT d'afficher un jeu de caractres en mode graphique.
Affiche des informations sur les commandes de Windows NT.
Excute une commande si une condition est vrifie.
Configure un clavier pour un langage spcifique.
Cre, modifie ou supprime le nom de volume d'un disque.et l'excute.
Cre un rpertoire.
Cre un rpertoire.
Configure les priphriques.
Affiche la sortie cran par cran.
Dplace un ou plusieurs fichiers d'un rpertoire un autre sur le mme lecteur.
Affiche ou dfinit le chemin de recherche des fichiers excutables.
Interrompt l'excution d'un fichier de commandes et affiche un message.
Restaure la valeur prcdente du rpertoire courant enregistr par PUSHD.
Imprime un fichier texte.
Change l'invite de Windows NT.
Enregistre le rpertoire courant puis le change.
Supprime un rpertoire.
Rcupre l'information lisible d'un disque dfectueux.
Insre un commentaire dans un fichier de commandes ou CONFIG.SYS.
Renomme un ou plusieurs fichier(s).
Renomme un ou plusieurs fichier(s).
Remplace des fichiers.
Restaure des fichiers sauvegards avec la commande BACKUP.
Supprime un rpertoire.
Affiche, dfinit ou supprime une variable d'environnement Windows NT.
Commence la localisation des changements de l'environnement dans un fichier de commandes.
Change la position des paramtres remplaables dans un fichier de commandes.
Trie son entre.
Affecte une lettre de lecteur un chemin.
Lance une fentre pour l'excution du programme ou de la commande.
Affiche ou dfinit l'heure de l'horloge interne du systme.
Fixe le titre de la fentre pour une session CMD.EXE.
Reprsente graphiquement l'arborescence d'un lecteur ou d'un chemin.
Affiche le contenu d'un fichier texte.
Affiche le numro de version de Windows NT.
Active/dsactive la vrification de l'criture sur disque.
Affiche le nom et le numro de srie du volume.
Copie des fichiers et des rpertoires.

III Redirection des entres-sorties

L'entrestandardestleclavier,lasortiestandardl'cran.Tousdeuxsontenfaitconsidrs
commedesfichiers.
Onpeutsubstituercesfichiersd'autresfichierstexte.Ainsionpeutconserverlatracede
l'excution d'un programme dans un fichier ou remplacer son entre par une suite de
caractresstocksdansunfichier.
Laredirectiondelasortiesefaitl'aideducaractre">".Parexemple:
monprog.exeaffichecesrsultatssurl'cran
monprog.exe>resultat.txtstockecesrsultatdanslefichierresultat.txt.
Laredirectiondel'entresefaitl'aideducaractre"<".
62

Par exemple, monprog.exe < entree.txt prend les caractres contenus dans le fichier
entree.txtaulieuduclavier.

63