OVH Cloud OVH Cloud

programme!!!

7 réponses
Avatar
fouky
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/

7 réponses

Avatar
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

Avatar
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


Avatar
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//


Il y a des parenthèses j'espère. :)

double r=attempt(a,n);
System.out.print(r); //je l'imprime..
}


Le message d'erreur que tu donnes est trop court !

En espérant t'avoir aidé ! ;)

--
naaalb!

Avatar
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)

Avatar
Olivier Thomann
Pourquoi ne pas tout simplement utiliser la méthode pow de la classe
java.lang.Math?
--
Olivier
Avatar
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;

double aInterm = puisRec(a,n/2);
aInterm *= aInterm;

if(n%2 != 0)
aInterm *= a;

return aInterm;
}

Et une solution en impératif :

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!

Avatar
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;

double aInterm = puisRec(a,n/2);
aInterm *= aInterm;

if(n%2 != 0)
aInterm *= a;

return aInterm;
}


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: ; http://www.lri.fr/~signoles
"In theory, practice and theory are the same,
but in practice they are different" (Larry McVoy)