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

avec Java Discussion :

Exercice fonction puissance


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 17
    Points
    17
    Par défaut Exercice fonction puissance
    Bonjour,

    Je débute complètement en java (mon langage habituel est Delphi) et je bloque sur un exercice dans lequel on me demande d'écrire une fonction qui retourne la puissance n d'un réel. Dans certains cas, la fonction doit retourner un résultat réel, dans d'autres cas, elle doit retourner le message "résultat non défini".

    J'ai pensé créer ma fonction en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean puissance(double x,y, int n){}
    Le résultat de cette fonction serait true (lorsque que le calcul est possible) ou false (lorsque le calcul n'est pas possible) et la variable y contiendrait la réponse réelle lorsque le calcul est possible.
    Dans la fonction main, j'aurais appelé ma fonction puissance ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if puissance(x,y,n) {
    "System.out.println("Le résultat est "+y;
    else System.out.println("Le résultat n'est pas défini.";
    Ce qui me bloque, c'est que la variable y est locale à cette fonction : on ne peut apparemment pas passer cette valeur par référence (comme j'aurais pu le faire avec delphi).
    Je fais peut-être fausse route et il y a sans doute une manière très simple de faire, mais laquelle ?
    Sine qua non : un traceur de courbes gratuit
    http://www.patrice-rabiller.fr/SineQuaNon/menusqn.htm
    Patrice Rabiller

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par patrice rabiller Voir le message
    Ce qui me bloque, c'est que la variable y est locale à cette fonction : on ne peut apparemment pas passer cette valeur par référence (comme j'aurais pu le faire avec delphi).
    C'est exact, il n'y a pas de syntaxe Java pour ça.

    Citation Envoyé par patrice rabiller Voir le message
    Je fais peut-être fausse route et il y a sans doute une manière très simple de faire, mais laquelle ?
    L'usage en Java, est de retourner la valeur demandée avec return. Et s'il y a un problème pour le faire, de lancer une Exception.

    Exemple, une méthode qui transforme une String en boolean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static boolean frenchToBool(String s) {
      if("vrai".equals(s)) {
        return true;
      } else if("faux".equals(s)) {
        return false;
      } else {
        throw new IllegalArgumentException("String '" + s + "' is neither 'vrai' nor 'faux'");
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 17
    Points
    17
    Par défaut
    J'ai essayé autre chose, mais ça ne marche pas mieux. Je n'ai pas compris comment fonctionne le type string
    Qu'est-ce qui ne va pas dans mon code ?
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import java.util.Scanner;
    public class Puissances {
    	static double Puissance(double x,int n){
    		double resultat;
    		if (n==0){
    			if (x>=0){
    				resultat=1;
    				ok="possible";//résultat défini
    			}
    			else{
    				resultat=0;//résultat non défini : la valeur 0 n'est pas significative
    				ok="impossible";
    			}
    		}
    		else{
    			if (n>=0){
    				resultat=1;
    				for(int k=1;k<=n;k=k+1)
    					resultat=resultat*x;
    				ok="possible";//résultat défini affecté à resultat
    			}
    			else{
    				if (x==0){//résultat non défini
    					ok="impossible";
    					y=0;
    				}
    				else{
    					resultat=1;
    					for(int k=1;k<=n;k=k+1)
    						resultat=resultat/x;
    					ok="possible";//résultat défini et affecté à resultat
    				}
    			}
    		}
    		return resultat;
    	}
    	public static void main(String[] args) {
    		double x,y;
    		int n;
    		String ok="possible";
    		y=0;
    		Scanner clavier=new Scanner(System.in);
    		System.out.print("Donner un réel x ");
    		x=clavier.nextDouble();
    		System.out.print("Donner un entier n ");
    		n=clavier.nextInt();
    		y=Puissance(x,n);
    		if (ok=="possible")	
    			System.out.println(x+"^"+n+" = "+y);
    		else
    			System.out.println("Résultat non défini");
    	}
    }
    Sine qua non : un traceur de courbes gratuit
    http://www.patrice-rabiller.fr/SineQuaNon/menusqn.htm
    Patrice Rabiller

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 13
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    En ce qui concerne l'exemple avec les String, il s'agit de simples tests qui permettent de retourner des booléens :

    Si la String est égale à "Vrai" alors on retourne true,

    Si la String est égale à "Faux" alors on retourne false,

    Et sinon dans tous les autres cas, on lève une Exception (en gros une Erreur) qui signale à l'utilisateur que la String passée en paramètre ne peut être prise en compte.

    Après pour ta fonction puissance je te conseille le récursif :

    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
    public static double puissance(double x, int y)
    	{
    		if (y == 0)
    		{
    			return 1;
    		}
    		else if (y < 0)
    		{
    			return (1 / x * (puissance(x, y + 1)));
    		}
    		else
    		{
    			return (x * puissance(x, y - 1));
    		}
    	}
    Grace à ce moyen tu évites les codes à rallonge.
    A la fonction que je te donne, le retour d'un message n'est pas implémenté, mais ça je te laisse voir

    En esperant t'avoir aidé,

    Cordialement,
    Azramis.

  5. #5
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par patrice rabiller Voir le message
    . Dans certains cas, la fonction doit retourner un résultat réel, dans d'autres cas, elle doit retourner le message "résultat non défini".
    point important: les spécifications sont anormales: on retourne un résultat point. à moins de torturer les principes on ne doit pas faire quelque chose qui retourne carpe et lapin en même temps.
    On peut éventuellement rendre un résultat de type double et claquer une exception si on ne peux pas le faire.
    Dans le cas contraire tu vas être obligé de rendre un String qui dans un cas représente une valeur numérique et dans l'autre un message. C'est faisable mais c'est contraire à tous les principes d'une programmation propre.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par patrice rabiller Voir le message
    J'ai essayé autre chose, mais ça ne marche pas mieux. Je n'ai pas compris comment fonctionne le type string
    Probablement pas en effet, mais ça n'a rien à voir avec String.
    Ce que tu n'as pas compris, à propos de ta variable ok, c'est ce qu'on appelle la portée des variables.

    Citation Envoyé par patrice rabiller Voir le message
    Qu'est-ce qui ne va pas dans mon code ?
    Essentiellement deux choses :
    - Dans ta méthode Puissance, tu essaies d'utiliser une variable "ok". Or, elle n'existe pas, elle n'est pas à portée de cette méthode. La variable "ok" a été déclarée dans ta méthode main(), et n'existe donc pas en dehors de cette méthode main().

    - Tu ne m'as pas écouté. Tu essaies de renvoyer à la fois le résultat numérique, et si ce résultat est utilisable ou s'il y a eu une erreur qui le rend inutile.
    C'est bien, mais ce n'est pas comme ça qu'on fait. S'il y a une erreur, on envoie une Exception. Et dans ce cas-là, il n'y a pas de valeur numérique retournée. Le code qui appelle la méthode ne recevra pas de valeur numérique, à la place il arrêtera le traitement, jusqu'à la première gestion d'exception qu'il trouve.
    Bref, le concept d'exception est sûrement nouveau pour toi, et peut-être un peu compliqué, mais ce n'est pas une raison. On fait comme ça, pas autrement. Parce qu'il n'y a pas de moyen pratique de faire autrement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je te rappelle au passage que tu travaille avec des doubles, donc si l'idée de l'exception ne te plait pas, il reste en double la valeur NaN (Not a Number) habituellement utilisée pour représenter un résultat impossible d'une opération (racine carré de -1 dans l'espace réel, division par 0, etc)

    Aussi, il y a des erreur de logique dans ton code, du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (n>=0){
    				.....
    			}
    			else{
    				if (x==0){//résultat non défini
    					...
    				}
    				else{
    					...
    					for(int k=1;k<=n;k=k+1)
    						// n est négatif, la boucle n'a pas de sens
    					...
    				}

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 17
    Points
    17
    Par défaut
    OK c'est vrai qu'il y a une erreur de logique dans l'une des boucles.
    Les exceptions : je connais depuis longtemps. Avec Delphi, l'une des syntaxes est :

    try
    ...
    except
    ...
    end;

    La récursivité aussi m'est familière, mais il s'agit ici de faire un exercice utilisant les structures conditionnelles et les boucles. La récursivité est en effet beaucoup plus élégante (c'est même ici un cas d'école).

    Je voudrais faire le travail sans utiliser les exceptions puisque le principe de l'exercice est précisément de traiter tous les cas de figure. Je suis donc intéressé par le résultat NaN (qui n'existe pas en Delphi !). Ce résultat est-il considéré comme un double ? En clair, au retour, est-ce que je peux écrire if Puissance(x,n)==NaN) ?

    Merci de supporter mes questions de débutant.
    Sine qua non : un traceur de courbes gratuit
    http://www.patrice-rabiller.fr/SineQuaNon/menusqn.htm
    Patrice Rabiller

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par patrice rabiller Voir le message
    Je suis donc intéressé par le résultat NaN (qui n'existe pas en Delphi !).
    Ben si il existe en delphi, comme dans la plupart des language respectant les normes de l'IETF relatives aux nombres à virgule flottante.

    Pour attribuer Nan à un double, il suffit de faire au choix

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double d = 0.0/0.0; // moche
    double d = Double.NaN;

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 17
    Points
    17
    Par défaut
    Merci : je touche au but
    Il me reste un détail à régler :

    Ma fonction main est maintenant celle-ci
    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
    public static void main(String[] args) {
    		double x,y;
    		int n;
    		y=0;
    		Scanner clavier=new Scanner(System.in);
    		System.out.print("Donner un réel x ");
    		x=clavier.nextDouble();
    		System.out.print("Donner un entier n ");
    		n=clavier.nextInt();
    		y=Puissance(x,n);
    		if (y!=Double.NaN)
    			System.out.println(x+"^"+n+" = "+y);
    		else
    			System.out.println("Résultat non défini");
    	}
    Si je rentre n=0 et x=-2 j'ai comme réponse "-2^0=NaN" et non pas "Résultat non défini".
    Même chose pour tous les cas où le calcul n'est pas possible...
    Comment faire ?
    Sine qua non : un traceur de courbes gratuit
    http://www.patrice-rabiller.fr/SineQuaNon/menusqn.htm
    Patrice Rabiller

  11. #11
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    l'égalité avec NAN n'est pas triviale : y a pas! utiliser un truc du genre Double.isNan(y)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 17
    Points
    17
    Par défaut
    Merci ! Ça marche
    Sine qua non : un traceur de courbes gratuit
    http://www.patrice-rabiller.fr/SineQuaNon/menusqn.htm
    Patrice Rabiller

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'une manière générale, ne jamais comparer les doubles avec double1 == double2, en virgule flottante il faut toujours penser "égaux à une marge d'erreur que je défini prêt", c'est chiant mais c'est comme ça

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

Discussions similaires

  1. Fonction puissance, avec des decimales
    Par n0o38 dans le forum Langage
    Réponses: 4
    Dernier message: 01/07/2007, 00h40
  2. la fonction puissance pow() ? entier, réel ?
    Par italiasky dans le forum C
    Réponses: 9
    Dernier message: 03/12/2006, 17h41
  3. Fonction Puissance en J2ME
    Par Vince1404 dans le forum Java ME
    Réponses: 4
    Dernier message: 22/08/2006, 16h28
  4. 8x11=0 !! problème fonction puissance
    Par Renesis57 dans le forum C
    Réponses: 18
    Dernier message: 26/11/2005, 14h54
  5. [LG]fonction puissance en pascal
    Par le 27 dans le forum Langage
    Réponses: 8
    Dernier message: 13/12/2003, 23h21

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