C++ ...

Discutez d'informatique ici !
Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 19 Avr 2013, 18:09

slt

une fois que tu auras définis ton problème de la forme y'=F(x,y(x)) (voir https://www.sharcnet.ca/help/index.php/RUNGE-KUTTA_Tutorial)
après c'est du gateau
la vie est une fête :)



Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 15:49

merci, j'ai jeté un oeil ça à l'air pas trop mal, mais la j'en suis on va dire à l'initialisation, j'ai un soucis tout con ...

je veux la masse totale (pour me placer dans le réf de cdm),

je fais ainsi :

for (i=0;i<9;i++)

{ mT =mT + M[k] }

et lorsque je fais cout "mT" il me ressort uniquement 0 sauf à la 9éme valeur (masse de neptune) la valeur 9 ... c'est bidon mais je trouve pas !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Avr 2013, 18:10

hello,

1) Il existe les balises CODE, sers-t-en.
2) indentes ton code
3) il n'apparait nul part ton cout dans ton code. Si tu as besoin d'aide, tu devrais au moins proposer un code qui reproduit ton problème. Ici, on ne sait même pas ce que tu fais(le cout, l'initilisation de M, le type de i, mT, etc...)
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 18:19

pardon :

int k;
double mT = 0.0;


for (k=0 ; k<9 ; k++)

{
mT = mT + M[k];
}

cout<< setprecision (12)<< mT <<endl;


où M[k] tableau de masse des planètes .
et donc il me retourne que la masse mT de Neptune M[8] sans sommer et je vois pas pq

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Avr 2013, 18:26

1) indenter le code, ca veut dire rajouter des espaces/tabulations pour aligner correctement le code et c'est très important pour tes lecteurs
Code: Tout sélectionner
for (k=0 ; k<9 ; k++)
{
    mT = mT + M[k];
}



2)c'est un détail, mais ton int k a rien à faire en dehors de la boucle ca devrait plutot etre
Code: Tout sélectionner
for (int k=0 ; k<9 ; k++)
{
    mT = mT + M[k];
}

(en vrai ca devrait etre un unsigned int mais passons, c'est du détail)

3) il manque l'initialisation de M...donc on peut toujours pas vérifier si ta somme attendue est correcte.
4) tu devrais plutot mettre le cout dans la boucle for pour suivre les ajouts des masses à ta variable mT

Code: Tout sélectionner
for (int k=0 ; k<9 ; k++)
{
    mT = mT + M[k];
    cout<< setprecision (12)<< mT <<endl;
}
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 18:51

en faite, je vois tout de suite qu'elle est incorrecte car j'ai convertis en masse solaire, et mon résultat final est inférieur à 1 ..

double M[8];

M[0]= 1.0;
M[1]= 0.0000001747;
M[2]=0.0000025759;
M[3]= 0.0000031606;
M[4]= 0.00000033960;
M[5]=0.00095455;
M[6]= 0.00030077;
M[7]= 0.000045931;
M[8]= 0.0000541958;

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Avr 2013, 19:05

donc déjà ton initialisation de M est mauvaise.
Tu as neuf valeurs. Donc double M[9].

en faite, je vois tout de suite qu'elle est incorrecte car j'ai convertis en masse solaire, et mon résultat final est inférieur à 1 ..

qu'est-ce qui est incorrect? Qu'est-ce que tu as convertis? Pourquoi ne pas donner directement la valeur convertie (la conversion n'a rien à voir avec ta somme, donc pourquoi compliquer le probleme)? De quel résultat parles-tu?

Affiches les différentes masses avant ta boucle, et affiche la valeur de mT pendant que tu sommes
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 19:36

oui M[9] pardon,

en faite c'est louche, quand je met la commande juste après le tableau, ça m'affiche la somme successive et je ressors le bon résultat 1.00134151 ... et quand jle met après (un peu plus loin dans le code, au moment de calculer le barycentre), ça marche pu, enfin ca me retourne 0 0 0 0 0 0 0 sauf pour M[8]

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Avr 2013, 19:44

il faut que tu comprennes que tes phrases sont complètement obscures.

Quand tu as un exo de math avec des figures géométriques, tu mets un dessin. Et tu mets pas un dessin qui prend tout l'écran, tu mets un dessin lisible pour le lecteur.

Ben quand tu as un problème en info, de code, tu mets un code - le plus simplifié - possible, qui reproduit le problème, et tu l'indentes pour le rendre lisible.

Chose que tu n'as toujours pas faite.
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 20:03

bah je met quasi tout le code alors, car c'est un gros tableau apparemment qui obstrue ma valeur


int N = 9; // Soleil + 8 planetes
double a = 0;


double Masse[N]; // Masse de N (les masses sont exprimees en masse solaire)

Masse[0] = 1.0;
Masse[1] = 0.00000016602;
Masse[2] = 0.0000024478;
Masse[3] = 0.0000030035; //on optimise la precision en prenant 5 chiffres significatifs
Masse[4] = 0.00000032272;
Masse[5] = 0.00095460;
Masse[6] = 0.00028582;
Masse[7] = 0.000043658;
Masse[8] = 0.000051501;


int i; // Variable pour balayer toutes les planetes avec une boucle for

for (int i = 0 ; i<N ; i++)


[INDENT]{
[INDENT]a= a + Masse [i];
cout<< setprecision (12)<<" "<< a <<endl;[/INDENT]

}[/INDENT]


// On va maintenant définir ainsi toutes les coordonnées et velocites de chaque planetes sous forme de tableau







double xG,yG,zG,vxG,vyG,vzG,mT; // Coordonnees du centres de masse et masse totale

xG = 0.0;
yG = 0.0;
zG = 0.0;
vxG = 0.0; // On doit prendre les "coordonnees" du centre de masse initiale
vyG = 0.0; // où on ajoutera ensuite ceux des autres planetes
vzG = 0.0;
mT = 0.0;



// Coordonnees, impulsions et masses totales


int k; // Variable pour balayer toutes les planetes avec une boucle for

for (int k = 0 ; k<N ; k++)


[INDENT] {
[INDENT] mT= mT + Masse[k];

cout<< setprecision (12)<<" "<< mT <<endl;[/INDENT]

}[/INDENT]

cout<< setprecision (12)<<" "<< mT <<endl;


pourquoi mon 1er cout affiche la bonne valeur et pas mon 2éme (et 3éme..) ?? ya juste un tableau qui les sépare à priori

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 21 Avr 2013, 20:14

le plus simplifié

pourquoi nous embêter avec r alors que tu ne t'en sers pas?

(tu remarqueras que si tu enlèves r, ton code fera probablement ce que tu attends. La raison, c'est que comme déjà dit précédemment dans cette discussion......, lorsque tu déclares un tableau de taille M, tu as droit d'accéder aux indices de 0 à M-1.
Ce n'est pas le cas de r, tu déclares un tableau de machin de taille 5. et tu accèdes au 6eme element...donc tu défonces ce que t'as en mémoire. c'est pas good du tout! )

Et de deux, ta définition de Masse[N] ne devrait même pas compiler, N devrait etre définie à la compilation, et certainement pas une variable. Ton compilateur est peut etre permissif, mais c'est bad!
donc tu #define N 9, ou tu écris 9 en gros, ou un const int N=9, ou je sais pas quoi mais ne laisse pas int N=9;


edit:
bah je met quasi tout le code alors, car c'est un gros tableau apparemment qui obstrue ma valeur

au temps pour moi, tu as bien fait de laisser r
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 20:24

super ! ca marche avec #define N 9, dans ces cas la, je vais faire pareil pour la constante gravitationnelle !

merci bcp! (et surement à bientôt...)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 21 Avr 2013, 21:53

Re-bonsoir,

autre question :

Comment définir pour une variable un nombre de chiffres significatifs sans l'afficher :

cout<< setprecision(12) << xG << " " << yG << " "<< zG << " " << vxG << " " << vyG << " "<< vzG << " " << mT <<endl;


mais j'arrive à pas à ne pas l'afficher.. en gros un truc pour contourner setprecision (il me faudrait 12 chiffres significatifs)

Merci.

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 26 Avr 2013, 21:10

bonsoir,

j'ai besoin d'aide (encore..) , j'arrive pas à savoir pourquoi mon programme me retourne aucune valeur dans mes fichiers .txt ... ? il me crée bien les fichiers quand je compile (ça doit être encore une faute de débutant!) ..

si quelqu'un à des idées.. je peux pas poste le code... il est trop long

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 26 Avr 2013, 22:04

un programme ne crèe pas de fichier.txt à la compilation.

Comment peut-on savoir comment tu essaies d'écrire dans tes fichiers sans code. On n'est pas devins.

Si on programme est trop gros, ben tu crèes un plus petit programme et tu essaies de reproduire ton erreur!
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 26 Avr 2013, 22:17

bon bah je sais pas à quel moment mais en tout cas il me les crée

void ecriture(double t, double a[6][N])
{

[INDENT] ofstream f("1.txt");
f <<a[0][0]<<" "<< a[1][0]<<" " << a[2][0]<< " " << a[3][0] << " "<< a[4][0]<< " "<< a[5][0];

ofstream g("2.txt");
g <<a[0][1]<<" "<< a[1][1]<<" " << a[2][1]<< " " << a[3][1] << " "<< a[4][1]<< " "<< a[5][1];

......

[/INDENT]
}


j'ai donc un .txt par planète , donc ce code doit bien me retourner, sous forme de colonne, les a[0][0] , a[1][0] ... a[5][0] ?

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 26 Avr 2013, 22:32

je connais pas ton compilo, pe peux-tu flusher?

Code: Tout sélectionner
f <<a[0][0]<<" "<< a[1][0]<<" " << std::flush;

ou bien
Code: Tout sélectionner
f <<a[0][0]<<" "<< a[1][0]<<" " << std::endl;
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 26 Avr 2013, 23:11

j'utilise codeblocks, dont il est intégré dedans.

ça me ressort toujours rien, je jetterais un oeil demain

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 27 Avr 2013, 10:53

dans ce cas sans ton code qui reproduit (ou un code simplifié qui reproduit aussi), je peux pas t'aider plus.
la vie est une fête :)

Billball
Membre Complexe
Messages: 2669
Enregistré le: 31 Mar 2006, 19:13

par Billball » 27 Avr 2013, 12:46

bon je vais essayer d'être clair :

quand je tape la ligne :

ofstream f("1.txt");
f << 1 <<" "<< 2<<" " << 3<< " " << 4 << " "<< 5 << " "<< 6 << std::endl;


en dehors de ma fonction, ça me ressort parfaitement un fichier avec 1 2 3 4 5 6 ..

par contre à l'intérieur de ma fonction, ca me ressort rien, donc je peux en déduire que c'est au niveau de la déclaration de la fonction :

void ecriture(double t, double a[6][N])

{
[INDENT]ofstream f("1.txt");
f << 1 <<" "<< a[1][0]<<" " << a[2][0]<< " " << a[3][0] << " "<< a[4][0]<< " "<< a[5][0] << std::endl;[/INDENT]
}


c'est que dans cette fonction ecriture qui me retourne rien, même pas la valeur 1 en première colonne .. :mur:

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite