Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1872 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  aide pour un projet en programmation c++

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide pour un projet en programmation c++

n°2229100
valouh
Posté le 26-05-2014 à 15:00:57  profilanswer
 

Bonjour,
je suis en deuxième année de licence de chimie et je dois rendre un projet en programmation (langage c++) et j'aurai besoin d'aide.
 
Le but du projet est de calculer le potentiel électrostatique d'un système moléculaire en passant par plusieurs options.
Je bloque à l'option 3 où il faut justement calculer le potentiel électrostatique mais mon programme beug dans cette option à un endroit que je ne comprends pas.
 
L'intitulé de l'option 3 est : Dans cette option sera calculé le potentiel électrostatique en chaque point de la grille. Attention! le potentiel ne sera pas calculé pour une distance, entre le point considéré et un atome, inférieure au rayon de van der Waals de cet atome. Une fonction de calcul de la distance entre deux points est donc fortement conseillée.
 
J'ai donc mis en dehors de la fonction main le calcul de la distance :
float distance(float x1, float y1, float x2, float y2) // calcul de la distance utilisee dans l'option 3
    {
      float result;
      result = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
      return(result);
      }
et j'ai ensuite mis dans l'option 3 3 boucles for imbriquées (indication donnée par le professeur) mais dans une de ces boucles j'ai un problème que j'arrive pas à résoudre:
if (activation_menu[3])
      {
                            for( i=0; i<401; i++);
                             
                            {
                                 for (j=0; j<201; j++);
                             
                             {  
                                 for ( n=0; n<=nombre_atome; n++);
                                 {
                                     if( distance < rayon)
                                     {
                                      pot=0;
                                      grille[i][j];
                                      }
 
le if (distance < rayon) se souligne en rouge donc il y a une erreur. J'ai pourtant bien déclaré la fonction distance plus haut donc je ne vois pas ce qui bloque ici !  
 
Merci de bien vouloir m'aider !!

mood
Publicité
Posté le 26-05-2014 à 15:00:57  profilanswer
 

n°2229101
theshockwa​ve
I work at a firm named Koslow
Posté le 26-05-2014 à 15:02:25  profilanswer
 

l'appel d'une fonction requiert le passage des paramètres.
 

Code :
  1. if( distance( x1, y1, x2, y2 ) < rayon )


---------------
last.fm
n°2229102
h3bus
Troll Inside
Posté le 26-05-2014 à 15:08:43  profilanswer
 

Il faut que tu appelles distance avec ses arguments x1, x2 etc...
 
 [:benou_grilled]


Message édité par h3bus le 26-05-2014 à 15:09:13

---------------
sheep++
n°2229103
valouh
Posté le 26-05-2014 à 15:10:15  profilanswer
 

Merci beaucoup !!!!  
Je ne suis pas très forte comme vous avez pu le constater !!

n°2229106
valouh
Posté le 26-05-2014 à 15:15:00  profilanswer
 

malheureusement ça ne marche toujours pas.. j'ai pourtant mis ça if( distance(x1,y1,x2,y2) < rayon) mais c'est toujours en rouge

n°2229108
h3bus
Troll Inside
Posté le 26-05-2014 à 15:21:16  profilanswer
 

avec le morceau de code qu'on a, difficile de savoir. Ou sont défini les positions de tes atomes?


---------------
sheep++
n°2229111
valouh
Posté le 26-05-2014 à 15:28:25  profilanswer
 

Voici tout mon bloc de déclaration avant le bloc principal :
 
struct atome // affichage des caracteristiques d'un atome
{  
  char type_atome [101];  // type de l'atome
   
  float x;  // coordonnee x
  float y;  // coordonnee y
  float z;  // coordonnee z
  float charge;  // charge partielle de l'atome
  float rayon;  // rayon de l'atome
};
 
struct atome molecule[100]; // creation d'un tableau à 100 cases
 
int nombre_atome=0; // nombre d'atome initialise
int i=0;  
int j=0;  
int k=0;
 
FILE*fichier=NULL;
char nom_fichier[100];
 
 
float distance(float x1, float y1, float x2, float y2) // calcul de la distance utilisee dans l'option 3
    {
      float result;
      result = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
      return(result);
      }
 
int n;
float rayon;
float potentiel;
 
Ensuite dans la fonction main on a la fonction while pour l'affichage de tous les menus et ensuite le switch avec donc tous les "case" que je dois remplir

n°2229114
h3bus
Troll Inside
Posté le 26-05-2014 à 15:32:01  profilanswer
 

Et "grille"?

 

Tu veux la distance entre l'atome de ta molécule indexé par n (molecule[n].x, molecule[n].y, ... et .z mais ta distance devrait supporter une 3ème dimension) et ... un autre atome mais lequel? la position sur la grille?


Message édité par h3bus le 26-05-2014 à 15:36:05

---------------
sheep++
n°2229118
Farian
Posté le 26-05-2014 à 15:47:02  profilanswer
 

Bonjour !
 
Pas mal d'erreurs ...
 
 * Il y a déjà le ";" à la fin des lignes for(...), qui fait que vous exécutez la boucle "à vide", puis effectuez le bloc suivant avec comme indice la valeur juste au dessus de la condition de sortie (j'espère avoir été  clair).
 
 * Par ailleurs, si le nombre d'atomes est effectivement nombre_atome, la ligne de code (j'ai enlevé le ";" final)

Code :
  1. for ( n=0; n<=nombre_atome; n++)


fait nombre_atome+1 itérations (0, 1, 2, ..., nombre_atome). Idem pour les autre boucles, si vous voulez faire 200 et 400 itérations.
 
 * Pour la ligne qui vous intéresse, vous tentez de comparer une fonction C à une valeur ... Vous devriez faire un truc du genre :

Code :
  1. if (distance(atome[i].x, atome[i].y, un x quelconque, un y quelconque) < rayon)


 * La ligne  

Code :
  1. grille[i][j];

 
ne fait rien, est-ce bien ce que vous vouliez écrire ?
 
Sans parler des questions sur l'algorithme pointées par mes prédécesseurs :)
 
Bonne continuation !

Message cité 1 fois
Message édité par Farian le 26-05-2014 à 15:48:10
n°2229121
valouh
Posté le 26-05-2014 à 15:57:37  profilanswer
 

ben grille je l'avais mis aussi mais ça posait problème dans le programme et je sais pas pk ! pourtant grille est un tableau donc pour le déclarer en dehors du main je dois faire comme le reste et mettre int grille [i][j] non? Mais ça ne marche pas.
 
Ben en fait dans mon option 3 les boucles for correspondent chacune à quelque chose. La première correspond à la ligne de coordonées x , la seconde boucle pour y et la troisième boucle for pour le calcul de la distance atome .
 
Toute mon option 3 c'est ca (enfin ce que j'ai fait, peut être tu y verras plus clair):
 
case 3:
     
     if (activation_menu[3])
      {
                            for( i=0; i<401; i++);
                             
                            {
                                 for (j=0; j<201; j++);
                             
                             {  
                                 for ( n=0; n<=nombre_atome; n++);
                                 {
                                     if( distance(x1,y1,x2,y2) < rayon)
                                     {
                                      potentiel=0;
                                      grille[i][j];
                                      }
                                     
                                     else
                                     {  
                                         result=distance;
                                         printf ("%f, calcul du potentiel electrostatique\n" );
                                         struct atome;
                                         double a [3];
                                         double b [3];
                                         double result;
                                         int i;
                                         int j;
                                         
                                         for(i=0; i<3 ; i++)
                                         {
                                                  for(j=0; j<3; j++)
                                                  {
                                                           resultat = resultat + a[i]/b[j];
                                                           return(potentiel);  
                                                   }
                                         }
                                         
                                                           
                                             
                      activation_menu[5]=1;
                  }
                                 }
                               }
                               }
                         }
     else
      {
       printf("choisissez une option active" );
      }
           break;
           

mood
Publicité
Posté le 26-05-2014 à 15:57:37  profilanswer
 

n°2229123
valouh
Posté le 26-05-2014 à 16:03:21  profilanswer
 

Farian a écrit :

Bonjour !
donc si j'ai bien compris à la fin des lignes for je dois enlever le ";"?
Par contre je n'ai pas bien compris pour les autres boucles ce que je dois modifier par rapport au fait que je veux faire 200 et 400 itérations.
Ensuite pour la grille oui c'est bien ce que je veux dire et ensuite sinon (else) c'est ici que je vais calculer les potentiels il me semble !
 
Pas mal d'erreurs ...
 
 * Il y a déjà le ";" à la fin des lignes for(...), qui fait que vous exécutez la boucle "à vide", puis effectuez le bloc suivant avec comme indice la valeur juste au dessus de la condition de sortie (j'espère avoir été  clair).
 
 * Par ailleurs, si le nombre d'atomes est effectivement nombre_atome, la ligne de code (j'ai enlevé le ";" final)

Code :
  1. for ( n=0; n<=nombre_atome; n++)


fait nombre_atome+1 itérations (0, 1, 2, ..., nombre_atome). Idem pour les autre boucles, si vous voulez faire 200 et 400 itérations.
 
 * Pour la ligne qui vous intéresse, vous tentez de comparer une fonction C à une valeur ... Vous devriez faire un truc du genre :

Code :
  1. if (distance(atome[i].x, atome[i].y, un x quelconque, un y quelconque) < rayon)


 * La ligne  

Code :
  1. grille[i][j];

 
ne fait rien, est-ce bien ce que vous vouliez écrire ?
 
Sans parler des questions sur l'algorithme pointées par mes prédécesseurs :)
 
Bonne continuation !


n°2229130
h3bus
Troll Inside
Posté le 26-05-2014 à 16:20:26  profilanswer
 

Tu ne réponds pas à la question. Qu'y a-t-il dans grille? Les potentiels? les atomes?
 
Pour l'instant c'est un peu n'importe quoi ton code, mais il faut d'abord clarifier ce que tu veux faire et quelles données tu stockes/utilises avant de passer à la phase codage.
 
Aussi merci d'utiliser les balise [code=cpp] [ /code] autour de ton code pour la lisibilité!


---------------
sheep++
n°2229156
valouh
Posté le 26-05-2014 à 20:21:38  profilanswer
 

Dans cette option on va calculer le potentiel en chaque point de la grille donc dans cette grille oui il y aura les potentiels

n°2229163
h3bus
Troll Inside
Posté le 26-05-2014 à 20:53:09  profilanswer
 

Mais comment tu connait la distance entre un point de ta grille et un atome? Les index i et j sont aussi des positions dans l'espace?
Pourquoi ta grille n'a pas de dimension Z?


---------------
sheep++
n°2229180
Soileh
Lurkeur professionnel
Posté le 26-05-2014 à 22:40:59  profilanswer
 

:hello: !

 

À mon avis, la variable grille représente la position de plusieurs atomes sous forme de coordonnées (x;y).
Pour chaque point de la grille, elle devra déterminer le potentiel électrostatique de celui-ci en respectant une condition : on n'effectue pas le calcul si la distance entre ce point et un atome est inférieure au rayon de Van Der Waals.

 

Bon, en même temps je ne sais pas comment on calcule un potentiel électrostatique, ni ce qu'est le rayon de Van Der Waals :o

 

Edit : pour l'instant, ce n'est que le début de la réflexion [:cupra].

Message cité 1 fois
Message édité par Soileh le 26-05-2014 à 22:43:11

---------------
And in the end, the love you take is equal to the love you make
n°2229183
h3bus
Troll Inside
Posté le 26-05-2014 à 22:58:47  profilanswer
 

Oui enfin il faut une échelle pour cette grille...


---------------
sheep++
n°2229184
Soileh
Lurkeur professionnel
Posté le 26-05-2014 à 23:10:40  profilanswer
 

h3bus a écrit :

Oui enfin il faut une échelle pour cette grille...


Bin je dirais à l'échelle (1;1) non ? :??:


---------------
And in the end, the love you take is equal to the love you make
n°2229185
h3bus
Troll Inside
Posté le 26-05-2014 à 23:29:27  profilanswer
 

Euh tu connais la taille du rayon de Van der Waals? Très petit ^^


---------------
sheep++
n°2229186
Soileh
Lurkeur professionnel
Posté le 26-05-2014 à 23:37:29  profilanswer
 

h3bus a écrit :

Euh tu connais la taille du rayon de Van der Waals? Très petit ^^


Euh pas vraiment [:cupra]
Mais bon 1cm de plus ou de moins ça se voit pas trop :o  [:tinostar]  


---------------
And in the end, the love you take is equal to the love you make
n°2229216
valouh
Posté le 27-05-2014 à 13:04:25  profilanswer
 

Soileh a écrit :

:hello: !
 
À mon avis, la variable grille représente la position de plusieurs atomes sous forme de coordonnées (x;y).
Pour chaque point de la grille, elle devra déterminer le potentiel électrostatique de celui-ci en respectant une condition : on n'effectue pas le calcul si la distance entre ce point et un atome est inférieure au rayon de Van Der Waals.
 
Bon, en même temps je ne sais pas comment on calcule un potentiel électrostatique, ni ce qu'est le rayon de Van Der Waals :o
 
Edit : pour l'instant, ce n'est que le début de la réflexion [:cupra].


 
 
Bonjour !  
Oui vous avez raison on n'effectue pas le calcul si la distance entre ce point et un atome est inférieur au rayon de VDW c'est ça que j'exprime , en tout cas que je voulais exprimer, dans mes boucles if et else, else étant là où justement on va effectuer le calcul

n°2229218
valouh
Posté le 27-05-2014 à 13:13:23  profilanswer
 

h3bus a écrit :

Mais comment tu connait la distance entre un point de ta grille et un atome? Les index i et j sont aussi des positions dans l'espace?
Pourquoi ta grille n'a pas de dimension Z?


 
En fait dans l'option 2 j'ai déjà initialisé cette grille. L'énoncé de l'option 2 est : Dans cette option le programme doit initialiser à zéro la grille qui permettra de stocker toutes les valeurs des potentiels électrostatiques. La grille est définie sur un plan XY pour des valeurs de X allant de -20 à 20 Å et pour des valeurs de Y allant de -10 à 10 Å . L'intervalle entre chaque point sera de 0,5 Å.

n°2229220
valouh
Posté le 27-05-2014 à 13:17:09  profilanswer
 

J'ai trouvé l'erreur qui me bloquait ici :  

Code :
  1. for ( n=0; n<=nombre_atome; n++);
  2.                                  {
  3.                                      if( distance(x1,y1,x2,y2) < rayon)
  4.                                      {
  5.                                       potentiel=0;
  6.                                       grille[i][j];
  7.                                       }

[/quotemsg]
 
 
En fait il fallait que je déclare les x1, x2... même si je les avais déjà déclaré dans la fonction distance !


Message édité par valouh le 27-05-2014 à 13:19:39
n°2229226
valouh
Posté le 27-05-2014 à 14:01:36  profilanswer
 

Mais maintenant j'ai un problème dans ma boucle else  

Code :
  1. else
  2.                                      { 
  3.                                          result=distance;
  4.                                          printf ("%f, calcul du potentiel electrostatique\n" );
  5.                                          struct atome;
  6.                                          double a [3];
  7.                                          double b [3];
  8.                                          double result;
  9.                                          int i;
  10.                                          int j;


 
Le "result=distance" s'affiche en rouge, pourtant dans mon bloc de déclaration (fonction distance) c'est bien result que j'ai demandé que l'ordinateur renvoie (return (result)) donc je comprends pas

n°2229231
h3bus
Troll Inside
Posté le 27-05-2014 à 14:22:19  profilanswer
 

Je reviens sur les distances avant d'attaquer tes problèmes de programmation.

valouh a écrit :

La grille est définie sur un plan XY pour des valeurs de X allant de -20 à 20 Å et pour des valeurs de Y allant de -10 à 10 Å . L'intervalle entre chaque point sera de 0,5 Å.


Donc en gros tu a besoin de 1/0.5 * (2*20) + 1 = 81 points en X et 41 points en Y, pourquoi tes boucles sur i et j vont de 0 à 401 et 0 à 201? il faudrait faire 0 à 80 (inclu) et 0 à 40 (inclu).

 

Ensuite pour calculer les distances, il faut que tu ramène i et j à l'échelle (si STEP = 0.5 Å):

Code :
  1. x2 = (i - 40) * STEP;
  2. y2 = (j - 20) * STEP;
 

Ensuite seulement tu peux appeler ta fonction distance avec

Code :
  1. distance(atome[n].x, atome[n].y, x2, y2)
 
valouh a écrit :

En fait il fallait que je déclare les x1, x2... même si je les avais déjà déclaré dans la fonction distance !


Attention, ce n'est pas parce que tu déclares des valeurs que tu as les données nécessaires dedans!

 


valouh a écrit :

Le "result=distance" s'affiche en rouge, pourtant dans mon bloc de déclaration (fonction distance) c'est bien result que j'ai demandé que l'ordinateur renvoie (return (result)) donc je comprends pas


Les variables déclarés dans un contexte local (une fonction par exemple) n'existent que dans ce contexte.
De plus tu déclare result après l'avoir utilisé...
Enfin distance est toujours une fonction, elle doit être appelée avec ses paramètres.

 

Dernier point, grille[i][j]; ne fait toujours rien, si tu veux metre 0 dedans c'est

Code :
  1. grille[i][j] = 0;


Tu pourra mettre ton potentiel calculé ensuite avec le même type de syntaxe.

 

Tu m'as l'air de seulement découvrir le C, je suis dubatatif sur le fait qu'un prof vous demande de coder un programme sans connaissance en programmation :/

Message cité 1 fois
Message édité par h3bus le 27-05-2014 à 14:23:23

---------------
sheep++
n°2229292
valouh
Posté le 27-05-2014 à 20:43:17  profilanswer
 

h3bus a écrit :

Je reviens sur les distances avant d'attaquer tes problèmes de programmation.


 

h3bus a écrit :


Donc en gros tu a besoin de 1/0.5 * (2*20) + 1 = 81 points en X et 41 points en Y, pourquoi tes boucles sur i et j vont de 0 à 401 et 0 à 201? il faudrait faire 0 à 80 (inclu) et 0 à 40 (inclu).
 
Ensuite pour calculer les distances, il faut que tu ramène i et j à l'échelle (si STEP = 0.5 Å):

Code :
  1. x2 = (i - 40) * STEP;
  2. y2 = (j - 20) * STEP;


 
 
Ensuite seulement tu peux appeler ta fonction distance avec

Code :
  1. distance(atome[n].x, atome[n].y, x2, y2)


 


 

h3bus a écrit :


Attention, ce n'est pas parce que tu déclares des valeurs que tu as les données nécessaires dedans!
 
 


 

h3bus a écrit :


Les variables déclarés dans un contexte local (une fonction par exemple) n'existent que dans ce contexte.
De plus tu déclare result après l'avoir utilisé...
Enfin distance est toujours une fonction, elle doit être appelée avec ses paramètres.
 
Dernier point, grille[i][j]; ne fait toujours rien, si tu veux metre 0 dedans c'est

Code :
  1. grille[i][j] = 0;


Tu pourra mettre ton potentiel calculé ensuite avec le même type de syntaxe.
 
Tu m'as l'air de seulement découvrir le C, je suis dubatatif sur le fait qu'un prof vous demande de coder un programme sans connaissance en programmation :/


 
 
Mlaheureusement STEP nous ne l'avons jamais utilisé donc comment je pourrai faire pour ramener i et j à l'échelle ?
mais pour les bornes effectivement tu as raison , je me suis mélangée dans l'énoncé avec d'autres tableaux !  
 
En ce qui concerne la programmation, je trouve ça super dur mais j'en avais déjà fait durant 1 semestre l'année dernière mais le prof n'était pas super et les notes de la promo l'ont fait ressentir...!

n°2229298
h3bus
Troll Inside
Posté le 27-05-2014 à 21:26:17  profilanswer
 

Non mais step est une constante, 0.5 si tu veux rester en Å


---------------
sheep++
n°2229385
valouh
Posté le 28-05-2014 à 15:49:39  profilanswer
 

ah d'accord merci

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  aide pour un projet en programmation c++

 

Sujets relatifs
[arduino] Projet de terminaleaide pour base de données python 2.7
Besoin d'aide pour mon programme javascriptquestion boucle if
j'ai besoin de votre aideProblème Programmation
Apprendre la programmationProjet en Java's cool, effet sur image
Aide pygameQue pensez vous de mon projet de Web APP
Plus de sujets relatifs à : aide pour un projet en programmation c++


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR