DELPHI - INSIA SIGL1 - STRUCTURES DE CONTROLE, TABLEAUX ET ROUTINES ------------------------------------------------------------------- --------------------- SUJET N°1 - TRANSPOSE --------------------- Chemin : U:\rendu\sigl1\delphi\tp1 Fichier : Transpose.dpr (AUCUN AUTRE) Limite : mardi 09/03/2004 à 23:42 Il s'agit de transposer une matrice carrée, c'est-à-dire un tableau à deux dimensions égales (ex. 5x5). La dimension est stockée dans une variable Size extraite de la ligne de commande (valeur minimale 1). -> StrToInt(ParamStr(1)) [avec les vérifs qui vont bien] Vous n'avez pas le droit d'utiliser une matrice temporaire, ou une autre matrice de quelque forme que ce soit. Vous avez une seule matrice, que vous modifiez à la volée. La transposition transforme les lignes en colonnes et les colonnes en lignes. Exemple : 1 2 3 4 5 1 6 11 16 21 6 7 8 9 10 2 7 12 17 22 11 12 13 14 15 -> 3 8 13 18 23 16 17 18 19 20 4 9 14 19 24 21 22 23 24 25 5 10 15 20 25 Votre matrice est dans une variable globale nommée Matrix. Faites une procédure Init, qui initialise Matrix comme à gauche ci-dessus. Faites une procédure Display, qui affiche Matrix (pas besoin d'aligner les valeurs comme ci-dessus, mais affichez tout de même ligne par ligne). Une fois ces deux-là faites, vous pouvez les tester facilement en les appelant l'une après l'autre pour vérifier que vous obtenez bien la matrice à gauche sur l'exemple précédent. Faites une procédure Trans, qui transpose Matrix. Votre programme principal sera le suivant : begin Init; Display; WriteLn; // Pour une ligne vide entre les deux. Trans; Display; ReadLn; // Pour attendre Entrée avant de se fermer. end. * Rappels de syntaxe et indices Pour Trans, vous aurez besoin de deux boucles _for_ imbriquées, la seconde dépendant de la première pour son index de début. Vous aurez aussi besoin d'une variable de valeur temporaire pour échanger les "cases" de la matrice. Syntaxe d'une procédure sans paramètres : procedure NomDeLaProc; [variables dans une section _var_ s'il y en a] begin [code ici] end; SUJET N°2 - HANOI ----------------- Chemin : U:\rendu\sigl1\delphi\tp1 Fichier : Hanoi.dpr (AUCUN AUTRE) Limite : mardi 09/03/2004 à 23:42 Soient 3 piquets et DISK_COUNT disques de tailles allant diminuant. Tous les disques démarrent sur le piquet 1, depuis celui de taille DISK_COUNT tout en bas (disons en position 1) jusqu'à celui de taille 1 tout en haut (disons en position DISK_COUNT). DISK_COUNT est bien entendu passée en ligne de commande ;-p La valeur minimale est 1. Valeur maximale 16384. Vous devez déplacer les disques, un à la fois, sans jamais en avoir un plus grand sur un plus petit, jusqu'au piquet 3. Le principe directeur est toujours le même : pour déplacer N disque de X en Y, 1. je déplace N-1 de X vers Z 2. je déplace le disque restant de X vers Y 3. je déplace N-1 de Z vers Y Vous définirez aussi une constante NO_DISK à zéro (0), que vous utiliserez partout. Votre plateau de jeu sera représenté par un tableau à 2 dimensions : Piquets x Disques. Faites une procédure Init qui initialise le plateau de sorte que le premier piquet contienne bien les disques de taille DISK_COUNT à 1, et les deux autres soient vides (que des NO_DISK). Faites une procédure Display qui affiche le plateau piquet par piquet, à raison d'un piquet par ligne. Chaque piquet est terminé par un tiret. Exemple pour le plateau de départ : 5 4 3 2 1 - - - Exemple pour une étape intermédiaire : 5 4 - 2 1 - 3 - Faites enfin une procédure MoveDisks dont la signature est la suivante : procedure MoveDisks(Source, Dest, Inter, DiskCount: Integer); Cette procédure doit déplacer DiskCount (ne pas confondre avec la valeur fixe DISK_COUNT) disques du piquet Source au piquet Dest, en s'aidant du piquet Inter comme intermédiaire. Vous aurez sans doute besoin d'une procédure annexe pour déplacer le disque sommet d'un piquet X au-desus du sommet d'un piquet Y, que vous appelerez le cas échéant MoveTopDisk(Source, Dest: Integer). Celle-ci pourrait avoir besoin d'une procédure d'obtention de la position du plus haut disque sur un piquet, laquelle s'appellerait alors GetTopDiskIndex(Piquet: Integer): Integer. Chaque déplacement d'un disque doit être affiché sous la forme suivante : "Moving 1 disk from picket X to picket Y" (avec X et Y corrects bien sûr). Votre programme principal aura l'aspect suivant : begin Init; Display; MoveDisks(1, 3, 2, DISK_COUNT); Display; ReadLn; // Pour attendre Entrée avant de se fermer. end. * Rappels de syntaxe et indices Syntaxe d'une fonction avec paramètres du même type (ici 2) : function NomDeLaFunc(Param1, Param2: Type): TypeValeurDeRetour; [Section _var_ si besoin] begin [code ici] end; --FIN DE SUJET--