aide pour un projet en programmation c++

aide pour un projet en programmation c++ - C++ - Programmation

Marsh Posté le 26-05-2014 à 15:00:57    

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 !!

Reply

Marsh Posté le 26-05-2014 à 15:00:57   

Reply

Marsh Posté le 26-05-2014 à 15:02:25    

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

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


---------------
last.fm
Reply

Marsh Posté le 26-05-2014 à 15:08:43    

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++
Reply

Marsh Posté le 26-05-2014 à 15:10:15    

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

Reply

Marsh Posté le 26-05-2014 à 15:15:00    

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

Reply

Marsh Posté le 26-05-2014 à 15:21:16    

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


---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 15:28:25    

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

Reply

Marsh Posté le 26-05-2014 à 15:32:01    

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++
Reply

Marsh Posté le 26-05-2014 à 15:47:02    

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
Reply

Marsh Posté le 26-05-2014 à 15:57:37    

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;
           

Reply

Marsh Posté le 26-05-2014 à 15:57:37   

Reply

Marsh Posté le 26-05-2014 à 16:03:21    

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 !


Reply

Marsh Posté le 26-05-2014 à 16:20:26    

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++
Reply

Marsh Posté le 26-05-2014 à 20:21:38    

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

Reply

Marsh Posté le 26-05-2014 à 20:53:09    

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++
Reply

Marsh Posté le 26-05-2014 à 22:40:59    

: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
Reply

Marsh Posté le 26-05-2014 à 22:58:47    

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


---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 23:10:40    

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
Reply

Marsh Posté le 26-05-2014 à 23:29:27    

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


---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 23:37:29    

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
Reply

Marsh Posté le 27-05-2014 à 13:04:25    

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

Reply

Marsh Posté le 27-05-2014 à 13:13:23    

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 Å.

Reply

Marsh Posté le 27-05-2014 à 13:17:09    

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
Reply

Marsh Posté le 27-05-2014 à 14:01:36    

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

Reply

Marsh Posté le 27-05-2014 à 14:22:19    

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++
Reply

Marsh Posté le 27-05-2014 à 20:43:17    

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...!

Reply

Marsh Posté le 27-05-2014 à 21:26:17    

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


---------------
sheep++
Reply

Marsh Posté le 28-05-2014 à 15:49:39    

ah d'accord merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed