aide pour un projet en programmation c++ - C++ - Programmation
Marsh Posté le 26-05-2014 à 15:08:43
Il faut que tu appelles distance avec ses arguments x1, x2 etc...
Marsh Posté le 26-05-2014 à 15:10:15
Merci beaucoup !!!!
Je ne suis pas très forte comme vous avez pu le constater !!
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
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?
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
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?
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 :
|
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 :
|
* La ligne
Code :
|
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 !
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;
Marsh Posté le 26-05-2014 à 16:03:21
Farian a écrit : Bonjour !
|
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é!
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
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?
Marsh Posté le 26-05-2014 à 22:40:59
!
À 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
Edit : pour l'instant, ce n'est que le début de la réflexion .
Marsh Posté le 26-05-2014 à 22:58:47
ReplyMarsh 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 ?
Marsh Posté le 26-05-2014 à 23:29:27
Euh tu connais la taille du rayon de Van der Waals? Très petit ^^
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
Mais bon 1cm de plus ou de moins ça se voit pas trop
Marsh Posté le 27-05-2014 à 13:04:25
Soileh a écrit : ! |
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
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? |
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 Å.
Marsh Posté le 27-05-2014 à 13:17:09
J'ai trouvé l'erreur qui me bloquait ici :
Code :
|
[/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 !
Marsh Posté le 27-05-2014 à 14:01:36
Mais maintenant j'ai un problème dans ma boucle else
Code :
|
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
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 :
|
Ensuite seulement tu peux appeler ta fonction distance avec
Code :
|
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 :
|
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
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 :
|
h3bus a écrit : |
h3bus a écrit :
|
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...!
Marsh Posté le 27-05-2014 à 21:26:17
Non mais step est une constante, 0.5 si tu veux rester en Å
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 !!