Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme defectueux

    9 mai 2008 à 9:37:20

    Bonjour,

    J'ai crée un petit programme avec Qt qui permet de trouver des valeur a partir de valeurs données avec 2 calcules différents.

    bool    ok   = false;
            int     i    = 0;
            int     j    = 0;
            QString mr   = "en serie.";
            float   res1 = 0.0;
            float   res2 = 0.0;
            QString res1str,res2str,dd;
            float   vlrd = 0.0;
            float   vlrt = -1.0;
            float   valeurS[42] = {0.0,1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0,12.0,15.0,18.0,22.0,27.0,33.0,39.0,47.0,56.0,68.0,82.0,100.0,120.0,150.0,180.0,220.0,270.0,330.0,390.0,470.0,560.0,680.0,820.0,1000.0,1200.0,1800.0,2200.0,2700.0};//tableau de valeur     
             
            while(ok != true)
            {
                    vlrd = QInputDialog::getDouble(this, "RCSearch", "Entrez la valeur recherchée en ohms",0,0.1,100000,1, &ok);//Demande la valeur recherchée.
            }
            
            while(vlrt!=vlrd  && i <  42)//Première boucle de test avec comme calcul x+y=z
            {
                       
                    res2 = valeurS[i];
                             
                    while(vlrt!=vlrd && j < 42)
                    {
                               res1 = valeurS[j];
                               vlrt = res1+res2;
                               
                               j++;
                               
                    }        
                    i++;
                     
            }
            i = 1;
            j = 1;
            if(vlrt!=vlrd )// si valeur non trouvée
            {
                    while(vlrt!=vlrd  && i < 42)//Deuxième boucle de test avec calcul (x*y)/x+y=z
                    {
                               res2 = valeurS[i];
                               while(vlrt!=vlrd  && j < 42)
                               {
                                          res1 = valeurS[j];
                                          vlrt = (res1*res2)/res1+res2;
                                                                                
                                          j+=1;
                               }
                               i+=1;
                    }
                    if(vlrt==vlrd )
                    {
                               mr = "en parrallèle.";
                    }
                    else if(vlrt!=vlrd)
                    {
                               QMessageBox::critical(this,"Erreur","Impossible de trouver la resistance choisie...");
                               res1 = 0.0;
                               res2 = 0.0;
                               mr = ".";
                    }
            }
            
                    
            if(vlrt == vlrd)
            {
            res1str = QString("%1").arg(res1,0,'f',1);
            res2str = QString("%1").arg(res2,0,'f',1);
            
            QMessageBox::information(this, "RCSearch", "Il vous faut "+ res1str +" ohms et "+ res2str +" omhs "+ mr);
            }
    


    Je remarque qu'il donne à vlrt la valeur 2.0 quand i=1 et j=/peu importe/ et il s'arrête quand j=41 et i=1 sans aller dans la deuxième boucle.

    Où est le problème?

    Merci,
    Pfranco
    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2008 à 13:20:00

      tu initialise j au mauvais endroit, en dehors de ta boucle. ;)
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2008 à 13:32:28

        Merci, ça marche.
        J'ai un autre pb : quand j'entre 632 ou 835 ou une autre valeur complexe, il me met le message d'erreur et j'ai l'impression qu'il n'utilise pas la 2eme méthode de calcul.Est-ce vrai?


        Cordialement,
        Pfranco
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2008 à 13:34:49

          C'est à dire ?

          Quel message d erreur ?

          Je vais regarder ^^
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2008 à 13:36:50

            Il me met le message 'critical'.Il test avec toutes les valeurs de valeurS, et (normalement) avec les 2 algo.

            Ps : voici le code modifié:
            bool    ok   = false;
                    int     i    = 0;
                    int     j    = 0;
                    QString mr   = "en serie.";
                    float   res1 = 0.0;
                    float   res2 = 0.0;
                    QString res1str,res2str,dd;
                    float   vlrd = 0.0;
                    float   vlrt = 1.0;
                    float   valeurS[42] = {0.0,1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0,12.0,15.0,18.0,22.0,27.0,33.0,39.0,47.0,56.0,68.0,82.0,100.0,120.0,150.0,180.0,220.0,270.0,330.0,390.0,470.0,560.0,680.0,820.0,1000.0,1200.0,1800.0,2200.0,2700.0};
                     
                    while(ok != true)
                    {
                            vlrd = QInputDialog::getDouble(this, "RCSearch", "Entrez la valeur recherchée en ohms",0,1,100000,1, &ok);
                    }
                    
                    while(vlrt!=vlrd && i <  42)
                    {
                               
                            res2 = valeurS[i];
                                     
                            while(vlrt!=vlrd && j < 42)
                            {
                                       res1 = valeurS[j];
                                       vlrt = res1+res2;
                                       
                                       j++;                           
                            }
                            j=0;        
                            i++;
                             
                    }
                    i = 1;
                    j = 1;
                    if(vlrt!=vlrd)
                    {
                            while(vlrt!=vlrd && i < 42)
                            {
                                       res2 = valeurS[i];
                                       while(vlrt!=vlrd && j < 42)
                                       {
                                                  res1 = valeurS[j];
                                                  vlrt = (res1*res2)/res1+res2;
                                                            
                                                  j++;
                                       }
                                       j=0;
                                       i++;                          
                            }
                            if(vlrt==vlrd)
                            {
                                       mr = "en parrallèle.";
                            }
                            else if(vlrt!=vlrd)
                            {
                                       QMessageBox::critical(this,"Erreur","Impossible de trouver la resistance choisie...");
                            }
                    }
                    
                            
                    if(vlrt == vlrd)
                    {
                    res1str = QString("%1").arg(res1,0,'f',1);
                    res2str = QString("%1").arg(res2,0,'f',1);
                    
                    QMessageBox::information(this, "RCSearch", "Il vous faut "+ res1str +" ohms et "+ res2str +" omhs "+ mr);
                    }
            
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2008 à 13:52:17

              De mon côté aussi

              mon code :
              float resultat(float vlrd, float vlrt = -1.0) {
              
              	float valeurS[42] = {0.0,1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0,12.0,15.0,18.0,22.0,27.0,33.0,39.0,47.0,56.0,68.0,82.0,100.0,120.0,150.0,180.0,220.0,270.0,330.0,390.0,470.0,560.0,680.0,820.0,1000.0,1200.0,1800.0,2200.0,2700.0};//tableau de valeur
              	int i = 0, j;
              
              	float res1, res2;
              
              	while(vlrt!=vlrd  && i <  42)//Première boucle de test avec comme calcul x+y=z
              	{
              		res2 = valeurS[i];
              		j = 0;
              		         
              		while(vlrt!=vlrd && j < 42)
              		{
              			res1 = valeurS[j];
              			vlrt = res1+res2;
              
              			j++;
              
              		}        
              		i++;
                       
              	}
              
              	if(vlrt!=vlrd )// si valeur non trouvée
              	{
              		i = 0;
              		while(vlrt!=vlrd  && i < 42)//Deuxième boucle de test avec calcul (x*y)/x+y=z
              		{
              			j = 0;
              			res2 = valeurS[i];
              			while(vlrt!=vlrd  && j < 42)
              			{
              				res1 = valeurS[j];
              				vlrt = (res1*res2)/res1+res2;
              
              				j+=1;
              			}
              			i+=1;
              		}
              		if(vlrt==vlrd )
              		{
              			return -vlrt;
              		}
              		else if(vlrt!=vlrd)
              		{
              			return vlrt;
              		}
              	} else {
              		return -vlrt;
              	}
              
              	return 0.0;
              
              }
              


              resultat(632) me retourne 5400
              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2008 à 14:00:13

                Merci.
                Moi, vlrt, je n'en n'ai pas besoin , je veut récupérer res1 et res2 et l'algorithme utilisé.


                Pfranco
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2008 à 14:06:51

                  Ton algorithme est défectueux :D

                  relis :
                  vlrt = (res1*res2)/res1+res2;
                  


                  Tu as écrit (x*y)/x +y, donc ca fait y+y ^^.

                  Et je te confirme qu'il rentre bien dans la seconde boucle, je viens de tester, mais ca vient d'un oubli de parenthèse à mon avis ^^

                  Egalement, je pense que tu y gagnerais a changer tes vlrt!=vlrd en vlrt<vlrd, tes "fonctions" étant croissantes.

                  Voici mon code final :
                  float resultat(float vlrd, float vlrt = -1.0) {
                  
                  	float valeurS[42] = {0.0,1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0,12.0,15.0,18.0,22.0,27.0,33.0,39.0,47.0,56.0,68.0,82.0,100.0,120.0,150.0,180.0,220.0,270.0,330.0,390.0,470.0,560.0,680.0,820.0,1000.0,1200.0,1800.0,2200.0,2700.0};//tableau de valeur
                  	int i = 0, j;
                  
                  	float res1, res2;
                  
                  	do//Première boucle de test avec comme calcul x+y=z
                  	{
                  		res2 = valeurS[i];
                  		j = 0;
                  		         
                  		do
                  		{
                  			res1 = valeurS[j];
                  			vlrt = res1+res2;
                  
                  			j++;
                  
                  		} while(vlrt<vlrd && j < 42);       
                  		i++;
                           
                  	} while(vlrt!=vlrd  && i <  42);
                  
                  	if(vlrt!=vlrd )// si valeur non trouvée
                  	{
                  		i = 0;
                  		while(vlrt!=vlrd  && i < 42)//Deuxième boucle de test avec calcul (x*y)/x+y=z
                  		{
                  			j = 0;
                  			res2 = valeurS[i];
                  			do
                  			{
                  				res1 = valeurS[j];
                  				vlrt = (res1*res2)/(res1+res2);
                  
                  				j+=1;
                  			} while(vlrt<vlrd  && j < 42);
                  			i+=1;
                  		}
                  		if(vlrt==vlrd )
                  		{
                  			return -vlrt;
                  		}
                  		else if(vlrt!=vlrd)
                  		{
                  			return vlrt;
                  		}
                  	} else {
                  		return -vlrt;
                  	}
                  
                  	return 0.0;
                  
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mai 2008 à 14:12:29

                    ca retourne res1 et res2 et mr?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 mai 2008 à 14:19:18

                      Citation : pfranco

                      ca retourne res1 et res2 et mr?



                      non pardon, j avais pas vu que c etait ce que tu voulais, tiens :

                      bool resultat(float & res1, float & res2, bool & mr, float vlrd, float vlrt = -1.0) {
                      
                      	float valeurS[42] = {0.0,1.0,1.2,1.5,1.8,2.2,2.7,3.3,3.9,4.7,5.6,6.8,8.2,10.0,12.0,15.0,18.0,22.0,27.0,33.0,39.0,47.0,56.0,68.0,82.0,100.0,120.0,150.0,180.0,220.0,270.0,330.0,390.0,470.0,560.0,680.0,820.0,1000.0,1200.0,1800.0,2200.0,2700.0};//tableau de valeur
                      	int i = 0, j;
                      
                      	mr = false;
                      
                      	do//Première boucle de test avec comme calcul x+y=z
                      	{
                      		res2 = valeurS[i];
                      		j = 0;
                      		         
                      		do
                      		{
                      			res1 = valeurS[j];
                      			vlrt = res1+res2;
                      
                      			j++;
                      
                      		} while(vlrt<vlrd && j < 42);       
                      		i++;
                               
                      	} while(vlrt!=vlrd  && i <  42);
                      
                      	if(vlrt!=vlrd )// si valeur non trouvée
                      	{
                      		i = 0;
                      		while(vlrt!=vlrd  && i < 42)//Deuxième boucle de test avec calcul (x*y)/x+y=z
                      		{
                      			j = 0;
                      			res2 = valeurS[i];
                      			do
                      			{
                      				res1 = valeurS[j];
                      				vlrt = (res1*res2)/(res1+res2);
                      
                      				j+=1;
                      			} while(vlrt<vlrd  && j < 42);
                      			i+=1;
                      		}
                      		if(vlrt==vlrd )
                      		{
                      			// mr
                      			mr = true;
                      			return true;
                      		}
                      		else if(vlrt!=vlrd)
                      		{
                      			// non trouvé
                      			return false;
                      		}
                      	} else {
                      		// trouvé avec 1ere methode
                      		return true;
                      	}
                      
                      }
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 mai 2008 à 14:49:31

                        Merci,c'est bon.

                        Sauf qu'il me met
                        error:prototype for 'la fonction en question'does not match any in class 'MaFenetre
                        error:candidate is : MaFenetre::la fonction en question
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 mai 2008 à 15:08:08

                          Tu cherches à ajouter cette fonction à ta classe fenêtre ? Pourquoi ?

                          Mets là juste dans ton .cpp, au dessus de là où tu l'utilises.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Algorithme defectueux

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown