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

Fortran Discussion :

Eviter le zero dans un array


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut Eviter le zero dans un array
    Bon soir,

    voilà un problème basique. Array comme

    1 1
    2 2
    3 3
    0 Solution: 5
    5 6
    0
    6

    Alors, je veux lire seulement le numeros IF(v(i).ne.0)
    Je ne sais pas si la solution est pareille que la montré dans "Problème dans la lecture partiel d'un archive", mais j´ai essaie déja et Ça ne marche pas comme je veux.

    Quelques idees?

    MerÇi en avant

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Par défaut
    Bonjour,

    et bien à mon avis, tu peux essayer quelque chose de similaire.
    Pour une prochaine fois, je te conseilles de bien détailler ton problème, les solutions qui te seront proposées n'en seront que meilleures.

    Il me semble ici que :
    la première variable de chaque ligne est un entier.
    quand cette variable est égale à 0 la seconde variable ne nous intéresse pas.
    sinon : la seconde variable est également un entier et on veut la stocker.

    Une idée peut être d'utiliser une lecture avec l'instruction Advance="NO".
    l'idée est de lire la première variable, la tester, en fonction du résultat lire la seconde variable et passer une ligne ou bien sauter une ligne directement.

    ce qui donne quelquechose comme cela
    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
     
    !maz compteur ligne du tableau de stockage
    nligne=0
    do
     read(10,'(i0)',advance="NO",iostat=io)v1
      if(io/=0)exit !condition sortie de boucle
     if(v1/=0)then  
       read(10,'(i0)',advance="YES",iostat=io)v2 
    !stockage v1 v2
       nligne=nligne+1
       valeur1(nligne)=v1
       valeur2(nligne)=v2
     else
       f(v1==0)read(10,'(a)',advance="YES",iostat=io) !on ne lit rien et on passe une ligne
    enddo
    Ca c'est pour l'idée générale je te laisse le soin de compléter avec les déclarations nécessaires. Je n'ai pas testé ce code donc je ne garanti pas qu'aucune erreur ne s'y trouve.

    Bon courage !

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Sans remettre en question la solution proposée par yogitetradim, les internal read offrent souvent une solution intéressante à ce genre de problème. En utilisant cette approche, le programme de yogitetradim devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nligne=0
    do
       read(10,'(a)',iostat=io) Ligne
       if(io/=0)exit !condition sortie de boucle
       read (Ligne,*) v1
       if(v1/=0)then  
          read (Ligne,*) v1, v2 ! plus simple de relire v1 que de le sauter...
          !stockage v1 v2
          nligne = nligne+1
          valeur1(nligne) = v1
          valeur2(nligne) = v2
       endif
    enddo

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut Problème persiste
    Excusez moi pour l'ignorance, et merÇi pour l'aide, mais je trouve encore des problèmes avec les propossitions citée jusqu'ici.

    Alors, je répéte la question:si le array initial lit est de la form a(nligne): 1 2 3 4 0 5 0 6, c'est possible de le réecrire dans un array comme res(n): 1 2 3 4 5 6?

    La proposition de Bergeron utilise Ligne, que j'entends comme un array. Nonobstant, je ne comprends pas v1, v2 et la sequence de programmation. Mon impression est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    program dontread0
     
    IMPLICIT NONE
     
    INTEGER, PARAMETER :: nligne=8 !number of rows in file
    INTEGER n
    INTEGER, DIMENSION(nligne) ::a
    INTEGER, DIMENSION(n) :: res
     
    !et determiner n avec le systeme  de "Problème dans la lecture partiel d'un !archive" et après avec vos propositions res
     
    end program
    C'est possible avec les codes présentés. Encore mes excuses d'être un rookie, et merÇi en avant pour le feedback

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Jusqu'à date, cette discussion démontre surtout que si une question n'est pas bien formulée, les chances que la réponse soit adéquate sont plutôt faible...

    Pour dimensionner Res à n éléments à l'exécution, Res doit être « allocatable ».

    L'algorithme général est :
    • Lire les éléments
    • Compter les éléments pertinents
    • Allouer la variable résultante
    • Copie les éléments

    Si tu as une idée de la longueur de la première liste, la technique que tu propose (integer, parameter :: nligne) est tout à fait adéquate.

    Si tu n'as pas idée de la longueur totale de la liste, la solution est plus complexe :
    • Tu peux utiliser une liste liée (linked list).
    • Lire le fichier « dans le vide », juste pour compter le nombre de ligne, allouer une liste assez longue, « rewinder » le fichier, le lire effectivement.

Discussions similaires

  1. eviter les zeros dans un etat
    Par lbar012001 dans le forum IHM
    Réponses: 3
    Dernier message: 08/08/2007, 11h18
  2. Réponses: 5
    Dernier message: 18/11/2005, 22h11
  3. [MySQL] non affichage d'un zero dans le resultat d'une requete
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/11/2005, 00h31
  4. Insérer dans un array
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 29/03/2005, 09h22
  5. Eviter plusieurs OR dans une requete SELECT
    Par zoubidaman dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/06/2004, 05h56

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