From 0f37235b101be42fb15cc52df2fb6c4ef12b1b53 Mon Sep 17 00:00:00 2001 From: gasc Date: Sun, 22 Aug 2021 13:28:05 +0200 Subject: [PATCH] Importation du code depuis GitHub --- README.md | 16 +++ TD1-5/Anim.java | 71 ++++++++++++++ TD1-5/Cyborg.java | 26 +++++ TD1-5/ImagePanel.java | 49 ++++++++++ TD1-5/Images.java | 29 ++++++ TD1-5/Images/ex1.png | Bin 0 -> 276 bytes TD1-5/Images/ex10.png | Bin 0 -> 2136 bytes TD1-5/Images/ex11.png | Bin 0 -> 1861 bytes TD1-5/Images/ex12.png | Bin 0 -> 1647 bytes TD1-5/Images/ex13.png | Bin 0 -> 1415 bytes TD1-5/Images/ex14.png | Bin 0 -> 999 bytes TD1-5/Images/ex15.png | Bin 0 -> 480 bytes TD1-5/Images/ex16.png | Bin 0 -> 241 bytes TD1-5/Images/ex17.png | Bin 0 -> 132 bytes TD1-5/Images/ex18.png | Bin 0 -> 132 bytes TD1-5/Images/ex2.png | Bin 0 -> 648 bytes TD1-5/Images/ex3.png | Bin 0 -> 1138 bytes TD1-5/Images/ex4.png | Bin 0 -> 1380 bytes TD1-5/Images/ex5.png | Bin 0 -> 1446 bytes TD1-5/Images/ex6.png | Bin 0 -> 1603 bytes TD1-5/Images/ex7.png | Bin 0 -> 2157 bytes TD1-5/Images/ex8.png | Bin 0 -> 2151 bytes TD1-5/Images/ex9.png | Bin 0 -> 2187 bytes TD1-5/Images/mini1.png | Bin 0 -> 10212 bytes TD1-5/Images/mini2.png | Bin 0 -> 8796 bytes TD1-5/Images/mini3.png | Bin 0 -> 7884 bytes TD1-5/Images/mini4.png | Bin 0 -> 6376 bytes TD1-5/Images/mini5.png | Bin 0 -> 4343 bytes TD1-5/Images/mini6.png | Bin 0 -> 6096 bytes TD1-5/Images/mini7.png | Bin 0 -> 10946 bytes TD1-5/Images/mini8.png | Bin 0 -> 6638 bytes TD1-5/Indestructible.java | 11 +++ TD1-5/Killer.java | 31 ++++++ TD1-5/Logline.java | 21 ++++ TD1-5/Logs.java | 24 +++++ TD1-5/PasTrouve.java | 7 ++ TD1-5/Plateau.java | 83 ++++++++++++++++ TD1-5/Robot.java | 201 ++++++++++++++++++++++++++++++++++++++ TD1-5/Sprite.java | 95 ++++++++++++++++++ TD1-5/build.sh | 54 ++++++++++ TD1-5/notes.md | 35 +++++++ TD6/Dossier.java | 57 +++++++++++ TD6/Fichier.java | 9 ++ TD6/FileInfo.java | 70 +++++++++++++ TD6/Node.java | 33 +++++++ TD6/ReadFS.java | 6 ++ 46 files changed, 928 insertions(+) create mode 100644 README.md create mode 100644 TD1-5/Anim.java create mode 100644 TD1-5/Cyborg.java create mode 100644 TD1-5/ImagePanel.java create mode 100644 TD1-5/Images.java create mode 100644 TD1-5/Images/ex1.png create mode 100644 TD1-5/Images/ex10.png create mode 100644 TD1-5/Images/ex11.png create mode 100644 TD1-5/Images/ex12.png create mode 100644 TD1-5/Images/ex13.png create mode 100644 TD1-5/Images/ex14.png create mode 100644 TD1-5/Images/ex15.png create mode 100644 TD1-5/Images/ex16.png create mode 100644 TD1-5/Images/ex17.png create mode 100644 TD1-5/Images/ex18.png create mode 100644 TD1-5/Images/ex2.png create mode 100644 TD1-5/Images/ex3.png create mode 100644 TD1-5/Images/ex4.png create mode 100644 TD1-5/Images/ex5.png create mode 100644 TD1-5/Images/ex6.png create mode 100644 TD1-5/Images/ex7.png create mode 100644 TD1-5/Images/ex8.png create mode 100644 TD1-5/Images/ex9.png create mode 100644 TD1-5/Images/mini1.png create mode 100644 TD1-5/Images/mini2.png create mode 100644 TD1-5/Images/mini3.png create mode 100644 TD1-5/Images/mini4.png create mode 100644 TD1-5/Images/mini5.png create mode 100644 TD1-5/Images/mini6.png create mode 100644 TD1-5/Images/mini7.png create mode 100644 TD1-5/Images/mini8.png create mode 100644 TD1-5/Indestructible.java create mode 100644 TD1-5/Killer.java create mode 100644 TD1-5/Logline.java create mode 100644 TD1-5/Logs.java create mode 100644 TD1-5/PasTrouve.java create mode 100644 TD1-5/Plateau.java create mode 100644 TD1-5/Robot.java create mode 100644 TD1-5/Sprite.java create mode 100755 TD1-5/build.sh create mode 100644 TD1-5/notes.md create mode 100644 TD6/Dossier.java create mode 100644 TD6/Fichier.java create mode 100644 TD6/FileInfo.java create mode 100644 TD6/Node.java create mode 100644 TD6/ReadFS.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..54241c4 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Cours de programmation orientée objet (I3MIIL11) +Mes TD de programmation orientée objet (INSA Toulouse - 3 MIC) d'après [les sujets de D. Le Botlan](http://wwwperso.insa-toulouse.fr/~lebotlan/Y/java3mic.html). + +## Compilation +Pour le TD6, il n'y a pas de script pour compiler, vous pouvez le faire ainsi (sous linux uniquement) : +```bash +$ mkdir build +$ javac *.java +$ mv *.class build/ +$ cd build +$ java ReadFS /dir/ +``` +ou en one-liner : +``` +rm -rf build; javac *.java; mkdir build; mv *.class build/; cd build; java ReadFS /dir/; cd ..; rm -rf build +``` diff --git a/TD1-5/Anim.java b/TD1-5/Anim.java new file mode 100644 index 0000000..af50e62 --- /dev/null +++ b/TD1-5/Anim.java @@ -0,0 +1,71 @@ +/** Boucle principale de la simulation */ + +import java.awt.Color ; + +public class Anim { + + /** Effectue une pause de la duree indiquee en millisecondes */ + public static void pause(int duree) { + try { + Thread.currentThread().sleep(duree) ; + } catch (InterruptedException e) {} + } + + /** Boucle principale */ + public void go() { + int compteur = 0; + + Plateau plat ; + Robot[] robots ; + + plat = new Plateau(800, 600) ; + robots = new Robot[7] ; + + robots[0] = new Robot("Aphrodite", "Images/mini1.png", 200, 100, plat, Color.RED, 0) ; + robots[1] = new Robot("Arès", "Images/mini2.png", 600, 100, plat, Color.GREEN, 1) ; + robots[2] = new Indestructible("Zeus", "Images/mini3.png", 200, 500, plat, Color.YELLOW, 2) ; + robots[3] = new Cyborg("Déméter", "Images/mini7.png", 600, 500, plat, Color.PINK, 7, 3) ; + robots[4] = new Cyborg("Poséidon", "Images/mini4.png", 400, 300, plat, Color.BLUE, 5, 4) ; + robots[5] = new Killer("Hermès", "Images/mini5.png", 700, 300, plat, Color.GRAY, 5, 3) ; + robots[6] = new Killer("Athéna", "Images/mini6.png", 100, 300, plat, Color.ORANGE, 6, 8) ; + + + // On repete la boucle d'animation sans arret + while (true) { + + // On fait evoluer chaque robot + for (int i = 0 ; i < robots.length ; i++) { + robots[i].bouge () ; + } + + // Puis on teste les collisions deux a deux + for (int i = 0 ; i < robots.length ; i++) { + for (int j = i+1 ; j < robots.length ; j++) { + robots[i].testeCollision(robots[j]) ; + } + } + + // Pour chaque robot, on met un petit cercle + if (compteur % 10 == 0){ + for (int i = 0 ; i < robots.length ; i++) { + plat.setColor(robots[i].col); + plat.drawCircle(robots[i].x, robots[i].y, 5); + } + } + compteur++; + + // Petite pause + java.awt.Toolkit.getDefaultToolkit().sync(); // Sinon l'animation est saccadée - probablement à cause du Window Manager. + this.pause(12) ; + } + + } + + + public static void main(String[] args) { + Anim an = new Anim() ; + Images.init () ; + an.go () ; + } + +} diff --git a/TD1-5/Cyborg.java b/TD1-5/Cyborg.java new file mode 100644 index 0000000..2716849 --- /dev/null +++ b/TD1-5/Cyborg.java @@ -0,0 +1,26 @@ +import java.awt.Color ; + +public class Cyborg extends Robot { + /** Nombre total de collision */ + private int nombreCollision = 0; + + /** Nombre maximun de collision */ + private int maxCollision = 6; + + public Cyborg (String name, String nomImage, int init_x, int init_y, Plateau pt, Color col, int maxCollision, int sn) { + super(name, nomImage, init_x, init_y, pt, col, sn); + this.maxCollision = maxCollision; + } + + @Override public void collision(Robot autre) { + //System.out.println("AH AH pauvre malheureux, tu viens de colisionner un CYBORG !"); + doLogsThings(autre); + vx = this.randomV() ; + vy = this.randomV() ; + + nombreCollision++ ; + if (nombreCollision > maxCollision) { + this.explose(); + } + } +} \ No newline at end of file diff --git a/TD1-5/ImagePanel.java b/TD1-5/ImagePanel.java new file mode 100644 index 0000000..68e9ff3 --- /dev/null +++ b/TD1-5/ImagePanel.java @@ -0,0 +1,49 @@ +/** + * Cette classe gère une image de fond + des sprites qui peuvent se déplacer + * (Bas-niveau) + */ + +import javax.swing.* ; +import java.awt.* ; +import java.util.* ; + +public class ImagePanel extends JPanel { + + // L'image de fond qui est dessinée dans le cadre à chaque refresh. + private Image image ; + + // La liste des sprites à dessiner. + private Vector sprites = new Vector () ; + + public void setImage(Image image) { + this.image = image; + } + + // Crée un nouveau sprite, aux coordonnées indiquées. + public Sprite addSprite(String imgName, int x, int y) { + Sprite s = new Sprite(imgName, x, y, this) ; + sprites.add(s) ; + return s ; + } + + // Refresh image & dessine les sprites + public void paintComponent(Graphics g) { + if(image != null) { + g.drawImage(image, 0, 0, this); + + for (Sprite s : sprites) { + s.dessine (g, this) ; + } + } + } + + public Dimension getPreferredSize() { + int w, h; + if(image == null) { + return new Dimension(0, 0); + } + w = image.getWidth(null); + h = image.getHeight(null); + return new Dimension(w > 0 ? w : 0, h > 0 ? h : 0); + } +} diff --git a/TD1-5/Images.java b/TD1-5/Images.java new file mode 100644 index 0000000..fd08347 --- /dev/null +++ b/TD1-5/Images.java @@ -0,0 +1,29 @@ +import javax.imageio.* ; +//import java.awt.* ; +import java.awt.image.* ; +import java.io.* ; + +public class Images { + + public static BufferedImage[] explosion ; + + public static BufferedImage get(String imgfile) { + try { + // Read from a file + File file = new File(imgfile); + return ImageIO.read(file); + } catch (IOException e) { + System.err.println("Le fichier " + imgfile + " est introuvable.") ; + System.exit(1) ; + return null ; + } + } + + public static void init() { + explosion = new BufferedImage[18] ; + for (int i = 0 ; i < explosion.length ; i++) { + explosion[i] = get("Images/ex" + (i+1) + ".png") ; + } + } + +} diff --git a/TD1-5/Images/ex1.png b/TD1-5/Images/ex1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d08b9849614f6ebea71e05a3c138619fa8b157a GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^%0O%+zy>7S4)0R|Qfx`y?k@kqfHUIz9iRwjfk$L9 z0|U1(2s1Lwnj--e+~Vot7?N@C?d6S}Ee-;$4>|dKc+EC37YqM3u-L%%Fi6_KYK`NX z11BCNRc~NAD8$oJ-k4JmaiHKs{mDZ)pDNDGU<4Wh0YBn{E~}jUt$VgOQm@;juhPyp zh$GGQ;oS2JC#*ZYDRIJ*^UrPG=f}?88+XrAwyRTGh`VdHQ1{M%dq3Ik;Wo;?ox6I~ z{hNg|S}%Ohd^Pu6@0NAvpYOZx|8iFK^I~!TQ`YQIYyNE1&%0e{ynSDLEl9-E)z4*} HQ$iB}V2y2z literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex10.png b/TD1-5/Images/ex10.png new file mode 100644 index 0000000000000000000000000000000000000000..246571701f34354e5535d317b092b56f75614b78 GIT binary patch literal 2136 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 literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex12.png b/TD1-5/Images/ex12.png new file mode 100644 index 0000000000000000000000000000000000000000..2b28f85ce5491fbe4a33d67120786690761c0030 GIT binary patch literal 1647 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 V?vLP+?$iJP002ovPDHLkV1m7yj1&L> literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex14.png b/TD1-5/Images/ex14.png new file mode 100644 index 0000000000000000000000000000000000000000..48b12e70f2e2646d307bda4a60b13905a18a6814 GIT binary patch literal 999 zcmVp4Wlftj_j2cfk|vo+ zXWltqlLDH*8_yF0Xf*O32V=}$005{|03m?YRe8s8fX`3*Zdrx_0O#j%{ptS0LssMb zHTeXSt*{iN*#zo!U~3DgR^_qL0BSW7?BhfBYc_$C6Y9UWM^}aLpQq2vEQW;K-vf8XEMQ)- z=$ji7l!PT=uCLP?e~^?dMhM{P30Pc|>35tU47*g2V2}o~2)02ITa3Sc-~kqk;gt_g z)G(;M=h63eTLxjZ-|{jrHwTnTrdh3qgRke2^;}+(OF0g3b(Nbi{tHn$tW!IX*Vopziqa(S3!HKd!D(d-nuEzb?yE8+ETEpBr5Hyaf6B{hv0B4t7zce!cFuq+lJw!CKw(yuPv=c?&Xy zFlx-;EEE@9SvXGLLih#YeyYGxaJ%ec%9O$s3N*QTJ-V(4ZUJPF^q(hXc7h}pMhZl` zSD@3O<75L52lK$da(1Z+(sie!zIsf`_kzscGU77S4)0R|Qfx`y?k@kqfHUIz9iRwjfk$L9 z0|U1(2s1Lwnj^u$z}VpF;uw-~@9j;)u0sI=$3E7J9X#fw(wg94EzRv%{dVgIhIl$fHgj4NBCv%cg1af&#wjf3;*6`}ci*!sT@*-r=KIW*<>a=@oC|_1=e9XZ^yVC& zyjiwEv*UT=Yp0z&zirPv-}bmj&VR+#rh^9xYvhkTPHD|B)8C)DbwOBjmF%jkKRzF2 zx|aRy)z;NIE`QBsG?=EubY)g!3@DMnVB`SKZkRi=@_s1xKyHU^f z-nO;xOAoSH^M3EU*lX`5WmdKI;Vst08Wn9o&W#< literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex16.png b/TD1-5/Images/ex16.png new file mode 100644 index 0000000000000000000000000000000000000000..7381e2b99f0a3a0513c7b6740e5f23073ab5fb65 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^%0O%+zy>7S4)0R|Qfx`y?k@kqfHUIz9iRwjfk$L9 z0|U1(2s1Lwnj--eoapJ|7?N@C?G;0=W(NVchuazRH-uHObK7?8o&I4(oa2Ts9EXT zL;DUF{&_bywXyW?x42bTXME@1(|4)zQ0Y>Z4Y^xCd;aR*WO6yTY_f{yBvdrtmN9sx W>@_#vo_L_+7(8A5T-G@yGywpj_g-}X literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex17.png b/TD1-5/Images/ex17.png new file mode 100644 index 0000000000000000000000000000000000000000..09cca1e6bb84c49ce370e1d3840f74832052b9c6 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^%0O%+zy>7S4)0R|Qfx`y?k@kqfHUIz9iRwjfk$L9 z0|U1(2s1Lwnj--eRPl6i49U3n_MjmnkauXoSN~id`2|2G0z61Gd&IzK>~{V=NX*mK K&t;ucLK6UAY9Yk{ literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex18.png b/TD1-5/Images/ex18.png new file mode 100644 index 0000000000000000000000000000000000000000..09cca1e6bb84c49ce370e1d3840f74832052b9c6 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^%0O%+zy>7S4)0R|Qfx`y?k@kqfHUIz9iRwjfk$L9 z0|U1(2s1Lwnj--eRPl6i49U3n_MjmnkauXoSN~id`2|2G0z61Gd&IzK>~{V=NX*mK K&t;ucLK6UAY9Yk{ literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex2.png b/TD1-5/Images/ex2.png new file mode 100644 index 0000000000000000000000000000000000000000..dede8534fe5e9fd69f9e45f7ede01bdbda8e8ed2 GIT binary patch literal 648 zcmV;30(bq1P)79l3q-uqL!i%Qiuq-!a_k}iUm(%VIhpg zu`I?!FM4tPc%Nnhx0lO2J2yK42qAFMnSlzMpZJYaJ2>}+w- zaRA`_+_ta~MfjB=vbNUMwY@E}w>LU^av~yfc=-G*A|mqmSTFk5bGg30d|p?S?R-KI zGBgCt%!rgq>2#%HVq+2S3j%=gaoc%)L5Qx5W)uHtU7?UlU0(jW$`Q$C+uJubf+yN+ zyt`Xi_yv_?UKLXz!Foosl~TK2ZvgNkE2o~2Mu`R$(A+v-kZlij!~j4nW(4UT5cVt7 zC<3jlm`@LQ{#MC)$^2c zoRN`(gMooo327Oo_XIz_{p)D$o=VLQ(dM1AxZKnu`K{B<*b`+fcW zKxe1zyh0EI0FEOvHy4Sltca|ycX#Jc| zImob)K?fzHtzE?}4+R=75-DA@=Ac1PiO`zHth`2E20GEgjvC#niGHv=;>Yio%F@aYra^8rLe6BCy6V=rnR|kCcLNBd>t?pMBCnv+pZ-IRNZv=6dmX>(Dp~0!% z91tcJ)Af-NAR6uMHH=C@wsVF%f?c}A*xkEg_45c(L$cXhw|LEPws!0u`S&V+0MDOy zN*EiC@%s-QQdOY7zPFd(adY|H3jRIIsj--@4-D`pnzrx45D@|O^?;_Ss{H}jr?K(+ zbxi{X2QObX4F2bAzt-4rjHYqNcn^1uaIO>l$Hxwv;R0Q`qU$|9c596dVe&f4v(3Smy1;4zi@`SZsQAeW0qdBVFTzE=VFCS*K*?_M$qOiTcY z1m7AgEZ7xj&xrGs4N~Xc+VJLqkAa z9e=-20Ej$WjqD2rhyyJTcfk^gL?V$$Boc{4B9S=7Z<<6`E}%&Xwg3PC07*qoM6N<$ Ef@ystb^rhX literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex4.png b/TD1-5/Images/ex4.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5e15b865d682d12a1cd1fe1ed657e8b34f1adc GIT binary patch literal 1380 zcmV-q1)KVbP)=-aOSZ_P3AOtgn$n6HM zUX}VcUjJ_>HM63}DF2=|ORu5!(zLb$y}gB=kxBudKbIDuxS$;O{ymV%RC|<-wUUDf z08Azzn+4|PfM5_11lDh{0D=Iltx4A+4hL}L2ypl?&s(iT!C*Qq2pk6hv$I-_m(yMl zafz7CKzlo|V@Fey$pqZKy}B9*NKf|lF>eyNe%)rfb`9w0XlvWE2QZs2UNjgAf5GD! z8S(izZfq=_9vRWvo(hCu8#2*Dh^D7)wwEuZmWU{qBl_^+?Ac64%tAz$FE=%Ly;46> zIJ~wdJzu(I&rMA5{Qdj&w!erFY+#Zg0AR65hLv(1|UU})&quVVMbe(^bZSS)PGRR`6#4TK@JMr35N2=k2oZ9J^Mzq7OQv|ZIhWVwBb)-a(jT)1`1;SiHU;n}Oo!brz^kB8@P-UPO8 zZEY={jpPcatzbT1IPCSZGgy1O(k!LGV>&v3-dI!mtnKa;(&t z%K_2oyLXXDH4Q0lkb0zXiAza7Dwa|($YM=2y11B3YUw%31y~O&d5TwZJw>%JlIJWg zuC9hcz|_=>7f+u83k&DYv3kq%=fyoJ99EW%)OlhwYPT;f0b^t7v{=!r!^9D-tN=TA z5)lDTCs8yyJUll?^zoz1mB~nLVf{pDy`|Lizke5d-{ax=$w{?#Rs8Q0j@z;Y`0|Ba z`TayIE1^&%0-QO+HiW?-+y5*q0C(>K+qP}rZZHrTjX-lV`v&`C;+CeI2QhC>Bqk>X zft6b0an*KJDvVr+#>at%24H#`IDQ;>`<4YoB9=;DzqZ@Q$AMkD+S>N+B{CXMp5!glPKeN_+$*jO6PZ+*V*?#GXbHf;h993Xo0 zW_Wmho+uWx+vn$r5($^<>sO*DPi(fC86t-RxN?Q4xf$5Kn|+6?*@V|vxWWyXXz+j5 ma2*{T9UUDV9UUE=e~CYukNDP5>7gqC0000w1!5cC9!$wougTcahm^Vz`X1CdGHtBoM{az+J*`3Vqli&P)Grt8)nfhOe(tZ1Y z)>cZ}+krD@j2qY3@l5^O^vD0he>?yIqNxd}t~PGGZQFnY2TC=*DN{=l;7aM~)6151c2Y_yrE_x(jKjeJ$pQXn#SJYC z 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 B^Jf46 literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex7.png b/TD1-5/Images/ex7.png new file mode 100644 index 0000000000000000000000000000000000000000..b535a3f8bacbbd03af78e6a87ebb58737c176b91 GIT binary patch literal 2157 zcmV-z2$J`SP)3@SRk=h zwo((Dv?%2kgf&6f3hb_7u~SQkjmG1{$)7WGy3@Uh1>Ns~!|a^S{Qo!qeFnHm!8rgd zS~TBs6fj@lysOLa@99au4*(dOZ+UMTa2^T)KA-b>;NK*yD0f9(ebwda?&kd2XMye8 zbH7ea4e<2SKxHKm3US`m<@5FRalT~>ux%Ud6O;&g{?i}};JmZb@9*uURi3Y_12$~9 zarZY2VCBmB=D{M6*J~As^PM{dF;6`O)Yq#7{cpkfiWPv*$NAc|z>`m=-|z7ND^}cS zxo(>1&-uD_KtltdX~6R3z@bCHx8DMFb-+Up0ZW&zkSR^i#&B zrhxJBTb>xsH*W@7TY)oYfM}GlQ>TD~2WRga7+AGxWCXZ!#Wa&i;PU0EDbobX%8H9M z4Y+u5dfGIBk&#&JqmLLH90b1p`j#O^W-m><{dT_}=;&x}ZfgTL7lGI`fBp5!6`-x{ zv(Mgs8+hxjHEUX00Dv*Z1Tm&bM?f+uh`Mx15cStzVsA%BEcU_+^F|DrK4Sv|KscO! zKL9-XC=idgv>ZMx&lrY1_YhHpAAjuWNhX2mX+gx$(5X{LkIM6xFJHZyOag!WF*Bp< zz_n|@@#Bnr{4wzU`?>0OTh5GTNQlID->q5m!3Th8PEID1Krr~?i@Kib%Bjn^NMvH- z+&Q48rlO*%N?HtI$r6u8(|{vK&Yv$Y2Y{KGT(!%iz{?ck=|AuQP+VM6Qd$alJenp5 z$*hhgO9=)AA*w|YQMxX!TUO@v>N@A^*8^L(&O0%pQf+M&LYI|s-rHMU-QN$KJ-cbs z;Go>;^F8xSD)O9ATf1XNFbEVE3&oc%t*or7awdu_ClGMC0)brh$=Q{pCG6a37~8f1 z8#g}oSYsp5(ZTuauLC6|UT`KJ z_WI>vF#`h+KfG%f(B9tH_x$rxg;40_m+gd5EKw~(D4a<2_h)iHx=wYqSXZuWYYT;d zB}*zRtrkW2`R7;+;9S>pDG0MBMmBwcKzVspm3*RVFx9k@5?u!piT(SnM5qL*S!p&= z4Gq8lE?34@uNKEeMF220H8o`o!n!V8>F&Gzet@xLGMBlxMLom_zuLk_N_X?NXaCqzJf(uP4n zR&^m#)QJ$W-^s=3ca;zV6?{IQ*PE&w$P5`<4Cl+21B({}7cXA85QzYWF+3a$0*QoG zEGam-h$LukB2_}2&Qt7Cq1H9|Aq$H+aROMi3MelR1Oy?IlSG=82&wqzpU-t{7)?#7 zR@x^CnA?I>h}J-+?c9)YOCVBXQxlL#w6yHoClzrDs`(Ehi4Y3jb`WvoQubbov32W4 zM<014*L!DSG3(chK170oXnnm{iHLt{GOH3!mPrppKrQ@e?~x;G*PcF2^BYkKr=Ry^ zO$=jSd;ts%rSfr7fC#cHB7dh<3ZMF3YC0D&N5-lmo77}67cPiiicnYA)>d5&gu{)E zy}hCmZfq3Se*E!t`eqS)X~IT=0O7ER`c!8SL25d70_{6=$ex|(cOqzL$nBOf#wqw( zWwjRyoM&&tX)Q*+5!|vR6nfaUwufP(4(ioC|`;wVa?@f|H@A zE&!ceO6`@1D5`Jv?Tf_@97wNkhQtV=uU+GOWF!{byBBC^FwNRpNlfN&s&t9Sbge-? zVC>j2AhSvc$SNz*#ICk>aPYqSWCcu+1z0)-RaeQ55H($^P+NtszB+q0eN4%j7%N4< zop%D^@X3?o$hCm>_IUiY*MMkr zV&bQtJ70qu%B~0UvP^h_C*To!2*R2+lPw$k+ zFq|H&3(b0_?fv&D-^qqHv_>^agihu_n6feyPsw=2XC)F*pL6$+?kR6f8hacwe zLU|LT5(EJ8xR~S-;&FiU@4xqWPM-!AEfOaF+i!dJ0Kh%>2v>0Gg`~n_?qa>C__x1b zq-A^0M3yo+3HT>L~G?gq-s&!4ZT0Nieu z%k2jK{BvUBjyr%$mqtg0f+tQ~zb*!1x(+0h$B$pXE(sv3q+@!$BIYrS?cO~-{qDQD z%Kb0Ci3EU}8u?3Sr{BMQJ5XPL|NXVKv+EFoY(WIn!Ib@tBxCLE^ZF+8pCO7dptaTI z>h1=fd+v!RRq1bn2VvYlnpkMWBB3 zO`mVa4moJrwJQ?o=>evvfw3{MXY*zt5&@!7;Mg%>|Nj5Y7gw2rp7?yrQNXQ&!so9A j6i`3`1r$&~0e1Wi)aRH!8aU?w00000NkvXXu0mjf8ioq0 literal 0 HcmV?d00001 diff --git a/TD1-5/Images/ex8.png b/TD1-5/Images/ex8.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb263e45b1b82188e51802bafc47150e7a3b646 GIT binary patch literal 2151 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 N002ovPDHLkV1j-!9WVd@ literal 0 HcmV?d00001 diff --git a/TD1-5/Images/mini1.png b/TD1-5/Images/mini1.png new file mode 100644 index 0000000000000000000000000000000000000000..0df62aa64e83804ec404962cec89eff3bb3b9b83 GIT binary patch literal 10212 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 eNhP(o>;D08Q?Lf0jmn$=0000VM`d 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 literal 0 HcmV?d00001 diff --git a/TD1-5/Images/mini5.png b/TD1-5/Images/mini5.png new file mode 100644 index 0000000000000000000000000000000000000000..1e24d826fa004d3104cbf4017340670298eb735d GIT binary patch literal 4343 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 literal 0 HcmV?d00001 diff --git a/TD1-5/Images/mini6.png b/TD1-5/Images/mini6.png new file mode 100644 index 0000000000000000000000000000000000000000..5221113a9d6289174539bb4de6813b3147271a0d GIT binary patch literal 6096 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 WnW$0?&^M|800009kY3*j8I- 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 x) { + autre.explose(); + //System.out.println("Pauvre fou, je suis un KILLER !"); + } + } +} \ No newline at end of file diff --git a/TD1-5/Logline.java b/TD1-5/Logline.java new file mode 100644 index 0000000..09f5516 --- /dev/null +++ b/TD1-5/Logline.java @@ -0,0 +1,21 @@ +import java.util.*; + +public class Logline { + protected Date d; + private String msg; + protected Robot r,tier; + + public Logline(Date d, String msg, Robot self, Robot tier) { + this.d = d; + this.msg = msg; + this.r = self; + this.tier = tier; + } + + @Override public String toString() { + if (tier != null) + return "[" + d.toString() + "](" + r + ", " + tier + ") " + msg + "\n"; + else + return "[" + d.toString() + "](" + r + ") " + msg + "\n"; + } +} diff --git a/TD1-5/Logs.java b/TD1-5/Logs.java new file mode 100644 index 0000000..742a456 --- /dev/null +++ b/TD1-5/Logs.java @@ -0,0 +1,24 @@ +import java.util.*; + +public class Logs { + private Stack logsStack = new Stack(); + + public void add(String message, Robot emetteur, Robot tiers) { + logsStack.push(new Logline(new Date(), message, emetteur, tiers)); + } + + @Override public String toString() { + String str = ""; + for (Logline ligne : logsStack) + str += ligne; + return str; + } + + public Logline trouveLigne(Robot emetteur, Robot tiers) throws PasTrouve { + for (Logline i : logsStack) + if (i.r == emetteur && i.tier == tiers) + return i; + throw (new PasTrouve("Not found.")); + //return null; + } +} diff --git a/TD1-5/PasTrouve.java b/TD1-5/PasTrouve.java new file mode 100644 index 0000000..bdb291e --- /dev/null +++ b/TD1-5/PasTrouve.java @@ -0,0 +1,7 @@ +public class PasTrouve extends Exception { + String contenu; + + public PasTrouve(String contenu) { + this.contenu = contenu; + } +} \ No newline at end of file diff --git a/TD1-5/Plateau.java b/TD1-5/Plateau.java new file mode 100644 index 0000000..e490505 --- /dev/null +++ b/TD1-5/Plateau.java @@ -0,0 +1,83 @@ +/** + * Ouvre une fenetre pour y afficher les sprites + * ou y tracer des points, lignes, etc. + */ + +import javax.swing.* ; +import java.awt.* ; +import java.awt.image.* ; + +public class Plateau { + + // ImagePanel : contient le cadre et les sprites des robots. + private ImagePanel panel ; + + private JFrame frame ; + private BufferedImage img ; + private Graphics2D gr ; + + private int larg ; + private int haut ; + + /** + * Crée et affiche une nouvelle fenêtre + */ + public Plateau (int largeur, int hauteur) { + this.frame = new JFrame ("Le Monde des Robots"); + this.frame.setResizable(false) ; + this.larg = largeur ; + this.haut = hauteur ; + this.img = new BufferedImage (largeur, hauteur, BufferedImage.TYPE_3BYTE_BGR) ; + this.gr = this.img.createGraphics() ; + this.panel = new ImagePanel () ; + + this.panel.setImage(this.img) ; + this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.frame.setSize(largeur, hauteur); + + this.frame.setContentPane(this.panel) ; + this.frame.setVisible(true); + + this.setColor (new Color(180, 180, 200)) ; + gr.fillRect(0,0,largeur,hauteur) ; + + this.setColor (Color.black) ; + this.repaint() ; + } + + /** Renvoie la largeur de la fenetre */ + public int getLarg () { return this.larg ;} + + /** Renvoie la hauteur de la fenetre */ + public int getHaut () { return this.haut ;} + + /** + * Force le reaffichage de la fenetre + */ + public void repaint() { + panel.repaint() ; + } + + /** + * Fixe la couleur du crayon pour les dessins futurs. + */ + public void setColor (Color col) { + this.gr.setColor (col) ; + } + + /** + * Dessine un cercle + */ + public void drawCircle (int x, int y, int rayon) { + this.gr.fillOval(x - rayon, y - rayon, 2*rayon, 2*rayon) ; + panel.repaint (0, x - rayon, y - rayon, 2*rayon, 2*rayon) ; + } + + /** + * Cree un nouveau sprite a partir du fichier image indique' + */ + public Sprite addSprite(String imgName, int x, int y) { + return panel.addSprite(imgName, x, y) ; + } + +} diff --git a/TD1-5/Robot.java b/TD1-5/Robot.java new file mode 100644 index 0000000..119af67 --- /dev/null +++ b/TD1-5/Robot.java @@ -0,0 +1,201 @@ +import java.awt.Color ; + +public class Robot { + + /* + * Les attributs de chaque Robot. + */ + + /** Position du robot */ + protected int x, y ; + + /** Vitesse du robot */ + protected int vx, vy ; + + /** Etat du robot */ + private boolean vivant ; + + /** Sprite (==image) representant le robot */ + private Sprite image ; + + /** Plateau sur lequel le robot evolue */ + private Plateau plat ; + + /** Ce robot est-il arrete' ? */ + private boolean arrete ; + + /** Couleur des cercles */ + protected Color col ; + + /** Serail number */ + private int SN; + + /** Son nom */ + private String name; + + /** Nombre max. d'explosion */ + public static final int maxExplosions = 20; + + /** Compte du nombre d'explosion */ + protected static int nbExplosions; + + /** Nombre de robots créés */ + private static int nbRobot = 0; + + /** Logs */ + Logs l = new Logs(); + + + /* + * Constructeur de Robot. + */ + + /** Cree un nouveau robot avec l'image indiquee, a la position indiquee sur le plateau + * La vitesse de depart est aleatoire + */ + public Robot (String name, String nomImage, int init_x, int init_y, Plateau pt, Color col, int sn) { + this.x = init_x ; + this.y = init_y ; + this.vivant = true ; + this.vx = this.randomV() ; + this.vy = this.randomV() ; + this.plat = pt ; + this.image = pt.addSprite (nomImage, this.x, this.y) ; + this.arrete = false ; + this.col = col ; + this.SN = sn; + this.name = name; + nbRobot++; + } + + /* + * Méthodes + */ + + + /** Renvoie une valeur de vitesse aleatoire */ + public int randomV() { return (int)(Math.random() * 6) - 3 ; } + + /** Recupere la largeur de l'image du robot */ + public int getLarg() { return this.image.getLarg() ; } + + /** Recupere la hauteur de l'image du robot */ + public int getHaut() { return this.image.getHaut() ; } + + /** Retourne le SN */ + public int getSN() { return this.SN ; } + + + /** Effectue un deplacement elementaire du robot */ + public void bouge() { + + if (this.vivant) { + + this.x += this.vx ; + this.y += this.vy ; + + // Si le robot rejoint un bord de la fenetre, il rebondit et change de direction + int futurX = this.x + this.vx ; + int futurY = this.y + this.vy ; + + // Collision avec le bord gauche + if (futurX < 0) { + this.vx = Math.abs(this.vx) ; + this.vy = this.randomV() ; + } + + // Collision avec le bord droit + if (futurX + this.getLarg() > this.plat.getLarg()) { + this.vx = -Math.abs(this.vx) ; + this.vy = this.randomV() ; + } + + // Collision avec le bord haut + if (futurY < 0) { + this.vy = Math.abs(this.vy) ; + this.vx = this.randomV() ; + } + + // Collision avec le bord bas + if (futurY + this.getHaut() > this.plat.getHaut()) { + this.vy = -Math.abs(this.vy) ; + this.vx = this.randomV() ; + } + } + + // Redessine le robot au nouvel endroit + // Force a redessiner, meme si le robot n'a pas bouge. + this.image.moveTo(this.x, this.y) ; + + } + + + /** Teste si ce robot est en collision avec le robot 'autre' */ + public void testeCollision(Robot autre) { + + // Pour etre en collision, il faut une intersection sur les X ET sur les Y + boolean enCollision = ((this.x + this.getLarg() >= autre.x) && (this.x < autre.x + autre.getLarg()) && + (this.y + this.getHaut() >= autre.y) && (this.y < autre.y + autre.getHaut())) ; + + // Si on est en collision avec un robot different de soi-meme, on reagit et l'autre aussi. + if (this.vivant && autre.vivant && (autre != this) && enCollision) { + + // Si les deux robots sont deja arretes, on ne fait rien. + if (this.arrete && autre.arrete) {} + else { + this.collision(autre) ; + autre.collision(this) ; + } + } + } + + /** Arrêter ce robot. */ + public void arreterRobot() { + this.vx = 0 ; + this.vy = 0 ; + this.arrete = true ; + } + + /** Fait exploser ce robot */ + public void explose() { + if (nbExplosions >= maxExplosions) { + return; + } + this.image.playSequence(Images.explosion, false) ; + this.vivant = false ; + nbExplosions++; + + l.add("Explosion", this, null); + System.out.println(l.toString()); + } + + protected void doLogsThings(Robot autre){ + direBonjour(autre); + l.add("Collision", this, autre); + } + + /** Reaction a une collision : on s'arrete */ + public void collision(Robot autre) { + //System.out.println("[Collision entre " + this + " et " + autre +"]"); + doLogsThings(autre); + this.arreterRobot() ; + } + + /** toString */ + @Override public String toString() { + return this.name + " at " + this.x + ", " + this.y; + //return "Robot (" + this.name + ", sn. : " + this.SN + ") at " + this.x + ", " + this.y; + } + + public void direBonjour(Robot autre) { + Logline line; + + try { + line = l.trouveLigne(this, autre); + System.out.println(" Rebonjour, on s'est déjà croisé le " + line.d.toString()); + } + catch (PasTrouve e){ + System.out.println(" Bonjour, on ne se connaît pas."); + } + } +} diff --git a/TD1-5/Sprite.java b/TD1-5/Sprite.java new file mode 100644 index 0000000..d287a18 --- /dev/null +++ b/TD1-5/Sprite.java @@ -0,0 +1,95 @@ +/** + * Un sprite est une image qui a vocation a se deplacer. + * (bas niveau) + */ + +import java.awt.* ; +import java.awt.image.* ; + +public class Sprite { + + // Position, dimension et image du sprite + public int x, y ; + private int width, height ; + public BufferedImage image ; + + // ImagePanel ou se trouve le sprite + private ImagePanel ip ; + + // Animation du robot : sequence d'images + private BufferedImage[] seq ; + + // Index dans la sequence. -1 signifie qu'on ne la joue pas. + private int indexSeq ; + + // Nombre d'expositions de chaque image de la sequence + private final int dureeExposition = 6 ; + private int compteurExposition ; + + private boolean repeat ; + + + + /** Renvoie la largeur du sprite */ + public int getLarg() { return this.width ; } + + /** Renvoie la hauteur du sprite */ + public int getHaut() { return this.height ; } + + public Sprite (String imgfile, int x, int y, ImagePanel ip) { + + this.x = x ; + this.y = y ; + this.seq = null ; + this.indexSeq = -1 ; + this.ip = ip ; + + this.image = Images.get(imgfile) ; + this.width = this.image.getWidth() ; + this.height = this.image.getHeight() ; + } + + // Indique à l'image panel de se redessiner sur la zone du sprite. + private void repaint() { + this.ip.repaint (0, this.x, this.y, width, height) ; + } + + + public void moveTo (int x, int y) { + // Il faudra redessiner l'endroit d'où il part + this.repaint() ; + this.x = x ; + this.y = y ; + // Et l'endroit où il arrive. + this.repaint() ; + } + + public void playSequence(BufferedImage[] seq, boolean repeat) { + this.seq = seq ; + this.indexSeq = 0 ; + this.compteurExposition = this.dureeExposition ; + this.repeat = repeat ; + } + + public void dessine(Graphics g, ImagePanel im) { + + if (this.indexSeq >= 0 && this.indexSeq < this.seq.length) { + this.image = this.seq[this.indexSeq] ; + + this.width = this.image.getWidth() ; + this.height = this.image.getHeight() ; + + if (this.compteurExposition-- <= 0) { + this.compteurExposition = this.dureeExposition ; + this.indexSeq ++ ; + } + + if (this.indexSeq >= this.seq.length && this.repeat) { + this.indexSeq = 0 ; + } + } + + g.drawImage(this.image, this.x, this.y, im) ; + + } +} diff --git a/TD1-5/build.sh b/TD1-5/build.sh new file mode 100755 index 0000000..b305cca --- /dev/null +++ b/TD1-5/build.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +red='\e[0;31m' +green='\e[0;32m' +orange='\e[0;33m' +neutral='\e[0;m' + +printout() { + echo -e "[${green}INFO${neutral}] $@" +} + +printhelp() { + echo -e "[${orange}HELP${neutral}] $@" +} + +printerr() { + echo -e "[${red}ERROR${neutral}] $@" +} + +if test $# -ne 1 +then + printhelp "Veuillez spécifier le nom du programme à lancer." + printhelp "Utilisation de Anim par défaut" + a="Anim" +else + a=$1 +fi + +printout "Compilation avec javac..." +javac *.java + +if test $? -eq 0 +then + printout "Succès de la compilation !" +else + printerr "Echec de la compilation." + exit 1 +fi + +rm build -rf 2>&1 > /dev/null +mkdir build +mv *.class build/ +cp -R Images build/ + +printout "Lancement du programme..." +cd build + +printhelp "Logs : " +java $a + +cd - 2>&1 > /dev/null +rm build -rf 2>&1 > /dev/null + +exit 0 \ No newline at end of file diff --git a/TD1-5/notes.md b/TD1-5/notes.md new file mode 100644 index 0000000..0c7081c --- /dev/null +++ b/TD1-5/notes.md @@ -0,0 +1,35 @@ +## Notes de TD - POO java +### TD 1 +* Pour passer votre programme à un collègue, que devez-vous lui envoyer : les fichiers .java, les fichiers .class, les deux ? + +On ne lui envoie que les .class, ça suffit et il est pas question qu'il nous pique notre code. + +* Combien d'objets sont créés explicitement dans la méthode go() ? + +What does "Explicitement" means ? Sinon, si c'est à chaque `new`, bah 6. + +* Comment récupère-t-on la taille d'un tableau ? + +`.length` + +* Localisez le constructeur de la classe Robot. A-t-il autant d'arguments que la classe a d'attributs ? + +Nope. + +* Où est appelé le constructeur de la classe Robot ? + +Anim.java, l. 24 - 27 : +```java +robots[0] = new Robot("Images/mini1.png", 200, 100, plat, Color.RED) ; +``` + +* Où est appelée la méthode collision() de la classe Robot ? + +Robot.java > testeCollision > l. 121 - 122 : +```java +this.collision(autre) ; +``` + +* Dans la classe Robot, examinez le corps de testeCollision. Cette méthode manipule deux robots, pourtant elle n'a qu'un seul argument. Expliquer ce mystère. + +Il y a l'objet en lui même et son copain. diff --git a/TD6/Dossier.java b/TD6/Dossier.java new file mode 100644 index 0000000..6216574 --- /dev/null +++ b/TD6/Dossier.java @@ -0,0 +1,57 @@ +import java.util.* ; + +public class Dossier extends Node { + // Liste des éléments contenus + ArrayList elements = new ArrayList(); + + public Dossier (String path, int depth) { + super(path, 0, depth); + this.depth = depth; + Iterator son; + String p; + long s = 0; + long sum = 0; + try { + son = FileInfo.getElements(path); + } + catch (java.io.IOException e) { + son = null; + } + while (son.hasNext()) { + p = son.next(); + try { + s = FileInfo.size(p); + sum += s; + } + catch (java.io.IOException e) {} + + if (this.depth + 1 <= maxDepth && nbNode <= maxNode){ + if (FileInfo.isFile(p)) { + elements.add(new Fichier(p, s, this.depth + 1)); + } + else + elements.add(new Dossier(p, this.depth + 1)); + } + } + Collections.sort(this.elements, comparator); + this.size = sum; + } + + Comparator comparator = new Comparator() { + @Override public int compare(Node node1, Node node2) { + return node1.name.compareTo(node2.name); + } + }; + + @Override public void afficher() { + System.out.println("+ (DIR) " + this.name + "[total = " + size + " octets]"); + for (Node i : elements) { + if (i.depth <= maxDepth){ + for (int j = 0; j < depth; ++j){ + System.out.print(" "); + } + i.afficher(); + } + } + } +} diff --git a/TD6/Fichier.java b/TD6/Fichier.java new file mode 100644 index 0000000..4546e07 --- /dev/null +++ b/TD6/Fichier.java @@ -0,0 +1,9 @@ +public class Fichier extends Node { + public Fichier (String path, long size, int depth) { + super(path, size, depth); + } + + @Override public void afficher() { + System.out.println("| " + this.name + "[total = " + size + " octets]"); + } +} diff --git a/TD6/FileInfo.java b/TD6/FileInfo.java new file mode 100644 index 0000000..c37a120 --- /dev/null +++ b/TD6/FileInfo.java @@ -0,0 +1,70 @@ +import java.io.* ; +import java.util.* ; + +public class FileInfo { + + // No constructor + private FileInfo() { } + + /** + * @param path an absolute path to a file or directory + * @return the name of the file or directory + */ + public static String getName(String path) { + return (new File(path)).getName() ; + } + + /** + * @param path an absolute path to a file + * @return the size of the file + * @throws java.io.IOException if the file does not exist or if it is a directory. + */ + public static long size(String path) throws IOException { + File file = new File(path) ; + if (file.exists() && file.isFile()) return file.length() ; + else if (!file.exists ()) throw (new IOException("File " + path + " does not exist.")) ; + else throw (new IOException(path + " is not a regular file.")) ; + } + + /** + * @param path an absolute path to a file or a directory + * @return true if it is a directory + */ + public static boolean isDirectory(String path) { + return (new File(path)).isDirectory() ; + } + + /** + * @param path an absolute path to a file or a directory + * @return true if it is a regular file + */ + public static boolean isFile(String path) { + return (new File(path)).isFile() ; + } + + /** + * @paral path an absolute path to a directory + * @return an iterator over the paths of all elements in this directory. + * @throws java.io.IOException if it is not a directory. + */ + public static Iterator getElements(String path) throws IOException { + File file = new File(path) ; + + if (!file.exists ()) throw (new IOException("Directory " + path + " does not exist.")) ; + if (!file.isDirectory()) throw (new IOException(path + " is not a directory.")) ; + + String[] elements = file.list() ; + // If the directory could not be read, elements is null here. + if (elements == null) { + elements = new String[0] ; + } + + for (int i = 0 ; i < elements.length ; i++) { + elements[i] = path + File.separator + elements[i] ; + } + + // if (elements == null) throw (new IOException("Cannot read directory " + path)) ; + + return Arrays.asList(elements).iterator() ; + } +} diff --git a/TD6/Node.java b/TD6/Node.java new file mode 100644 index 0000000..7e44f4c --- /dev/null +++ b/TD6/Node.java @@ -0,0 +1,33 @@ +public abstract class Node { + // Node max + static protected int maxNode = 100; + static public int nbNode = 0; + + // Profondeur max + static protected int maxDepth = 3; + + // Chemin vers l'élément + protected String path; + + // Nom de l'élément + protected String name; + + // Taille de l'élément + protected long size; + + // Profondeur + protected int depth; + + + // Constructeur + public Node(String path, long size, int depth) { + nbNode++; + this.path = path; + this.size = size; + this.depth = depth; + this.name = FileInfo.getName(path); + } + + public abstract void afficher(); + +} diff --git a/TD6/ReadFS.java b/TD6/ReadFS.java new file mode 100644 index 0000000..b77be88 --- /dev/null +++ b/TD6/ReadFS.java @@ -0,0 +1,6 @@ +public class ReadFS { + public static void main (String args[]) { + Dossier first = new Dossier(args[0], 0); + first.afficher(); + } +}