Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/06/2024, à 06:46

temps

[résolu] comment construire 2 conditions dans une boucle for

Bonjour,
Je cherche à construire 2 conditions dans une boucle for

quelque chose de la forme

for (int i = (k1[j]), k = dif6; i < k3[j] && k >0; i++, k -= 3)

qui enlèverai une valeur tous les 3 coups jusqu'à épuisement de dif6

actuellement j'ai ça, et ça produit un décroché indésirable
le but est de soustraire la valeur dif6, moins violement

        
case 2:for (int i = (k1[j]); i < (k1[j]+dif6); i= i+dif6) { f<<tabn[i]; }
            //for (int i = (k1[j]+dif6); i < (k3[j]); i=i+dif1) { f<<tabn[i];}
            for (int i = (k1[j]+dif6); i < (k3[j]); i += dif1) { f<<tabn[i];}
            for (int i = 0; i < (k4[j]+k7+2); i++){ f<<tabn[(k3[j])]; }

Dernière modification par temps (Le 22/06/2024, à 19:28)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 22/06/2024, à 10:19

kamaris

Re : [résolu] comment construire 2 conditions dans une boucle for

temps a écrit :

qui enlèverai une valeur tous les 3 coups jusqu'à épuisement de dif6

for (int i = k1[j], k = dif6; i < k3[j]; i++)
{
  if ((i - k1[j] + 1) % 3 == 0)
  {
    k -= valeur;
    if (k <= 0)
      break;
  }
}

Hors ligne

#3 Le 22/06/2024, à 11:56

jplemoine

Re : [résolu] comment construire 2 conditions dans une boucle for

De mémoire, quand on touche aux variables de definition de la boucle (index et/ou bornes), on utilise pas une boucle for mais un while ou un repeat.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 22/06/2024, à 12:07

kamaris

Re : [résolu] comment construire 2 conditions dans une boucle for

Non, il n'y a aucune règle de ce type.
Les boucles for et while sont logiquement équivalentes, le choix est une question de contexte, de lisibilité, de style, donc en partie subjectif.
Il est tout à fait possible, en particulier, de laisser le dernier champ d'une boucle for vide et de gérer entièrement la modification des variables dans la boucle.
Dans le cas présent, la boucle for est d'autant plus justifiée que la variable principale de la boucle est i (entièrement gérée dans la définition de la boucle for), tandis que k apparait comme une variable secondaire.

Dernière modification par kamaris (Le 22/06/2024, à 12:07)

Hors ligne

#5 Le 22/06/2024, à 13:05

temps

Re : [résolu] comment construire 2 conditions dans une boucle for

Bonjour,
merci pour les réponses.
Depuis ce matin je suis dessus des dizaines de tests et j'ai pas encore une solution qui va bien
j'en suis là

for (int i = (k1[j]), k = dif6; i < k3[j] && k >0; i +=dif1, k -= (3*dif1)){ f<<tabn[i]; }

je test la solution de kamaris et je reviens


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 22/06/2024, à 18:37

temps

Re : [résolu] comment construire 2 conditions dans une boucle for

Bonjour,
je reviens car je n'y arrive pas

je ne comprends pas le code proposé.
Les questions sont à quoi correspond "valeur" dans le code et pourquoi il y a break dans le code, je crains de sortir du switch

J'en suis là, je dessine deux droites une qui monte et une qui descend, le code marche très bien pour celle qui descend, mais parfois dans celle qui monte je n'ai que la moité ou un peu plus de la valeur attendue.
En détail :

        case 1:
            for (int i = (k1[j]); i < (k3[j]); i++)  {  f<<tabn[i];ki++; if (dif6 >ki) { i++ ;}   }
            for (int i = 0; i < (k4[j]+k7); i++){ f<<tabn[(k3[j])]; }
            // fin monte
            break;

        case 2:

           for (int i = (k1[j]+1); i < (k3[j]); i += dif1)  {  f<<tabn[i];}
            for (int i = 0; i < (k4[j]+k7); i++){ f<<tabn[(k3[j])]; }
            // fin monte 

k1 est le point haut, k3 le point bas , dif1 le rapport du nombre de points entre k1 et k3 divisé par le nombre de points voulu , dif6 est le reste de la division

Dernière modification par temps (Le 22/06/2024, à 18:41)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#7 Le 22/06/2024, à 19:07

Watael

Re : [résolu] comment construire 2 conditions dans une boucle for

je voudrais savoir de quel langage il est question.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 22/06/2024, à 19:27

temps

Re : [résolu] comment construire 2 conditions dans une boucle for

C'est du c++, je me suis aperçu de l'erreur juste avant le dernier post.
Je vais poster en résolu et m'y prendre autrement car je n'y arrive pas, je dois faire des erreurs logiques

Je vais créer des zones avec des switch et jouer sur les accélérations (nombre de i++) ainsi chaque valeur de dif1 aura sa propre écriture.
Le git du projet est ici si ça interesse , ça marche mais il y a beaucoup de code à améliorer https://framagit.org/temps09/Audiojo-graphique le projet est ouvert

Cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#9 Le 22/06/2024, à 19:35

kamaris

Re : [résolu] comment construire 2 conditions dans une boucle for

temps a écrit :

je ne comprends pas le code proposé.
Les questions sont à quoi correspond "valeur" dans le code

À la valeur dont tu parles dans ta question initiale : "qui enlèverai une valeur tous les 3 coups".
C'est à toi de la renseigner.

temps a écrit :

et pourquoi il y a break dans le code, je crains de sortir du switch

Il y a un break pour correspondre à la demande : "jusqu'à épuisement de dif6".
Un break ne s'applique qu'à l'instruction la plus proche pour laquelle il a un sens, donc ici il s'appliquera à la boucle for, tu ne sortiras pas du switch.

Hors ligne

#10 Le 22/06/2024, à 23:37

Ilari1

Re : [résolu] comment construire 2 conditions dans une boucle for

#6  "De mémoire, quand on touche aux variables de definition de la boucle (index et/ou bornes), on utilise pas une boucle for mais un while ou un repeat."

-Il a parfaitement raison, on ne fait jamais ça, c'est un des baba du génie logiciel.
Soit tu connais le nombre d'itérations que tu as à faire et la boucle for est appropriée, soit tu ne le connais pas et on est donc dans le cas d 'un nombre d'exécutions variable, non connus à la compilation.
Il faut alors écrire un while, 0..n itérations ou un repeat, 1..n itérations, donc un sous -ensemble du précédent.

-Eventuellement, tu peux avoir à écrire un itérer en utilisant un break, si l'on a besoin de combiner une exécution avant la rupture et une exécution après.

-Modifier la condition d'exécution d'une boucle est la source garantie de futurs problèmes lors d'évolution ou de maintenance.
-Ce n'est pas parce que le langage le permet qu'il faut le faire..

Hors ligne

#11 Le 23/06/2024, à 06:49

temps

Re : [résolu] comment construire 2 conditions dans une boucle for

Bonjour,
Merci kamaris pour la réponse. En détail la voix humaine est obtenue quand l'intensité des ondes varient en même sens, pour inverser il faut tuer la force en diminuant l'intensité (hauteur), et les durées doivent s'accélérer vers le centre des fronts (exponentielle amortie). voir = la forme 5 dans l'application elle génère les voix humaines

J'ai tout repris sous une cascade de switch
la cascade de switch, en exemple d'un cas

        // calcul du nombre d'unité
        /**********tri k3-k1***front-montant****************************************/

        int dif1,dif1plus,dif1moins,dif6,tri;
        int ki =0;
        dif1 = k3[j]-k1[j];
        int dif2,dif2plus,dif2moins,dif5,trii1;
        dif2 = k3[j]-k5[j];
        
        if (dif1 > 5){

            if (dif1< nbumonte){tri = 1;dif1moins = nbumonte / dif1 ;dif6 = nbumonte % dif1 ;} // si les unités de la hauteur du front est inférieur aux unités de l'axe des x
            if (dif1>= nbumonte){tri = 2;dif1plus = dif1 / nbumonte ;dif6 = dif1 % nbumonte ;} // si les unités de la hauteur du front est supérieur aux unités de l'axe des x

            switch(tri) {
            case 1:   //cas ou il faut ajouter la dif 

                switch(dif1moins){
                case 1: memj15=10;  break;
                case 2: memj15=11;  break;
                case 3: memj15=12;  break;
                case 4: memj15=13;  break;
                case 5: memj15=14;  break;
                case 6: memj15=15;  break;
                default: memj15=16;  break;
                }

                break;
            case 2:

                switch(dif1plus){  //cas ou il faut enlever la difference
                case 1: memj15=1;  break;
                case 2: memj15=2;  break;
                case 3: memj15=3;  break;
                case 4: memj15=4;  break;
                case 5: memj15=5;  break;
                case 6: memj15=6;  break;
                default: memj15=7;  break;
                }
                break;
            }
        }

        if (dif1 < 6){ switch(dif1){
            case 5: memj15=17;  break;
            case 4: memj15=18;  break;
            case 3: memj15=19;  break;
            case 2: memj15=20;  break;
            case 1: memj15=21;  break;
            }}

        /**********tri k5-k1***front descendant********************************************/

avec plusieurs tri au dessus le dernier tri étant

        case 4:
            ki=0;
            for (int i = (k1[j]); i < (k3[j]); i++){ if ((dif6/2) >ki) { f<<tabn[i];i +=8 ;} else{ f<<tabn[i];i++ ;i++ ;i++ ; } ; ki++;   }
            for (int i = 0; i < (k4[j]+k7+2); i++){ f<<tabn[(k3[j])]; }
            break;  // fin monte 
        case 5:
            ki=0;
            for (int i = (k1[j]); i < (k3[j]); i++){ if ((dif6/2) >ki) { f<<tabn[i];i +=10 ;} else{ f<<tabn[i];i +=4 ; } ; ki++;   }
            for (int i = 0; i < (k4[j]+k7+2); i++){ f<<tabn[(k3[j])]; }
            break;  // fin monte         
        case 6:
            ki=0;
            for (int i = (k1[j]); i < (k3[j]); i++){ if ((dif6/2) >ki) { f<<tabn[i];i +=12 ;} else{ f<<tabn[i];i +=5 ;} ; ki++;   }
            for (int i = 0; i < (k4[j]+k7+2); i++){ f<<tabn[(k3[j])]; }
            break;  // fin monte       
        case 7:
            ki=0;
            for (int i = (k1[j]); i < (k3[j]); i += dif1plus) { f<<tabn[i];}
            for (int i = 0; i < (k4[j]+k7+2); i++){ f<<tabn[(k3[j])]; }

            break;  // fin monte  

Je vais modifier avec votre code, j'espère que cela va corriger le defaut

Cordialement

P.S. A force de chercher, j'ai trouvé, c'était un bout de code de la partie montante glissé dans les codes de la partie descendante, une simple ligne qui avait beaucoup d'effet.
Et elle n'était pas dans le bout de code donné qui fonctionne bien
C'est corrigé, j'ai une base parfaite, il ne me suffit plus que développer différentes accélération pour les autres générateurs
c'est sur le git ici dans execu5

Dernière modification par temps (Le 27/06/2024, à 06:54)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#12 Le 23/06/2024, à 11:16

kamaris

Re : [résolu] comment construire 2 conditions dans une boucle for

Ilari1 a écrit :

#6  "De mémoire, quand on touche aux variables de definition de la boucle (index et/ou bornes), on utilise pas une boucle for mais un while ou un repeat."

-Il a parfaitement raison, on ne fait jamais ça, c'est un des baba du génie logiciel.
Soit tu connais le nombre d'itérations que tu as à faire et la boucle for est appropriée, soit tu ne le connais pas et on est donc dans le cas d 'un nombre d'exécutions variable, non connus à la compilation.
Il faut alors écrire un while, 0..n itérations ou un repeat, 1..n itérations, donc un sous -ensemble du précédent.

-Eventuellement, tu peux avoir à écrire un itérer en utilisant un break, si l'on a besoin de combiner une exécution avant la rupture et une exécution après.

-Modifier la condition d'exécution d'une boucle est la source garantie de futurs problèmes lors d'évolution ou de maintenance.
-Ce n'est pas parce que le langage le permet qu'il faut le faire..

Non, ça n'a rien d'un "baba du génie logiciel", et ce que tu dis à propos du nombre d'itérations connu à l'avance n'a guère de sens.
Je le répète, les boucles while et for sont logiquement équivalentes, i.e. tout ce qui peut être programmé avec l'une peut l'être avec l'autre.
L'appréciation de laquelle est la plus pertinente dans telle ou telle situation est parfois facile à trancher, parfois moins, mais puisqu'elles sont toutes les deux possibles il y a une irréductible part de subjectivité.

Et ce n'est pas ça qui va impacter la maintenabilité d'un logiciel, c'est trop localisé, il ne s'agit pas d'un principe assez général.
Voilà un exemple de principe qui fait partie du b.a.-ba du développement logiciel : https://fr.wikipedia.org/wiki/Ne_vous_r … %A9tez_pas

Dernière modification par kamaris (Le 23/06/2024, à 11:18)

Hors ligne

#13 Le 23/06/2024, à 11:55

jplemoine

Re : [résolu] comment construire 2 conditions dans une boucle for

kamaris a écrit :

Non, ça n'a rien d'un "baba du génie logiciel", et ce que tu dis à propos du nombre d'itérations connu à l'avance n'a guère de sens.

Si on exclue les histoire de pile et de tas qui peuvent engendrer des fuites mémoires, effectivement, ça n' a guère de sens.
En fait, dans certains langages (que je suis incapable de citer : je suis admin Linux N2 depuis 2019 après 20 ans de développement professionnel : j'ai un peu [beaucoup oublié]),
les bornes du for ne sont évaluées qu'au début de la boucle : donc, le fait de modifier les valeurs de la bornes en cours d'execution est donc néfaste.
Dans une boucle while ou repeat, la condition est évaluée à chaque occurrence.

Pour la maintenabilité du code, c'est un des principes de la "programmation structurée" : 1 point d'entrée et 1 point de sortie.
Et je te confirme que c'est beaucoup plus facile à debugger dans ce cas.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#14 Le 23/06/2024, à 22:06

Ilari1

Re : [résolu] comment construire 2 conditions dans une boucle for

-Je ne veux pas entamer ici de discussions de comptoirs, je confirme que c'est un basique du génie logiciel.
-Il ne faut pas confondre ce que permet le langage et ce qui est souhaitable, ce sont 2 choses très différentes.
-Par ex. Ada , langage sur s'il en est et conçu pour ça, interdit de modifier le compteur de boucle dans la boucle elle-même.
La variable est, à la fois en lecture seule et inexistante en deçà et au delà de le portée de la boucle, ce n'est peut-être pas complètement par hasard.
Le DoD avait imposé des normes strictes sur ce sujet et Ada 83 faisait déjà ça et on commençait à peine à parler de génie logiciel.
Beaucoup de principes Ada, sont d'ailleurs repris par Rust et Go qui ne font que copier, à plus de 40 ans de distance, des principes déjà établis dans les années 80.

-Je confirme que basiquement, soit on connait le nombre d'itérations à la compilation, soit on ne le connait pas et on doit utiliser les structures adéquates.
L'histoire du logiciel est pleine d'astuces ''géniales'' de programmeurs qui ont provoqué des catastrophes, il y en a plein wikipedia, et c'est souvent du C, comme par hasard..

-Apres quand on parle génie logiciel, il existe bien sur de bonnes pratiques connues, maintenant chaque entreprise peut régler le curseur la ou elle veut.
Chacun étant libre de "choisir ses ennuis".

Hors ligne

#15 Le 23/06/2024, à 22:28

kamaris

Re : [résolu] comment construire 2 conditions dans une boucle for

Ilari1 a écrit :

-Je ne veux pas entamer ici de discussions de comptoirs

Nous pouvons tomber d'accord là-dessus, allons tous nous occuper de choses plus intéressantes.

Hors ligne