Enveloppe de courbe

Enveloppe de courbe - C - Programmation

Marsh Posté le 15-03-2004 à 15:21:45    

g des fichiers (oui oui plein oui) ds ce format :
 

nombre1
 
        nombre2       nombre3
        nombre4       nombre5
        nombre6       nombre7
        nombre8       nombre9
        nombre10       nombre11
        nombre12       nombre13
        nombre14       nombre15


 
 
 
je voudrais effectuer des opérations simples avec ces fichiers :
 

  • chercher les max (ie : tous les nombres entourés de 2 nombres inférieurs) de la colonne 2  
  • effacer tous les autres
  • enlever les blancs engendrés, si nécessaire


je fais ça en Fortran ou en C (C j'imagine sinon, moins de personnes m'aideront :) ) ?
j'aimerais de l'aide pour appliquer cet 'algo' à tous les fichiers (qui ont des noms du type : Moisjour-n° (ex : Mars01-01.dat ou Fev24-10.dat)) à la suite et que le prog me les renomme en ajoutant une ext "_max" par ex.
 
je suis une tache en prog déjà mais en plus g jamais fait ou presque de gestion de fichiers :'(
 
 
je vous propose que je fasse un bout de prog avant, histoire que vous ne me filiez pas la soluce sans que g essayé
ou alors, que je pose des questions très précises


Message édité par sseb22 le 17-03-2004 à 16:09:52

---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 15:21:45   

Reply

Marsh Posté le 15-03-2004 à 15:21:58    

Code :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.    //   FILE fopen(const char *nom, const char *mode);
  5.    FILE *input, *output ;
  6.    int lettre;
  7.    double aux=0.;
  8.    if((input = fopen("test.res" , "r" )) == NULL)
  9.      {
  10.        printf("Erreur a l'ouverture du fichier" );
  11.      } 
  12.    else
  13.      {
  14.        lettre=fgetc(input);
  15.        //      aux=fgetc(input);
  16.      }
  17.    if (fclose(input)==EOF)
  18.      printf("Erreur a la fermeture du fichier.\n" );
  19.    printf("contenu de aux : %d\n",aux);
  20.    printf("contenu de lettre : %i\n",lettre);
  21. }


input, c un pointeur
EOF est un entier
fclose(input) renvoie un entier, c ça ?


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 15:27:25    

jespere que Taz ne passera pas par la  :whistle:

Reply

Marsh Posté le 15-03-2004 à 15:31:32    

y a marqué, pour les nuls :p
 
j'ai prévenu, g pas pris en traître


Message édité par sseb22 le 15-03-2004 à 15:31:43

---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 15:46:03    

pour les noms des fichiers le mieux serait davoir le nom des fichiers qui sont dans le repertoire , et ca ca depant de l'os (le C ne peut te fournir ca
 
si tu es sous win32 tu peut utiliser FindFirstFile (http://msdn.microsoft.com/library/ [...] ctions.asp), puis FindNextFile apres  
 

Reply

Marsh Posté le 15-03-2004 à 15:52:28    

g un bouquin qui me dit qu'il y a une fonction rename pourtant


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 15:53:04    

avec ça pour exemple :
 

Code :
  1. #include <stdio.h>
  2. void main(int argc, char *argv[])
  3. {
  4.   if (argc < 3)
  5.     printf("Vous devez specifier des noms de fichiers source et cible\n" );
  6.   else if (rename(argv[1], argv[2]))
  7.     printf("Erreur - impossible de renommer le fichier\n" );
  8. }


Message édité par sseb22 le 15-03-2004 à 15:53:16

---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 15:55:25    

sseb22 a écrit :

avec ça pour exemple :
 

Code :
  1. #include <stdio.h>
  2. void main(int argc, char *argv[])
  3. {
  4.   if (argc < 3)
  5.     printf("Vous devez specifier des noms de fichiers source et cible\n" );
  6.   else if (rename(argv[1], argv[2]))
  7.     printf("Erreur - impossible de renommer le fichier\n" );
  8. }




 
moi je pensait au fait de lister tout les fichiers du rep, a moins que tu ne veille lancer le prog pour chaque fichier (avec un batch derriere par exemple ) mais ca risque detre  moins performant

Reply

Marsh Posté le 15-03-2004 à 15:57:22    

aaaaaaaaah ok ok ok
 
je préfère un truc simple et un peu moins performant
 
au fait, je tourne sous linux


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 15-03-2004 à 16:00:36    

sseb22 a écrit :

avec ça pour exemple :
 
[cpp]#include <stdio.h>
 
void main(int argc, char *argv[])
 {
  if (argc < 3)
    printf("Vous devez specifier des noms de fichiers source et cible\n" );


 
 
ca c pas tres bon parce que sil rentre plus de paramatre => DTC
 
et puis tu devrais mettre un exemple de commande c toujours plus facile genre :
argv[0] filename filedest ...

Reply

Marsh Posté le 15-03-2004 à 16:00:36   

Reply

Marsh Posté le 17-03-2004 à 14:36:38    

bon, g fait ça
prog qui essaie de prendre des points d'un fichier pour en faire l'enveloppe
avant même de discuter de l'algorithme, qqun pourrait-il m'aider à débrouissailler les erreurs de compilation ?


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 17-03-2004 à 14:36:50    

Programme :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. int main(int argc, char **argv)
  5. {
  6.   typedef double cell_t[2];
  7.  
  8.   void tri_x(cell_t, int);
  9.   void tri_y(cell_t, int);
  10.   FILE *fin, *fout;
  11.   double tmpf;
  12.   cell_t *truc, *truc2;
  13.   int m, n, i, j, taille;
  14.  
  15.   if(argc < 2)
  16.     {
  17.       puts(__FILE__": erreur ! manque le nom du fichier à traiter..." );
  18.       exit(1);
  19.     };
  20.   fin = fopen(argv[1], "r" );
  21.   if(fin == NULL)
  22.     {
  23.       printf("Erreur avec %s",argv[1]);
  24.       perror(__FILE__);
  25.       exit(1);
  26.     };
  27.   fout = fopen(argv[2], "w" );
  28.   if(fout == NULL)
  29.     {
  30.       printf("Erreur avec %s",argv[2]);
  31.       perror(__FILE__);
  32.       exit(1);
  33.     };
  34.   scanf(argv[3], "%d", n);
  35.   if(n==NULL)
  36.     {
  37.       printf("Erreur sur n" );
  38.       perror(__FILE__);
  39.       exit(1);
  40.     };
  41.   scanf(argv[4], "%d", m);
  42.   if(m==NULL)
  43.     {
  44.       printf("Erreur sur m" );
  45.       perror(__FILE__);
  46.       exit(1);
  47.     };
  48.   // on recupere le 1er nombre
  49.   fscanf(fin, "%lf", &tmpf);
  50.  
  51.   // taille de la partition (nb de colonnes du tableau)
  52.   taille = tmpf/n;
  53.  
  54.   // creation du tableau
  55.   truc = (cell_t*)malloc(taille * sizeof(cell_t));
  56.   for(j=0;j<n;j++)
  57.     {
  58.       // remplissage du tableau avec les lignes du fichier
  59.       for(i=0;i<taille;i++)
  60. {
  61.   fscanf(fin,"%lf %lf", &truc[i][0], &truc[i][1]);
  62. };
  63.      
  64.       // stockage des m points les plus grands en y
  65.      
  66.       // tri suivant y  
  67.       tri_y(*truc,taille);
  68.      
  69.       // selection des m derniers points
  70.      
  71.       // creation du tableau de taille m
  72.       truc2 = (cell_t *)malloc(m * sizeof(cell_t));
  73.        
  74.       // remplissage des m points ds truc2  
  75.       for(i=0;i<m;i++)
  76. {
  77.   truc2[i][0] = truc[taille-i][0];
  78.   truc2[i][1] = truc[taille-i][1];
  79. }
  80.       // tri de truc2 suivant x
  81.       tri_x(*truc2,m);
  82.      
  83.       // ecriture des m points dans fout
  84.       for(i=0;i<m;i++)
  85. {
  86.   fprintf(fout,"%lf %lf\n", truc2[i][0],truc2[i][1]);
  87. };
  88.     };
  89.   free(truc);
  90.   free(truc2);
  91.   return 0;
  92. };
  93. // Fonction de tri suivant les valeurs en Y
  94. void tri_y(cell_t *Tab, int NbElt)
  95.   {
  96.     int i, j, mark;
  97.     double max[2], aux[2];
  98.    
  99.     // boucle de tri
  100.    
  101.     for(j=0;j<NbElt;j++)
  102.       {
  103. // recherche du max
  104. max[0] = *Tab[0][0];
  105. max[1] = *Tab[0][1];
  106. mark = 0;
  107. for(i=1;i<NbElt-j;i++)
  108.   {
  109.     if(max[1]< *Tab[i][1])
  110.        {
  111.   max[0] = *Tab[i][0];
  112.   max[1] = *Tab[i][1];
  113.   mark = i;
  114.        };
  115.   };
  116.     // Permutation de max avec le dernier elt
  117.     aux[0] = *Tab[NbElt-j][0];
  118.     aux[1] = *Tab[NbElt-j][1];
  119.     *Tab[NbElt-j][0] = max[0];
  120.     *Tab[NbElt-j][1] = max[1];
  121.     *Tab[mark][0] = aux[0];
  122.     *Tab[mark][1] = aux[1]
  123.   };
  124.       };
  125. // Fonction de tri suivant les valeurs en X
  126. void tri_x(cell_t *Tab, int NbElt)
  127.   {
  128.     int i, j, mark;
  129.     double max[2], aux[2];
  130.    
  131.     // boucle de tri
  132.    
  133.     for(j=0;j<NbElt;j++)
  134.       {
  135. // recherche du max
  136. max[0] = *Tab[0][0];
  137. max[1] = *Tab[0][1];
  138. mark = 0;
  139. for(i=1;i<NbElt-j;i++)
  140.   {
  141.     if(max[0]< *Tab[i][0])
  142.        {
  143.   max[0] = *Tab[i][0];
  144.   max[1] = *Tab[i][1];
  145.   mark = i;
  146.        };
  147.   };
  148.     // Permutation de max avec le dernier elt
  149.     aux[0] = *Tab[NbElt-j][0];
  150.     aux[1] = *Tab[NbElt-j][1];
  151.     *Tab[NbElt-j][0] = max[0];
  152.     *Tab[NbElt-j][1] = max[1];
  153.     *Tab[mark][0] = aux[0];
  154.     *Tab[mark][1] = aux[1]
  155.   };
  156.       };


Message édité par sseb22 le 17-03-2004 à 16:09:34

---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 17-03-2004 à 14:37:18    

erreurs de compilation :
 

manu2.c:105: parse error before `*'
manu2.c: In function `tri_y':
manu2.c:112: `NbElt' undeclared (first use in this function)
manu2.c:112: (Each undeclared identifier is reported only once
manu2.c:112: for each function it appears in.)
manu2.c:115: `Tab' undeclared (first use in this function)
manu2.c:135: parse error before `}'
manu2.c:140: parse error before `void'
manu2.c:170: parse error before `}'
manu2.c:172: parse error at end of input


 
pkoi ds la fonction tri_y, NbElt 'est pas reconnu ???


Message édité par sseb22 le 17-03-2004 à 16:09:12

---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 17-03-2004 à 16:08:47    

update


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 17-03-2004 à 16:17:16    

quest ce qui change entre tri_x et tri_y ?????

Reply

Marsh Posté le 17-03-2004 à 17:33:34    

la ligne suivant laquelle on trie


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 17-03-2004 à 17:35:38    

t'es obligé de faire ca en C?
Avec un langage adapté au traitement du texte ca serait plus facile (Perl, Python, Ruby, awk, ...)

Reply

Marsh Posté le 17-03-2004 à 17:45:32    

je ne connais pas bien le C, le pascal et le fortran mais PAS DU TOUT les autres langages


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 19-03-2004 à 11:07:51    

Ton "typedef double cell_t[2];" sors le du main et met le avant.
Le problème pour NbElt viens de "cell_t *Tab", vu qu'il ne connais pas le type "cell_t" (connu uniquement du main() vu comment c'est déclaré)

Reply

Marsh Posté le 19-03-2004 à 13:59:26    

ok merci


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 19-03-2004 à 14:16:57    

g ce prog
 
g mis les fonctions en tête
g corrigé qq erreurs

Code :
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <errno.h> 
  4. typedef double cell_t[2];
  5. // Fonction de tri suivant les valeurs en Y  
  6. void tri_y(cell_t* Tab, int NbElt)
  7. {
  8.   int i, j, mark;
  9.   double max[2], aux[2];
  10.  
  11.   // boucle de tri  
  12.        
  13.   for(j=0;j<NbElt;j++)
  14.     { 
  15.       // recherche du max  
  16.       max[0] = Tab[0][0];
  17.       max[1] = Tab[0][1];
  18.       mark = 0;
  19.       for(i=1;i<NbElt-j;i++)
  20. {
  21.   if(max[1]< Tab[i][1])
  22.     {
  23.       max[0] = Tab[i][0];
  24.       max[1] = Tab[i][1];
  25.       mark = i;
  26.     };
  27. };
  28.      
  29.       // Permutation de max avec le dernier elt  
  30.       aux[0] = Tab[NbElt-j][0];
  31.       aux[1] = Tab[NbElt-j][1];
  32.       Tab[NbElt-j][0] = max[0];
  33.       Tab[NbElt-j][1] = max[1];
  34.       Tab[mark][0] = aux[0];
  35.       Tab[mark][1] = aux[1];
  36. };
  37. };
  38. // Fonction de tri suivant les valeurs en X  
  39. void tri_x(cell_t* Tab, int NbElt)
  40. {
  41.   int i, j, mark;
  42.   double max[2], aux[2];
  43.  
  44.   // boucle de tri  
  45.  
  46.   for(j=0;j<NbElt;j++)
  47.     { 
  48.       // recherche du max  
  49.       max[0] = Tab[0][0];
  50.       max[1] = Tab[0][1];
  51.       mark = 0;
  52.       for(i=1;i<NbElt-j;i++)
  53. {
  54.   if(max[0] < Tab[i][0])
  55.     {
  56.       max[0] = Tab[i][0];
  57.       max[1] = Tab[i][1];
  58.       mark = i;
  59.     };
  60. };
  61.      
  62.       // Permutation de max avec le dernier elt  
  63.       aux[0] = Tab[NbElt-j][0];
  64.       aux[1] = Tab[NbElt-j][1];
  65.       Tab[NbElt-j][0] = max[0];
  66.       Tab[NbElt-j][1] = max[1];
  67.       Tab[mark][0] = aux[0];
  68.       Tab[mark][1] = aux[1];
  69. };
  70. };
  71. int main(int argc, char **argv) 
  72.   void tri_x(cell_t*, int);
  73.   void tri_y(cell_t*, int);
  74.  
  75.   FILE *fin, *fout; 
  76.   double tmpf; 
  77.   cell_t *truc, *truc2; 
  78.   int m, n, i, j, taille; 
  79.  
  80.  
  81.   if(argc < 2) 
  82.     { 
  83.       puts(__FILE__": erreur ! manque le nom du fichier à traiter..." ); 
  84.       exit(1); 
  85.     }; 
  86.   fin = fopen(argv[1], "r" );
  87.   if(fin == NULL) 
  88.     { 
  89.       printf("Erreur avec %s",argv[1]);
  90.       perror(__FILE__); 
  91.       exit(1); 
  92.     }; 
  93.   fout = fopen(argv[2], "w" );
  94.   if(fout == NULL) 
  95.     {
  96.       printf("Erreur avec %s",argv[2]); 
  97.       perror(__FILE__); 
  98.       exit(1); 
  99.     }; 
  100.   n=atoi(argv[3]);
  101.   if(n==0)
  102.     {
  103.       printf("Erreur sur n" );
  104.       perror(__FILE__); 
  105.       exit(1); 
  106.     }; 
  107.   m=atoi(argv[4]);
  108.   if(m==0)
  109.     {
  110.       printf("Erreur sur m" );
  111.       perror(__FILE__); 
  112.       exit(1); 
  113.     };
  114.  
  115.  
  116.   // on recupere le 1er nombre  
  117.   fscanf(fin, "%lf", &tmpf); 
  118.  
  119.   // taille de la partition (nb de colonnes du tableau)  
  120.   taille = tmpf/n;
  121.  
  122.   // creation du tableau  
  123.   truc = (cell_t*)malloc(taille * sizeof(cell_t));
  124.  
  125.   for(j=0;j<n;j++)
  126.     {
  127.       // remplissage du tableau avec les lignes du fichier  
  128.       for(i=0;i<taille;i++)
  129. {
  130.   fscanf(fin,"%lf %lf", &truc[i][0], &truc[i][1]);
  131. };
  132.      
  133.       // stockage des m points les plus grands en y  
  134.      
  135.       // tri suivant y   
  136.       tri_y(truc,taille);
  137.      
  138.       // selection des m derniers points  
  139.      
  140.       // creation du tableau de taille m  
  141.       truc2 = (cell_t *)malloc(m * sizeof(cell_t));
  142.      
  143.       // remplissage des m points ds truc2   
  144.       for(i=0;i<m;i++)
  145. {
  146.   truc2[i][0] = truc[taille-i][0];
  147.   truc2[i][1] = truc[taille-i][1];
  148. }
  149.       // tri de truc2 suivant x  
  150.       tri_x(truc2,m);
  151.      
  152.       // ecriture des m points dans fout  
  153.       for(i=0;i<m;i++)
  154. {
  155.   fprintf(fout,"%lf %lf\n", truc2[i][0],truc2[i][1]);
  156. };
  157.     };
  158.   free(truc);
  159.   free(truc2);
  160.   return 0; 
  161. };


il compile mais fais une segmentation fault à l'exécution
je pense que c dû au type de truc et truc2 par rapport à leur utilisation  


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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