2010-12-06 70 views
0

J'ai ce programme en Java import java.util. *;J'ai besoin d'aide dans mon programme

public class Euclid { 

    private static final String EXCEPTION_MSG = 
     "Invalid value (%d); only positive integers are allowed. "; 

    public static int getGcd(int a, int b) 
     { 
      if (a < 0) 
       { 
        throw new IllegalArgumentException(String.format(EXCEPTION_MSG, a)); 
       } 
       else 
        if (b < 0) 
        { 
         throw new IllegalArgumentException(String.format(EXCEPTION_MSG, b)); 
        } 

      while (b != 0) 
      { 


       if (a > b) 
        { 
        a = a - b; 
          }  
       else 
        { 
         b = b - a; 
        }  
      } 
       return a; 
     } 
    } 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 

public class EuclidGui 
{ 
    private static final String PROMPT_A = "#1"; 
    private static final String PROMPT_B = "#2"; 
    private static final String BUTTON_TEXT = "Get GCD >>"; 
    private static final String EXCEPTION_TITLE = "Input Exception"; 
    private static final String INSTRUCTIONS = "Type to integer and press 'Get GCD'"; 
    private static final String DIALOG_TITLE = "Euclid's Algorithm"; 
    private static final int FIELD_WIDTH = 6; 

public static void main (String[] args) 
{ 
final JTextField valueA = new JTextField (FIELD_WIDTH); 
final JTextField valueB = new JTextField (FIELD_WIDTH); 
final JTextField valueGcd = new JTextField (FIELD_WIDTH); 
JLabel labelA = new JLabel(PROMPT_A); 
JLabel labelB = new JLabel(PROMPT_B); 
JButton computeButton = new JButton(BUTTON_TEXT); 
Object[] options = new Object[] {labelA, valueA, labelB, valueB, computeButton, valueGcd}; 
valueGcd.setEditable (false); 
computeButton.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent evt) 
    { try 
     { 
      int a = Integer.parseInt(valueA.getText()); 
      int b = Integer.parseInt(valueB.getText()); 
      int gcd = Euclid.getGcd(a , b); 

      valueGcd.setText(Integer.toString(gcd)); 
     } 
     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e.getMessage(), EXCEPTION_TITLE, JOptionPane.ERROR_MESSAGE); 

     } 
     } 
    }); 
    JOptionPane.showOptionDialog(null, INSTRUCTIONS, DIALOG_TITLE, JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, 
    null, options, null); 
}  
}  

et je veux ajouter un code de temps de calcul sur elle, mais je ne sais pas comment, et quel est le code exact que je use.Please me aider si quelqu'un a une idée.

+1

Veuillez mettre en retrait tout le code pour que tout apparaisse comme du code. – gdj

+0

Que voulez-vous dire par «code temporel»? –

Répondre

2

System.currentTimeMillis() ferait l'affaire:

long start = System.currentTimeMillis(); 
// do stuff 
long timeTaken = System.currentTimeMillis() - start; 
+0

C'est correct en principe, mais dans le cas particulier du PO, cela ne marchera probablement pas; vois ma réponse. –

+0

Stephen a parfaitement raison, c'était un oubli plutôt flagrant de ma part. FWIW Je ne m'embêterais jamais avec nanoTime, à cause des problèmes que vous avez soulevés. Millisecondes et une énorme boucle est la voie à suivre! – ZoFreX

1

Les chances sont qu'un seul appel à getGcd prendra si peu de temps que vous aurez des difficultés à mesurer avec précision fiable et.

La méthode System.currentTimeMillis() vous donnera l'heure de l'horloge murale mesurée en millisecondes. Cependant, la granularité de l'horloge milliseconde est probablement trop grossière. (Lisez le javadoc!).

La méthode System.nanoTime() donne un temps de système avec (comme le dit javadoc) « précision nanoseconde, mais pas nécessairement nanoseconde précision. ».

Il existe également des problèmes avec nanoTime() sur les machines multicœurs avec certains systèmes d'exploitation. Par exemple, j'ai entendu dire que différents cœurs peuvent avoir des horloges nanoTime indépendantes qui peuvent dériver les unes par rapport aux autres. Cela peut entraîner System.nanoTime() renvoyant des valeurs qui ne sont pas monotones; par exemple. si le thread en cours est replanifié par le système d'exploitation pour fonctionner sur un noyau différent entre deux appels nanoTime(). Si je faisais cela, je mettrais les appels à getGcd() dans une boucle qui l'a couru 10 000 ou 100 000 fois, mesurer le temps pour la boucle, et diviser le temps mesuré par le facteur pertinent.