IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tri un fichier sur la dernière colonne


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 0
    Points
    0
    Par défaut Tri un fichier sur la dernière colonne
    Bonjour,

    Après un calcul sur C je sauvegarde 8 variables dans un fichier.txt

    fprintf(input_data_trans,"%.f %.f %.3E %.3E %.3E %.3E %.3E %.3E\n",No,A,B,C,D,E,F,distance);

    Donc le fichier est de la forme suivante:

    0 2 1.340E-004 1.070E-005 1.111E-001 5.177E-001 3.484E-001 7.584E-001
    1 6 7.190E-005 6.470E-006 5.556E-001 2.595E-001 9.074E-002 3.431E-002
    2 2 1.810E-004 1.360E-005 1.111E-001 7.131E-001 5.250E-001 2.975E-001
    3 8 1.280E-004 9.070E-006 7.778E-001 4.927E-001 2.491E-001 6.145E-002
    4 8 8.440E-005 7.190E-006 7.778E-001 3.114E-001 1.346E-001 2.758E-001
    5 9 2.180E-004 5.220E-006 8.889E-001 8.669E-001 1.462E-002 4.148E-001
    6 4 7.580E-005 1.120E-005 3.333E-001 2.757E-001 3.788E-001 2.891E-001
    7 5 1.270E-004 9.980E-006 4.444E-001 4.886E-001 3.045E-001 6.383E-002
    8 10 7.840E-005 7.970E-006 1.000E+000 2.865E-001 1.821E-001 2.775E-001
    9 1 1.690E-004 6.020E-006 0.000E+000 6.632E-001 6.334E-002 2.445E-001

    => le fichier contient :10 lignes et 8 colonnes.

    par la suite je veux trier les lignes de mon fichiers suivant la dernière colonnes (distance)

    ç.a.d:

    7.584E-001 > 3.431E-002
    Donc la ligne
    (0 2 1.340E-004 1.070E-005 1.111E-001 5.177E-001 3.484E-001 7.584E-001) se déplace dans la 2 éme ligne
    et la ligne
    (1 6 7.190E-005 6.470E-006 5.556E-001 2.595E-001 9.074E-002 3.431E-002) sera dans la 1 ère ligne.

    Que je dois faire pour lire fichier et tirer les valeurs? Merci

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    tu crées le fichier, alors pourquoi ne pas trier les valeurs avant de les écrire dans le fichier ?

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Tu ne peux pas lire avec fscanf et ranger tes données dans un tableau et le trier avec qsort ?

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Pouvez vous m'expliquer encore vos proposition. Je suis débutante en C

    @ kwariz: J'ai pas pu les trier avant car les valeurs est une conclusion d'une opération mathématique dans une boucle.

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par mouna1985 Voir le message
    Pouvez vous m'expliquer encore vos proposition. Je suis débutante en C

    @ kwariz: J'ai pas pu les trier avant car les valeurs est une conclusion d'une opération mathématique dans une boucle.
    Au lieu de faire un fprintf, tu places ces valeurs dans un tableau que tu tries puis que tu sauves dans un fichier.
    Tu définis une structure du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct s_data {
      int No;
      double A;
      double B;
      double C;
      double D;
      double E;
      double F;
      double distance;
    };
    et un tableau de telles structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct s_data my_data[N]
    où N est une taille max suffisament grande (suivant le cas il est préférable d;utiliser l'allocation dynamique mais comme tu débutes on va s'en tenir à un tableau de taille fixe).

    Au lieu du fprintf, tu écris dans le tableau, après la boucle tu sais combien tu as d'éléments dans le tableau et tu le tries
    Ensuite tu fais une boucle sur le tableau trié pour l'écrire dans le fichier.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Comment je peux écrire après ça dans le tableau??

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Pour trier un tableau (sans dépenser trop d'efforts en codage) tu peux utilise la fonction qsort (il faudra inclure stdlib.h).
    La première chose à faire est d'écrire une fonction qui compare deux lignes de ton tableau. Cette fonction qu'on va nommer compare doit accepter comme paramètre deux pointeurs (un par ligne comparée) et renvoie un entier qui vaut -1 si la première ligne vient avant la seconde, 0 si les deux lignes ont des clés égales, 1 si la seconde ligne vient avant la première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    int compare(const void* param1, const void* param2)
    {
      // on commence par dire que les paramètres sont des pointeurs
      // sur des lignes
      struct s_data* ligne1=(struct s_data *)param1;
      struct s_data* ligne2=(struct s_data *)param2;
     
      // on compare les lignes. Comme on effectue une comparaison
      // sur des doubles on définit d'abord une limite à partir de laquelle
      // on considère deux doubles égaux.
      static double epsilon = 1e-8;
      if (fabs(ligne1->distance-ligne2->distance))<epsilon {
        // ici on considère que les deux lignes ont la même distance
        // car la différence entre leur distance en valeur absolue
        // est inférieure à notre limite epsilon
        return 0;
      } else if (ligne1->distance<ligne2->distance) {
        // ligne1 devra se placer avant ligne2
        return -1;
      } else if (ligne1->distance>ligne2->distance) {
        // ligne1 devra se placer après ligne2
        return 1;
      }
    }
    Ensuite pour trier le tableau il faut juste faire un appel à qsort en lui donnant le nom du tableau que tu veux trier, le nombre d'éléments que ce tableau contient, la taille de chaque élément et comment les comparer :
    qsort(my_data, nombre_elements, sizeof(struct s_data), compare);

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 10
    Points : 0
    Points
    0
    Par défaut
    Et comment je peux afficher le résultats pour vérifier?

  9. #9
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Comme on affiche un tableau ... une boucle for et un printf par exemple ?

Discussions similaires

  1. Supprimer un évènement sur la dernière colonne (datagridview)
    Par jacko842 dans le forum Développement Windows
    Réponses: 1
    Dernier message: 09/02/2012, 16h24
  2. Tri de fichiers sur un disque dur ou une clé USB
    Par J.Michel dans le forum Windows XP
    Réponses: 6
    Dernier message: 24/06/2008, 15h17
  3. Tri effectif que sur certaines colonnes
    Par benoitbs dans le forum Excel
    Réponses: 4
    Dernier message: 22/02/2008, 15h36
  4. tri par moyenne sur plusieurs colonnes
    Par adr22 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/12/2007, 16h19
  5. tri sur la xème colonne
    Par r-zo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/07/2003, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo