tp
This commit is contained in:
parent
fae997b0e8
commit
4d7c490f87
BIN
Automate/JFLAP7.1.jar
Normal file
BIN
Automate/JFLAP7.1.jar
Normal file
Binary file not shown.
554
Automate/TP0/Ex1.jff
Normal file
554
Automate/TP0/Ex1.jff
Normal file
File diff suppressed because it is too large
Load Diff
296
Automate/TP0/Ex2.jff
Normal file
296
Automate/TP0/Ex2.jff
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--Created with JFLAP 7.1.--><structure>
|
||||||
|
<type>fa</type>
|
||||||
|
<automaton>
|
||||||
|
<!--The list of states.-->
|
||||||
|
<state id="0" name="q0">
|
||||||
|
<x>239.0</x>
|
||||||
|
<y>109.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="1" name="0">
|
||||||
|
<x>96.0</x>
|
||||||
|
<y>289.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="2" name="q2">
|
||||||
|
<x>426.0</x>
|
||||||
|
<y>114.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="3" name="q3">
|
||||||
|
<x>100.0</x>
|
||||||
|
<y>107.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="4" name="2*n+1">
|
||||||
|
<x>240.0</x>
|
||||||
|
<y>288.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="5" name="2*n">
|
||||||
|
<x>389.0</x>
|
||||||
|
<y>289.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="6" name="n">
|
||||||
|
<x>63.0</x>
|
||||||
|
<y>465.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="7" name="0mod3">
|
||||||
|
<x>253.0</x>
|
||||||
|
<y>401.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="8" name="1mod3">
|
||||||
|
<x>248.0</x>
|
||||||
|
<y>522.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="9" name="2mod3">
|
||||||
|
<x>391.0</x>
|
||||||
|
<y>459.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="10" name="n">
|
||||||
|
<x>632.0</x>
|
||||||
|
<y>89.0</y>
|
||||||
|
<initial/>
|
||||||
|
</state>
|
||||||
|
<state id="11" name="2mod9">
|
||||||
|
<x>888.0</x>
|
||||||
|
<y>-64.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="12" name="3mod9">
|
||||||
|
<x>930.0</x>
|
||||||
|
<y>301.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="13" name="4mod9">
|
||||||
|
<x>1119.0</x>
|
||||||
|
<y>-61.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="14" name="5mod9">
|
||||||
|
<x>950.0</x>
|
||||||
|
<y>119.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="15" name="6mod9">
|
||||||
|
<x>1079.0</x>
|
||||||
|
<y>124.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="16" name="7mod9">
|
||||||
|
<x>1202.0</x>
|
||||||
|
<y>309.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="17" name="8mod9">
|
||||||
|
<x>1316.0</x>
|
||||||
|
<y>111.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="18" name="0mod9">
|
||||||
|
<x>766.0</x>
|
||||||
|
<y>181.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="19" name="1mod9">
|
||||||
|
<x>771.0</x>
|
||||||
|
<y>15.0</y>
|
||||||
|
</state>
|
||||||
|
<!--The list of transitions.-->
|
||||||
|
<transition>
|
||||||
|
<from>17</from>
|
||||||
|
<to>16</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>14</from>
|
||||||
|
<to>19</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>8</from>
|
||||||
|
<to>9</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>9</from>
|
||||||
|
<to>8</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>3</from>
|
||||||
|
<to>0</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>13</from>
|
||||||
|
<to>18</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>15</from>
|
||||||
|
<to>13</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>18</from>
|
||||||
|
<to>19</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>10</from>
|
||||||
|
<to>18</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>19</from>
|
||||||
|
<to>11</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>19</from>
|
||||||
|
<to>12</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>1</from>
|
||||||
|
<to>4</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>11</from>
|
||||||
|
<to>13</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>0</from>
|
||||||
|
<to>2</to>
|
||||||
|
<read>b</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>2</from>
|
||||||
|
<to>0</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>12</from>
|
||||||
|
<to>15</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>15</from>
|
||||||
|
<to>12</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>0</from>
|
||||||
|
<to>0</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>2</from>
|
||||||
|
<to>2</to>
|
||||||
|
<read>b</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>4</from>
|
||||||
|
<to>5</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>5</from>
|
||||||
|
<to>4</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>13</from>
|
||||||
|
<to>17</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>7</from>
|
||||||
|
<to>8</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>8</from>
|
||||||
|
<to>7</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>11</from>
|
||||||
|
<to>14</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>14</from>
|
||||||
|
<to>11</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>16</from>
|
||||||
|
<to>14</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>10</from>
|
||||||
|
<to>19</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>16</from>
|
||||||
|
<to>15</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>6</from>
|
||||||
|
<to>8</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>1</from>
|
||||||
|
<to>1</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>5</from>
|
||||||
|
<to>5</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>7</from>
|
||||||
|
<to>7</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>18</from>
|
||||||
|
<to>18</to>
|
||||||
|
<controlx>795</controlx>
|
||||||
|
<controly>188</controly>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>4</from>
|
||||||
|
<to>4</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>9</from>
|
||||||
|
<to>9</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>17</from>
|
||||||
|
<to>17</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>6</from>
|
||||||
|
<to>7</to>
|
||||||
|
<read>0</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>12</from>
|
||||||
|
<to>16</to>
|
||||||
|
<read>1</read>
|
||||||
|
</transition>
|
||||||
|
<note>
|
||||||
|
<text/>
|
||||||
|
<x>286.0</x>
|
||||||
|
<y>756.0</y>
|
||||||
|
</note>
|
||||||
|
</automaton>
|
||||||
|
</structure>
|
73
Automate/TP0/TP2NDA.jff
Normal file
73
Automate/TP0/TP2NDA.jff
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--Created with JFLAP 6.4.--><structure>
|
||||||
|
<type>fa</type>
|
||||||
|
<automaton>
|
||||||
|
<!--The list of states.-->
|
||||||
|
<state id="0" name="q0">
|
||||||
|
<x>67.0</x>
|
||||||
|
<y>118.0</y>
|
||||||
|
<initial/>
|
||||||
|
</state>
|
||||||
|
<state id="1" name="q1">
|
||||||
|
<x>148.0</x>
|
||||||
|
<y>51.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="2" name="q2">
|
||||||
|
<x>149.0</x>
|
||||||
|
<y>162.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="3" name="q3">
|
||||||
|
<x>261.0</x>
|
||||||
|
<y>49.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="4" name="q4">
|
||||||
|
<x>262.0</x>
|
||||||
|
<y>162.0</y>
|
||||||
|
</state>
|
||||||
|
<state id="5" name="q5">
|
||||||
|
<x>382.0</x>
|
||||||
|
<y>51.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<state id="6" name="q6">
|
||||||
|
<x>388.0</x>
|
||||||
|
<y>166.0</y>
|
||||||
|
<final/>
|
||||||
|
</state>
|
||||||
|
<!--The list of transitions.-->
|
||||||
|
<transition>
|
||||||
|
<from>4</from>
|
||||||
|
<to>6</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>0</from>
|
||||||
|
<to>0</to>
|
||||||
|
<read>b</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>0</from>
|
||||||
|
<to>2</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>2</from>
|
||||||
|
<to>4</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>1</from>
|
||||||
|
<to>3</to>
|
||||||
|
<read>b</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>0</from>
|
||||||
|
<to>1</to>
|
||||||
|
<read>a</read>
|
||||||
|
</transition>
|
||||||
|
<transition>
|
||||||
|
<from>3</from>
|
||||||
|
<to>5</to>
|
||||||
|
<read>b</read>
|
||||||
|
</transition>
|
||||||
|
</automaton>
|
||||||
|
</structure>
|
20
Automate/TP0/n2n2n+1
Normal file
20
Automate/TP0/n2n2n+1
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
n 2n 2n+1
|
||||||
|
0 mod3 0 mod3 1 mod3
|
||||||
|
1 mod3 2 mod3 0 mod3
|
||||||
|
2 mod3 1 mod3 2 mod3
|
||||||
|
|
||||||
|
0 1
|
||||||
|
zéro zéro un
|
||||||
|
un deux zéro
|
||||||
|
deux un deux
|
||||||
|
|
||||||
|
n 2n 2n+1
|
||||||
|
0 mod9 0 mod9 1 mod9
|
||||||
|
1 mod9 2 mod9 3 mod9
|
||||||
|
2 mod9 4 mod9 5 mod9
|
||||||
|
3 mod9 6 mod9 7 mod9
|
||||||
|
4 mod9 8 mod9 0 mod9
|
||||||
|
5 mod9 1 mod9 2 mod9
|
||||||
|
6 mod9 3 mod9 4 mod9
|
||||||
|
7 mod9 5 mod9 6 mod9
|
||||||
|
8 mod9 7 mod9 8 mod9
|
BIN
DEV3.2/ControleMachine/ARemplirDEV32.tar.gz
Normal file
BIN
DEV3.2/ControleMachine/ARemplirDEV32.tar.gz
Normal file
Binary file not shown.
55
DEV3.2/ControleMachine/DEV32/1/Bulles.java
Normal file
55
DEV3.2/ControleMachine/DEV32/1/Bulles.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* @author Pourchot Adrian
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class Bulles{
|
||||||
|
|
||||||
|
public static boolean bulle(ArrayDeque<Integer> listerempli, ArrayDeque<Integer> listevide){
|
||||||
|
int stockentier=listerempli.remove();
|
||||||
|
boolean ordrechanger=false;
|
||||||
|
|
||||||
|
|
||||||
|
while(!listerempli.isEmpty()){
|
||||||
|
if(stockentier>listerempli.element()){
|
||||||
|
listevide.add(listerempli.remove());
|
||||||
|
ordrechanger=true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
listevide.add(stockentier);
|
||||||
|
stockentier=listerempli.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listevide.add(stockentier);
|
||||||
|
return ordrechanger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void tri(ArrayDeque<Integer> listeatrier){
|
||||||
|
ArrayDeque<Integer> listeentiervide = new ArrayDeque<Integer>(10);
|
||||||
|
boolean boucle=true;
|
||||||
|
|
||||||
|
while(boucle){
|
||||||
|
boucle=bulle(listeatrier,listeentiervide);
|
||||||
|
while(!listeentiervide.isEmpty()){
|
||||||
|
listeatrier.add(listeentiervide.remove());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ArrayDeque<Integer> listeentier = new ArrayDeque<Integer>(10);
|
||||||
|
int affichage;
|
||||||
|
|
||||||
|
for (int i=0; i<args.length; i++) {
|
||||||
|
listeentier.add(Integer.parseInt(args[i]));
|
||||||
|
}
|
||||||
|
tri(listeentier);
|
||||||
|
for (int i=0; i<args.length; i++) {
|
||||||
|
affichage = listeentier.remove();
|
||||||
|
System.out.print(affichage+" ");
|
||||||
|
listeentier.add(affichage);
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
}
|
BIN
DEV3.2/ControleMachine/DEV32/2/838_planche06_copie.webp
Normal file
BIN
DEV3.2/ControleMachine/DEV32/2/838_planche06_copie.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
49
DEV3.2/ControleMachine/DEV32/2/Exemple.java
Normal file
49
DEV3.2/ControleMachine/DEV32/2/Exemple.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
public class Exemple{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exemple d'utilisation de SimpleDequeThatsNotCricket.
|
||||||
|
*
|
||||||
|
* @param args pas de paramètre en ligne de commande prévu.
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
MinimalDeque<String> d = new SimpleDequeThatsNotCricket<String>();
|
||||||
|
|
||||||
|
System.out.println(d.toString());//
|
||||||
|
System.out.println("");
|
||||||
|
|
||||||
|
String s = "Zo";
|
||||||
|
System.out.println("addFirst " + s);//
|
||||||
|
d.addFirst(s);
|
||||||
|
System.out.println(d.toString());//
|
||||||
|
|
||||||
|
s = "Bu";
|
||||||
|
System.out.println("addFirst " + s);//
|
||||||
|
d.addFirst(s);
|
||||||
|
System.out.println(d.toString());//
|
||||||
|
|
||||||
|
s = "Ga";
|
||||||
|
System.out.println("addFirst " + s);//
|
||||||
|
d.addFirst(s);
|
||||||
|
System.out.println(d.toString());//
|
||||||
|
|
||||||
|
s = "Meu";
|
||||||
|
System.out.println("addLast " + s);//
|
||||||
|
d.addLast(s);
|
||||||
|
System.out.println(d.toString());//gab
|
||||||
|
System.out.println("");
|
||||||
|
|
||||||
|
System.out.println("removeFirst "+d.removeFirst()+", reste");
|
||||||
|
System.out.println(d.toString());//Ga
|
||||||
|
System.out.println("removeLast "+d.removeLast()+", reste");
|
||||||
|
System.out.println(d.toString());//Meu
|
||||||
|
System.out.println("removeLast "+d.removeLast()+", reste");
|
||||||
|
System.out.println(d.toString());//Zo
|
||||||
|
System.out.println("removeFirst "+d.removeFirst()+", reste");
|
||||||
|
System.out.println(d.toString());//Bu
|
||||||
|
System.out.println("");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
68
DEV3.2/ControleMachine/DEV32/2/MinimalDeque.java
Normal file
68
DEV3.2/ControleMachine/DEV32/2/MinimalDeque.java
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* interface simplifiée pour un Deque, c'est-à-dire une file d'attente à double extrémité
|
||||||
|
*
|
||||||
|
* Pour éviter la lourdeur de l'interface Deque de l'API officielle, celle-ci limite
|
||||||
|
* cette dernière à 5 méthodes essentielles.
|
||||||
|
*
|
||||||
|
* La spécification de ces méthodes est essentiellement identique à celle des méthodes équivalentes
|
||||||
|
* dans Deque.
|
||||||
|
*
|
||||||
|
* Ici nous choisissons d'interdire null comme élément et de ne pas limiter la capacité de la deque.
|
||||||
|
* Nous ignorons ClassCastException qui n'est a priori pas possible d'obtenir en runtime avec javac sans contorsion.
|
||||||
|
*
|
||||||
|
* The javadoc is reproduced and adapted from source for your convenience below in the file, but in english.
|
||||||
|
*
|
||||||
|
* Il est recommandé d'ajouter un constructeur sans argument qui instancie un deque vide.
|
||||||
|
* Il est utile de surcharger toString() pour permettre d'afficher utilement la structure de donnée.
|
||||||
|
*Œ
|
||||||
|
* @author Luc Hernandez, Florent Madelaine.
|
||||||
|
* @See Java.util.Deque
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface MinimalDeque<E> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts the specified element at the front of this deque if it is
|
||||||
|
* possible to do so.
|
||||||
|
*
|
||||||
|
* @param e the element to add
|
||||||
|
* @throws NullPointerException if the specified element is null
|
||||||
|
* @throws IllegalArgumentException if some property of the specified
|
||||||
|
* element prevents it from being added to this deque
|
||||||
|
*/
|
||||||
|
void addFirst(E e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts the specified element at the end of this deque if it is
|
||||||
|
* possible to do so.
|
||||||
|
*
|
||||||
|
* @param e the element to add
|
||||||
|
* @throws NullPointerException if the specified element is null
|
||||||
|
* @throws IllegalArgumentException if some property of the specified
|
||||||
|
* element prevents it from being added to this deque
|
||||||
|
*/
|
||||||
|
void addLast(E e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns <tt>true</tt> if this collection contains no elements.
|
||||||
|
*
|
||||||
|
* @return <tt>true</tt> if this collection contains no elements
|
||||||
|
*/
|
||||||
|
boolean isEmpty();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves and removes the first element of this deque.
|
||||||
|
*
|
||||||
|
* @return the head of this deque
|
||||||
|
* @throws NoSuchElementException if this deque is empty
|
||||||
|
*/
|
||||||
|
E removeFirst();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves and removes the last element of this deque.
|
||||||
|
*
|
||||||
|
* @return the tail of this deque
|
||||||
|
* @throws NoSuchElementException if this deque is empty
|
||||||
|
*/
|
||||||
|
E removeLast();
|
||||||
|
}
|
65
DEV3.2/ControleMachine/DEV32/2/QuestionsTest.txt
Normal file
65
DEV3.2/ControleMachine/DEV32/2/QuestionsTest.txt
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
Ce fichier indiquent les questions à résoudre pour la partie test du TP noté.
|
||||||
|
Il faudra soit éditer les squelette de fichiers java fournis, soit répondre dans ce fichier sous la question.
|
||||||
|
|
||||||
|
1) [3 points en tout]
|
||||||
|
|
||||||
|
La classe SimpleDequeThatsNotCricket implémente l'interface MinimalDeque demandée.
|
||||||
|
L'expression britannique "that's not cricket" se traduit par "ce n'est pas du jeux".
|
||||||
|
En effet, cette classe fait exactement ce qu'il ne faut pas faire puisqu'elle utilise
|
||||||
|
une implémentation de Deque fournies par java.util.
|
||||||
|
|
||||||
|
a) Quel patron de conception est à l'oeuvre ici?
|
||||||
|
[2 points]
|
||||||
|
|
||||||
|
Il s'agit d'une façade.
|
||||||
|
|
||||||
|
b) Comment fonctionne cette classe?
|
||||||
|
[1 point]
|
||||||
|
|
||||||
|
Elle implémente et redéfinit les méthodes contenu dans l'interfaces MinimalDeque tout en ajoutant de nouvelles méthodes propre à elle même.
|
||||||
|
|
||||||
|
2) [-6 à 4 points en tout]
|
||||||
|
|
||||||
|
Indiquez pour chaque assertion si elles est vraie ou non.
|
||||||
|
|
||||||
|
[2 points par groupe d'assertion si toutes correctes,
|
||||||
|
-1 si une faute par question,
|
||||||
|
0 si pas répondu)]
|
||||||
|
|
||||||
|
a1) Il est possible de décider si un programme java va s'arrêter quelle que soit son entrée.
|
||||||
|
V/F
|
||||||
|
a2) Il est possible de décider si un programme C va s'arrêter quelle que soit son entrée.
|
||||||
|
V/F
|
||||||
|
a3) Il est possible de décider si un programme python ne va pas s'arrêter pour certaines entrées.
|
||||||
|
V/F
|
||||||
|
|
||||||
|
b1) Il est possible de décrire les propriétés souhaitées d'un programme en utilisant
|
||||||
|
des langages de spécifications inspirés de la logique du premier ordre.
|
||||||
|
V/F
|
||||||
|
b2) Il existe des logiciels qui étant donné une spécification et un programme peuvent
|
||||||
|
décider à coup sûr que le programme satisfait la spécification ou pas.
|
||||||
|
V/F
|
||||||
|
b3) Il existe des logiciels qui étant donné une spécification et un programme peuvent
|
||||||
|
décider si le programme satisfait la spécification ou pas en demandant
|
||||||
|
à un logiciel d'IA générative (comme chatGPT) pour générer une preuve.
|
||||||
|
V/F
|
||||||
|
|
||||||
|
3) [1 point en tout]
|
||||||
|
|
||||||
|
a) Quelle est la commande pour lancer les tests de la classe TestSimpleDeque si les archives
|
||||||
|
junit.jar et hamcrest-core.jar sont dans le même répertoire?
|
||||||
|
|
||||||
|
java junit.jar hamcrest-core.jar TestSimpleDeque
|
||||||
|
|
||||||
|
b) Quelle est la commande pour lancer les tests de la classe TestSimpleDeque si les archives
|
||||||
|
junit.jar et hamcrest-core.jar sont dans le CLASSPATH?
|
||||||
|
|
||||||
|
java org.junit.runner.JUnitCore TestSimpleDeque
|
||||||
|
|
||||||
|
4) [12 points en tout]
|
||||||
|
|
||||||
|
Remplissez les tests dans TestSimpleDeque.java
|
||||||
|
|
||||||
|
Il faut absolument que ce fichier compile sinon c'est 0 pour cette partie.
|
||||||
|
voir barème dans TestSimpleDeque pour chaque test.
|
||||||
|
|
20
DEV3.2/ControleMachine/DEV32/2/README.txt
Normal file
20
DEV3.2/ControleMachine/DEV32/2/README.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Contenu du répertoire.
|
||||||
|
|
||||||
|
README.txt ce fichier.
|
||||||
|
838_planche06_copie.webp vive les shadocks
|
||||||
|
|
||||||
|
MinimalDeque.java interface minimale d'un deque
|
||||||
|
SimpleDequeThatsNotCricket.java implémentation qui triche
|
||||||
|
Exemple.java exemple d'usage
|
||||||
|
|
||||||
|
|
||||||
|
SimpleDeque.java fichier à rendre pour Luc
|
||||||
|
|
||||||
|
QuestionsTest.txt Fichier à remplir pour Florent
|
||||||
|
TestSimpleDeque.java Fichier à remplir pour Florent
|
||||||
|
|
||||||
|
|
||||||
|
Pour utiliser JUnit :
|
||||||
|
|
||||||
|
Attention à vérifier votre CLASSPATH qui doit contenir le jar pour junit4 et potentiellement celui de hamcrest si vous souhaitez utiliser des mécanismes d'assertions plus avancés.
|
||||||
|
|
45
DEV3.2/ControleMachine/DEV32/2/SimpleDeque.java
Normal file
45
DEV3.2/ControleMachine/DEV32/2/SimpleDeque.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* Implémentation de l'interface MinimalDeque
|
||||||
|
*
|
||||||
|
* classe à rendre à luc.
|
||||||
|
*
|
||||||
|
* @author Pourchot Adrian
|
||||||
|
* @see Java.util.Deque
|
||||||
|
*/
|
||||||
|
public class SimpleDeque<E> implements MinimalDeque{
|
||||||
|
|
||||||
|
private E[] deque;
|
||||||
|
|
||||||
|
public SimpleDeque(){
|
||||||
|
this.deque = new E[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFirst(E e){
|
||||||
|
Objects.requireNonNull(e, "e must not be null");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addLast(E e){
|
||||||
|
Objects.requireNonNull(e, "e must not be null");
|
||||||
|
this.deque = this.deque.copyOf(this.deque, this.deque.length+1);
|
||||||
|
this.deque[this.deque.length-1] = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty(){
|
||||||
|
if (this.deque.length==0){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public E removeFirst(){
|
||||||
|
this.deque = this.deque.copyOfRange(this.deque, 1, this.deque.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public E removeLast(){
|
||||||
|
this.deque = this.deque.copyOfRange(this.deque, 0, this.deque.length-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
import java.util.Objects;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Deque;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implémentation de l'interface MinimalDeque
|
||||||
|
*
|
||||||
|
* sert uniquement à tester les tests
|
||||||
|
* contrairement au sujet de Luc "Huck" Hernandez, fonctionne par délégation à un attribut
|
||||||
|
* implémentant Deque (ici une LinkedList)
|
||||||
|
*
|
||||||
|
* @author Florent Madelaine
|
||||||
|
* @see Java.util.Deque
|
||||||
|
*/
|
||||||
|
public class SimpleDequeThatsNotCricket<E> implements MinimalDeque<E>{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* attribut à qui on va déléguer le travail.
|
||||||
|
*/
|
||||||
|
private Deque<E> d;
|
||||||
|
|
||||||
|
public SimpleDequeThatsNotCricket(){
|
||||||
|
this.d = new LinkedList<E>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFirst(E e){
|
||||||
|
Objects.requireNonNull(e, "e must not be null");
|
||||||
|
this.d.addFirst(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addLast(E e){
|
||||||
|
Objects.requireNonNull(e, "e must not be null");
|
||||||
|
this.d.addLast(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty(){
|
||||||
|
return this.d.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public E removeFirst(){
|
||||||
|
return this.d.removeFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
public E removeLast(){
|
||||||
|
return this.d.removeLast();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return this.d.toString();
|
||||||
|
}
|
||||||
|
}
|
141
DEV3.2/ControleMachine/DEV32/2/TestSimpleDeque.java
Normal file
141
DEV3.2/ControleMachine/DEV32/2/TestSimpleDeque.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
import static org.junit.Assert.assertTrue; // import static : une facilité offerte depuis java5 (pas besoin de mettre le préfixe)
|
||||||
|
import static org.junit.Assert.assertFalse; //
|
||||||
|
import static org.junit.Assert.assertSame; //
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Une classe pour faire des tests sur la classe SimpleDeque avec JUnit
|
||||||
|
* On utlise des string comme type paramétré.
|
||||||
|
*/
|
||||||
|
public class TestSimpleDeque {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On ne peut pas ajouter avec addFirst l'élément null
|
||||||
|
* [0.5 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void addFirstNull(){
|
||||||
|
MinimalDeque<String> d = new SimpleDeque<String>();
|
||||||
|
|
||||||
|
d.addFirst(null);
|
||||||
|
d.contains(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On ne peut pas ajouter avec addLast l'élément null
|
||||||
|
* [0.5 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void addLastNull(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Un deque sans élément est vide.
|
||||||
|
* [0.5 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void addNoneIsEmpty(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Un deque avec 1 élément n'est pas vide.
|
||||||
|
* [0.5 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void addOneIsNotEmpty(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dans un deque vide ajouter devant "ga" "bu" "zo" "meu" devant puis enlever à la fin me redonne les mêmes string (identiques aux précédents) et dans le même ordre.
|
||||||
|
* [1 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void pasDeResquilleur(){
|
||||||
|
MinimalDeque<String> d = new SimpleDeque<String>();
|
||||||
|
String ga = "ga";
|
||||||
|
String bu = "bu";
|
||||||
|
String zo = "zo";
|
||||||
|
String meu = "meu";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dans un deque vide ajouter "ga" "bu" "zo" "meu" derrière puis enlever au débutr me redonne les mêmes string (identiques aux précédents) et dans le même ordre.
|
||||||
|
* [1 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void pasDeResquilleurQuantique(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On ne peut pas enlever d'élément devant d'un deque vide.
|
||||||
|
* [1 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void removeFirstFromEmpty(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On ne peut pas enlever d'élément derrière d'un deque vide.
|
||||||
|
* [1 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void removeLastFromEmpty(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dans un deque vide ajouter "ga" puis enlever me redonne le même string que ajouter ou enlever soit devant oui derrière.
|
||||||
|
* [2 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void mangerLaBananeParLesDeuxBouts(){
|
||||||
|
MinimalDeque<String> d = new SimpleDeque<String>();
|
||||||
|
String ga = "ga";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invariant de taille
|
||||||
|
* Lancer un nombre entier aléatoire N compris entre 100 et 1000 (inclus).
|
||||||
|
*
|
||||||
|
* Ajouter au hasard, devant ou derrière N éléments tirés au hasard dans {"Ga", "bu", "zo", "meu"}.
|
||||||
|
*
|
||||||
|
* Enlever au hasard, devant ou derrière N éléments.
|
||||||
|
*
|
||||||
|
* Vérifier finalement que la Deque est vide.
|
||||||
|
*
|
||||||
|
* [4 point]
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void invariantTaille(){
|
||||||
|
MinimalDeque<String> d = new SimpleDeque<String>();
|
||||||
|
String[] s = {"ga","bu","zo","meu"};
|
||||||
|
Random rd = new Random();
|
||||||
|
|
||||||
|
int N = rd.nextInt(42)+4;
|
||||||
|
|
||||||
|
// rd.nextBoolean())
|
||||||
|
|
||||||
|
|
||||||
|
// s[rd.nextInt(4)])
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
BIN
DEV3.2/ControleMachine/pourchot_dev32.tar.gz
Normal file
BIN
DEV3.2/ControleMachine/pourchot_dev32.tar.gz
Normal file
Binary file not shown.
Binary file not shown.
@ -29,5 +29,7 @@ public class Main{
|
|||||||
joueur.recule();
|
joueur.recule();
|
||||||
joueur.recule();
|
joueur.recule();
|
||||||
joueur.vueToString();
|
joueur.vueToString();
|
||||||
|
joueur.avance();
|
||||||
|
joueur.vueToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
DEV3.4/TP7/Junit4Exemples.tar.gz
Normal file
BIN
DEV3.4/TP7/Junit4Exemples.tar.gz
Normal file
Binary file not shown.
106
DEV3.4/TP7/Junit4Exemples/AssertTests.java
Normal file
106
DEV3.4/TP7/Junit4Exemples/AssertTests.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
Il y a en fait pleins d'assertions possibles.
|
||||||
|
|
||||||
|
voici un exemple faisant un petit tour de ce qui est possible que j'ai pris ici.
|
||||||
|
https://github.com/junit-team/junit4/wiki/Assertions
|
||||||
|
|
||||||
|
NB. hamcrest est un projet maintenant intégré à junit
|
||||||
|
(c'est un anagrame de matchers)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.allOf;
|
||||||
|
import static org.hamcrest.CoreMatchers.anyOf;
|
||||||
|
import static org.hamcrest.CoreMatchers.both;
|
||||||
|
import static org.hamcrest.CoreMatchers.containsString;
|
||||||
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.hamcrest.CoreMatchers.everyItem;
|
||||||
|
import static org.hamcrest.CoreMatchers.hasItems;
|
||||||
|
import static org.hamcrest.CoreMatchers.not;
|
||||||
|
import static org.hamcrest.CoreMatchers.sameInstance;
|
||||||
|
import static org.hamcrest.CoreMatchers.startsWith;
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.hamcrest.core.CombinableMatcher;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class AssertTests {
|
||||||
|
@Test
|
||||||
|
public void testAssertArrayEquals() {
|
||||||
|
byte[] expected = "trial".getBytes();
|
||||||
|
byte[] actual = "trial".getBytes();
|
||||||
|
assertArrayEquals("failure - byte arrays not same", expected, actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertEquals() {
|
||||||
|
assertEquals("failure - strings are not equal", "text", "text");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertFalse() {
|
||||||
|
assertFalse("failure - should be false", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertNotNull() {
|
||||||
|
assertNotNull("should not be null", new Object());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertNotSame() {
|
||||||
|
assertNotSame("should not be same Object", new Object(), new Object());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertNull() {
|
||||||
|
assertNull("should be null", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertSame() {
|
||||||
|
Integer aNumber = Integer.valueOf(768);
|
||||||
|
assertSame("should be same", aNumber, aNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
// JUnit Matchers assertThat
|
||||||
|
@Test
|
||||||
|
public void testAssertThatBothContainsString() {
|
||||||
|
assertThat("albumen", both(containsString("a")).and(containsString("b")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertThatHasItems() {
|
||||||
|
assertThat(Arrays.asList("one", "two", "three"), hasItems("one", "three"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertThatEveryItemContainsString() {
|
||||||
|
assertThat(Arrays.asList(new String[] { "fun", "ban", "net" }), everyItem(containsString("n")));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Core Hamcrest Matchers with assertThat
|
||||||
|
@Test
|
||||||
|
public void testAssertThatHamcrestCoreMatchers() {
|
||||||
|
assertThat("good", allOf(equalTo("good"), startsWith("good")));
|
||||||
|
assertThat("good", not(allOf(equalTo("bad"), equalTo("good"))));
|
||||||
|
assertThat("good", anyOf(equalTo("bad"), equalTo("good")));
|
||||||
|
assertThat(7, not(CombinableMatcher.<Integer> either(equalTo(3)).or(equalTo(4))));
|
||||||
|
assertThat(new Object(), not(sameInstance(new Object())));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssertTrue() {
|
||||||
|
assertTrue("failure - should be true", true);
|
||||||
|
}
|
||||||
|
}
|
30
DEV3.4/TP7/Junit4Exemples/Calculator.java
Normal file
30
DEV3.4/TP7/Junit4Exemples/Calculator.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
Calculator est une classe offrant une seule méthode qui évalue une somme, donnée sous la forme d'une chaîne de caractère listant des opérandes séparées par des +
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Calculator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
somme les opérandes passées sous forme d'une chaîne de caractères et retourne le résultat sous forme d'entier.
|
||||||
|
@param expression : chaîne de caractères ("nombres" séparés par des + sans espaces), par exemple "42+3" ou encore "-42+42" (le moins unaire est autorisé).
|
||||||
|
ici nombre est à comprendre au sens de parseInt(java.lang.String)
|
||||||
|
@throws NumberFormatException : si l'expression n'est pas dans ce format (par exemple "x+2" ou " 1 +2" -- il y a des espaces -- ou encore "9999999990").
|
||||||
|
*/
|
||||||
|
public int evaluate(String expression) {
|
||||||
|
int sum = 0;
|
||||||
|
for (String summand: expression.split("\\+"))
|
||||||
|
sum += Integer.valueOf(summand);
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Pour appeller cette super méthode depuis la ligne de commande (on ne regarde que le premier argument, les autres sont ignorés).
|
||||||
|
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Calculator calculator = new Calculator();
|
||||||
|
System.out.println(calculator.evaluate(args[0]));
|
||||||
|
}
|
||||||
|
}
|
30
DEV3.4/TP7/Junit4Exemples/CalculatorTest0.java
Normal file
30
DEV3.4/TP7/Junit4Exemples/CalculatorTest0.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import static org.junit.Assert.assertEquals; // import static : une facilité offerte par java5
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
CalculatorTest0 est un premier exemple de test pour la classe Calculator utilisant junit4
|
||||||
|
Assert, ou comment vérifier qu'une méthode donne un résultat correct?
|
||||||
|
|
||||||
|
Remarque en passant, pour tester en ligne de commande (une fois les classes compilées), il faut faire
|
||||||
|
$java org.junit.runner.JUnitCore CalculatorTest0
|
||||||
|
|
||||||
|
Remarque, comme expliqué dans la doc de org.junit.runner.JUnitCore
|
||||||
|
JUnitCore is a *facade* for running tests. It supports running JUnit 4 tests, JUnit 3.8.x tests, and mixtures. To run tests from the command line, run java org.junit.runner.JUnitCore TestClass1 TestClass2
|
||||||
|
|
||||||
|
Oh le joli design pattern. C'est cadeau.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CalculatorTest0 {
|
||||||
|
|
||||||
|
|
||||||
|
// un test pour Junit4 c'est une méthode avec l'annotation suivante devant la méthode.
|
||||||
|
@Test
|
||||||
|
public void evaluatesGoodExpression() {
|
||||||
|
Calculator calculator = new Calculator();
|
||||||
|
int sum = calculator.evaluate("1+2+3");
|
||||||
|
// on peut stipuler que des choses sont normalement égales (il faut charger de manière statique les Assert si on veut éviter d'avoir à écrire de quelle classe on parle)
|
||||||
|
assertEquals(6, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
18
DEV3.4/TP7/Junit4Exemples/CalculatorTest1.java
Normal file
18
DEV3.4/TP7/Junit4Exemples/CalculatorTest1.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
CalculatorTest1 est un exemple de test pour la classe Calculator utilisant junit4.
|
||||||
|
Comment vérifier qu'on lance bien une exception?
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CalculatorTest1 {
|
||||||
|
|
||||||
|
|
||||||
|
// un test pour Junit4 qui cherche à vérifier qu'il y a bien une exception
|
||||||
|
@Test(expected = NumberFormatException.class)
|
||||||
|
public void doesNotEvaluateBadExpression() {
|
||||||
|
Calculator calculator = new Calculator();
|
||||||
|
int sum = calculator.evaluate("1 +2+3");//notez l'espace qui va génèrez une exception
|
||||||
|
}
|
||||||
|
}
|
48
DEV3.4/TP7/Junit4Exemples/CalculatorTest2.java
Normal file
48
DEV3.4/TP7/Junit4Exemples/CalculatorTest2.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.junit.BeforeClass; // ne pas oublie de charger le fait qu'on veut l'annotation @BeforeClass
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
CalculatorTest2 est un exemple de test pour la classe Calculator utilisant junit4
|
||||||
|
Il réunit en fait les deux tests des 2 classes précédentes dans une seule classe.
|
||||||
|
|
||||||
|
Typiquement on a en effet tous les tests simples portant sur une classe "métier" regroupée dans une classe de test correspondante.
|
||||||
|
Avec les annotations, on peut factoriser des choses concernant tous ces tests.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CalculatorTest2 {
|
||||||
|
static Calculator calculator;
|
||||||
|
|
||||||
|
// On peut si on le souhaite faire un traitement avant tous les tests (typiquement on fait quelque chose de cher comme se connecter à une base de données, ici j'économise une instance de Calculator (on s'en moque un peu pour être honnête).
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUp() {
|
||||||
|
System.out.println("Avant tous les tests");
|
||||||
|
calculator = new Calculator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evaluatesGoodExpression() {
|
||||||
|
System.out.println("Test evaluation bonne expression");
|
||||||
|
int sum = calculator.evaluate("1+2+3");
|
||||||
|
assertEquals(6, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test(expected = NumberFormatException.class)
|
||||||
|
public void doesNotEvaluateBadExpression() {
|
||||||
|
System.out.println("Test evaluation mauvaise expression");
|
||||||
|
int sum = calculator.evaluate("1 +2+3");
|
||||||
|
}
|
||||||
|
|
||||||
|
// On peut si on le souhaite faire un traitement après tous les tests (typiquement on fait quelque chose de cher comme se connecter à une base de données, ici j'économise une instance de Calculator (on s'en moque un peu pour être honnête).
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDown() {
|
||||||
|
System.out.println("Après tous les Test");
|
||||||
|
calculator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
DEV3.4/TP7/Junit4Exemples/CalculatorTest3.java
Normal file
20
DEV3.4/TP7/Junit4Exemples/CalculatorTest3.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
CalculatorTest3 est un exemple de test pour la classe Calculator utilisant junit4 qui est volontairement non satisfait
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CalculatorTest3 {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evaluatesGoodExpression() throws Exception{
|
||||||
|
Calculator calculator = new Calculator();
|
||||||
|
int sum = calculator.evaluate("1+2+3");
|
||||||
|
assertEquals(42, sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
43
DEV3.4/TP7/Junit4Exemples/Readme.txt
Normal file
43
DEV3.4/TP7/Junit4Exemples/Readme.txt
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Les fichiers et ce qu'ils illustrent
|
||||||
|
|
||||||
|
Calculator.java le fichier contenant la classe qu'on va prétendre couloir tester.
|
||||||
|
|
||||||
|
CalculatorTest0.java mon premier test avec Junit4 et assert
|
||||||
|
CalculatorTest1.java mon second test avec Junit4 pour des exceptions
|
||||||
|
CalculatorTest2.java les deux précédents
|
||||||
|
CalculatorTest3.java un test volontairement non satisfait
|
||||||
|
|
||||||
|
Jusqu'ici pour exécuter un test, on compile tous les fichiers (une fois le classpath correct) puis on fait :
|
||||||
|
|
||||||
|
$java org.junit.runner.JUnitCore CalculatorTest0
|
||||||
|
|
||||||
|
voir plusieurs classes de tests suite à suite, en faisant :
|
||||||
|
|
||||||
|
$java org.junit.runner.JUnitCore CalculatorTest0 CalculatorTest1
|
||||||
|
|
||||||
|
Des choses un peu plus avancées
|
||||||
|
|
||||||
|
RunForestRun.java un exemple de runner (alternative à la ligne de commande qui fait la même chose en java).
|
||||||
|
TestParam.java mon premier test avancé permettant d'exécuter un test simple sur une liste de paramètres.
|
||||||
|
TestSuite.java comment combiner plusieurs tests (par exemple si on veut tester plusieurs classes en même temps).
|
||||||
|
AssertTests.java Squelette de toutes les variantes d'assertion proposées par Junit4
|
||||||
|
|
||||||
|
===
|
||||||
|
|
||||||
|
Pour pouvoir utiliser ces tests à bon escients, il faut :
|
||||||
|
_ avoir installé Junit4 (c'est un jar)
|
||||||
|
_ faire ce qu'il faut au CLASSPATH pour que Junit4 soit dedans.
|
||||||
|
|
||||||
|
Par exemple sur ma machine, j'ai plusieurs versions de junit:
|
||||||
|
|
||||||
|
$ ls -l /usr/share/java/junit*
|
||||||
|
-rw-r--r-- 1 root root 108762 mai 18 2012 /usr/share/java/junit-3.8.2.jar
|
||||||
|
-rw-r--r-- 1 root root 313072 mars 8 2016 /usr/share/java/junit4-4.12.jar
|
||||||
|
lrwxrwxrwx 1 root root 15 mars 8 2016 /usr/share/java/junit4.jar -> junit4-4.12.jar
|
||||||
|
lrwxrwxrwx 1 root root 15 mai 18 2012 /usr/share/java/junit.jar -> junit-3.8.2.jar
|
||||||
|
|
||||||
|
Du coup, j'ai fait en sorte que mon CLASSPATH contienne /usr/share/java/junit4.jar
|
||||||
|
|
||||||
|
$ echo $CLASSPATH
|
||||||
|
.:/usr/lib/jvm/java-8-openjdk-amd64/lib:/usr/share/java/junit4.jar
|
||||||
|
|
24
DEV3.4/TP7/Junit4Exemples/RunForestRun.java
Normal file
24
DEV3.4/TP7/Junit4Exemples/RunForestRun.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Alternative à la ligne de commande, on peut appeller le runner depuis java avec org.junit.runner.JUnitCore.runClasses
|
||||||
|
qui retourne un objet de type Result qui modélise les résultats des tests.
|
||||||
|
|
||||||
|
En particulier, on peut accéder à la liste des échecs -- un échec eest un objet Failure -- avec getFailures
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import org.junit.runner.JUnitCore;
|
||||||
|
import org.junit.runner.Result;
|
||||||
|
import org.junit.runner.notification.Failure;
|
||||||
|
|
||||||
|
public class RunForestRun {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
final Result result = org.junit.runner.JUnitCore.runClasses(CalculatorTest0.class,CalculatorTest1.class,CalculatorTest3.class);
|
||||||
|
for (final Failure failure : result.getFailures()) {
|
||||||
|
System.out.println(failure.toString()); // affiche détail sur chaque échec
|
||||||
|
}
|
||||||
|
System.out.println(result.wasSuccessful()); // affiche true ssi aucune erreurs
|
||||||
|
}
|
||||||
|
}
|
47
DEV3.4/TP7/Junit4Exemples/TestParam.java
Normal file
47
DEV3.4/TP7/Junit4Exemples/TestParam.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Example d'utilisation d'un runner spécial : Parameterized.
|
||||||
|
|
||||||
|
Ce runner permet de facilement itérer des tests similaires sur plusieurs choix de valeurs.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.junit.runners.Parameterized.Parameters;
|
||||||
|
|
||||||
|
|
||||||
|
// l'annotation @RunWith propre aux runners
|
||||||
|
@RunWith(Parameterized.class)
|
||||||
|
public class TestParam {
|
||||||
|
|
||||||
|
// l'annotation @Parameters pour aller chercher les paramètres des tests (on itère sur des tuples d'objet)
|
||||||
|
@Parameters(name = "{index}: {0} = {2}")
|
||||||
|
public static Iterable<Object[]> data() {
|
||||||
|
return Arrays.asList(new Object[][] { { "1+2+3", 6 }, { "40+2", 42 },
|
||||||
|
{ "001+41", 42 }, { "0000", 0 }, { "999+-999", 0 } });
|
||||||
|
}
|
||||||
|
|
||||||
|
// les attributs qui correspondent aux éléments de nos tuples
|
||||||
|
private String expression;
|
||||||
|
private int res;
|
||||||
|
|
||||||
|
// le constructeur
|
||||||
|
public TestParam(String expression, int res) {
|
||||||
|
this.expression = expression;
|
||||||
|
this.res = res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// le test qui va manger les paramètres qu'on vient de définir
|
||||||
|
@Test
|
||||||
|
public void evaluatesGoodExpressions() {
|
||||||
|
Calculator calculator=new Calculator();
|
||||||
|
assertEquals(res, calculator.evaluate(expression));
|
||||||
|
}
|
||||||
|
}
|
26
DEV3.4/TP7/Junit4Exemples/TestSuite.java
Normal file
26
DEV3.4/TP7/Junit4Exemples/TestSuite.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
Un runner spécial qui sert à créer une collection de tests.
|
||||||
|
Typiquement, on peut avoir une classe de tests unitaires pour chaque classe métier et une "suite de tests" qui va appeller tous les tests de classes ayant un lien (par exemple dans le même paquet).
|
||||||
|
|
||||||
|
Ceci est de nouveau un test, qu'on peut exécuter en faisant par exemple dans une console
|
||||||
|
java org.junit.runner.JUnitCore TestSuite
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Suite;
|
||||||
|
|
||||||
|
// @RunWith permet d'indiquer le runner
|
||||||
|
@RunWith(Suite.class)
|
||||||
|
|
||||||
|
//les tests à faire et dans quel ordre.
|
||||||
|
@Suite.SuiteClasses({
|
||||||
|
CalculatorTest0.class,
|
||||||
|
CalculatorTest1.class,
|
||||||
|
CalculatorTest3.class
|
||||||
|
})
|
||||||
|
|
||||||
|
public class TestSuite {
|
||||||
|
// La classe est vide en fait
|
||||||
|
// C'est juste un conteneur pour les annotations du dessus, utilisés par Junit4
|
||||||
|
}
|
88
DEV4.4/TP0/base_64.c
Normal file
88
DEV4.4/TP0/base_64.c
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const char base64_table[] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
||||||
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
||||||
|
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
||||||
|
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
|
'w', 'x', 'y', 'z', '0', '1', '2', '3',
|
||||||
|
'4', '5', '6', '7', '8', '9', '+', '/'
|
||||||
|
};
|
||||||
|
|
||||||
|
void base64_encode_file(char * file, char * file_encoded)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int fdin, fdout ;
|
||||||
|
unsigned char buffer[3]; // octets a encoder
|
||||||
|
unsigned char tmp[4]; // valeurs des 4 groupes de 6 bits
|
||||||
|
char buffer_encoded[4]; // octets encodes
|
||||||
|
ssize_t nb_read;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fdin = open(file,O_RDONLY);
|
||||||
|
fdout = open(file_encoded,O_WRONLY|O_TRUNC|O_CREAT,0644);
|
||||||
|
|
||||||
|
assert(fdin >= 0);
|
||||||
|
assert(fdout >= 0);
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
nb_read = read(fdin,buffer,3);
|
||||||
|
|
||||||
|
if (nb_read < 3)
|
||||||
|
break;
|
||||||
|
// TODO
|
||||||
|
// calculer la valeur des 4 groupes de 6 bits de buffer
|
||||||
|
|
||||||
|
tmp[0] = buffer[0] >> 2;
|
||||||
|
tmp[1] = buffer[0] << 4 + buffer[1] << 4;
|
||||||
|
tmp[2] = buffer[1] << 2 + buffer[2] << 6;
|
||||||
|
tmp[3] = buffer[2];
|
||||||
|
|
||||||
|
for (i = 0; i < 4 ;i++)
|
||||||
|
buffer_encoded[i] = base64_table[tmp[i]];
|
||||||
|
|
||||||
|
write(fdout,buffer_encoded,4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
/* il reste quelque chose ? */
|
||||||
|
|
||||||
|
if ( nb_read != 0){
|
||||||
|
for( i = nb_read; i < 3; i++)
|
||||||
|
buffer[i] = 0;
|
||||||
|
|
||||||
|
tmp[0] = 0;
|
||||||
|
tmp[1] = 0;
|
||||||
|
tmp[2] = 0;
|
||||||
|
tmp[3] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < nb_read + 1 ;i++)
|
||||||
|
buffer_encoded[i] = base64_table[tmp[i]];
|
||||||
|
|
||||||
|
for (i = nb_read + 1; i < 4 ;i++)
|
||||||
|
buffer_encoded[i] = '=';
|
||||||
|
|
||||||
|
|
||||||
|
write(fdout,buffer_encoded,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fdin);
|
||||||
|
close(fdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
assert(argc >= 3);
|
||||||
|
base64_encode_file(argv[1],argv[2]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
BIN
DEV4.4/TP1/Ex1/file.crypt
Normal file
BIN
DEV4.4/TP1/Ex1/file.crypt
Normal file
Binary file not shown.
47
DEV4.4/TP1/Ex1/lfsr.c
Normal file
47
DEV4.4/TP1/Ex1/lfsr.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#define MASK_BIT_7 0x80
|
||||||
|
#define MASK_BIT_6 0x40
|
||||||
|
#define MASK_BIT_5 0x20
|
||||||
|
#define MASK_BIT_4 0x10
|
||||||
|
#define MASK_BIT_3 0x08
|
||||||
|
#define MASK_BIT_2 0x04
|
||||||
|
#define MASK_BIT_1 0x02
|
||||||
|
#define MASK_BIT_0 0x01
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char next(unsigned char lfsr)
|
||||||
|
{
|
||||||
|
lfsr = (lfsr << 1);
|
||||||
|
if(__builtin_parity(lfsr)==0){
|
||||||
|
lfsr ^= 1 << 0;
|
||||||
|
}
|
||||||
|
return lfsr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int fd_in,fd_out;
|
||||||
|
unsigned char w,buf;;
|
||||||
|
|
||||||
|
|
||||||
|
assert(argc >= 4);
|
||||||
|
fd_in = open(argv[1],O_RDONLY);
|
||||||
|
fd_out = open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0600);
|
||||||
|
w = (unsigned char)strtol(argv[3],NULL,0);
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
ssize_t nb = read(fd_in,&buf,1);
|
||||||
|
if (nb <=0)
|
||||||
|
break;
|
||||||
|
buf ^= w;
|
||||||
|
write(fd_out,&buf,1);
|
||||||
|
w=next(w);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
1
DEV4.4/TP1/Ex1/text.txt
Normal file
1
DEV4.4/TP1/Ex1/text.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Bonjour je m'appelle Jean François Fion.
|
1
DEV4.4/TP1/Ex1/textencode.crypt
Normal file
1
DEV4.4/TP1/Ex1/textencode.crypt
Normal file
@ -0,0 +1 @@
|
|||||||
|
å ðW<15>›óÍ*¾P]•™£Â#òXZ¾Œ²ÉoØOš*tÈ&í<<3C>†½‰
|
Loading…
Reference in New Issue
Block a user