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

C++ Discussion :

Problème avec programmation d'un tableau


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Problème avec programmation d'un tableau
    Bonjour a tous,
    j'ai une petite problème avec ce programme

    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
     
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <limits>
    #include <stdlib.h>
     
    using namespace std;
     
     
    double Y[200][200][10];
     
    int main()
    {
     
     int Nx=200;
     int Nt=10;
     int Ny=200;
    double x,y,z,c;
     
    double stepx=0.01;
    double stepy=0.01;
    double stept=0.1;
     
     
    for(int t=0;t<Nt;t++)
    {
        for(int i=0;i<Nx;i++)
        {
            for(int j=0;j<Ny;j++)
            {
                x=-1+i*stepx;
                y=-1+j*stepy;
                z=t*stept;
                Y[i][j][t]=x-y;
     
                if(Y[i][j][t]=0.0)
                {
                    cout<<x<<"   "<<endl;}
                }
            }
        }
     
        return 0;
    }
    je ne comprend pas pourquoi il ne m'affiche rien or le Y=0 pour x=y


    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
     
    #include <fstream>
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <limits>
    #include <stdlib.h>
     
    using namespace std;
     
     
    double Y[200][200][10];
     
    int main()
    {
     
     int Nx=200;
     int Nt=10;
     int Ny=200;
    double x,y,z,c;
     
    double stepx=0.01;
    double stepy=0.01;
    double stept=0.1;
     
     
    for(int t=0;t<Nt;t++)
    {
    for(int i=0;i<Nx;i++)
    {
     for(int j=0;j<Ny;j++)
     {x=-1+i*stepx;
     y=-1+j*stepy;
    z=t*stept;
    Y[i][j][t]=x-y;
     
    if(x=y)
    {cout<<x<<"   "<<endl;}
     }
     }
    }
     
    return 0;
    }

    Merci d'avance

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Déjà ligne 38 : c'est pas plutôt si non, ce qu'il y a dans le if n'est jamais éxécuté!!

    Même remarque à la ligne 38 de l'autre code : remplacer par Donc, ne pas confondre l'opérateur d'affectation = : x = 5.2 qui fait que la variable x vaut 5.2, et l'opérateur logique == : x == 5.2 qui renvoie true si la valeur de x est égal à 5.2 et false si la valeur de x est différente de 5.2

    Ceci explique pourquoi ça n'affiche rien!!!

  3. #3
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Bonjour
    Citation Envoyé par bertry Voir le message
    Déjà ligne 38 : c'est pas plutôt si non, ce qu'il y a dans le if n'est jamais éxécuté!!

    Même remarque à la ligne 38 de l'autre code : remplacer par Donc, ne pas confondre l'opérateur d'affectation = : x = 5.2 qui fait que la variable x vaut 5.2, et l'opérateur logique == : x == 5.2 qui renvoie true si la valeur de x est égal à 5.2 et false si la valeur de x est différente de 5.2

    Ceci explique pourquoi ça n'affiche rien!!!
    Merci pour votre réponse
    ma problème c'est que quand je crée une fonction par exemple f(x,y)= x-y je veux qu'il m'affiche les nombres de x quand f=0

    En réalité j'ai des fonctions plus compliqué de ça mais quand j'ai essayé même avec ces petites fonction ça ne fonctionne pas

    le double == ce n'est veux dire différent

    Merci d'avance

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Citation Envoyé par hey kong Voir le message
    ma problème c'est que quand je crée une fonction par exemple f(x,y)= x-y je veux qu'il m'affiche les nombres de x quand f=0
    Alors, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Y[i][j][t] = f ( x, y );
    if ( Y[i][j][t]==0.0 ) {
    cout << x << endl;
    }
    serait correct. Le cout ne sera exécute que si Y[i][j][t] est égal à 0,

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Non, l'opérateur == est bel et bien l'opérateur qui permet de comparer deux valeurs et de s'assurer qu'elles sont égales.

    C'est l'opérateur != qui s'assure que deux valeurs soient différentes

    Cependant, si tu réglais ton compilateur pour te donner un maximum d'avertissements (il est vraiment préférable de le faire, et de veiller autant que possible à résoudre les avertissements qu'il donne ), tu obtiendrait un avertissement du genre de
    warning : comparaison beetween two double is allways false
    Je te passe les détails techniques (qui ont par ailleurs été exposés à de nombreuses reprises sur le forum, une petite recherche devrait te permettre de les retrouver, si cela t'intéresse ) mais, en gros, entre les problèmes de conversion de binaire en décimal (et inversement) et le fait que les double soient représentés sous la forme d'une mantisse et d'un exposant, il y a toujours une part d'imprécision dans la valeur que l'on obtient.

    Il faut donc toujours prendre cette imprécision (l'epsylon ! ) en compte lorsque tu souhaites vérifier l'égalité de deux doubles, surtout si leur valeur a été obtenue par calcul!

    Tu peux obtenir l'epsylon * défini pour un type donné grâce à fonction epsylon() de la classe template fournie par le standard std::numeric_limits.

    Ta comparaison devrait donc prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>.epsylon() ||
        Y[i][j][t]>=0.0 - std::numeric_limits<double>.epsylon() )
    {
        // ce qu'il faut faire
    }
    * L'epsylon est la plus valeur qui vérifiera x- epsylon == x == x + epsylon

  6. #6
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Bonjour
    Citation Envoyé par koala01 Voir le message
    Salut,

    Non, l'opérateur == est bel et bien l'opérateur qui permet de comparer deux valeurs et de s'assurer qu'elles sont égales.

    C'est l'opérateur != qui s'assure que deux valeurs soient différentes

    Cependant, si tu réglais ton compilateur pour te donner un maximum d'avertissements (il est vraiment préférable de le faire, et de veiller autant que possible à résoudre les avertissements qu'il donne ), tu obtiendrait un avertissement du genre de

    Je te passe les détails techniques (qui ont par ailleurs été exposés à de nombreuses reprises sur le forum, une petite recherche devrait te permettre de les retrouver, si cela t'intéresse ) mais, en gros, entre les problèmes de conversion de binaire en décimal (et inversement) et le fait que les double soient représentés sous la forme d'une mantisse et d'un exposant, il y a toujours une part d'imprécision dans la valeur que l'on obtient.

    Il faut donc toujours prendre cette imprécision (l'epsylon ! ) en compte lorsque tu souhaites vérifier l'égalité de deux doubles, surtout si leur valeur a été obtenue par calcul!

    Tu peux obtenir l'epsylon * défini pour un type donné grâce à fonction epsylon() de la classe template fournie par le standard std::numeric_limits.

    Ta comparaison devrait donc prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>.epsylon() ||
        Y[i][j][t]>=0.0 - std::numeric_limits<double>.epsylon() )
    {
        // ce qu'il faut faire
    }
    * L'epsylon est la plus valeur qui vérifiera x- epsylon == x == x + epsylon
    Bonjour,
    j'ai essayé avec
    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
     
    for(int t=0;t<Nt;t++)
    {
    for(int i=0;i<Nx;i++)
    {
     for(int j=0;j<Ny;j++)
     {x=-1+i*stepx;
     y=-1+j*stepy;
    z=t*stept;
    Y[i][j][t]=sinh(z+asinh(1.5))*x+y;
     
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>.epsylon() || Y[i][j][t]>=0.0 - std::numeric_limits<double>.epsylon() )
    {
     cout << x << endl;
    }
    }
    }
    }
    mais une erreur expected primary expression before '.' token ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>.epsylon() || Y[i][j][t]>=0.0 - std::numeric_limits<double>.epsylon() )
    Merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Petite précision : il faut inclure le fichier <limits> pour que cela fonctionne

  8. #8
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Bonjour
    Citation Envoyé par koala01 Voir le message
    Petite précision : il faut inclure le fichier <limits> pour que cela fonctionne
    Merci pour votre réponse
    oui j'ai déjà fais mais toujours le même erreur

    Merci d'avance

  9. #9
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Bonjour
    bonjour,
    je crois que j'ai trouvé la solution, il faut écrire

    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
     
    for(int t=2;t<3;t++)
    {
    for(int i=0;i<Nx;i++)
    {
     for(int j=0;j<Ny;j++)
     {x=-1+i*stepx;
     y=-1+j*stepy;
    z=t*stept;
    Y[i][j][t]=sinh(z+asinh(1.5))*x+y;
     
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>::epsilon() || Y[i][j][t]>=0.0 - std::numeric_limits<double>::epsilon() )
    {
     cout << x << endl;
    }

    est ce que c'est vrai
    merci d'avance

  10. #10
    Membre à l'essai
    Femme Profil pro
    informatique
    Inscrit en
    Juillet 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2011
    Messages : 27
    Points : 14
    Points
    14
    Par défaut bonjour
    bonjour,
    j'ai une autre question s'il vous plait, pourquoi il m'affiche l'erreur invalid type double [400] [double] for array subscrpt

    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
     
    double k=1;
    for(int t=2;t<3;t++)
    {
    for(int i=0;i<Nx;i++)
    {
     for(int j=0;j<Ny;j++)
     {x=-1+i*stepx;
     y=-1+j*stepy;
    z=t*stept;
    Y[i][j][t]=sinh(z+asinh(1.5))*x+y;
     
    if( Y[i][j][t]<=0.0 + std::numeric_limits<double>::epsilon() || Y[i][j][t]>=0.0 - std::numeric_limits<double>::epsilon() )
    {
     T[k]=x;
    k=k+1;
    }
    Merci d'avance

  11. #11
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Pour accéder à un élément dans un tableau, l'index doit obligatoirement être un entier. Or la variable "k" est un double.
    A moins qu'il n'y ai une bonne raison de déclarer "k" en tant que double (ce qui n'est pas le cas dans le code présenté ici), je te conseillerais de plutôt le déclarer de cette façon:


Discussions similaires

  1. Réponses: 17
    Dernier message: 10/08/2011, 17h51
  2. Réponses: 11
    Dernier message: 19/09/2010, 14h37
  3. Perl: problème avec un hashage de tableau
    Par lorlando dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2009, 09h44
  4. problème avec affichage d'un tableau
    Par bandit_debutant dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 29/05/2008, 16h15
  5. Problème avec PtInRegion et un tableau dynamique
    Par mduse dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2005, 09h29

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