Salut
je suis un debutant en informatique malgré trois ans de logiciel de
calculs formels. j'ai voulu construire un programme en java qui calcule
les puissance des nombres. pour cela je compte construire un tableau dont
les elements sont les puissances suxcessives du nombre en question. voici
donc mon prog qui ne veut pas marcher:
// je cree une classe dans un projet
// puis une methode que je nomme attempt
public static double attempt(float a, int n){
double[] P;//le tableau en quetion
double r;//resultat
P=new double [n+1];
int i;
for(i=1;i<n;i++){P[1]=1;P[i+1]=P[i]*a;}
return P[n+1];}
je cree une methode main
public static void main (String [] args){
double a;
int n;
a=lirereel("entrez votre nombre"); /* lireentier etant une methode
predefinie et qui permet de recuperer des doubles par ex.*/
n=lireentier; //de la mm facon//
double r=attempt(a,n);
System.out.print(r); //je l'imprime..
}
je vous serais reconnaissant si vous m'aidez a trouver l'erreur qui est
declaré comme suit
exception throad main.java
ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions
merci d'avance
> -> Post via http://www.republique-des-lettres.com/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Nicolas Delsaux
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de
la pile d'exception (tout ce qui se trouve après le Exception throwed) de ton programme ? et renvoyer tout ça sur le forum.
-- Nicolas Delsaux AN>Faire de la pub, c'est se mettre sur le même plan que Begbeider, Séguéla ou Raffarin. AN>C'est quand même ultime les boules. in frab la pub
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si
j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java
ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions
merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de
la pile d'exception (tout ce qui se trouve après le Exception throwed) de
ton programme ? et renvoyer tout ça sur le forum.
--
Nicolas Delsaux
AN>Faire de la pub, c'est se mettre sur le même plan que Begbeider, Séguéla
ou Raffarin.
AN>C'est quand même ultime les boules.
in frab la pub
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de
la pile d'exception (tout ce qui se trouve après le Exception throwed) de ton programme ? et renvoyer tout ça sur le forum.
-- Nicolas Delsaux AN>Faire de la pub, c'est se mettre sur le même plan que Begbeider, Séguéla ou Raffarin. AN>C'est quand même ultime les boules. in frab la pub
jerome moliere
Nicolas Delsaux wrote:
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de la pile d'exception (tout ce qui se trouve après le Exception throwed) de ton programme ? et renvoyer tout ça sur le forum. pourquoi cela ?
on appelle une classe Java Test codée dans un fichier Test.java par java Test et non java Test.java ... après reste à positionner le CLASSPATH ... bref lire la FAQ pourrait être plus qu'une bonne idée....
Jerome
Nicolas Delsaux wrote:
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si
j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java
ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions
merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de
la pile d'exception (tout ce qui se trouve après le Exception throwed) de
ton programme ? et renvoyer tout ça sur le forum.
pourquoi cela ?
on appelle une classe Java Test codée dans un fichier Test.java par
java Test et non java Test.java ...
après reste à positionner le CLASSPATH ...
bref lire la FAQ pourrait être plus qu'une bonne idée....
Le 6 Nov 2003 14:14:42 GMT, old s'est levé est s'est dit : "tiens, si j'écrivais aux mecs de fr.comp.lang.java :
exception throad main.java ce qui pour moi est du charabia je n'ai pas encore etudie les exceptions merci d'avance
Ce message est loin d'être explicite. Pourrais-tu faire un copier-coller de la pile d'exception (tout ce qui se trouve après le Exception throwed) de ton programme ? et renvoyer tout ça sur le forum. pourquoi cela ?
on appelle une classe Java Test codée dans un fichier Test.java par java Test et non java Test.java ... après reste à positionner le CLASSPATH ... bref lire la FAQ pourrait être plus qu'une bonne idée....
Jerome
Skaldruhkk
Salut.
old wrote:
public static double attempt(float a, int n){ double[] P;//le tableau en quetion double r;//resultat P=new double [n+1]; int i; for(i=1;i<n;i++){P[1]=1;P[i+1]=P[i]*a;} return P[n+1];}
Bon, tu as un problème avec l'utilisation des tableaux : Si tu déclares un tableau de taille n+1, ta dernière case est la numéro n (la numérotation commence à 0). Ensuite, tu fais une erreur dans ton for : il faut t'arrêter n+1.
Ensuite, je placerais l'initialisation hors de ta boucle for.
Si tu veux garder ton tableau, fais :
double [] P; P = new double[n+1]; P[0]=1; // la première case for (int i=1 ; i<n+1 ; i++){ // déclare int i ici P[i+1] = a*P[i]; } // for (les accolades ne sont pas indispensables dans ce cas) return P[n];
Mais le mieux à mon avis est de faire ça : double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){ // ici, r = a^i r = r * a; // ici, r = a^(i+1) } // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n return r;
je cree une methode main public static void main (String [] args){ double a; int n; a=lirereel("entrez votre nombre"); /* lireentier etant une methode predefinie et qui permet de recuperer des doubles par ex.*/ n=lireentier; //de la mm facon//
Le message d'erreur que tu donnes est trop court !
En espérant t'avoir aidé ! ;)
-- naaalb!
Salut.
old wrote:
public static double attempt(float a, int n){
double[] P;//le tableau en quetion
double r;//resultat
P=new double [n+1];
int i;
for(i=1;i<n;i++){P[1]=1;P[i+1]=P[i]*a;}
return P[n+1];}
Bon, tu as un problème avec l'utilisation des tableaux :
Si tu déclares un tableau de taille n+1, ta dernière case est la numéro
n (la numérotation commence à 0).
Ensuite, tu fais une erreur dans ton for : il faut t'arrêter n+1.
Ensuite, je placerais l'initialisation hors de ta boucle for.
Si tu veux garder ton tableau, fais :
double [] P;
P = new double[n+1];
P[0]=1; // la première case
for (int i=1 ; i<n+1 ; i++){ // déclare int i ici
P[i+1] = a*P[i];
} // for (les accolades ne sont pas indispensables dans ce cas)
return P[n];
Mais le mieux à mon avis est de faire ça :
double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){
// ici, r = a^i
r = r * a;
// ici, r = a^(i+1)
} // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n
return r;
je cree une methode main
public static void main (String [] args){
double a;
int n;
a=lirereel("entrez votre nombre"); /* lireentier etant une methode
predefinie et qui permet de recuperer des doubles par ex.*/
n=lireentier; //de la mm facon//
public static double attempt(float a, int n){ double[] P;//le tableau en quetion double r;//resultat P=new double [n+1]; int i; for(i=1;i<n;i++){P[1]=1;P[i+1]=P[i]*a;} return P[n+1];}
Bon, tu as un problème avec l'utilisation des tableaux : Si tu déclares un tableau de taille n+1, ta dernière case est la numéro n (la numérotation commence à 0). Ensuite, tu fais une erreur dans ton for : il faut t'arrêter n+1.
Ensuite, je placerais l'initialisation hors de ta boucle for.
Si tu veux garder ton tableau, fais :
double [] P; P = new double[n+1]; P[0]=1; // la première case for (int i=1 ; i<n+1 ; i++){ // déclare int i ici P[i+1] = a*P[i]; } // for (les accolades ne sont pas indispensables dans ce cas) return P[n];
Mais le mieux à mon avis est de faire ça : double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){ // ici, r = a^i r = r * a; // ici, r = a^(i+1) } // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n return r;
je cree une methode main public static void main (String [] args){ double a; int n; a=lirereel("entrez votre nombre"); /* lireentier etant une methode predefinie et qui permet de recuperer des doubles par ex.*/ n=lireentier; //de la mm facon//
Le message d'erreur que tu donnes est trop court !
En espérant t'avoir aidé ! ;)
-- naaalb!
Julien Signoles
On Thu, 6 Nov 2003, Skaldruhkk wrote:
Salut.
Salut,
Mais le mieux à mon avis est de faire ça : double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){ // ici, r = a^i r = r * a; // ici, r = a^(i+1) } // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n return r;
Et, algorithmiquement parlant, le mieux est de coder la formule a^n = a^(n/2) * a^(n/2) si n pair = a^(n/2) * a^(n/2) * a si n impair plutôt que la formule a^n = a^(n-1) * a
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) { double r = 1; for(int i = 0; i < n / 2; i++) r *= a; // ici, r = a^(n/2) r *= r; // ici, r = a^(n/2) * a^(n/2) if (n % 2 != 0) // cas n impair r *= a; return r; }
Julien -- mailto: ; http://www.lri.fr/~signoles "In theory, practice and theory are the same, but in practice they are different" (Larry McVoy)
On Thu, 6 Nov 2003, Skaldruhkk wrote:
Salut.
Salut,
Mais le mieux à mon avis est de faire ça :
double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){
// ici, r = a^i
r = r * a;
// ici, r = a^(i+1)
} // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n
return r;
Et, algorithmiquement parlant, le mieux est de coder la formule
a^n = a^(n/2) * a^(n/2) si n pair
= a^(n/2) * a^(n/2) * a si n impair
plutôt que la formule
a^n = a^(n-1) * a
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) {
double r = 1;
for(int i = 0; i < n / 2; i++)
r *= a;
// ici, r = a^(n/2)
r *= r;
// ici, r = a^(n/2) * a^(n/2)
if (n % 2 != 0) // cas n impair
r *= a;
return r;
}
Julien
--
mailto:Julien.Signoles@lri.fr ; http://www.lri.fr/~signoles
"In theory, practice and theory are the same,
but in practice they are different" (Larry McVoy)
Mais le mieux à mon avis est de faire ça : double r = 1; // résultat intermédiaire
for (int i=0 ; i<n ; i++){ // ici, r = a^i r = r * a; // ici, r = a^(i+1) } // for (les accolades ne sont pas indispensables dans ce cas)
// r = a^n return r;
Et, algorithmiquement parlant, le mieux est de coder la formule a^n = a^(n/2) * a^(n/2) si n pair = a^(n/2) * a^(n/2) * a si n impair plutôt que la formule a^n = a^(n-1) * a
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) { double r = 1; for(int i = 0; i < n / 2; i++) r *= a; // ici, r = a^(n/2) r *= r; // ici, r = a^(n/2) * a^(n/2) if (n % 2 != 0) // cas n impair r *= a; return r; }
Julien -- mailto: ; http://www.lri.fr/~signoles "In theory, practice and theory are the same, but in practice they are different" (Larry McVoy)
Olivier Thomann
Pourquoi ne pas tout simplement utiliser la méthode pow de la classe java.lang.Math? -- Olivier
Pourquoi ne pas tout simplement utiliser la méthode pow de la classe
java.lang.Math?
--
Olivier
Pourquoi ne pas tout simplement utiliser la méthode pow de la classe java.lang.Math? -- Olivier
Skaldruhkk
Julien Signoles écrivit :
Et, algorithmiquement parlant, le mieux est de coder la formule a^n = a^(n/2) * a^(n/2) si n pair = a^(n/2) * a^(n/2) * a si n impair plutôt que la formule a^n = a^(n-1) * a
Exact !
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) { double r = 1; for(int i = 0; i < n / 2; i++) r *= a; // ici, r = a^(n/2) r *= r; // ici, r = a^(n/2) * a^(n/2) if (n % 2 != 0) // cas n impair r *= a; return r; }
Pourquoi n'utiliser la formule que tu indiques plus haut que pour le calcul de a^n et pas pour a^(n/2) ?
Allez, une solution récursive :
public static double puisRec(double a, int n){ if (n==0) return 1;
public static double puis2(double a, int n){ int xMax; // xMax est le nombre d'itération à faire { // Calcul de xMax // Si on utilise Math, on peut faire directement : // xMax = (int)(Math.log(n)/Math.log(2)); // À la main, ça donne : int x = 0; int cpt = 1; // 2^x while(cpt<=n){ x++; cpt *= 2; } // while xMax = x; }
double result; int [] puissances = new int[xMax+1]; { int k = n; int indice = xMax; while (k != 1){ puissances[indice] = k; k = k/2; indice--; } // while puissances[1] = 1; }
{ result = 1.0; for (int i=1 ; i<=xMax ; i++){ result = result * result; int k = puissances[i]; if (k%2 != 0){ result *= a; } } }
return result; }
À mon avis, il est certainement possible de faire mieux en utilisant des masques (les deux premières boucles de mon algo seraient inutiles). Mais là, la flemme me prend ! ;)
-- naaalb!
Julien Signoles écrivit :
Et, algorithmiquement parlant, le mieux est de coder la formule
a^n = a^(n/2) * a^(n/2) si n pair
= a^(n/2) * a^(n/2) * a si n impair
plutôt que la formule
a^n = a^(n-1) * a
Exact !
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) {
double r = 1;
for(int i = 0; i < n / 2; i++)
r *= a;
// ici, r = a^(n/2)
r *= r;
// ici, r = a^(n/2) * a^(n/2)
if (n % 2 != 0) // cas n impair
r *= a;
return r;
}
Pourquoi n'utiliser la formule que tu indiques plus haut que pour le
calcul de a^n et pas pour a^(n/2) ?
Allez, une solution récursive :
public static double puisRec(double a, int n){
if (n==0)
return 1;
public static double puis2(double a, int n){
int xMax; // xMax est le nombre d'itération à faire
{ // Calcul de xMax
// Si on utilise Math, on peut faire directement :
// xMax = (int)(Math.log(n)/Math.log(2));
// À la main, ça donne :
int x = 0;
int cpt = 1; // 2^x
while(cpt<=n){
x++;
cpt *= 2;
} // while
xMax = x;
}
double result;
int [] puissances = new int[xMax+1];
{
int k = n;
int indice = xMax;
while (k != 1){
puissances[indice] = k;
k = k/2;
indice--;
} // while
puissances[1] = 1;
}
{
result = 1.0;
for (int i=1 ; i<=xMax ; i++){
result = result * result;
int k = puissances[i];
if (k%2 != 0){
result *= a;
}
}
}
return result;
}
À mon avis, il est certainement possible de faire mieux en utilisant des
masques (les deux premières boucles de mon algo seraient inutiles).
Mais là, la flemme me prend ! ;)
Et, algorithmiquement parlant, le mieux est de coder la formule a^n = a^(n/2) * a^(n/2) si n pair = a^(n/2) * a^(n/2) * a si n impair plutôt que la formule a^n = a^(n-1) * a
Exact !
Ce qui, codé en style impératif et en java, donne :
public static double puis(double a, int n) { double r = 1; for(int i = 0; i < n / 2; i++) r *= a; // ici, r = a^(n/2) r *= r; // ici, r = a^(n/2) * a^(n/2) if (n % 2 != 0) // cas n impair r *= a; return r; }
Pourquoi n'utiliser la formule que tu indiques plus haut que pour le calcul de a^n et pas pour a^(n/2) ?
Allez, une solution récursive :
public static double puisRec(double a, int n){ if (n==0) return 1;
public static double puis2(double a, int n){ int xMax; // xMax est le nombre d'itération à faire { // Calcul de xMax // Si on utilise Math, on peut faire directement : // xMax = (int)(Math.log(n)/Math.log(2)); // À la main, ça donne : int x = 0; int cpt = 1; // 2^x while(cpt<=n){ x++; cpt *= 2; } // while xMax = x; }
double result; int [] puissances = new int[xMax+1]; { int k = n; int indice = xMax; while (k != 1){ puissances[indice] = k; k = k/2; indice--; } // while puissances[1] = 1; }
{ result = 1.0; for (int i=1 ; i<=xMax ; i++){ result = result * result; int k = puissances[i]; if (k%2 != 0){ result *= a; } } }
return result; }
À mon avis, il est certainement possible de faire mieux en utilisant des masques (les deux premières boucles de mon algo seraient inutiles). Mais là, la flemme me prend ! ;)
-- naaalb!
Julien Signoles
On Fri, 7 Nov 2003, Skaldruhkk wrote:
Pourquoi n'utiliser la formule que tu indiques plus haut que pour le calcul de a^n et pas pour a^(n/2) ?
Parce que, trop habitué à coder en fonctionnel (et donc en récursif), j'en ai oublié les bases de la programmation impérative... ;))
Allez, une solution récursive :
public static double puisRec(double a, int n){ if (n==0) return 1;
J'aurais du donner cette solution qui est celle que je donne
habituellement ;-)).
C'est de loin la plus élégante. Surtout coder de manière fonctionnell e,
ce qui n'est bien sûr pas possible en Java.
Julien
--
mailto:Julien.Signoles@lri.fr ; http://www.lri.fr/~signoles
"In theory, practice and theory are the same,
but in practice they are different" (Larry McVoy)