Section courante

A propos

Section administrative du site

Il peut être amusant d'effectuer des calculs avec des chiffres romains, toutefois les calculs à la mains nous sembles fastidieux ou on a l'impression d'avoir oublié quelque chose! Pour résoudre le problème, créez-vous une calculatrice! Il suffit simplement d'effectuer une conversion des nombres romains en nombre arabes et vice versa et de l'intégrer à une calculatrice classique. A l'aide du code source Java suivant, vous trouverez la réponse que vous souhaitez :

  1. import java.awt.BorderLayout;
  2. import java.awt.GridLayout;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel; 
  7. import javax.swing.JButton;
  8. import javax.swing.JPanel;
  9.  
  10. public class RomanCalculator extends JFrame implements ActionListener {
  11.     
  12.     boolean eqFlg = false;
  13.     char lastBut = '+';
  14.     char lastOp = '+';
  15.     boolean newNum = true;
  16.     int Total = 0;
  17.     
  18.     JLabel Resultat = new JLabel(".", JLabel.RIGHT);
  19.     JButton EntNumM = new JButton("M");
  20.     JButton EntNumD = new JButton("D");
  21.     JButton EntNumC = new JButton("C");
  22.     JButton EntNumPlus = new JButton("+");
  23.     JButton EntNumL = new JButton("L");
  24.     JButton EntNumX = new JButton("X");
  25.     JButton EntNumV = new JButton("V");
  26.     JButton EntNumMoins = new JButton("-");
  27.     JButton EntNumI = new JButton("I");
  28.     JButton EntNumDivision = new JButton("÷");
  29.     JButton EntNumMult = new JButton("×");
  30.     JButton EntNumEqual = new JButton("=");
  31.     
  32.     int RomainToNumber(String num) {
  33.          int i = 0, n = 0;
  34.          num = num.toUpperCase();     
  35.          // Calcul les milliers
  36.          while((i<num.length())&&(num.charAt(i) == 'M')) {
  37.              n+=1000;
  38.              i++;
  39.          }
  40.          // Calcul les centaines
  41.          if((num.length()>=i+2) && (num.substring(i,2) == "CM")) {
  42.              n+=900;
  43.              i+=2; 
  44.          } else if((num.length()>=i+2) && (num.substring(i,2) == "CD")) {
  45.              n+=400;
  46.              i+=2;
  47.          } else {
  48.           if((i<num.length())&&(num.charAt(i) == 'D')) {
  49.               n+=500;
  50.               i++;
  51.           }       
  52.           if(i<num.length()) while(num.charAt(i) == 'C') {
  53.               n+=100;
  54.               i++;
  55.               if(i>=num.length()) break;
  56.           }
  57.          }
  58.  
  59.          // Calcul les dizaines
  60.          if((num.length()>=i+2) && (num.substring(i,2) == "XC")) {
  61.              n+=90;
  62.              i += 2; 
  63.          } else if((num.length()>=i+2) && (num.substring(i,2) == "XL")) {
  64.              n+=40;
  65.              i += 2;
  66.          } 
  67.          else {
  68.           if((i<num.length())&&(num.charAt(i) == 'L')) {
  69.               n+=50;
  70.               i++;
  71.           }  
  72.           if(i<num.length()) while (num.charAt(i) == 'X') {
  73.               n+=10;
  74.               i++;
  75.               if(i>=num.length()) break;
  76.           }
  77.          }
  78.  
  79.          // Calcul les unités
  80.          if((num.length()>=i+2) && (num.substring(i,2) == "IX")) {
  81.              n += 9; 
  82.              i+=2; 
  83.          } else if((num.length()>=i+2) && (num.substring(i,2) == "IV")) {
  84.              n += 4;
  85.              i += 2;
  86.          } else {
  87.           if((i<num.length())&&(num.charAt(i) == 'V')) {
  88.               n += 5;
  89.               i++;
  90.           } 
  91.           if(i<num.length()) while(num.charAt(i) == 'I') {
  92.               n++;
  93.               i++;
  94.               if(i>=num.length()) break;
  95.           }
  96.          }
  97.          return(n);
  98.         } 
  99.     
  100.     static String NumberToRomain(int X) {
  101.        String S;
  102.       S = "";
  103.       switch((X % 1000) / 100) {
  104.        case 9: S+="CM";break;
  105.        case 8: S+="DCCC";break;
  106.        case 7: S+="DCC";break;
  107.        case 6: S+="DC";break;
  108.        case 5: S+="D";break;
  109.        case 4: S+="CD";break;
  110.        case 3: S+="CCC";break;
  111.        case 2: S+="CC";break;
  112.        case 1: S+="C";break;
  113.       }
  114.       switch((X % 100) / 10) {
  115.        case 9: S+="XC";break;
  116.        case 8: S+="LXXX";break;
  117.        case 7: S+="LXX";break;
  118.        case 6: S+="LX";break;
  119.        case 5: S+="L";break;
  120.        case 4: S+="XL";break;
  121.        case 3: S+="XXX";break;
  122.        case 2: S+="XX";break;
  123.        case 1: S+="X";break;
  124.       }
  125.       switch(X % 10) {
  126.        case 9: S+="IX";break;
  127.        case 8: S+="VIII";break;
  128.        case 7: S+="VII";break;
  129.        case 6: S+="VI";break;
  130.        case 5: S+="V";break;
  131.        case 4: S+="IV";break;
  132.        case 3: S+="III";break;
  133.        case 2: S+="II";break;
  134.        case 1: S+="I";break;
  135.       }
  136.       return S;
  137.      } 
  138.     
  139.     int eval(int Total,char lastOp,int n) {
  140.         switch(lastOp) {
  141.             case '+':return Total + n;
  142.             case '-':return Total - n;
  143.             case '*':return Total * n;
  144.             case '/':return Total / n;
  145.         }
  146.         return 0;
  147.     }
  148.     
  149.     public void EntOperator(char Operator) {
  150.      if(lastBut != '+' && lastBut != '-' && lastBut != '*' && lastBut != '/') {
  151.       boolean negFlg = false;
  152.       int n;
  153.       String Num = Resultat.getText().trim(); 
  154.       if(Num.charAt(0) == '-') {
  155.           negFlg = true;
  156.           Num = Num.substring(1);
  157.       }
  158.       if(Num != ".") {
  159.        n = RomainToNumber(Num);
  160.        if(negFlg) n = -n;
  161.        Total = Math.round(eval(Total,lastOp,n));
  162.        if(Total < -4999 || Total > 4999) Num = "Erreur de débordement de valeur"; else 
  163.        if(Total == 0) Num = "."; else 
  164.        if(Total < 0) Num = "-" + NumberToRomain(-Total);
  165.        else Num = NumberToRomain(Total);
  166.        Resultat.setText(Num);
  167.        newNum = true;
  168.        eqFlg = false;
  169.       }
  170.      }
  171.      lastBut = Operator;
  172.      lastOp = Operator;
  173.     } 
  174.     
  175.     public void ComputeTotal() {
  176.      boolean negFlg = false;
  177.      int n;
  178.      String Num;
  179.      if(eqFlg) {
  180.          Num = ".";
  181.          eqFlg = false;
  182.      } else {
  183.       Num = Resultat.getText().trim();
  184.       eqFlg = true;
  185.       if(Num.charAt(0) == '-') {
  186.           negFlg = true;
  187.           Num = Num.substring(1);
  188.       }
  189.       if(Num != ".") {
  190.        n = RomainToNumber(Num);
  191.        if(negFlg) n = -n;
  192.        Total = Math.round(eval(Total,lastOp,n));
  193.        if(Total < -4999 || Total > 4999) Num = "Erreur de débordement de capacité"; else 
  194.        if(Total == 0) Num = "."; else 
  195.        if(Total < 0) Num = "-" + NumberToRomain(-Total);
  196.        else Num = NumberToRomain(Total);
  197.       }
  198.       lastOp = '+';
  199.       newNum = true;
  200.       Total = 0;
  201.      }
  202.      Resultat.setText(Num); 
  203.     } 
  204.     
  205.     public void EntNum(char RomanNumber) {
  206.         eqFlg = false; lastBut = RomanNumber; 
  207.         if(newNum) {
  208.             Resultat.setText("");
  209.             newNum = false;
  210.         }
  211.         Resultat.setText(Resultat.getText()+RomanNumber);
  212.     }
  213.     
  214.     public void actionPerformed(ActionEvent e){
  215.         if(e.getSource() == EntNumM) EntNum('M');
  216.         else if(e.getSource() == EntNumD) EntNum('D');
  217.         else if(e.getSource() == EntNumC) EntNum('C');
  218.         else if(e.getSource() == EntNumPlus) EntOperator('+');
  219.         else if(e.getSource() == EntNumL) EntNum('L');
  220.         else if(e.getSource() == EntNumX) EntNum('X');
  221.         else if(e.getSource() == EntNumV) EntNum('V');
  222.         else if(e.getSource() == EntNumMoins) EntOperator('-');
  223.         else if(e.getSource() == EntNumI) EntNum('I');
  224.         else if(e.getSource() == EntNumDivision) EntOperator('/');
  225.         else if(e.getSource() == EntNumMult) EntOperator('*');
  226.         else if(e.getSource() == EntNumEqual) ComputeTotal();
  227.     }
  228.     
  229.     public RomanCalculator() {
  230.         super("Calculatrice romaine");
  231.         setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  232.         setLayout(new BorderLayout());
  233.         
  234.         add("North",Resultat);
  235.         JPanel panel = new JPanel();
  236.         panel.setLayout(new GridLayout(3,4,5,5));
  237.         
  238.         panel.add(EntNumM);
  239.         EntNumM.addActionListener(this);
  240.         panel.add(EntNumD);
  241.         EntNumD.addActionListener(this);
  242.         panel.add(EntNumC);
  243.         EntNumC.addActionListener(this);
  244.         panel.add(EntNumPlus);
  245.         EntNumPlus.addActionListener(this);
  246.         panel.add(EntNumL);
  247.         EntNumL.addActionListener(this);
  248.         panel.add(EntNumX);
  249.         EntNumX.addActionListener(this);
  250.         panel.add(EntNumV);
  251.         EntNumV.addActionListener(this);
  252.         panel.add(EntNumMoins);
  253.         EntNumMoins.addActionListener(this);
  254.         panel.add(EntNumI);
  255.         EntNumI.addActionListener(this);
  256.         panel.add(EntNumDivision);
  257.         EntNumDivision.addActionListener(this);
  258.         panel.add(EntNumMult);
  259.         EntNumMult.addActionListener(this);
  260.         panel.add(EntNumEqual);
  261.         EntNumEqual.addActionListener(this);
  262.         add("Center",panel);
  263.         pack();
  264.         setLocationRelativeTo(null); 
  265.     }
  266.     
  267.     public static void main(String[] args) {
  268.         new RomanCalculator().setVisible(true);
  269.     } 
  270.     
  271. }

Voici de quoi devrait avoir l'air la calculatrice :




Dernière mise à jour : Mercredi, le 3 juin 2015