Outils pour utilisateurs

Outils du site


exercices:debut

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
exercices:debut [10/10/2019 09:10]
webmestre [TP5]
exercices:debut [10/10/2019 09:11] (Version actuelle)
webmestre [TP5]
Ligne 1: Ligne 1:
 +Voici les données initiales pour réaliser les TP M3101.
  
 +====== TP1 ======
 +
 +Voici les codes fourni en TD1 :
 +  * {{:​exercices:​td1-pid.sh|}}
 +  * {{:​exercices:​td1-logique.sh|}}
 +  * {{:​exercices:​td1-zombie.sh|}}
 +  * {{:​exercices:​td1-pipe.sh|}}
 +  * {{:​exercices:​td1-exit.sh|}}
 +  * {{:​exercices:​td1-mutex.sh|}}
 +  * {{:​exercices:​td1-limit.sh|}}
 +  * {{:​exercices:​td1-rdv.sh|}}
 +  * {{:​exercices:​td1-turn.sh|}}
 +  * {{:​exercices:​td1-prod.sh|}}
 +  * {{:​exercices:​td1-rw.sh|}}
 +
 +Pour la question "Mise en place des sémaphores",​ utilisez les [[:codes:]] fournis dans le cours pour les programmes : mknamedsem.c,​ namedsemp.c,​ namedsemv.c et rmnamedsem.c.
 +
 +<WRAP center round tip 60%>
 +Les question "​Application au carrousel"​ et "​Application lecteur/​écrivains"​ ne seront pas notés.
 +
 +Pour visualiser une trotteuse, utilisez l'​option "​-update 1" de xclock.
 +</​WRAP>​
 +
 +====== TP2 ======
 +
 +Utilisez les entêtes :
 +<code c>
 +#include <​stdio.h>​
 +#include <​errno.h>​
 +#include <​stdlib.h>​
 +#include <​linux/​byteorder/​little_endian.h>​
 +</​code>​
 +
 +Même un source C peut être compilé avec "​g++"​ (pour pourvoir utiliser la syntaxe ANSI-C).
 +
 +Regardez la documentation des fonctions :
 +<code c>
 +       FILE *fopen(const char *path, const char *mode);
 +       void perror(const char *s);
 +       int sscanf(const char *str, const char *format, ...);
 +       int fseek(FILE *stream, long offset, int whence);
 +       ​size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
 +       int fprintf(FILE *stream, const char *format, ...);
 +
 +</​code>​
 +
 +{{:​exercices:​minixstructure.c|}}
 +
 +{{:​exercices:​td2.minixfs.zip|}}
 +
 +Pour voir le fichier en hexadécimal utilisez emacs et la commande : M-x hexl-mode //(Esc-x suivi de hexl-mode)//​
 +
 +
 +Exemple de code c
 +<code c>
 +#include <​stdio.h>​
 +#include <​stdlib.h>​
 +
 +int
 +main (int argc, char** argv, char** envp) {
 + fprintf (stdout, "Hello World\n"​);​
 + return 0;
 +}
 +</​code>​
 +
 +Exemple de compilation
 +<code bash>
 +$ gcc test.c
 +$ ./a.out
 +</​code>​
 +
 +<code c>
 +#include <​stdio.h>​
 +#include <​stdlib.h>​
 +
 +int
 +main (int argc, char** argv, char** envp) {
 + FILE *file = fopen (argv[1], "​r"​);​
 +
 + for (int i = 2; i < argc; i++) {
 + int adresse;
 + sscanf (argv[i], "​%x",​ &​adresse);​
 + fprintf (stdout, "​convert 0x%x = %d\n", adresse, adresse);
 + }
 + return 0;
 +}
 +</​code>​
 +
 +<code bash>
 +$ gcc test.c
 +$ ./a.out td2.minixfs 0x20 0x40
 +</​code>​
 +
 +<code c>
 +#include <​stdio.h>​
 +#include <​stdlib.h>​
 +
 +struct S {
 +   int a;
 +   int b;
 +};
 +
 +int
 +main (int argc, char** argv, char** envp) {
 + FILE *file = fopen (argv[1], "​r"​);​
 + fseek (file, 0x1000, SEEK_SET);
 +
 + int n = 3;
 + struct S tab [n];
 +
 + fread (tab, sizeof (struct S), n, file);
 +
 + for (int i = 0; i < n; i++)
 + fprintf (stdout, "a: 0x%x b: 0x%x\n",​ tab[i].a, tab[i].b);
 + return 0;
 +}
 +</​code>​
 +
 +
 +====== TP4 ======
 +
 +Exemple de code pour dessiner dans un JPanel.
 +
 +<code java>
 +public class Panneau extends JPanel {
 +  public Panneau (int width, int height) {
 +    this.width = width;
 +    this.height = height;
 +    Dimension size = new Dimension (width, height);
 +    setMinimumSize (size);
 +    setPreferredSize (size);
 +    setDoubleBuffered (true);
 +  }
 +
 +  public synchronized void update () {
 +    repaint ();
 +  }
 +
 +  public void paint (Graphics g) {
 +    Graphics2D g2 = (Graphics2D) g;
 +    g2.setBackground (Color.WHITE);​
 +    g2.clearRect (0, 0, width, height);
 +
 +    g2.setColor (Color.GREEN);​
 +    g2.fillRect (10, 10, 100, 100);
 +
 +    // ...
 +    //​g2.setColor (rectangle.color);​
 +    //​g2.fillRect (rectangle.x,​ rectangle.y,​ rectangle.width,​ rectangle.height);​
 +  }
 +}
 +</​code>​
 +
 +Exemple de code pour tester un objet graphique.
 +
 +<code java>
 +public static final void testComponent (final String title, final Component component) {
 +  SwingUtilities.invokeLater (new Runnable () {
 +    public void run () {
 +      JFrame jFrame = new JFrame (title);
 +      jFrame.addWindowListener (new WindowAdapter () {
 +        public void windowClosing (WindowEvent e) {
 +          System.exit (0);
 +        }
 +      });
 +      jFrame.getContentPane ().add (component, BorderLayout.CENTER);​
 +      jFrame.pack ();
 +      Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
 +      Dimension size = jFrame.getSize ();
 +      jFrame.setLocation ((screenSize.width - size.width)/​4,​ (screenSize.height - size.height)/​4);​
 +      jFrame.setVisible (true);
 +    }
 +  });
 +}
 +</​code>​
 +
 +====== TP5 ======
 +
 +Pour le TP, vous devez télécharger {{ :​exercices:​20171012-tp5.zip |tp5.zip}}
 +
 +Après décompression de l'​archive vous obtenez :
 +
 +Classes utiles pour le TP5 :
 +<code bash>
 +tp5/
 +├── jar
 +│   └── tp5.jar (Game.class Letter.class Player.class TestParse.class)
 +├── src
 +│   └── tp5
 +│   ​    ​└── GameNetParse.java
 +└── ws
 +    ├── compile.sh
 +    └── launch.sh
 +</​code>​
 +
 +Vous devez modifier la classe **GameNetParse.java**.
 +Pour compiler et tester, placez vous dans ws.
 +
 +
 +Le lancement du programme consiste dans le test suivant (inclue dans le jar) :
 +<code java>
 +public class TestParse {
 +
 +    static String[] msgs = {
 + "​140824 07:09:30 alice: guest bob", // execGuestArg
 + "​140824 07:09:31 alice: guest grpA:​bob",​ // execGuestArg
 + "​140824 07:09:32 alice: guest grpA:",​ // execGuestArg
 + "​140824 07:09:33 bob: welcome alice@10.0.0.1:​8080",​ // execWelcomeArg
 + "​140824 07:09:34 alice: welcome bob@10.0.0.2:​8081 chalie@10.0.0.1:​8082",​ // execWelcomeArg
 + "​140824 07:09:35 alice: send 10.0.0.1:​8080-A",​ // execLetterArg
 + "​140824 07:09:36 alice: answer 10.0.0.1:​8082-C",​ // execLetterArg
 + "​140824 07:09:37 alice: reject 10.0.0.1:​8080-A",​ // execLetterArg
 + "​140824 07:09:38 alice: close",​ // execNoArg
 + "​140824 07:09:39 bob: full", // execNoArg
 + "​140824 07:09:40 bob: done 10.0.0.2:​8081-[ACD] 10.0.0.2:​8082-[BD] 10.0.0.2:​8083-F"​ // execLettersArg
 +    };
 +
 +    static public void main (String[] arg) {
 + Game game = new Game ();
 + GameNetParse gnp = new GameNetParse (game);
 + for (String msg : msgs) {
 +     gnp.parse (msg);
 +     System.err.println ();
 + }
 +    }
 +}
 +</​code>​
 +
 +L'​objectif du TP est de réaliser l'​analyse des lignes précédentes et d'​appeler la classe Game (inclue dans le jar) :
 +<code java>
 +public class Game {
 +    public void netClose (String sender) {
 + System.err.println (">​close from "​+sender);​
 +    }
 +    public void netFull (String sender) {
 + System.err.println (">​full from "​+sender);​
 +    }
 +    public void netGuest (String sender, String guest) {
 + System.err.println (">​guest from "​+sender+"​ to "​+guest);​
 +    }
 +    public void netWelcome (String sender, List<​Player>​ players) {
 + System.err.print (">​welcome from "​+sender);​
 + for (Player player : players)
 +     System.err.print (" "​+player);​
 + System.err.println ();
 +    }
 +    public void netSend (String sender, Letter letter) {
 + System.err.println (">​send from "​+sender+"​ with "​+letter);​
 +    }
 +    public void netAnswer (String sender, Letter letter) {
 + System.err.println (">​answer from "​+sender+"​ with "​+letter);​
 +    }
 +    public void netReject (String sender, Letter letter) {
 + System.err.println (">​reject from "​+sender+"​ with "​+letter);​
 +    }
 +    public void netDone (String sender, List<​Letter>​ letters) {
 + System.err.println (">​done from "​+sender+"​ with "​+Letter.toString (letters));
 +    }
 +}
 +</​code>​
 +
 +Vous disposez des autres classes dans le jar.
 +<code java>
 +package tp5;
 +public class Player {
 +    public String name;
 +    public String ip;
 +    public int port;
 +
 +    public Player (String name, String ip, String port) {
 + this.name = name;
 + this.ip = ip;
 + this.port = Integer.parseInt (port);
 +    }
 +
 +    public String toString () { return name+"​@"​+ip+":"​+port;​ }
 +}
 +
 +public class Letter {
 +    public String alpha;
 +    public String ip;
 +    public int port;
 +
 +    public Letter (String alpha, String ip, String port) {
 + this.alpha = alpha;
 + this.ip = ip;
 + this.port = Integer.parseInt (port);
 +    }
 +}
 +</​code>​
 +
 +
 +====== TP6 ======
 +
 +Pour le TP, vous devez télécharger {{ :​exercices:​20170919-tp6.zip |tp6.zip}}
 +
 +Après décompression de l'​archive vous obtenez :
 +
 +<code bash>
 +tp6/
 +├── jar
 +│   └── tp6.jar
 +├── src
 +│   └── tp6
 +│   ​    ​└── model
 +│   ​        ​└── NetCom.java
 +└── ws
 +    ├── compile.sh
 +    ├── playNet2.sh
 +    ├── playNet.sh
 +    ├── playTxt2.sh
 +    └── playTxt.sh
 +</​code>​
 +
 +La commande playTxt.sh vous permet de tester en mode texte.
 +
 +
 +Vous devez écrire la classe Java **NetCom.java** pour pouvoir lancer la commande playNet.sh.
 +
 +Pour cela vous pouvez reprendre la classe recvdata.java (voir le bas de la rubrique [[codes:​debut|Ressources]]).
 +
 +Pour retrouver es information IP et port des joueurs, il existe des accesseurs dans deux classes suivantes :
 +<code java>
 +public class Player implements Comparable<​Player>​ {
 +
 +    public String getName () { return name; }
 +    public String getIp () { return ip; }
 +    public int getPort () { return port; }
 +}
 +</​code>​
 +<code java>
 +public class Game extends StateNotifier implements IGame {
 +    public Player getOwner () { return owner;}
 +}
 +</​code>​
 +La classe Packet quand à elle est définie dans l'​interface ICom comme suit :
 +<code java>
 +    public class Packet {
 + String ip;
 + int port;
 + String msg;
 + public Packet (String ip, int port, String msg) {
 +     this.ip = ip;
 +     this.port = port;
 +     this.msg = msg;
 + }
 +    }
 +
 +</​code>​
exercices/debut.txt · Dernière modification: 10/10/2019 09:11 par webmestre

Outils de la page