Vous êtes sur la page 1sur 58

ERII 3

TP de Programmation C

Enseignants : P. Benoit, J. Da Rolt, L. Dilillo, K. Godary, G. Marchesan, B. Rouzeyre, L. Torres

2010-2011

Sommaire

ENVIRONNEMENT DE PROGRAMMATION VISUAL STUDIO TP 1 : INITIATION AU LANGAGE C TP 2 : STRUCTURES DE CONTRLE TP 3 : TABLEAUX A UNE DIMENSION TP 4 : ALGORITHME DU PLUS COURT CHEMIN (LEE) TP 5 : VARIABLES ET FONCTIONS TP 6 : STRUCTURES ET FICHIERS TP 7 : STRUCTURES DE DONNEES TP 8 : RECURSION TP 9 : LISTE CHAINEES TP COMPLEMENTAIRES EXERCICES COMPLEMENTAIRES ANNEXE : INTRODUCTION AU SYSTEME WINDOWS/MS-DOS

2 7 11 12 13 15 17 19 20 21 22 27 46

Environnement de programmation Visual Studio


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

Menu Dmarrer / Tous les Programmes /MEA/Microsoft Visual Studio 2005 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 case Projet 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 :

Menu Fichier, 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 1er 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. Exercice : Cet exercice consiste crer un programme qui permet de faire le calcul suivant : Le rsultat attendu avec N=10 est 55. 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 3. Excution en mode pas pas Valeur 0 -858993460 Type int int

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.

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 : - Soit putchar ('a'); - Soit printf("%c",'a');

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 dentiers 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. 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 .

10

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.

11

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 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.

12

TP 5 : VARIABLES ET FONCTIONS

Rappels : - L'instruction du pr-processeur #define X Y permet 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 */ ... }

13

- 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 se trouvant dans le rpertoire Y:PublicMEA\MEA1-Info\ 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 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.

14

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); } }

15

2/ La fonction strtok() dclare dans string.h permet 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.h compare 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

16

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 utilisera une liste chaine statique appele Annuaire 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 : Liste[0] Liste[1] Liste[2] Liste[3] Liste[4] Nom / / / / / Suivant 1 2 3 4 -1

17

On ajoute un lment dont le nom est Alain , la liste devient : Liste[0] Liste[1] Liste[2] Liste[3] Liste[4] Nom Alain / / / / Suivant -1 2 3 4 -1

Vide=1 Pleine=0 On ajoute un nouvel lment dont le nom est Zizou , la liste devient : Liste[0] Liste[1] Liste[2] Liste[3] Liste[4] Vide=2 Pleine=0 On ajoute un nouvel lment dont le nom est Bernard , la liste devient : Liste[0] Liste[1] Liste[2] Liste[3] Liste[4] Vide=3 Pleine=0 On supprime llment 0 ( Alain ) de la liste, la liste devient : Liste[0] Liste[1] Liste[2] Liste[3] Liste[4] Vide=0 Pleine=2 Etc. Nom / Zizou Bernard / / Suivant 3 -1 1 4 -1 Nom Alain Zizou Bernard / / Suivant 2 -1 1 4 -1 Nom Alain Zizou / / / Suivant 1 -1 3 4 -1

18

1/ Dfinir un type de donnes Personne permettant de mmoriser les informations relatives une personne telles que son nom et son numro de tlphone. 2/ Dfinir un tableau de personnes, de taille fixe, nomm Annuaire. 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 Annuaire un 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. 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.

19

TP 8 : RECURSION
Exercice 1 : 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.

20

Exercice 2 : 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 n=6 1 1 1 1 1 1 1 1 2 3 4 5 6 1 3 6 10 15 1 4 10 20 1 5 15 1 6 1

Exercice complmentaire : DETERMINANT DUNE MATRICE On veut calculer le dterminant d'une matrice M. Pour ce faire, on utilise la formule suivante :

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 : - 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
pgm fichier1 fichier2

21

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.

22

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().

23

TPs COMPLEMENTAIRES
Exercice 1 : 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 2 : 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 est p_f *p_f : la variable p_f est 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 que p_f est 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)

24

#include <stdio.h> #include <stdlib.h> #include <math.h> #define EPSILON 0.001 double derivee(double (*p_f)(double),double x) /* 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)

25

Exercice 3 : On 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 { 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'en-tte :
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

26

Exercice 4 : Ecrire 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) ; 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 5 : Ecrire un programme contenant une fonction rcursive Calcul() 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. 27

Exercice 6 : Ecrire 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 I = 1 Exemple : I II III IV V VI VII VIII IX X XI XII 1 2 3 4 5 6 7 8 9 10 11 12 LXX LXXX XC C D M 70 80 90 100 500 1000 XX XXX XL L LX 20 30 40 50 60

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. 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 7 : Crez un nouveau projet et copier le fichier Tri.cpp situ dans : \\buis.isim.intra\PublicEns$\PublicMEA\MEA3\MEA3-Info
1 - Comprendre le fonctionnement du pogramme 2 - Rajouter les commentaires ncessaires 3 - Utilisez le symbole DEBUG pour voir le contenu des tableaux 4 - Augmenter N jusqu' 10000 et excutez le programme 5 - Visualisez les rsultats (resultat.txt) dans Excel 6 - Transformez l'algorithme de tri en fonction void BubbleSort(int t[], int Dim) 7 - Une optimisation est-elle possible? Si oui, ajoutez les instructions ncessaires 8 - Faire de mme avec l'algorithme de tri par tas et comparez les temps de traitement

Exercice 8 : 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"

28

void main() { 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 9 : 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 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.

29

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 10 : 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[k-1] 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.

30

EXERCICES 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 class par ordre de difficult. 1Donner l'organigramme et le programme qui dtermine si une anne est bissextile. L'utilisateur doit entrer l'anne. 2Donner 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 . . . 300 17 6 4 15 Celsius

148

Remarques : La conversion Farenheit (F) - Celsius (C) est assure par la formule suivante : Dans le tableau prcdent, les valeurs numriques affiches sont toutes entires 3Reprendre l'exercice prcdent en remplaant la boucle while par une boucle for. 4Donner 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. 5Ecrire 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 1 C=(5/9)*(F-32)

31

n=1 n=2 n=3 n=4 n=5 n=6

1 1 1 1 1 1

1 2 3 4 5 6 1 3 6 10 15 1 4 10 20 1 5 15 1 6 1

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 6Ecrire une fonction MIN et une fonction MAX qui dterminent le minimum et le maximum de deux nombres rels. 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 7Ecrire une fonction afficheCar(n,ch) qui affiche n fois le caractre ch. Ecrire un programme principal qui demande la hauteur d'une pyramide et qui affiche celleci en utilisant la fonction afficheCar(). Exemple : une pyramide de hauteur 4 * *** ***** *******

32

8Ecrire 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. 9Ecrire 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

10 Ecrire un programme permettant de trouver tous les p premiers nombres ou 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. 11 On se propose de calculer l'intgrale d'une fonction entre deux bornes a et b, tel que :

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. 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) * (ab)/10000.

33

F(x) I[0] pas

x a 12 Soit la squence : b

figure 1

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))++;

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]; */

13 On 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. 14 On veut crire un programme qui calcule la somme suivante :

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.

34

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.
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 a 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?

Rappel : - Un point est intrieur D si et seulement si . - La fonction random() prends comme argument un entier N et renvoie un entier compris entre 0 et N-1(int random(int N)). 15 Donner 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. 16 Faire 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 pair. 17 Mme exercice que prcdemment mais on sort de programme lorsquun terme du tableau t1 est gale zro. 35

18 Donner lorganigramme dun programme permettant de compter le nombre de lignes, le nombre de caractres et le nombre de mots lus dans un fichier 19 Donner 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 * *** ***** ******* ***** *** *

20 Ecrire 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 ;}

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. 21 Ecrire un programme qui se contente denregistrer squentiellement dans un fichier une suite de nombre entier quon lui fournit au clavier. 22 Ecrire 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. 23 Ecrire 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 HELLO ALSE PIERRE OTALEMENT HELLO

36

24 Ecrire 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. 25 Ecrire 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 librant leur espace en mmoire. Afficher chaque fois les mots restants en attendant la confirmation de l'utilisateur (par 'Enter'). 26On 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 : i. Ecrire une procdure void crypt( char *p ) de cryptage d'un caractre. ii. Ecrire le main qui appellera la fonction crypt sur l'ensemble du message et imprimera le rsultat. 27 On veut savoir si une lettre est prsente dans une chane de caractres et le nombre de fois que cette lettre apparat dans la chane. iii. 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. iv. Ecrire une fonction int parcours( char *p , char c ) renvoyant le nombre de fois que la lettre se trouve dans la chane de caractres. v. Ecrire le programme principal main(). 28 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). Ecrire de deux faons diffrentes, un programme qui vrifie si une chane CH introduite au clavier est un palindrome. vi. En utilisant uniquement le formalisme tableau. vii. En utilisant des pointeurs au lieu des indices numriques. 29 Tri 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].

37

30 Soit le programme tp3_ex4.c que vous trouverez dans le rpertoire Y:PublicMEA\MEA1Info\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. 31 Un 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*/ - 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

38

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. 32Ecrire 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 Exemple : V = 12 7 8 45 2 9 8 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. Son gabarit est int sprintf( char *chaine, const char *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.

39

33Ecrire 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:

40

35 - CRYPTOGRAPHIE : ALGORITHME DES Rfrences (http://www.uqtr.ca/~delisle/Crypto/prives/blocs_des.php) L'algorithme DES, Data Encryption Standard, a t cr dans les laboratoires de la firme IBM Corp. Il est devenu le standard du NIST en 1976 et a t adopt par le gouvernement en 1977. C'est un chiffrement qui transforme des blocs de 64 bits avec une cl secrte de 56 bits au moyen de permutations et de substitutions. Le DES est considr comme tant raisonnablement scuritaire. Algorithme : Pour tre chiffr, un bloc subit tout d'abord une permutation initiale, puis un algorithme complexe est appliqu en fonction de la cl (calcul mdian), et enfin le bloc subit une permutation finale. Cette dernire permutation est l'inverse de la permutation initiale. De cette faon, l'algorithme de chiffrement et de dchiffrement est le mme. Le calcul mdian dpendant de la cl peut tre dfini comme tant deux fonctions : une premire appele la fonction de chiffrement et une fonction de programmation de la cl. Chiffrement : La permutation initiale : Les 64 bits du bloc en entre dans l'algorithme DES subissent la permutation initiale :
1 9 2 3 4 5 6 7 8

10 11 12 13 14 15 16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1

59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7

Ainsi, le premier bit du bloc rsultant de la permutation initiale est le 58me bit du bloc en entre, le deuxime bit est le 50me bit et 41

ainsi de suite.

42

Le calcul mdian :Le calcul mdian peut se rsumer comme tant une fonction contenant 16 itrations identiques. Cette fonction traite deux blocs la fois : un bloc de 32 bits, les donnes, et l'autre de 48 bits, la cl. Le rsultat donne un bloc de 32 bits. Le bloc de donne de 64 bits est pralablement divis en deux blocs de 32 bits, "L" et "R" (pour "Left" et "Right"), aprs tre pass dans la permutation initiale. Ainsi, "L" contient les bits pairs et "R" contient les bits impairs. Les 48 bits du bloc "K" (pour "Key") sont choisis partir de la cl initiale de 64 bits. La sortie de L'R' aprs l'itration est dfinie par : L' = R R' = L XOR f(R,K) L'R' = [R][L + f(R,K)] L'entre la premire itration du chiffrement est le bloc ayant subit la permutation initiale. la fin, le bloc L'R' restant aprs la seizime itration devient le bloc de pr-sortie (avant la permutation finale). chaque itration, un bloc "K" diffrent de 48 bits est choisi partir de la cl de 64 bits. Pour "n" variant de 1 16, on a Ln = Rn-1 Rn = Ln-1 XOR f(Rn-1,Kn) La fonction de chiffrement "f" f reoit le bloc "R" et le bloc "K" en entre.

La fonction E prend un bloc de 32 bits en entre et donne un bloc de 48 bits en sortie. Les 48 bits, reprsents en huit blocs de 6 bits chacun, sont obtenus en slectionnant les bits du bloc en entre selon le tableau suivant.
32 1 4 8 5 9 2 6 3 7 4 8 5 9

10 11 12 13

12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25

43

24 25 26 27 28 29 28 29 30 31 32 1

Ainsi les trois premiers bits du bloc sortant sont le 32me, le 1er et le 2me bit du bloc en entre. Chacune des huit fonctions de slection, les S-Boxes, prend un bloc de 6 bits comme entre et donne un bloc de 4 bits en sortie. La premire fonction de slection "S1" est reprsente par la table suivante :
S1

Ligne No. 0 0 1 2 3
14 0 4 15

1 4 15 1 12

2 13 7 14 8

3 1 4 8 2

4 2 14 13 4

5 15 2 6 9

6 11 13 2 1

7 8 1 11 7

8 3 10 15 5

9 10 6 12 11

10 6 12 9 3

11 12 11 7 14

12 5 9 3 10

13 9 5 10 0

14 0 3 5 6

15 7 8 0 13

Le contenu des 7 autres S-Boxes est donn dans lannexe ci-jointe.. Le bloc en entre de 8 bits "B" est trait comme suit : le premier bit et le dernier bit du bloc unis reprsentent un nombre compris entre 0 et 3 en base 2, appel Bi, alors que les 4 bits restants du milieu reprsentent un nombre compris entre 0 et 15 en base 2, appel "Bj". Par exemple, si le bloc "B" est "011011" : Bi = 01 = 1 en base 10 Bj = 1101 = 13 en base 10 Ainsi, Bi tant le numro de la ligne de S1 et Bj tant le numro de sa colonne, le bloc de 4 bits de sortie sera "5" en base 10 , donc "0101" en base 2. Les 8 fonctions de slection S1, S2, S3, ..., S8 traitent chacune un des 8 blocs. Ces 8 blocs sont consolids pour former qu'un seul bloc de 32 bits, lequel sera l'entre pour une dernire permutation dans la fonction f. La permutation "P" sur le bloc de 32 bits est reprsente par la table suivante :

16 7 1 5 2

20 21

29 12 28 17 15 23 26 18 31 10 8 24 14 9 25

32 27 3 22 11 4

19 13 30 6

Le rsultat est un bloc de 32 bits. la suite des 16 rounds, le bloc de pr-sortie est L16R16.

44

Dchiffrement La permutation finale est l'inverse de la permutation initiale. On applique exactement le mme algorithme, mais l'inverse, en tenant bien compte que chaque itration du dchiffrement traite les mmes paires de blocs utilises dans le chiffrement. Rn-1 = Ln Ln-1 = Rn XOR f(Ln,Kn) Maintenant R16L16 et le bloc d'entre dans la fonction de dchiffrement, et R0L0 est le bloc de prsortie, avant la permutation finale. Ainsi le bloc relatif la cl K16 est utilis dans la premire itration et K1 dans la dernire. Codage du DES : Afin de faciliter le codage de cet algorithme nous considrons en entre une chane de caractres, le plus simple sera de convertir cette chane de caractre en un tableau dentiers de 0 et de 1. Par exemple si on considre la chane de caractre AIE cela correspondra un tableau dentier T=[0|0|1|0|0|0|0|1|0|0|1|0|1|0|0|1|0|0|1|0|0|1|0|1]. 2) Ecrire une fonction prenant en entre une chane de caractre de taille fixe et la convertissant en un tableau dentier 0 et 1. La permutation initiale est finale nest pas forcment ncessaire. 3) La deuxime opration consistera donc raliser la fonction E qui prend en entre un tableau de 32 bits (rappel un bit correspondant donc en un entier 0 ou 1) et qui le transforme en un tableau de 48 bits. Raliser cette fonction E. 4) La troisime opration consiste raliser le ou exclusif de la clef (sur 48 bits) avec le tableau de 48 bits issu de la fonction E. Raliser cette fonction. Les clefs sont donnes en annexe. 5) Une fois cette opration ralise il est alors ncessaire de programmer lensemble des Sbox, cest en fait tout simplement des tables de correspondance. Chaque Sbox est un tableau 3 dimensions. a. A la sortie du ou exclusif on dispose de 48 bits, 8 mots de 6 bits Pour chaque mot de 6 bits le bit de poids fort concatner avec le bit de poids faible donne le numro de ligne, les autres bits donnant le numro de colonne (cf exemple dans le texte). Pour raliser cette opration raliser une fonction qui partir dune srie de bits permet de convertir un nombre binaire en un nombre entier. b. Crer une fonction permettant de lire ladresse ligne & colonne de la Sbox la nouvelle valeur de lentier (par exemple ligne 1, colonne 13 lentier est 5). c. Crer une fonction qui permet de convertir un entier en un nombre binaire sur 4 bits (comme dhabitude un bit tant un nombre entier 0 ou 1) 6) Raliser une fonction permutant les bits, fonction P. 7) Raliser la chiffrement complet du DES, utiliser une fonction round() pour simplifier lenchanement des oprations. 8) Vrifier le bon fonctionnement de votre algorithme en dchiffrant le message chiffr. 9) Si il vous reste du temps et surtout si cela vous amuse, nous vous proposons en annexe 2 lalgorithme de gnration de clef. A vous de jouer ..

45

Annexe 1 : Les Clefs et les SBOX Exemple de clefs : K0= K1= K2= K3= K4= K5= K6= K7= K8= K9= K10= K11= K12= K13= K14= K15= Les SBOX :
/* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, /* S2 */ 0, 5, 10, 9, 11, 5, 3, 2, 15, 5, 14, 9,

110110010110110000010101011000000111110100000111 100001011010110011011101011001100110110000001111 111001001101001001010100001011100110101100000111 011010011001011001101010011011101100101100100011 100110111000000010100111110011101100101101100101 110100100100110111000011110001101100101011110101 001101001110100101101110100110111100101011010101 011101111011100000011000100110111100101010111000 001001111010111000110010000110111001001011111100 100101110001011100010101100110011001011001111000 110010000111101101000111101110001011010011111000 010111001110000011111001101100010011010011110010 000000101101101010111001001101010011010111011010 001011100100011100001010010101010011010100011011 001100010011010110001111011101000111010100001111 101110010110110111000000011001010111110100001101

/* S3 */ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, /* S4 */ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, /* S5 */

46

2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, /* S6 */ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, /* S7 */ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, /* S8 */ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11

47

Annexe 2 : Algorithme de gnration des clefs (rfrence : projet informatique MEA1 de Zayd GHANNAM, Fabien GOY, Brice JEANJEAN, Yves JULIEN 2004)

Cl initiale (64 bits) Permutation (64 -> 56 bits) Partie gauche (28 bits) Dcalage gauche dun bit Partie droite (28 bits) Dcalage gauche dun bit Partie droite dcale (28 bits) Permutation (56 -> 64 bits) Cl de 48 bits

Partie gauche dcale (28 bits)

Vers cryptage principal

Itration suivante Figure 1 : Principe de gnration des clefs On gnre une cl secrte appel K de 64 bits savoir 8 octets partir dune chane de caractres quelconque, cette dernire passe par plusieurs tapes avant quelle ne soit utilis dans le cryptage principal, le but est de gnrer des cls drives Ki pour chaque itration du cryptage partir de la cl principale K. En premier lieu, on supprime les bits de parits pour avoir une cl de 56 bits .On divise ensuite notre matrice en deux parties de 28 bits, gauche et droite , qui seront permutes laide des deux tableaux de permutations suivants :

57 1 10 19 BITS

49 58 2 11

41 50 59 3

33 42 51 60

25 34 43 52

17 26 35 4

9 18 27 36

63 7 14 21

55 62 6 13

47 54 61 5

39 46 53 28

31 38 45 20

23 30 37 12

15 22 29 44

BITS DE LA PARTIE GAUCHE

BITS DE LA PARTIE DROITE

Dans chacune des deux parties obtenues, on procde un dcalage de un bit vers la gauche, on obtient un nouvel ordre de nos deux blocs .Ces derniers sont regroups en un seul bloc de 56 bits qui passera son tour par une permutation qui fournira 48 bits en sortie laide du tableau suivant :

48

14 3 23 16 41 30 44 46

17 28 19 7 52 40 49 42

11 15 12 27 31 51 39 50

24 6 4 20 37 45 56 36

1 21 26 13 47 33 34 29

5 10 8 2 55 48 53 32

La cl de 48 bits obtenue correspond notre premier Ki qui sera utilis dans la premire des seize itrations de notre cryptage principal. Ainsi de suite les diffrents Ki obtenus lors des seize itrations seront utiliss comme argument pour la fonction Ou Exclusif dans le cryptage principal.

49

36 PROBLEME : CRYPTOGRAPHIE - 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. 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: a est transform en n, b en o, etc.

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

1- Ecrire une fonction void EncryptLigne1(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 char c = 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 fonction1 char** 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 A Z B E C P D H E I F R G A H B I C J D K F L G M J N K O L P M Q N R O S Q T S U T V U W V X W Y X Z Y

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

50

6- Ecrire une nouvelle fonction de chiffrement sappuyant sur le tableau de correspondance gnr par la fonction LUT(): void EncryptLigne3(char *T, char *cle) 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 void DecryptFile(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 . A partir 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 donne Symbole 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 lire et 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: 1: 2: 3: i x e s Nb Nb Nb Nb Occurence: Occurence: Occurence: Occurence: 9190 7036 5709 5629 Proba: Proba: Proba: Proba: 0.1267 0.0970 0.0787 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).

51

Statistiques Lettres Franaises 3 A 8.11 % B 0.81 % C 3.38 % D 4.28 % 1 E 17.69 % F 1.13 % G 1.19 % H 0.74 % I 7.24 % 4 N 7.68 % O 5.20 % P 2.92 % Q 0.83 % R 6.43 % 2 S 8.87 % T 7.44 % U 5.23 % V 1.28 % W 0.06 % X 0.53 % Y 0.26 % Z 0.12 %

Statistiques Lettres Anglaises 4 A 7.81 % B 1.28 % C 2.93 % D 4.11 % 1 E 13.05 % F 2.88 % G 1.39 % H 5.85 % I 6.77 % N 7.28 % 3 O 8.21 % P 2.15 % Q 0.14 % R 6.64 % S 6.46 % 2 T 9.02 % U 2.77 % V 1.00 % W 1.49 % X 0.30 % Y 1.51 % Z 0.09 %

J 0.18 % K 0.02 % L 5.99 % M 2.29 %

J 0.23 % K 0.42 % L 3.60 % M 2.62 %

En francais : Symbole 0: i Proba: Symbole 1: x Proba: Symbole 2: e Proba: Symbole 3: s Proba: En anglais Symbole 0: Symbole 1: Symbole 2: Symbole 3: : i x e s

0.1267 0.0970 0.0787 0.0776

Decalage Decalage Decalage Decalage

avec avec avec avec

e: s: a: n:

4 5 4 5

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

52

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*/ char chaine[10]= "zephir"; fprintf(fichier2,"%s",chaine); fclose(fichier2);

53

ANNEXE : INTRODUCTION AU SYSTEME WINDOWS/MS-DOS

1. Systme de gestion de fichiers a) Quest ce quun fichier ?

Un fichier est une suite doctets2 (de 0 plus de 2 Go) stocke sur un disque. Les disques ont pour nom a: , c: , p:, etc... Aucune structure nest impose un fichier par le systme, et aucune signification nest attache son contenu la signification des octets dpend uniquement des programmes qui manipulent le fichier. Windows reconnat deux grandes catgories de fichiers. Les fichiers ordinaires ou rguliers sont des fichiers sur disque dont le contenu est non structur et correspond donc une suite de caractres caractrise par sa longueur (qui permet en particulier de dtecter la fin de fichier). Les rpertoires voient leur contenu interprt par un certain nombre de fonctions du systme : ils permettent de structurer lensemble des fichiers en arborescence et dfinissent un mcanisme de dsignation des fichiers indpendant de leur localisation dans les tables du systme et sur le disque. Un rpertoire nest rien dautre quun fichier contenant une liste de chanes de caractres ou noms de fichier. Lorganisation qui sensuit est donc arborescente et suppose, pour tre oprationnelle, lexistence dune origine. symbolique. Cette origine est le nom du disque.
b) Rfrence absolue ou relative

La figure ci-contre fournit un exemple darborescence de fichiers. Pour tout fichier, il existe au moins un chemin menant de la racine jusqu lui. La liste des liens physiques quil faut utiliser pour arriver ce fichier lidentifie sans ambigut : elle constitue un chemin daccs long (full-pathname) ou rfrence absolue du fichier. Si les liens rencontrs sur un chemin de la racine vers un fichier sont successivement U, paul, travail et toto.c, la rfrence absolue du fichier scrit symboliquement P:U\paul\travail\toto.c . Une rfrence absolue commence toujours par le nom du disque. Afin de faciliter les reprages, tout processus (activit dans le systme) est associ un rpertoire de travail. La dsignation dun fichier par rapport au rpertoire de travail est appele rfrence relative (short pathname) et scrit sous la forme dune suite de liens spars par le caractre \ : elle correspond un chemin allant du rpertoire de travail un fichier. La rfrence absolue dun fichier se dduit dune rfrence relative en lui ajoutant en prfixe la rfrence absolue du rpertoire de travail. Ainsi, dans lexemple prcdent, si le rpertoire de travail est P:\U\paul, le fichier dont nous avons donn la rfrence absolue aura comme rfrence relative travail\toto.c.
2

Octet : une quantit dinformation de 8 bits. Pour nous, un octet est quivalent un caractre.

54

Ce type de reprage est encore facilit par un mcanisme permettant de remonter dans larborescence. Le lien .. contenu dans un rpertoire est toujours associ au rpertoire unique dont il est le descendant. De plus, le lien . est utilis par le rpertoire pour se dsigner lui mme. Ainsi, ..\claude\C est une rfrence relative parfaitement valide si le rpertoire de travail est, par ex. P:\U\denise. De mme, et bien quelles soient inutilement compliques, les rfrences ..\.\denise\..\..\soft ou jeux\..\travail\toto.c sont valides
2. Commandes de base MS-DOS/WINDOWS-NT

Les commandes de base sont celles qui permettent dobtenir des informations gnrales ou de manipuler lenvironnement immdiat de lutilisateur : rpertoire courant, fichiers, tches. Elles sont utilises dans les fentres MS-DOS
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.

copy ficSource ficCible (voir galement la commande xcopy) copy ficSource1 [ 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.

rename source cible


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

del fichier : destruction d'un fichier. mkdir rpertoire : cration d'un rpertoire
rmdir rpertoire : suppression d'un rpertoire et de toute l'arborescence de fichiers qu'il contient.

print fichier : impression de fichier. Attention le fichier ne doit contenir que des caractres imprimables. help : aide sur toutes les commandes. Donne la liste des commandes; help nom de commande : aide sur une commande particulire Remarques : - toutes ces commandes admettent de nombreuses options. Pour avoir le dtail de ces options utiliser la commande help - En dehors des fentres MS-DOS, l'quivalent de la plupart de ces commandes peut tre effectu par l'explorateur Windows.

55

Liste complte des commandes MS-DOS/WINDOWS-NT :


ACLCONV AT ATTRIB BREAK CALL CD CHCP CHDIR CHKDSK CLS 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 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. 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.

i. III Redirection des entres-sorties

L'entre standard est le clavier, la sortie standard l'cran. Tous deux sont en fait considrs comme des fichiers. On peut substituer ces fichiers d'autres fichiers texte. Ainsi on peut conserver la trace de l'excution d'un programme dans un fichier ou remplacer son entre par une suite de caractres stocks dans un fichier. 56

La redirection de la sortie se fait l'aide du caractre ">". Par exemple : mon-prog.exe affiche ces rsultats sur l'cran mon-prog.exe > resultat.txt stocke ces rsultat dans le fichier resultat.txt. La redirection de l'entre se fait l'aide du caractre "<". Par exemple, mon-prog.exe < entree.txt prend les caractres contenus dans le fichier entree.txt au lieu du clavier.

57