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

Algorithmes et structures de données Discussion :

Problème de raisonnement dans le cadre de boucles imbriquées


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut Problème de raisonnement dans le cadre de boucles imbriquées
    Bonjour

    J ai honte de poster tant la solution à mon problème doit être simple mais il m'est 'intellectuellement' impossible d inverser mon raisonnement alors je m adresse à vous.
    Comme une image vaut mieux qu un long discours :
    Nom : chart.png
Affichages : 539
Taille : 27,8 Ko

    il s agit d un chart simplifié de cours boursiers.

    Actuellement je boucle de 1 à n pour détecter les baisses de 2 unités et le remontés de 3. J ai volontairement simplifié le chart mais il se peut que les cours varient entre 9 et 11 par exemple mais sans jamais dépasser le cours au point 9.

    Etant donné que je boucle de 1 à N, ici je détecte [3-19].Si j imbrique une boucle après la détection du 3 il va me détecter [4-20].... Tout ceci en supposant que j ai les 22 de mon chart.

    Mais étant donné que je lis un fichier, en X=4, je n ai que les 4 première valeurs.

    Je cherche donc à détecter une baisse d'au moins 2 unités (ici x=11) par rapport à un dernier plus haut (ici le point en x=9) suivi d'une remontée d'au moins 3 unités (ici x=14).

    Je sais que je dois boucler de N à 1 mais impossible pour mon cerveau de quinqua débutant en informatique d'envisager une boucle dans ce sens !!!

    J ai donc besoin de vous.

    Merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Pardon d'être cru, mais on ne comprend rien. Que donne-t-on en entrée ? Que veut-on en sortie ? Pourquoi ne parles-tu jamais des pentes des droites ? Pourquoi ne parles-tu jamais des valeurs d'ordonnée ? D'où vient "[3-19]" ? Pourquoi 3 ? Pourquoi 19 ? Pourquoi 4 ? Pourquoi 20 ? Cherche-t-on un maximum de baisse et un maximum de hausse ? Ne travaille-t-on que sur les minima locaux ?

    Ce n'est pas une litanie. J'attends une réponse à ces questions.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Rien compris.
    Essaye d'expliquer clairement ce que tu cherches, sans nous parler de boucles de boucles ...

  4. #4
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Ok, pas de pb.
    C est vrai qu'à me relire...

    Mon pb est donc le suivant :

    Je lis un fichier de cours de bourse journaliers.
    Pour chaque date j ai le prix d ouverture, de fermeture, le plus haut et le plus bas.

    Je cherche à savoir si le plus haut du jour, c est à dire le dernier 'lu' remplit les critères suivants.
    -Il est plus haut de 3 points qu'un plus bas précédent.
    -que ce même plus bas précédent correspond à une baisse d au moins 2 points par rapport à un plus qui le précède.
    -

    (C est ce que j ai voulu représenter par la figure tracé entre les point d’abscisse 9 et 14 de manière très simplifiée)

    Dernière précisons, seuls les plus hauts et plus bas sont pris en compte, les phases de montées et de descente n'ont aucune durée/longueur déterminée contrairement à ce que peut laisser paraître/penser mon graphique.

    J espère cette fois avoir été plus clair.

    merci pour votre aide

  5. #5
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème de raisonnement dans le cadre de boucles imbriquées
    Bonjour, :-)

    La dernière mise au point confirme le premier énoncé du problème.

    Citation Envoyé par Debutant_pc Voir le message
    ... Je cherche donc à détecter une baisse d'au moins 2 unités (ici x=11) par rapport à un dernier plus haut (ici le point en x=9) suivi d'une remontée d'au moins 3 unités (ici x=14) ...
    Soit (Un) la suite des valeurs successives du cours en Bourse d'une action donnée.

    1°) Il faut d'abord envisager un repérage systématique des extremums (maximums ou minimums) suffisamment prononcés, par le calcul de l'écart séparant une valeur courante (Uk) de ses deux valeurs voisines, antérieure (Uk-1) et postérieure (Uk+1) .
    Arès voir convenu d'un seuil arbitraire (s = 0.4) il est possible d'associer à la suite précédente (Un) une seconde suite (Vn) définie de la façon suivante;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Si ((U[k] > U[k-1] + s) ET (U[k] > U[k+1] + s)) OU ((U[k] < U[k+1] - s) ET (U[k] < U[k-1] - s)) Alors Vk = 2.U[k] - U[k+1] - U[k-1]
    Sinon V[k] = 0 .
    La suite des cours (Un) étant indexée de (0) à (N) - soit (N + 1) valeurs - celle des extremums est définie de (1) à (N-1); on pourra poser V(0) = V(N) = 0 , afin d'éliminer toute indétermination.
    Il faut connaître la date (T°) du premier extremum, ce que donnent les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    k = 0;
    Tant que (V[k] = 0) Faire k = k + 1;
    T° = k ; 
    Si (U[] > U[0]) Alors s = 1 Sinon s = -1 ;
    2°) Après la suite indicatrice des pics (Vn), celle (Wn) du sens des variations des cours, définie de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pour k Variant de (0) à (T° - 1) Faire V[k] = s ;
    Puis au-delà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Si (V[k] <> 0) Alors W[k] = 0
    Sinon 
    Début
    Si (V[k - 1] = 0) Alors W[k] = W[k - 1]
    Sinon W[k] = -W[k - 2] 
    Fin
    Ces deux suites, si elles sont correctement codées, peuvent constituer une base pour la suite du programme.
    Il n'y a pas de boucles imbriquées; il faut seulement définir des suites différentielles, qui permettent de caractériser les variations du cours boursier.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  6. #6
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2013
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Février 2013
    Messages : 317
    Points : 233
    Points
    233
    Par défaut
    Ma vision: Lecture des données en deux passes pour extraire les plus hauts et les plus bas
    1ere passe:
    Tant que [Tn]>[Tn-1] avancer
    Sinon stocker valeur [Tn-1] dans [DHn] // c'est un plus haut
    2eme passe:
    Tant que [Tn]<[Tn-1] avancer
    Sinon stocker valeur [Tn-1] dans [DBn] // c'est un plus bas
    Quand on a tous les plus hauts et les plus bas on teste les antécédents avec n comme index.
    Savoir pour comprendre et vice versa.

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 393
    Points
    9 393
    Par défaut
    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
     
    plus_haut_jamais_vu = 0
    plus_bas_jamais_vu = 999999
     
    Lire_ligne ( --> ligne_lue)
    Tantque Ligne_lue <> NULL 
         Plus_haut_jour = 3ème valeur de ligne_lue
         Plus_bas_jour = 4ème valeur de ligne_lue
         si plus_haut_jour > plus_haut_jamais_vu  alors plus_haut_jamais_vu  = plus_haut_jour
         si plus_bas_jour < plus_haut_jamais_vu -2 alors 
              plus_bas_jamais_vu = plus_bas_jour
         fin
         si plus_haut_jour > plus_bas_jamais_vu + 3 alors
              print ( "Bingo !",  ligne_lue)
         fin
         Lire_ligne ( --> ligne_lue)
    fin
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    J espère cette fois avoir été plus clair.
    J'en étais sûr. Tu n'as répondu à aucune des questions. Du coup, on ne sait toujours pas ce que tu veux en sortie. Une réponse "oui ou non" ? La hausse maximale et la baisse maximale répondant aux critères ? Ou la hausse la plus proche et la baisse la plus proche répondant aux critères ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Merci à vous pour toutes ces pistes.

    @Flodelarab : Je susi désolé, je pensais avoir été assez explicite avec :
    Je cherche à savoir si le plus haut du jour, c est à dire le dernier 'lu' remplit les critères suivants.
    implicitement la réponse est donc un Oui ou un Non.

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Quand tu parles du dernier lu, tu es déjà dans l'action avant même d'avoir défini ton objectif. De là à voir dans l'avenir ce qui va être lu ...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Quand tu parles du dernier lu, tu es déjà dans l'action avant même d'avoir défini ton objectif. De là à voir dans l'avenir ce qui va être lu ...
    Je m explique vraiment mal alors car mon objectif est vraiment bien défini. Et il tend non pas à voir dans l avenir ce qui va être lu mais à envisager qu un seuil va être atteint.
    C est ni plus ni moins que ce que font toutes les personnes qui détiennent des actions. C est un pari sur l avenir.

    Mais je m initie à l informatique et peut être que mon raisonnement n est pas correct. Quel devrait t il être selon toi ?

  12. #12
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème de raisonnement dans le cadre de boucles imbriquées
    Un détail m'intrigue dans l'énoncé, que tu as bien formulé deux fois:

    Citation Envoyé par Debutant_pc Voir le message
    ... Je cherche donc à détecter une baisse d'au moins 2 unités (ici x=11) par rapport à un dernier plus haut (ici le point en x=9) suivi d'une remontée d'au moins 3 unités (ici x=14) ...
    Citation Envoyé par Debutant_pc Voir le message
    ... Je cherche à savoir si le plus haut du jour, c est à dire le dernier 'lu' remplit les critères suivants.
    -Il est plus haut de 3 points qu'un plus bas précédent.
    -que ce même plus bas précédent correspond à une baisse d au moins 2 points par rapport à un plus qui le précède.
    ... (C est ce que j ai voulu représenter par la figure tracé entre les point d’abscisse 9 et 14 de manière très simplifiée) ...
    L'exemple mis en valeur
    V09 = 98 ; V11 = 96 ; V15 = 100
    répond bien aux exigences puisqu'il vérifie: ∆V9-11 = -2 ; V11-15 = +4 .

    Mais que dire du cas suivant:
    V09 = 98 ; V11 = 91 ; V15 = 95 ?
    Il répond lui aussi aux conditions exprimées: ∆V9-11 = -7 < -2 ; V11-15 = +4 > 3 ,
    mais s'agissant d'un cours boursier, c'est une occurrence dépourvue d'intérêt puisqu'elle correspondrait à une revente à perte:
    V15 - V09 = -3 ...

    Ne faudrait-il pas plutôt rechercher les conditions:
    Vj - Vi <=-2 ; Vk - Vi >= +3 ?


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  13. #13
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Tu as du avoir un pb lors de l écriture de tes exemple car tu écris V09 = 98 ; V11 = 96 ; V15 = 100 et V09 = 98 ; V11 = 91 ; V15 = 95 ? mais je crois avoir compris.

    Effectivement on pourrait procéder de la sorte mais il faut considérer que je lis le fichier chronologiquement et que je suis à T=14 au moment ou je fais mon test.
    Mon objectif est de 'capturer' seulement le dernier mouvement depuis un pic (en x=9).

    L’idéal serait d être en x=12, vérifier que je viens de passer un pic à la baisse, vérifier que la chute est d au moins 2 par rapport à un pic, attendre que le cours remonte de +3 et ouvrir la position à l achat... Mais comme je ne m en sortais déjà pas avec mon simple pb, j ai simplifié mon énoncé pour avoir une "base de travail".

    Si je procédais comme tu le proposes, je capturerais beaucoup trop de choses et pas que du bon.
    Ici on aurait détecté une chute de 2 en X=3, une remontée de 3 en X=19.
    Bon ok ça aurait fonctionné avec mon chart pke j ai bien une remontée de 3 en X=22 mais j ai tracé ça simplement pour avoir un avis. Ici X=19 aurait pu être un plus haut historique et le cours ne serait jamais repassé au dessus et plus aucune position n aurait été ouverte.
    Alors qu en utilisant 'mon' système, si le cours fluctue après X=19 alors je peux toujours profiter de ces mouvements etant donné que l on prend en compte le dernier 'modèle'...

    mais s'agissant d'un cours boursier, c'est une occurrence dépourvue d'intérêt puisqu'elle correspondrait à une revente à perte:
    En bourse on peut vendre à découvert et ainsi gagner à la hausse comme à la baisse mais étant donné que mon système est censé ne détecter que les hausse, effectivement ça aurait été perdant.

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Tu insistes sur le fait que tu lis le fichier 'ligne à ligne'.
    Ok.
    En lisant ligne à ligne, le pseudo-code que j'ai proposé me semble convenir, meêm après les différentes discussions qui ont suivi.

    Mais sinon, tu peux parfaitement lire tout le fichier (ou tous les enregistrements qui concernent une même action), puis faire le traitement. Les ordinateurs d'aujourd'hui sont capables de charger en mémoire des tableaux 1000 fois plus gros que ceux que tu as.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Je te remercie pour ton 'code'.
    Je l ai utilisé comme 'base'.
    J'avais simplement oublié de mettre le post e résolu et comme d autres messages arrivent je laissais ouvert.

  16. #16
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    a la bourse et ses vicissitude

    pour info un valeur boursière tels que Debutant_pc l'entend est composé de n valeur

    Valeur d'ouverture
    Valeur de fermeture
    Valeur la plus haute
    valeur la plus basse
    le nombre d'operation passé pendant la seance
    ...

    Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TVALBOURSE  = ENREGISTREMENT
      VALOPEN  numeric
      VALCLOSE numeric
      VALMAX    numeric
      VALMIN    numeric
      .... 
    end;
    je suppose qu'il a une une liste de valeurs boursière

    donc

    Je cherche à savoir si le plus haut du jour, c est à dire le dernier 'lu' remplit les critères suivants.
    -Il est plus haut de 3 points qu'un plus bas précédent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       -Il est plus haut de 3 points qu'un plus bas précédent.
      POUR  I DE 1 JUSQU'A N-1 FAIRE
       //-Il est plus haut de 3 points qu'un plus bas précédent.
        SI  (LIST[N].VALMAX - LIST[N-I].VALMIN) > 3  ALORS 
          POUR  j DE 0 JUSQU'A i-1 FAIRE
         // -que ce même plus bas précédent correspond à une baisse d au moins 2 points par rapport à un plus qui le précède.
            SI  (LIST[N-I].VALMIN - LIST[N-I-j].VALMAX) < 2  ALORS 
              AJOUTEINDICETMP(N)
            FINSI
          FINPOUR
        FINSI
      FINPOUR
    voila mes deux cents
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  17. #17
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème de raisonnement dans le cadre de boucles imbriquées
    Voici ce que donne le traitement d'une séquence erratique de 61 valeurs entières (Liste U) de laquelle on peut extraire les séquences croissantes dont les termes dépassent le maximum précédent (Liste W, couleur verte):

    Nom : Image_q=5.545.png
Affichages : 278
Taille : 12,5 Ko

    Il faut distinguer dans la première liste (Lu) quatre sortes de termes:
    a) d'une part les extremums (minimums ou maximums), et d'autre part
    b) les termes qui n'en sont pas, et appartiennent à une sous-séquence croissante ou décroissante;
    les résultats correspondants sont consignés dans une seconde liste (Lv), où l'on trouve 4 valeurs arbitrairement choisies (1, 2, 101, 202) caractérisant chacun des cas.
    Le zéro résiduel traduit l'absence de caractérisation.

    Il est alors facile de reprendre l'édition de la première liste dans (Lw), après y avoir introduit la détection des séquences croissantes situées au-delà du maximum qui les précède.

    La difficulté réside dans la probabilité non négligeable de doublets de valeurs extrêmes - voir l'exemple ci-dessus; si l'on néglige l'existence de ces paliers, on risque de ne pas repérer un extremum et de compromettre l'efficacité de l'algorithme.
    La première valeur (k = 0) n'est pas identifiable, d'où Lv[0] = 0 ; mais cela n'a par la suite aucune importance.
    La seconde et l'avant-dernière (k = 1 et Nmax - 1) doivent vérifier des conditions de complexité comparable; les valeurs internes, les plus nombreuses (k variant de 2 à Nmax - 2), sont l'objet du traitement le plus lourd.
    En effet, la comparaison du terme de rang (k) doit à priori être effectuée sur les domaines [k - 2 ; k + 1] (Test21...) et/ou [k - 1 ; k + 2] (Test12...).
    Quand à la dernière, sa caractérisation est provisoire, et relativement facile.

    Voici l'essentiel du programme qui a été compilé; l'initialisation de la première liste (Lu), hors sujet, a été laissée de côté.
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     CONST Nmax = 60; o = 5;
     
     TYPE LstE = ARRAY[0..Nmax] OF LongInt;
     
     VAR Lu, Lv, Lw: LstE;
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     Liste W
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     PROCEDURE InitListeW(L_u, L_v: LstE; VAR L_w: LstE);
       CONST O2 = 2 * o;
       VAR h, k: Byte; Lim: LongInt; Test: Bool;
       BEGIN
         L_w:= L_u; h:= 0; Lim:= L_u[0];
         FOR k:= 0 TO (Nmax) DO
           BEGIN
             h:= L_v[k];
             CASE h OF  1: E(0011); 101: E(0009);
                        2: E(0014); 202: E(0012)
                        ELSE E(0015)  END;
             Test:= ((L_v[k]=1) OR (L_v[k]=202));
             IF ((L_u[k]>Lim) AND Test) THEN E(0210);
             IF (k=Nmax) AND ((L_u[k]>L_u[k - 1]) AND (L_v[k]>Lim)) THEN
               E(0010);
             We(12 + O2, k + 5, Lw[k], o); IF (L_v[k]=202) THEN Lim:= L_u[k]
           END
       END;
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     Recherche des extremums
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     FUNCTION Tmax11(k: Byte; L_u: LstE): Bool;
       BEGIN
         Result:= ((L_u[k]>L_u[k - 1]) AND (L_u[k]>L_u[k + 1]))
       END;
     
     FUNCTION Tmax12(k: Byte; L_u: LstE): Bool;
       VAR Test12: Bool;
       BEGIN
         Test12:= ((L_u[k]>L_u[k - 1]) AND (L_u[k]>L_u[k + 2]));
         Result:= ((L_u[k]=L_u[k + 1]) AND Test12)
       END;
     
     FUNCTION Tmax21(k: Byte; L_u: LstE): Bool;
       VAR Test21: Bool;
       BEGIN
         Test21:= ((L_u[k]>L_u[k - 2]) AND (L_u[k]>L_u[k + 1]));
         Result:= ((L_u[k]=L_u[k - 1]) AND Test21)
       END;
     
     FUNCTION Tmin11(k: Byte; L_u: LstE): Bool;
       BEGIN
         Result:= ((L_u[k]<L_u[k - 1]) AND (L_u[k]<L_u[k + 1]))
       END;
     
     FUNCTION Tmin12(k: Byte; L_u: LstE): Bool;
       VAR Test12: Bool;
       BEGIN
         Test12:= ((L_u[k]<L_u[k - 1]) AND (L_u[k]<L_u[k + 2]));
         Result:= ((L_u[k]=L_u[k + 1]) AND Test12)
       END;
     
     FUNCTION Tmin21(k: Byte; L_u: LstE): Bool;
       VAR Test21: Bool;
       BEGIN
         Test21:= ((L_u[k]<L_u[k - 2]) AND (L_u[k]<L_u[k + 1]));
         Result:= ((L_u[k]=L_u[k - 1]) AND Test21)
       END;
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     Liste V
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     PROCEDURE Aff_UV(VAR L_v: LstE);
       VAR k: Byte;
       BEGIN
         E(0013); Wt(5, 3, 'Lu        Lv        Lw');
         FOR k:= 0 TO Nmax DO
           BEGIN
             CASE L_v[k] OF  001: E(0011);
                             002: E(0014);
                             101: E(0009);
                             202: E(0012)
                             ELSE E(0015)  END;
             We(2, k + 5, Lu[k], o); Write('     ', Lv[k]:o)
           END
       END;
     
     PROCEDURE InitListeV(L_u: LstE; VAR L_v: LstE);
       VAR k: Byte; Test1, Test2, Tmax, TmaxIJ, Tmin, TminIJ: Bool;
       BEGIN
         L_v[0]:= 0;
     
         FOR k:= 1 TO (Nmax - 1) DO
           BEGIN
             CASE k OF  1: BEGIN
                             TminIJ:= Tmin12(k, Lu);
                             TmaxIJ:= Tmax12(k, Lu);
                           END;
                        (Nmax - 1): BEGIN
                                      TminIJ:= Tmin21(k, Lu);
                                      TmaxIJ:= Tmax21(k, Lu);
                                    END
                        ELSE BEGIN
                               TminIJ:= (Tmin12(k, Lu) OR Tmin21(k, Lu));
                               TmaxIJ:= (Tmax12(k, Lu) OR Tmax21(k, Lu))
                             END  END;
             Tmin:= Tmin11(k, Lu) OR TminIJ;
             Tmax:= Tmax11(k, Lu) OR TmaxIJ;
             IF Tmin THEN L_v[k]:= 101
                     ELSE IF Tmax THEN L_v[k]:= 202
                                  ELSE L_v[k]:= L_v[k - 1] MOD 100
           END;
         Test2:= (L_u[k]<Lu[k - 1]) AND (L_u[k - 1]<Lu[k - 2]);
         Test1:= (L_u[k]>Lu[k - 1]) AND (L_u[k - 1]>Lu[k - 2]);
         IF Test1 THEN L_v[Nmax]:= 1
                  ELSE IF Test2 THEN L_v[Nmax]:= 2
                                ELSE L_v[Nmax]:= 0
       END;
     
    // ...  / ...
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     Programme principal
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     BEGIN
       REPEAT
         InitListeU(Lu); InitListeV(Lu, Lv);
         Aff_UV(Lv);     InitListeW(Lu, Lv, Lw); A_
       UNTIL (1<0)
     END.
    Les directives d'affichage, inséparables de l'algorithme, ont été données.
    - Pour information: Wt(x, y, '...') = affichage d'une chaîne de caractères ; We(x, y, n, w) = affichage d'un entier ;
    E(<abdc>) = couleurs de l'écran / a>0: effacement / b: couleur du fond / <cd>: couleur du texte

    Ce programme ne répond pas exactement au problème posé dans la mesure où il traite un ensemble fixe de données, et ne se prête pas à une actualisation permanente.

    Rien n'empêche cependant d'introduire d'introduire une nouvelle donnée en dernière position (k = Nmax) par le décalage simultané de toutes les autres, dans les trois tableaux créés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PROCEDURE Translation(VAR Lu, Lv, Lw: LstE);
      VAR k: Byte;
      BEGIN
        FOR k:= 0 TO (Nmax - 1) DO BEGIN
                                     Lu[k]:= Lu[k+1];
                                     Lv[k]:= Lv[k+1];
                                     Lw[k]:= Lw[k+1];
                                   END
      END;
    Il suffit alors de reprendre les trois derniers termes, de rangs (k - 2 , k - 1 , k).


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

Discussions similaires

  1. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46
  2. Réponses: 2
    Dernier message: 28/08/2006, 13h16
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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