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 :

Quelqu'un saurait-il où est l'erreur?


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut Quelqu'un saurait-il où est l'erreur?
    Bonsoir à tous

    Heureusement je n'aurai pas à faire directement mon histoire d'ondes sismiques parce que ça me faisait sérieusement stresser cette histoire

    De manière nettement plus simple, je souhaiterais réaliser une grille avec des points répartis dans 4 zones différentes que j'ai mises dans la pièce jointe.

    Je vais également vous montrer le programme que j'ai fait mais il ne fonctionne pas, pourtant il m'a l'air à peu près propre. Quelqu'un saurait il me dire ce qui ne va pas et ce qu'il faut que je fasse pour le débloquer?

    Merci beaucoup

    Voici le programme:

    Création d’un maillage

    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
    #include <stdio.h>
     
    main()
    {
    float x ;
    float z ;
    (x>=0) && (x<13);
    (z>1200) && (z<=1414.44);
       for (x=0; x<0.710; x=x+0.01)
             {
               printf(« Point situé en zone d’amortissement %f\n », x);
              }
       for (x=0.710 ; x<=2 ; x=x+0.01 ; x=x+0.01)
              {
                if ((z>=1200) && (z<=1250))
                printf(« Point situé en zone d’amortissement %f\n », x) ;
                if ((z>=1250) && (z<=-18.062*x+1322.82))
                printf(« Point situé dans la roche mère %f\n, x) ;
                if ((z>-18.062*x+1322.82) && (z <=-1.705*x+1311.21))
                printf(« Point situé dans les sédiments %f\n, x) ;
                if ((z>-1705*x+1311.21) && (z<=1414.44))
                printf(« Point en surface %f\n », x) ;
               }
    return 0 ;
    }
    Images attachées Images attachées  

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    A vue d'oeil, il y a des trucs qui ne vont pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (x>=0) && (x<13);
    (z>1200) && (z<=1414.44);


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (x=0.710 ; x<=2 ; x=x+0.01 ; x=x+0.01)

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    À mon grand désarroi, je me doute en effet que des choses ne vont pas. Manque de chance, je ne suis pas bon du tout en programmation et il faut pourtant que je fasse avec cette lacune au quotidien

    Les 3 choses que tu as indiquées sont elles les seules qui te paraissent aberrantes?
    Puisque les valeurs que j'ai déclarées sont de type float, pourquoi devrais-je mettre int devant la fonction main?

    Pour ta troisième remarque, cette erreur n'est pas dans le programme d'origine. C'est juste que je n'ai pas pu faire de copier coller du programme dans le site Web et il a fallu que je le recopie mot à mot.

    Pour ta seconde remarque, je ne comprends pas pourquoi c'est faux. Après avoir déclaré mon x et mon z, j'avais besoin de définir un rectangle dans lesquels ils devaient impérativement se trouver. La syntaxe est elle absurde? Dans ce cas, quelle est la bonne pour ce genre de choses?

    Merci d'être intervenu dans ce topic.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut.

    Je ne comprends pas trop ce que ton code est censé effectuer. Pourrais-tu donner plus de précisions ?

    Sinon, côté programmation C, il y a effectivement de nombreuses choses qui ne vont pas.

    Déjà, la variable z n'est pas initialisée. Cela va poser un problème pour le test des conditions.

    Puisque les valeurs que j'ai déclarées sont de type float, pourquoi devrais-je mettre int devant la fonction main?
    Cela n'a rien à voir. Quand un programme se termine, il doit renvoyer une valeur au système d'exploitation. La fonction principale doit toujours renvoyer un entier de type int, en l'occurrence la valeur EXIT_SUCCESS si le programme se termine normalement.

    Pour ta seconde remarque, je ne comprends pas pourquoi c'est faux. Après avoir déclaré mon x et mon z, j'avais besoin de définir un rectangle dans lesquels ils devaient impérativement se trouver. La syntaxe est elle absurde? Dans ce cas, quelle est la bonne pour ce genre de choses?
    Là, je ne comprends pas ta manoeuvre. On ne peut pas définir une zone de cette manière.

    Lorsqu'en C, tu écris par exemple
    le programme va simplement tester si x>=0 ET si x<13. Or, là, les conditions sont testées mais le résultat du test est perdu. Lors de la compilation, cela ne va pas provoquer une erreur mais un warning, qui va t'indiquer que ce qui est écrit dans la ligne sera sans effet.
    Tu peux par contre te servir du if pour tester des conditions et exécuter des instructions en cas de réussite du test, en fonction de ce que tu veux faire.
    Et si tu veux "quadriller" ton graphique afin d'effectuer des tests à divers endroits, tu dois utiliser une boucle voire une boucle à l'intérieur d'une autre boucle si tu veux te positionner à la position X,Y.

    Mais avant de pouvoir te diriger correctement, il faudrait que tu nous apporte des précisions sur ce que ton programme est vraiment censé faire.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    Bonjour

    Je vais essayer d'être plus précis:

    Le proigramme que j'essaie de créer est en fait la première étape de ce qui viendra ensuite, à savoir une étude de propagation d'ondes sismiques. Mais chaque chose en son temps.

    Dans la mesure où mon étude correspond à une tranche verticale de sol dans un bassins édimentaire, j'ai des strates de différents matériaux dont les limites sont symbolisées sur les schéma que j'ai mis en pièce jointe dans mon premier post. Certaines fois, ce sont des lignes horizontales, d'autres fois non, mais quand ce n'est pas le cas, j'ai mis les équations des droites sur ce même schéma.

    Comme je me trouve dans une tranche de sol en 2D, je peux donc dire que mon étude se passe dans un rectangle (le fameux que j'essaie de définir).

    Le logiciel dont je me sers permet d'établir un maillage à l'intérieur de ce rectangle, et qui est constitué d'un certain nombre de cellules dont il est possible d'avoir les coordonnées des centres. Ce que je veux, c'est un programme qui, si je lui rentre les coordonnées du centre d'une cellule, me renvoie une phrase me disant dans quelle strate elle se trouve (zone d' amortissement, roche mère, sédiments ou surface).

    J'ai bien conscience de l' aspect ultra basique de ce programme, mais je galère quand même et j'aimerais vraiment y arriver et comprendre pourquoi je ne fais pas les choses bien.

    Je te propose donc une nouvelle solution, en espérant qu'elle soit un peu moins lamentable que la première:

    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
    #include <stdio.h>
     
    int main(void)
    {
    float x ;
    float z ;
    0<=x<=13;
    1200<=z<=1414.44;
       for (x=0; z=0; x<=0.710; z<=1414.44; x=x+0.01: z=z+0.01)
             {
               printf(« Point situé en zone d’amortissement %f\n », x, z);
              }
       for (x=0.710 ; x<=2; z=1200 ; z<=1414.44; x=x+0.01 ; z=x+0.01)
              {
                if (1200<=z<=1250)
                printf(« Point situé en zone d’amortissement %f\n », x, z) ;
                if (1250<z<=-18.062*x+1322.82)
                printf(« Point situé dans la roche mère %f\n, x, z) ;
                if (-18.062*x+1322.82<z<=-1.705*x+1311.21)
                printf(« Point situé dans les sédiments %f\n, x, z) ;
                if (-1705*x+1311.2<z<=1414.44)
                printf(« Point en surface %f\n », x, z) ;
               }
    return 0 ;
    }
    Question annexe: mes { } sont elles mises au bons endroits et doit-on mettre des espaces quand on veut par exemple écrire 2<z<3 ou 2 < z < 3)?

    Je précise que j'apprécie vraiment ton aide.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    Les espaces n'ont pas d'importance en C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (x>=0) && (x<13);
    (z>1200) && (z<=1414.44);
    ne fait rien

    Et tes boucles for ne sont pas bonnes. Si tu as 3 variables tu dois faire 3 boucles imbriquées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (i.....)
    {
           for (j.....)
           {
                     for (k .....)
                     {
                      printf (.....);
                      }
           }
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    et il y'a aussi un problème avec tes if je crois

    Je ne crois pas que

    marche

    -> plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (1200 <= z && z <= 1250)

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Le problème est plutôt simple.
    Ton schéma se compose de plusieurs cellules (rectangle et triangle) positionnées les unes au côté des autres. On connait leur emplacement grâce à la position de chacun des points qui les compose.

    Il suffit alors de faire une succession de test pour déterminer à quel élément correspond la position (x,z).

    Quelque chose du style :

    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
    #include<stdio.h>
     
    int main(void)
    {
        double x, z, z_sommet_zone2, z_sommet_zone3;
     
        printf("Entrez x :");
        scanf("%lf",&x);
     
        printf("Entrez z :");
        scanf("%lf",&z);
     
        if (x<0.0 || x>=2.0 || z<1200.0 || z>=1414.44) printf("Vous n'etes dans aucune zone.\n");
        else
        {
            if ((x>=0.0 && x<0.71) || (x>=0.71 && z>=1200.0 && z<1250.0)) printf("Vous etes dans la zone 1.\n");
            else
            {
                z_sommet_zone2=1322.82-18.062*x;
                z_sommet_zone3=1311.21-1.705*x;
                if (z<z_sommet_zone2) printf("Vous etes dans la zone 2.\n");
                else if (z<z_sommet_zone3) printf("Vous etes dans la zone 3.\n");
                else printf("Vous etes en zone de surface.\n");
            }
        }
        getchar();
        getchar();
    	return 0;
    }
    La méthode est simple.
    Déjà, on teste si x et z débordent du graph.
    Si ce n'est pas le cas, alors :
    1) On teste si on est dans la zone 1.
    2) Si ce n'est pas le cas, on se trouve alors forcément soit dans la zone 2, la zone 3 ou la zone de surface.
    2a) Dans ce cas, il faut alors calculer, pour x donné, la hauteur limite de la zone 2 et de la zone 3.
    2b) Si z est inférieur au sommet de la zone 2, c'est qu'on est forcément dans la zone 2, car si on avait été dans la zone 1, le test 1) n'aurait pas échoué.
    2c) Sinon, on teste si z est inférieur au sommet de la zone 3. Si c'est le cas, on est forcément dans la zone 3, car vu que le test 2b) a échoué, c'est qu'il ne peut pas en être autrement.
    2d) Si le dernier test échoue, c'est que finalement, on est forcément dans la zone de surface.

    Voilà. Si tu as des questions...

  9. #9
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    Au secours, c'est de pire en pire

    Voici l'état actuel du 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
    #include <stdio.h>
     
    int main(void)
    {
    float x;
    float y;
    0<=x<=13;
    1200<=z<=1414.44
        for (x=0; x<=0.710; x=x+0.01)
            {
             for (z=0; z<=1414.44; z=z+0.01)
                 {
                  printf("Point situé en zone amortie %f\n", x, z);
                 }
        for (x=0; x<=2; x=x+0.01)
            {
             for (z=1200; z<=1414.44; z=z+0.01)
                 {
                  if ((1200<=z) && (z<=1250))
                  printf("Point situé en zone amortie %f\n", x, z)
                  if ((1250<=z) && (z<=-18.062*x+1322.82))
                  printf("Point situé dans la roche mère %f\n", x, z)  
                  if ((-18.062*x+1322.82<z) && (z<=-1.705*x+1311.21))
                  printf("Point situé dans les sédiments %f\n", x, z)
                  if ((-1.705*x+1311.2<z) && (z<=1414.44))
                  printf("Point en surface %f\n, x, z)
                 }
            }
    return 0;
    }
    Et voilà la quantité effarante de messages d'erreurs que je reçois quand j'essaie de le compiler. Peut être que ça vous parlera, parce que pour moi, ça s'apparente à du Chinois:

    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
    maillage_profil1.C:13: error: stray '\253' in program
    maillage_profil1.C:13: error: stray '\351' in program
    maillage_profil1.C:13: error: stray '\' in program
    maillage_profil1.C:13: error: stray '\273' in program
    maillage_profil1.C:21: error: stray '\253' in program
    maillage_profil1.C:21: error: stray '\351' in program
    maillage_profil1.C:21: error: stray '\' in program
    maillage_profil1.C:21: error: stray '\273' in program
    maillage_profil1.C:23: error: stray '\253' in program
    maillage_profil1.C:23: error: stray '\351' in program
    maillage_profil1.C:23: error: stray '\350' in program
    maillage_profil1.C:23: error: stray '\' in program
    maillage_profil1.C:25: error: stray '\253' in program
    maillage_profil1.C:25: error: stray '\351' in program
    maillage_profil1.C:25: error: stray '\351' in program
    maillage_profil1.C:25: error: stray '\' in program
    maillage_profil1.C:27: error: stray '\253' in program
    maillage_profil1.C:27: error: stray '\' in program
    maillage_profil1.C:27: error: stray '\273' in program
    maillage_profil1.C: In function 'int main()':
    maillage_profil1.C:13: error: 'Point' was not declared in this scope
    maillage_profil1.C:21: error: 'Point' was not declared in this scope
    maillage_profil1.C:23: error: 'Point' was not declared in this scope
    maillage_profil1.C:25: error: 'Point' was not declared in this scope
    maillage_profil1.C:27: error: 'Point' was not declared in this scope

  10. #10
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    Jeroman, il semblerait que j'étais entrain de rédiger mon message quand tu as posté le tien.

    Quand je vois le code que tu proposes, je le comprends, et je te remercie de m'avoir proposé cette solution. Il y a cependant une chose qui m'agace au plus haut point, c'est de ne pas comprendre pourquoi le mien est faux (et par la même occasion de ne jamais arriver à créer un programme fonctionnel). Il y a sûrement une erreur de logique quelque part, mais je n'arrive pas à savoir où

    Ca a un aspect assez désespérant. Pourtant il me semble que je traite chaque cas l'un après l'autre (à l'exception du cas où on est en dehors du cadre, mais il ne me semblait pas utile de le faire dans la mesure où je précisais dès le début les doubles inégalités sur x et z )

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    toutes les instructions en C se finissent par un " ; "

  12. #12
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut
    Ton code corrigé :

    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
    #include <stdio.h>
     
    int main(void)
    {
    float x;
    float y;
        for (x=0; x<=0.710; x=x+0.01)
            {
             for (z=0; z<=1414.44; z=z+0.01)
                 {
                  printf("Point situé en zone amortie %f\n", x, z);
                 }
        for (x=0; x<=2; x=x+0.01)
            {
             for (z=1200; z<=1414.44; z=z+0.01)
                 {
                  if ((1200<=z) && (z<=1250))
                  printf("Point situé en zone amortie %f\n", x, z);
                  if ((1250<=z) && (z<=-18.062*x+1322.82))
                  printf("Point situé dans la roche mère %f\n", x, z)  ;
                  if ((-18.062*x+1322.82<z) && (z<=-1.705*x+1311.21))
                  printf("Point situé dans les sédiments %f\n", x, z);
                  if ((-1.705*x+1311.2<z) && (z<=1414.44))
                  printf("Point en surface %f\n, x, z);
                 }
            }
    return 0;
    }

  13. #13
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    La vache, je n'arrive pas à croire que le problème venait seulement de ces fichus ;

    Remarque d'une certaine manière ça me remonte le moral.

    J'ai testé le code et il fonctionne.

    Merci beaucoup à tout le monde pour votre aide

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

Discussions similaires

  1. Où est l'erreur?
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 26/10/2005, 09h48
  2. [VB.NET] Pagination DataGrid (où est l'erreur?)
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/10/2004, 11h46
  3. Ou est l'erreur ?
    Par Antoine NSG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/09/2004, 10h56
  4. [Erreur] Quel est cette erreur?
    Par netah25 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2004, 10h16

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