probleme lors de la lecture d'un fichier

Voir le sujet précédent Voir le sujet suivant Aller en bas

probleme lors de la lecture d'un fichier

Message  laetitia le Mer 8 Mai 2013 - 16:55

Bonjour,

Voila, j'ai un projet à faire, mon prof nous a passé un programme de base ou je dois écrire les options, sa a un peut la forme d'un menu.
La première que je dois faire c'est de lire un fichier (sa doit me lire et afficher toutes les caractéristiques d'1 molécule). Le problème que je rencontre y en a 2:
_ en utilisant la forme pour l'ouvrir et le lire dans le programme de base que l'on m'a fourni lors de l’exécution le programme cesse d’exécuter
_ si je refait la meme chose dans un nouveau fichier source sans la base sa fonctionne, outre que tout mes caractéristique sont null.
Est ce que quelqu'un pourrait m'aider sur ce point la? (sa concerne ce qui ait dans case 1)

Mon autre problème je dois calculé une énergie qui ait la somme de 2 énergies. Pour ça j'ai déclarer des fonctions. On peut le découpe en partie
_ calcule d'une distance
_calcule d'une premiére energie
_ calcul d'une deuxiéme energie
_ somme des 2 energies
(correspond avant le main et case 4) la dessus j'ai juste besoin qu'on me dise si c'est correcte.

Je vous remercie d'avance.
Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


struct atome molecule[100];

struct atome {
      char type;
      float x; // coordonnes en x de l'atome
      float y; // coordonnes en y de l'atome
      float z; //coordonnes en z de l'atome
      int appartenance;
      float charge;
      float vdw_r;
      float vdw_e;
};

double distance(double r,float xa, float xb, float ya, float yb, float za, float zb)
{
      double resultat_r=0;
      resultat_r=sqrt(((xa-xb)*(xa+xb))+((ya-yb)*(ya-yb))+((za-zb)*(za-zb)));
      return resultat_r;
}

double e_elect(double qi, double qj, double distance)
{
      double resultat_e_elect=0;
      resultat_e_elect=(qi*qj)/distance;
      return resultat_e_elect;
}
int somme(double Ra, double Rb)
{
    int resultat_somme=0;
    resultat_somme= Ra+Rb;
    return resultat_somme;
}
int produit(int somme, double distance)
{
    int resultat_produit=0;
    resultat_produit= somme / (2*distance);
    return resultat_produit;
}
double e_vdw(int produit, float ea, float eb)
{
      double resultat_e_vdw=0;
      resultat_e_vdw=sqrt(ea*eb)*(pow(produit,12)-pow(produit,6));
      return resultat_e_vdw;
}
double e_int(double e_elect, double e_vdw)
{
      double resultat_e_int=0;
      resultat_e_int=(e_elect + e_vdw);
      return resultat_e_int;
      }

int main()
{
   int choix, menu=1;          // variables pour gérer le choix des options et la condition de sortie du programme
   int activation_menu[6];    // variable permettant de gérer l'activation des options du menu
   
    int i;
    int nb_total; //nombre total dans la molecule
    float n1, n2; // nombre d'atome de la molecule 1 et 2
   
    FILE* molecules;
    char atome_molecules [100]= "molecules.txt";
   
   activation_menu[0]=1;
   activation_menu[1]=1;
   activation_menu[2]=0;
   activation_menu[3]=0;
   activation_menu[4]=0;
   activation_menu[5]=0;

   while (menu) //tant que la variable menu est vraie (ou =1), la condition pour rester dans la boucle est remplie
            // et la condition de sortie n'est pas remplie.
            // l'affichage du menu se fait jusqu'à ce que menu prenne la valeur 0.
      {
         printf("=== Menu ===\n\n");

         if(activation_menu[1])
            {
                 printf("1. Chargement d'une structure moleculaire\n");
            }
         if(activation_menu[2])
            {
               printf("2. Calcul des distances minimales intra et intermoleculaires\n");
            }
         if(activation_menu[3])
            {
               printf("3. Calcul de prediction des liaisons H\n");
            }
         if(activation_menu[4])
            {
               printf("4. Calcul de l'energie d'interaction\n");
            }
         if(activation_menu[5])
            {
               printf("5. Sauvegarde des resultats au format texte\n");
            }
         if(activation_menu[0])
            {
               printf("0. Quitter\n");
            }
         printf("Votre choix : ");
         scanf("%d", &choix);
         printf("\n");

         switch (choix)
         {
            case 1:
               printf("\n === Chargement d'une structure moleculaire ===\n");
               
               printf("quel est le nombre d'atome de la molecule 1 ? : ");
               scanf("%f", &n1);
               printf("quel est la molecule 1 ? : ");
               scanf("%f", &n1);
               printf("quel est le nombre d'atome de la molecule 2 ? : ");
               scanf("%f", &n2);
               printf("quel est la molecule 2 ? : ");
               scanf("%f", &n2);
               printf("quel est le nombre d'atome total ? : ");
               scanf("%d", &nb_total);
               
                    molecules = fopen("molecules.txt", "r");
                    fscanf(molecules, "%s %f %f %f %d %f %f %f",&molecule[i].type, &molecule[i].x, &molecule[i].y, &molecule[i].z, &molecule[i].appartenance, &molecule[i].charge, &molecule[i].vdw_r, &molecule[i].vdw_e );
                    printf("%s %f %f %f %d %f %f %f",molecule[i].type, molecule[i].x, molecule[i].y, molecule[i].z, molecule[i].appartenance, molecule[i].charge, molecule[i].vdw_r, molecule[i].vdw_e );
                    fclose(molecules);
                   
                   
               activation_menu[2]=1;
               activation_menu[3]=0;
               activation_menu[4]=1;
               activation_menu[5]=0;
               break;
            case 2:
               if (activation_menu[2])
                  {
                     printf("\n === Calcul des distances minimales intra et intermoleculaires ===\n");
                     activation_menu[3]=1;
                  }
               else
                  {
                     printf("choisissez une option active");
                  }
               break;
             case 3:
               if (activation_menu[3])
                  {
                        printf("\n === Calcul de prediction des liaisons H ===\n");
                  }
               else
                  {
                     printf("choisissez une option active");
                  }
                  break;
             case 4:
               if (activation_menu[4])
                  {
                        printf("\n === Calcul de l'energie d'interaction ===\n");
                        //calcul de la distance
                              printf("quel est le nombre d'atome de la molecule 1 ? : ");
                              scanf("%f", &n1);
                              printf("quel est la molecule 1 ? : ");
                              scanf("%f", &n1);
                              printf(" quel est le nombre d'atome de la molecule 2 ? :");
                              scanf("%f", &n2);
                              printf("quel est la molecule 2 ? : ");
                              scanf("%f", &n2);
                             
                              printf("distance(r, xa, xb, ya,yb, za, zb)\n");
                              scanf("%lf", &distance);
                             
                              // calcule de l'energie electrostatique
                                printf("quel est l'energie electrostatique (en kcal/mol)\n");
                               
                                printf("e_elect(qi, qj, distance)\n");
                                scanf("%lf", &e_elect);
                               
                                // calcule de l'energie van der waals
                                printf("somme(Ra, Rb)\n");
     
                                printf("produit(somme, distance)\n");

                                printf("e_vdw(ea, eb, produit)\n");
                                scanf("%lf", &e_vdw);
                           
                                // calcule de l'energie d'interaction
                                printf("e_int(e_elect, e_vdw)\n");
                                scanf("%lf", &e_int);
   
                           }
               else
                  {
                            printf("Vous devez d'abord charger les parametres : option 1 \n");
                      printf("choisissez une option active");
                  }
                  break;
            case 5:
               if (activation_menu[5])
                  {
                     printf("\n === Sauvegarde des resultats au format texte ===\n");
                  }
               else
                  {
                     printf("choisissez une option active");
                  }
               break;
            case 0:
               printf("\n === Quitter ===\n");
               menu=0;  // condition de sortie de la boucle while
               break;
             default:
                  printf("Votre choix n'est pas correct.");
                  break;
         }
         printf("\n\n");
      }
      
      return(0);
}

laetitia

Messages : 1
Date d'inscription : 08/05/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: probleme lors de la lecture d'un fichier

Message  watchinofoye le Mar 28 Mai 2013 - 11:55

Bonjour.

Tout d'abord, quelle est la partie du programme qui est fournie de base ?

Ensuite, pour vous répondre, je vois un bon nombre de problèmes :

Tout d'abord, vous créez un tableau de structures avant que la structure "atome" ne soit déclarée. Placez la déclaration du tableau après celle de la structure.

Ensuite, dans le main, vous utilisez la variable i alors qu'à aucun moment vous ne l'initialisez ou ne lui attribuez de valeur.

La chaine de caractères "atome_molecules" pour le nom de fichier n'est finalement jamais utilisée puisque vous indiquez directement le nom dans la fonction fopen (ça à la limite, c'est pas vraiment grave).

Dans le case 1 et le case 4 :
Code:
printf("\n === Chargement d'une structure moleculaire ===\n");

printf("quel est le nombre d'atome de la molecule 1 ? : ");
scanf("%f", &n1);
printf("quel est la molecule 1 ? : ");
scanf("%f", &n1);
printf("quel est le nombre d'atome de la molecule 2 ? : ");
scanf("%f", &n2);
printf("quel est la molecule 2 ? : ");
scanf("%f", &n2);
printf("quel est le nombre d'atome total ? : ");
scanf("%d", &nb_total);

[...]

printf("quel est le nombre d'atome de la molecule 1 ? : ");
scanf("%f", &n1);
printf("quel est la molecule 1 ? : ");
scanf("%f", &n1);
printf(" quel est le nombre d'atome de la molecule 2 ? :");
scanf("%f", &n2);
printf("quel est la molecule 2 ? : ");
scanf("%f", &n2);
Ici, scanf attribue la valeur saisie à n1 mais celle-ci est ensuite écrasée avant d'être utilisée. Idem pour n2.

Par la suite, dans le case 1, pour fscanf avec %s vous indiquez que vous passez une chaîne de caractères. Sauf que molecule[i].type est un caractère et non une chaîne. Si vous souhaitez passer un caractère, il faut indiquer %c au lieu de %s.
Enfin, dans le case 4, vous placez des fonctions là où les scanf attendent des variables. J'imagine que vous vouliez agir directement sur les retours de ces fonctions. Sauf qu'en l'occurrence, vous passez des adresses de fonctions et non de variables. N'hésitez pas à utiliser plutôt des variables intermédiaires. Les opérations n'en seront que plus claires.

Par curiosité, avec quels outils de développement (éditeur, compilateur, débogueur) travaillez-vous ?

Cordialement,

Watchi~

watchinofoye

Messages : 6
Date d'inscription : 27/03/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: probleme lors de la lecture d'un fichier

Message  -ed- le Lun 1 Sep 2014 - 8:04

Ce programme ne compile pas pour la raison suivante :

Code:

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
G:\dev\test\test\main.c|7|error: array type has incomplete element type|
G:\dev\test\test\main.c||In function 'distance':|
G:\dev\test\test\main.c|20|warning: unused parameter 'r' [-Wunused-parameter]|
G:\dev\test\test\main.c||In function 'main':|
G:\dev\test\test\main.c|174|warning: format '%lf' expects argument of type 'double *', but argument 2 has type 'double (*)(double,  float,  float,  float,  float,  float,  float)' [-Wformat=]|
G:\dev\test\test\main.c|180|warning: format '%lf' expects argument of type 'double *', but argument 2 has type 'double (*)(double,  double,  double)' [-Wformat=]|
G:\dev\test\test\main.c|188|warning: format '%lf' expects argument of type 'double *', but argument 2 has type 'double (*)(int,  float,  float)' [-Wformat=]|
G:\dev\test\test\main.c|192|warning: format '%lf' expects argument of type 'double *', but argument 2 has type 'double (*)(double,  double)' [-Wformat=]|
G:\dev\test\test\main.c|68|warning: unused variable 'atome_molecules' [-Wunused-variable]|
G:\dev\test\test\main.c|63|warning: variable 'i' set but not used [-Wunused-but-set-variable]|
||=== Build failed: 1 error(s), 7 warning(s) (0 minute(s), 0 second(s)) ===|

Pour lire le fichier, il faut une boucle ...
le type est de type char. Il faut utilise %c et non %s ... Si on veut une chaîne (nom de la molécule ?) , il faut définir un tableau de char ... et effectivement utiliser %s.

Ceci fonctionne (j'ai un doute avec la fonction 'distance()' ) avec le fichier
Code:

A 2. 3. 4. 5 6. 7. 8.
B 3. 4. 5. 6 7. 8. 9.
Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


// -ed- la definition de la structure doit etre faite avant son utilisation.
struct atome
{
  char type;
  double x; // coordonnes en x de l'atome
  double y; // coordonnes en y de l'atome
  double z; //coordonnes en z de l'atome
  int appartenance;
  double charge;
  double vdw_r;
  double vdw_e;
};

double distance(float xa, float xb, float ya, float yb, float za, float zb)
{
  /* -ed- je me demande si la formule est bonne. Il n'y a pas un probleme de signe ? */
  return sqrt(((xa-xb)*(xa+xb))+((ya-yb)*(ya-yb))+((za-zb)*(za-zb)));
}

double e_elect(double qi, double qj, double distance)
{
  return (qi*qj)/distance;
}

double somme(double Ra, double Rb)
{
  return Ra+Rb;
}

double produit(double somme, double distance)
{
  return somme / (2*distance);
}

double e_vdw(int produit, float ea, float eb)
{
  return sqrt(ea*eb)*(pow(produit,12)-pow(produit,6));
}

double e_int(double e_elect, double e_vdw)
{
  return e_elect + e_vdw;
}

int main()
{
  static struct atome molecule[100];
  int choix, menu=1;          // variables pour gérer le choix des options et la condition de sortie du programme
  int activation_menu[6];  // variable permettant de gérer l'activation des options du menu
  char fichier_molecules []= "molecules.txt";

  // etat des menus au demarrage
  activation_menu[0]=1;
  activation_menu[1]=1;
  activation_menu[2]=0;
  activation_menu[3]=0;
  activation_menu[4]=0;
  activation_menu[5]=0;

  while(menu)
      // tant que la variable menu est vraie (ou =1), la condition pour rester dans la boucle est remplie
      // et la condition de sortie n'est pas remplie.
      // l'affichage du menu se fait jusqu'à ce que menu prenne la valeur 0.
  {
      printf("=== Menu ===\n\n");

      if(activation_menu[1])
      {
        printf("1. Chargement d'une structure moleculaire\n");
      }
      if(activation_menu[2])
      {
        printf("2. Calcul des distances minimales intra et intermoleculaires\n");
      }
      if(activation_menu[3])
      {
        printf("3. Calcul de prediction des liaisons H\n");
      }
      if(activation_menu[4])
      {
        printf("4. Calcul de l'energie d'interaction\n");
      }
      if(activation_menu[5])
      {
        printf("5. Sauvegarde des resultats au format texte\n");
      }
      if(activation_menu[0])
      {
        printf("0. Quitter\n");
      }
      printf("Votre choix : ");
      scanf("%d", &choix);
      printf("\n");

      switch(choix)
      {
      case 1:
        printf("\n === Chargement d'une structure moleculaire ===\n");

        FILE* molecules = fopen(fichier_molecules, "r");
        if(molecules !=NULL)
        {

            int i = 0;
            while(fscanf(molecules, "%c %lf %lf %lf %d %lf %lf %lf",
                        &molecule[i].type,
                        &molecule[i].x,
                        &molecule[i].y,
                        &molecule[i].z,
                        &molecule[i].appartenance,
                        &molecule[i].charge,
                        &molecule[i].vdw_r,
                        &molecule[i].vdw_e) != EOF)
            {


              printf("%c %f %f %f %d %f %f %f",
                      molecule[i].type,
                      molecule[i].x,
                      molecule[i].y,
                      molecule[i].z,
                      molecule[i].appartenance,
                      molecule[i].charge,
                      molecule[i].vdw_r,
                      molecule[i].vdw_e);
              i++;
            }
            fclose(molecules);
            molecules=NULL;

            // activation des menus
            activation_menu[2]=1;
            activation_menu[3]=0;
            activation_menu[4]=1;
            activation_menu[5]=0;
        }
        else
        {
            printf("fichier %s inconnu\n", fichier_molecules);
        }
        break;
      case 2:
        if(activation_menu[2])
        {
            printf("\n === Calcul des distances minimales intra et intermoleculaires ===\n");
            activation_menu[3]=1;
        }
        else
        {
            printf("choisissez une option active");
        }
        break;
      case 3:
        if(activation_menu[3])
        {
            printf("\n === Calcul de prediction des liaisons H ===\n");
        }
        else
        {
            printf("choisissez une option active");
        }
        break;
      case 4:
        if(activation_menu[4])
        {
            int m1=0;
            int m2=0;

            printf("\n === Calcul de l'energie d'interaction ===\n");
            //calcul de la distance
            printf("quel est la molecule 1 ? : ");
            scanf("%d", &m1);
            printf("quel est la molecule 2 ? : ");
            scanf("%d", &m2);

            double dist = distance(molecule[m1].x,
                                  molecule[m2].x,
                                  molecule[m1].y,
                                  molecule[m2].y,
                                  molecule[m1].z,
                                  molecule[m2].z);
            printf("distance = %f\n",dist);

            // calcule de l'energie electrostatique
            double nrj_es = e_elect(molecule[m1].charge,
                                    molecule[m2].charge,
                                    dist);
            printf("energie electrostatique = %f kcal/mol\n", nrj_es);

            // calcule de l'energie van der waals
            double vdw = somme(molecule[m1].vdw_r, molecule[m2].vdw_r);
            printf("somme van der waals = %d\n", vdw);

            double vdw_par_dist = produit(vdw, dist);
            printf("vdw_par_dist= %f\n", vdw_par_dist);

            double nrj_vdw = e_vdw(molecule[m1].vdw_e, molecule[m2].vdw_e, vdw_par_dist);
            printf("energie van der waals = %f\n", nrj_vdw);


            // calcule de l'energie d'interaction
            printf("energie d'interaction = %f\n", e_int(nrj_es, nrj_vdw));
        }
        else
        {
            printf("Vous devez d'abord charger les parametres : option 1 \n");
            printf("choisissez une option active");
        }
        break;
      case 5:
        if(activation_menu[5])
        {
            printf("\n === Sauvegarde des resultats au format texte ===\n");
        }
        else
        {
            printf("choisissez une option active");
        }
        break;
      case 0:
        printf("\n === Quitter ===\n");
        menu=0;  // condition de sortie de la boucle while
        break;
      default:
        printf("Votre choix n'est pas correct.");
        break;
      }
      printf("\n\n");
  }
  return 0;
}

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: probleme lors de la lecture d'un fichier

Message  Contenu sponsorisé Aujourd'hui à 15:30


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum