IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

exception dans un calcul de factorielle


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut exception dans un calcul de factorielle
    bonsoir a tous,
    je dispose d'une petite classe pour calculer la factorielle d'un nombre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class factoriel
    {private int nb;
    	public factoriel (int nb)
    		{this.nb=nb;}
    	public int getnb()
    		{return(nb);}
     
    	public int calcul()
    		{int fact=nb;int res=nb;
    		while(res>1)
    			{res--;
    			fact*=res;
    			}
    		return(fact);
    		}
    }
    --> le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import java.lang.*;
    class testfactoriel
    {public static void main(String [] args)
    {try
        {int a=Integer.parseInt(args[0]);
        factoriel f=new factoriel(a);
        if (a<0) throw new negaException("la factorielle n'est pas défini");
        System.out.println("le factoriel de "+f.getnb()+" est "+f.calcul());
        }
    catch (ArrayIndexOutOfBoundsException e1) {System.out.println("veuillez indiquer le nombre sur la ligne de commande");}
    catch (NumberFormatException e2) {System.out.println("nb non entier");}
    catch (negaException e3) {System.out.println("-4 est negatif :"+e3.getMessage());}
     
    }
    }
    --> class negaexception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class negaException extends Exception
    {public negaException(String s)
    {super(s);}
    }
    je traite trois types d'exceptions, dans le cas ou nb est non indiqué sur la ligne de commande, dans le cas ou nb est non entier, et dans le cas ou nb est negatif.
    on me demande en plus de traiter le cas ou le nb est egal a 20.
    j'ai fait l'essai, effectivement ca retourne une valeur fausse negative,je comprend pas pourquoi ca retourne pas une valeur juste,j'ai pensé à un depassement puisque nb est un int...
    je n'ai aucune idée comment traiter ce cas, c'est à dire, comment je vais faire pour connaitre d'avance que mon nombre en entré va me donné une factorielle fausse?
    merci d'avance pour votre aide

  2. #2
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    20! = 2432902008176640000

    Et un int est compris entre -2 147 483 648 et 2 147 483 647 (4 octets).

    Tu as bien un dépassement en mémoire, soit tu utilise le type BigInteger, soit tu imposes une limite supérieure.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  3. #3
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    merci v4np13 pour m'avoir répondu.
    je suis d'accord avec toi que changer le type de retour est la solution la plus facile, mais ici le but c'est de traiter ca avec des exceptions.
    sinon tu entend quoi par imposer une limite superieur?(sur quoi je vais l'imposer cette limite??)

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Il te faut tester le dépassement de capacité à chaque étape du calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public int calcul() throws ArithmeticException {
       int factorielle = 1;
       for (int i = 2; i <= nb; i++) {
          if (factorielle > Integer.MAX_VALUE / i) {
            throw new ArithmeticException("dépassement de capacité lors du calcul de la factorielle de " + nb);
          }
          factorielle *= i;
       }
       return factorielle;
    }

  5. #5
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    merci bcp herve91,ca fonctionne comme je veux... juste une ptite explication sur le if (factorielle > Integer.MAX_VALUE / i)
    pourquoi on divise le Integer.MAX_VALUE par i??
    dsl si je pose trop de questions

  6. #6
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Tu t'assures avant de le faire que tu puisses le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       if (factorielle > Integer.MAX_VALUE / i) {
            throw new ArithmeticException("dépassement de capacité lors du calcul de la factorielle de " + nb);
       }
       factorielle *= i;
    Donc si la factorielle avant le calcul est déjà plus grande que la limite_max /i, c'est sur que factorielle * i sera plus grande que la limite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    factorielle *= i ; // est équivalent à factorielle =  factorielle *i;
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  7. #7
    Membre actif
    Inscrit en
    Février 2007
    Messages
    406
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 406
    Points : 207
    Points
    207
    Par défaut
    aa oké je comprend la
    merci bcp bcp à tout ceux qui m'ont aidé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans le calcul des normales moyennes,
    Par MaxPayne dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/04/2005, 17h50
  2. gestionnaire d'Exception dans DLL
    Par pirbd dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2005, 18h58
  3. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo