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

Qt Discussion :

Un probème sute avec Qt.


Sujet :

Qt

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Un probème sute avec Qt.
    Salut ,
    Je veut fair un programme avec Qt qui donne les nombres premiers jusqu'a un nombre n.
    Ce qui est bizzard c'est que mon programme marche dans un programme en console mais avec Qt il y a problème.
    Avant de vous donnez mon souci je commence par vous expliquer mon résonnement pour trouver tous les nombre premier avant un nombre n, cette technique je l'ai trouver dans un livre de math français termnal S.

    1)On draisse une liste de tous les nombre aprés 2 et qui sont <=n.//c'est a dire {2,3,4,5,6,7,8,9,10...,n}.

    2)On met à 0 tous les multiples du 2.// sa donne {2,3,0,5,7,0,9,0,...,n}

    3)Puis je prend le 1er chiffre non- NULL aprés le 2 (c'est a dire "3" dans notre cas et on barre tous ses multiples.// sa donne {2,3,0,5,7,0,0,0...,n}

    ...ainsi de suite j'usqu'a n (où j'usqu'a la racine carre de n).

    Voila voici les codes sources importants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*Dans cette fonction y a rien n'a dire c'est elle qui prend le nombre n,
    puis le transfere a la fonction getNbrPremier (la fonction qui pose problaime)*/
    void MonWidget::getNbr()
    {
      int nombre= QInputDialog::getInteger(this,"Jusqu'à?","Donne les nombre  premiers j'usqu'à n, n=",2,2,100000);
      QString text(getNbrPremier(nombre));//cette fonction renvoie un QString contenan la liste des nbr premiers.
      emit afficheNbrPremier(text);
    }
    Et voici celle qui pose souci:
    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
     
    QString MonWidget::getNbrPremier(int nbr)
      {
        int *liste= new int[nbr+1];
        int racineCarre= floor(sqrt(nbr)),n=2;
        QString L2;
     
        for(int i=0;i<=nbr;i++)
        {
          liste[i]=n;
          n++;
        }
     
        for(int i=0 ; i<=racineCarre ; i++)
        {
          if(liste[i]!=0)
          {
            for(int j=(i+1) ; j<=nbr ; j++)
            {
              if((liste[j]/liste[i])-floor(liste[j]/liste[i])==0)/*je ne sai pas pour quoi, mais dans un prgm Qt cette conditon est tjr vrai, alor qu'en console sa  marche bien.vous trouverez plus bas ce quel signifie.*/
                liste[j]=0;
            }
          }
        }
       // le reste ne pose aucun problaime.
        for(int i=0;i<nbr;i++)
        {
          if(liste[i]!=0)
          {
            L2.insert(L2.size(),QString("%1;").arg(liste[i]));
          }
        }
        delete liste;
        return L2;
      }
    La ligne qui pose problème dit:
    Si le nombre liste[j] est multiple de liste[i].

    PS:Au cas ou vous voudriez savoir, sachez que tous se passe dans une classe nommée MonWidget.

    S.V.P aidez-moi , merci .

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Utilise plutôt des float que des entier pour ça. Je ne vois même pas comment ça peut marcher en console, à part par pur hasard.
    Les racines carrés sont assez rarement entières, tout comme les divisions dans ce cas

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Salut,

    Utilise plutôt des float que des entier pour ça. Je ne vois même pas comment ça peut marcher en console, à part par pur hasard.
    Les racines carrés sont assez rarement entières, tout comme les divisions dans ce cas
    Surtout pas ca lui fera la même chose du moins l'erreur ne viens pas que de là
    le floor donne ici surement un float et le compilateur va sûrement compiler ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (liste[j]/liste[i])-floor(liste[j]/liste[i])==0
    en opération flottante.
    Le test ==0 est à proscrire avec les float, double ...:
    http://cpp.developpez.com/faq/cpp/?p...ions_flottants

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Le tableau "liste" étant un tableau d'entier, c'est foireux. Je n'ai pas dit que ça ne compilait pas toutefois.
    Passer en float réduira grandement les incohérences, allier à une vraie comparaison tel que décrit dans la FAQ que tu indiques.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fie,
    Citation Envoyé par IrmatDen Voir le message
    Le tableau "liste" étant un tableau d'entier, c'est foireux. Je n'ai pas dit que ça ne compilait pas toutefois.
    Passer en float réduira grandement les incohérences, allier à une vraie comparaison tel que décrit dans la FAQ que tu indiques.
    Utiliser des float pour travailler sur des entiers ! Hérésie.

    Eh oui, les nombres premiers sont des nombres entiers, jusqu'à preuve du contraire.

    Les conversions se feront sans problème, et les divisions entières sont parfaitement adaptées au problème.

    ----------------------

    Pour Adam3220 : pourquoi cette ligne dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              if((liste[j]/liste[i])-floor(liste[j]/liste[i])==0)
    sais-tu que l'opérateur % (modulo) existe en C++ ?
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par droggo Voir le message
    Utiliser des float pour travailler sur des entiers ! Hérésie.

    Eh oui, les nombres premiers sont des nombres entiers, jusqu'à preuve du contraire.
    Ca je suis bien d'accord... Quand même

    Par contre, je suis vraiment dans le coltard aujourd'hui (pas impossible, mais à ce point)... Mais je vois vraiment pas comment tu espères que la division entière 16/10 (au hasard) te donne un résultat valide?

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Ca je suis bien d'accord... Quand même

    Par contre, je suis vraiment dans le coltard aujourd'hui (pas impossible, mais à ce point)... Mais je vois vraiment pas comment tu espères que la division entière 16/10 (au hasard) te donne un résultat valide?
    par ce que dans toute l'operation y as un float/double avec le floor. donc la division 16/10 ne sera pas entière

  8. #8
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    par ce que dans toute l'operation y as un float/double avec le floor. donc la division 16/10 ne sera pas entière
    Et les parenthèses qui rendent la division indépendante? Ton compilo les ignore? Dis moi lequel c'est que je ne l'utilise jamais...
    Tant mon VS que mon GCC me font des divs entières dans ces conditions.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Et les parenthèses qui rendent la division indépendante? Ton compilo les ignore? Dis moi lequel c'est que je ne l'utilise jamais...
    Tant mon VS que mon GCC me font des divs entières dans ces conditions.
    Bon y as un truc que je n'ai pas du capter...
    http://www.developpez.net/forums/sho...0&postcount=25

  10. #10
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Bon y as un truc que je n'ai pas du capter...
    http://www.developpez.net/forums/sho...0&postcount=25
    Si, quand même, je pense que c'est juste une erreur d'inattention
    Je décompose le fameux snippet:
    if((liste[j]/liste[i])-floor(liste[j]/liste[i])==0)
    => if ( (int / int) - floor(int / int) == 0 )
    => if ( int - floor(int) == 0 )
    => if ( int - float == 0 )
    => if ( float == 0 )

    Ormis la division entière, utiliser floor ici n'a pas le moindre sens puisque le résultat d'une division entière est obligatoirement un entier. Donc floor agit ici uniquement comme un cast coûteux en float.

    Si on reprend le 16/10 que j'ai cité plus haut, ça donne donc ça:
    => if ( (16 / 10) - floor(16 / 10) == 0 )
    => if ( 1 - floor(1) == 0 )
    => if ( 1 - 1.0 == 0 )
    => if ( 0.0 == 0 )
    D'où le fait que la condition soit vraie.

    La façon la plus simple de résoudre ça (bien sûr en restant sur le même code, pas en le changeant comme l'a conseillé à juste titre droggo) serait de caster l'un des 2 en float:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float liste_i_f = liste[i];
    if((liste[j]/liste_i_f)-floor(liste[j]/liste_i_f)==0)
    A ceci, tu ajoutes la bonne méthode pour tester l'égalité d'un flottant que tu as cité plus haut, et basta, le code est valide (mais non optimal, rappellons le).

    Désolé de n'avoir pas décomposé plus tôt (c'est quand même plus explicite), j'étais au taf et un peu sous le stress.

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fio,
    Citation Envoyé par IrmatDen Voir le message
    La façon la plus simple de résoudre ça (bien sûr en restant sur le même code, pas en le changeant comme l'a conseillé à juste titre droggo) serait de caster l'un des 2 en float:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float liste_i_f = liste[i];
    if((liste[j]/liste_i_f)-floor(liste[j]/liste_i_f)==0)
    Ce code ne fait que tester si le résultat de la division est entier.

    Comme au départ il s'agit d'entiers, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (liste[j] % liste_i_f) == 0)
    et exit les floats et atrocités qu'ils amènent dans un problème qui n'a qu'à utiliser des entiers.

    Donc, "La façon la plus simple de résoudre ça" est de ne travailler qu'avec des entiers.
    Persister à utiliser des flottants pour un tel problème, c'est vouloir faire une dissertation française en utilisant uniquement des mots anglais et la grammaire espagnole.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Je crois que t'as pas compris 2 points:
    1. je sais, je suis d'accord avec toi, mais tu t'évertues à ignorer le 2nd point
    2. si on lui explique pas le problème de diviser des entier, il rencontrera à nouveau le problème dans un cadre différent.

    Donc tu m'excuseras d'insister lourdement sur ce point, mais je juge beaucoup plus pédagogue de lui apprendre à diviser correctement avant de lui fournir une solution qui contourne le problème qu'il a rencontré.

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Siu,
    Citation Envoyé par IrmatDen Voir le message
    ...
    Donc tu m'excuseras d'insister lourdement sur ce point, mais je juge beaucoup plus pédagogue de lui apprendre à diviser correctement avant de lui fournir une solution qui contourne le problème qu'il a rencontré.
    A mon avis, il est beaucoup plus utile de lui montrer qu'il faut utiliser les bons outils pour résoudre un problème.
    Dans le cas présent, les flottants ne sont pas le bon outil, et tout ce que vous faites en persistant, c'est le maintenir dans une mauvaise voie.

    Pour expliquer les problèmes qu'il y a avec les flottants, il y a d'autres sujets, qui existent déjà, ou que tu pourrais ouvrir toi-même par exemple, il y a des cours, la FAQ...
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Mais je persiste pas bon sang! Je vois pas pourquoi tu t'entêtes à me dire que j'ai tord de lui dire pourquoi son expression est fausse.

    J'ai déjà dit que tu avais raison, si je persiste c'était uniquement pour finir l'explication sur le pourquoi de son erreur actuelle... Lui apprendre le modulo, c'est très bien, qu'il comprenne comment diviser c'est très bien aussi. ça va pas plus loin.

Discussions similaires

  1. probème requête (avec Execute reader)
    Par michael_MS dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/11/2008, 15h00
  2. [JAI] Probème d'utilisation avec RCP
    Par gargantua dans le forum 2D
    Réponses: 10
    Dernier message: 04/07/2007, 12h33
  3. [Réseaux] Probème avec les sockets
    Par scaleo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/05/2007, 21h45
  4. Probème avec une calculatrice (débutant)
    Par cirtey dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 23/04/2007, 22h44
  5. Probème avec FireFox
    Par Krubi dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 20/06/2006, 16h27

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