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

WinDev Discussion :

Comparer ligne par ligne les valeurs dans la colonne de table


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Comparer ligne par ligne les valeurs dans la colonne de table
    Bonjour à tous , je suis entrain de créer un petit projet qui gére la note dans une établissement , mon problème c'est sur la "Ex-æquo", j'ai trié en ordre décroissant la colonne moyenne après j'ai comparé ligne par ligne les valeurs de moyenne, et le rang c'est tiré à partir de ces derniers , puis j'ai comparé si il y a des moyennes pareils dans le colonne moyenne et si 'il y en a , je voudrait ajouter une petite "ex" juste après le rang.
    Le type de la colonne rang est de type texte non pas numérique.

    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    i,m,j sont des entier
    m=TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)
    POUR i=1 A m  
    	m=TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)  
    	POUR j=1 A m
    	  SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[j]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] ALORS 
    	  	TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"
    	  FIN
        FIN
    FIN
    et voici ce qui s'est passé

    Nom : Capture.PNG
Affichages : 2112
Taille : 26,8 Ko

    il ajoute la petite "Ex" aux lignes qui ne devraient pas y avoir et 2 fois pour ceux qui la devraient . C'est ça mon problème en général.
    Merci à tous pour ceux qui vont me répondre

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Peut-être qu'un débogage pourrait vous donner une piste dans ce qui s'est passé?

    PS: dans les boucles POUR, il est conseillé de remplacer le mot clé A par _A_

    PS2: pourquoi récupérer le nombre d'occurrences de la table à l'intérieur de la boucle POUR i , alors que cela a déjà été fait avant d'entrer dans cette boucle?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    j'ai modifié le code
    comme romulus m'a dit mais le résultat c'est comme toute à l'heure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i,m,j sont des entier
    m=TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)
    POUR i=1 _A_ m  
    	
    	POUR j=1 _A_ m
    	  SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[j]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] ALORS 
    	  	TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"
    	  FIN
        FIN
    FIN

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par romulus001 Voir le message
    Peut-être qu'un débogage pourrait vous donner une piste dans ce qui s'est passé?
    Il semblerait que cette remarque a été ignorée

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Je vient de jeter un coup d’œil dans le débogage , En réalité le code devrait fonctionné mais je ne sais pourquoi ça fonctionne pas

  6. #6
    Invité
    Invité(e)
    Par défaut
    Idée de résolution : peut-être avoir le cas où i=j ?

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Bonjour,

    Vous bouclez deux fois.
    Donc, vous identifiez deux fois les ex-æquo.

    Il faut le faire en une passe, en comparant le niveau en cours au niveau précédent.

    Par ailleurs, lorsque romulus001 vous suggère
    PS: dans les boucles POUR, il est conseillé de remplacer le mot clé A par _A_
    il faut aller voir dans la doc le motif de cette proposition.

    Si vous aviez revu la doc, vous auriez compris qu'il fallait aussi oublier l'assignation de TableOccurrence à m.
    Remarque que vous comprendrez si vous cherchez _A_ dans l'index de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i est un entier
    
    POUR i=2 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière) 
    	//on commence nécessairement à 2 sinon la valeur [i-1] vaudra 0 pour i = 1 et cela générera une erreur. (les indices des lignes commencent à 1) 
    	POUR j=1 _A_ m
    	  SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i-1] ALORS 
    	  	TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"
    	  FIN
        FIN
    FIN
    Non testé, mais cela devrait fonctionner.

    Bon travail

    Hemgé

  8. #8
    Invité
    Invité(e)
    Par défaut
    @Hemgé : si les 2 meilleurs élèves ont tous les 2 une note moyenne de 20, il faut leur ajouter "ex" dans la colonne "rang"
    L'idée de faire 2 boucles est une bonne idée, mais elle a mal été gérée, la boucle j doit partir de i+1, puis, avant d'ajouter le mot "ex", il suffit de contrôler qu'il n'a pas déjà été ajouté auparavant (par exemple, à l'aide de Contient)

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 122
    Points : 9 547
    Points
    9 547
    Par défaut
    Ton roblème n'est pas à probablement parler un problème Windev. C'est un problème de logique. Si tu programmais en C ou en n'importe quel autre langage, tu aurais le même problème.
    Si tu ne trouves pas par toi-même la solution, tu ne sauras jamais réfléchir sur un programme.
    Je te propose la modification suivante: ton programme ne marchera pas mieux, mais tu pourras réfléchir, et trouver toi-même pourquoi ton programme plante. Et peut-être trouver une solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    i,m,j sont des entier
    m=TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)
    POUR i=1 _A_ m  
     
    	POUR j=1 _A_ m
    	  SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[j]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] ALORS 
    	  	TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"
                     trace ( " les lignes " + i + " et  " + j  + " sont ex-aequo ; ajout de  EX sur la ligne n° " + j )   
    	  FIN
        FIN
    FIN
    J'ai juste ajouté la ligne trace ...

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci à tous pour vos suggestion.
    avec le code ci-après ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     POUR i=1 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière) 
    	//on commence nécessairement à 2 sinon la valeur [i-1] vaudra 0 pour i = 1 et cela générera une erreur. (les indices des lignes commencent à 1) 
    	POUR j=i+1 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière) 
    		SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[j]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] ALORS 
    			TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"
    			TABLE_moyenne_notepond_reng_par_matière.COL_Rang[j]+=" ex"
    		FIN
    	FIN
     FIN
    j'ai obtenu le résultat suivant:
    Nom : Capture1.PNG
Affichages : 1986
Taille : 26,7 Ko

    mais si il y a 3 moyennes pareils , voilà ce qui se passe :

    Nom : Capture2.PNG
Affichages : 2018
Taille : 29,2 Ko

    comment remédier à ça ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Hobinantenaina1 Voir le message
    comment le remédier ?
    Je ne sais pas si la communication est bonne entre la france et Madagascar, il semblerait que certains de mes messages n'arrivent pas à destination

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 256
    Points : 12 919
    Points
    12 919
    Par défaut
    Bonjour,
    Une piste (mais sans le code !):
    La première boucle part de la ligne 1 jusqu'à la dernière (indice I1).
    La deuxième boucle par de la ligne 1 jusqu'à la dernière (indice I2).
    Si les deux lignes ont la même moyenne ET que les indices sont différents => tag de la ligne I1 ET sortie de la boucle
    Fin deuxième boucle
    Fin première boucle

    Ainsi une ligne n'est traitée qu'une seule fois, et toutes les lignes sont traitées.

    Pourquoi les deux boucles partent de 1 ? Imaginons que la table ne contienne que 3 lignes, avec la même moyenne.
    Comme je ne tague que la ligne qui est "pointée" par la première boucle, elle doit parcourir toute la table.
    Et comme je veux aussi traiter la dernière ligne, il faut bien que je la compare avec les lignes précédentes.

    Tu peux aussi optimiser en ne comparant chaque ligne qu'avec la précédente (si elle existe) et la suivante (si elle existe). Ainsi tu n'as plus qu'une seule boucle, et non deux boucles imbriquées.

    Et comme l'indique Romulus001, WinDev est livré avec un débuggeur. Autant l'utiliser pour savoir ce qu'il se passe.

    Tatayo.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci à tous pour vos suggestions ,
    mon problème est résolu grâce à la proposition de Romulus001 , j'ai utilisé la fonction contient() pour déterminer si une des chaque lignes contient déjà une petite "ex" sinon je l'ajoute.

    Voici le code:

    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
     
    i,j sont des entier
    POUR i=1 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)    
    	POUR j=i+1 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière)
    		SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[j]=TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] ALORS 
    			SI Contient(TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i],"ex")=Faux   ALORS 
    			          TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i]+=" ex"     
    		    FIN
     
    		    SI Contient(TABLE_moyenne_notepond_reng_par_matière.COL_Rang[j],"ex")=Faux  ALORS 
    		    	 TABLE_moyenne_notepond_reng_par_matière.COL_Rang[j]+=" ex"
    		    FIN
    	   FIN
        FIN
    FIN
    et voici les résultats:
    Nom : Capture7.PNG
Affichages : 2023
Taille : 32,3 Ko

    Nom : Capture8.PNG
Affichages : 1959
Taille : 26,7 Ko

    Merci encore à tous pour votre participation

  14. #14
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Citation Envoyé par romulus001 Voir le message
    @Hemgé : si les 2 meilleurs élèves ont tous les 2 une note moyenne de 20, il faut leur ajouter "ex" dans la colonne "rang"
    L'idée de faire 2 boucles est une bonne idée, mais elle a mal été gérée, la boucle j doit partir de i+1, puis, avant d'ajouter le mot "ex", il suffit de contrôler qu'il n'a pas déjà été ajouté auparavant (par exemple, à l'aide de Contient)
    J'avais évidemment prévu de mettre aussi à jour la ligne [i-1] , mais je ne me suis pas relu et c'est resté dans mes circonvolutions cérébrales.
    Lesquelles ne sont pas programmées pour s'épancher sans instruction spécifique ...

    Mais je n'avais pas prévu le triplé !
    Donc, en tenant compte de votre proposition, ceci devrait faire l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    i est un entier
     
    POUR i = 2 _A_ TableOccurrence(TABLE_moyenne_notepond_reng_par_matière) 
    	//on commence nécessairement à 2 sinon la valeur [i-1] vaudra 0 pour i = 1 et cela générera une erreur. (les indices des lignes commencent à 1) 
     
    	  SI TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i] = TABLE_moyenne_notepond_reng_par_matière.COL_Moyenne[i-1] ALORS 
    	  	TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i] += " ex"
                    SI Contient(TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i-1],"ex") = Faux  ALORS TABLE_moyenne_notepond_reng_par_matière.COL_Rang[i-1] += " ex"
    	  FIN
     
    FIN

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 49
    Dernier message: 02/12/2015, 18h22
  2. [Batch] Deux boucles FOR pour comparer deux fichiers ligne par ligne et une condition IF
    Par Christophe.G dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 18/11/2014, 23h10
  3. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  4. [XL-2007] Comparer 2 tableaux lignes par lignes
    Par jomassilia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/03/2013, 02h16
  5. intervertir les valeurs dans une colonne d'une table
    Par hammou dans le forum Débuter
    Réponses: 2
    Dernier message: 26/01/2004, 10h15

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