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 :

Liste de points et repérage de couches


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Liste de points et repérage de couches
    Bonjour,

    Comme dit le proverbe, jamais 2 sans 3. J’ amène donc mon troisième problème. Il s’ agit en fait d’ une évolution du code pour lequel j’ avais sollicité de l’ aide ces derniers jours et qui n’ a pas plu à mon boss parcequ’ il n’ était apparemment pas assez « général ».

    L’ évolution est la suivante : je me place toujours dans un rectangle, et le programme doit avoir deux étapes bien distinctes dans son fonctionnement ; tout d’ abord, je souhaite qu’ il m’ affiche une liste avec les coordonnées de tous les points disposés à intervalles réguliers (dont je fixe le pas). Il s’ agit d’ une grille régulière.

    Une fois cette liste affichée, c’est là que ça se corse. Je veux que le programme me demande combien de couches je veux pour le sous-sol. Idéalement, je souhaiterais que ce nombre de couches ne soit pas limité, mais si ce n’est pas possible, alors je pense que les valeurs 1, 2 et 3 (la 1 étant la plus basse et on monte successivement) devraient suffire. Une fois que je lui ai fixé le nombre de couches, je veux qu’il me demande a chose suivante :
    « Entrez les coordonnées (i1, j1) d’ un nœud appartenant à une interface entre les couches 1 et 2»
    « Entrez les coordonnées (i2, j2) d’ un nœud appartenant à cette même interface avec i2 > i1 »
    // La condition i2>i1 me paraît nécessaire pour que les intervalles définis restent orientés dans le sens des x croissants, ce qui simplifie le programme.//
    « Entrez les coordonnées (x, y), d’ un point »

    Une fois que les coordonnées (x, y) sont entrées, je veux qu’ il évalue si le point se situe au dessus ou en dessous de la droite reliant (i1, j1) à (i2, j2). Si il est en dessous, je veux que le programme me renvoie un message du genre
    « Le point appartient à la couche 1 »
    Si il est au dessus, je veux qu’il me renvoie :
    « Le point est situé dans la couche 2 ou 3. Entrez les coordonnées (i3, j3) d’ un nœud appartenant à l’ interface entre les couches 2 et 3. »
    « Entrez les coordonnées (i4, j4) d’ un nœud à l’ interface entre les couches 2 et 3 avec i4>i3).
    Et là il évalue si le point de coordonnées (x, y) se situe au dessus ou en dessous de cette interface. Si il est en dessous, il me renvoie :
    « Le point en situé dans la couche2 »
    Sinon, il me renvoie :
    « Le point est situé dans la couche 3 »

    Voici le code que j’ai fait jusqu’à présent, mais il n’est pas complet :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include cond_limite_ext.h
     
    int main(void)
     
    //Largeur du profil :
    int L=13000 ;
    // Hauteur du profil :
    int H=2000 ;
     
    float i, j, x, y, a, b, a_1, b_1, i_1, i_2, i_3, i_4, j_1, j_2, j_3, j_4 ; Ici, j’ ai un problème car si le nombre de couches est de seulement 1 ou 2, je vais me retrouver avec des floats en trop qui ne serviront à rien dans mon programme. Est-ce un problème de déclarer des floats potentiellement inutiles en fonction des instructions (en l’ occurrence le nombre de couches) que l’ on rentre ensuite ?
    int k ; (Je voudrais que cet entier ne puisse prendre que les valeurs 1, 2 ou 3, mais je ne sais pas très bien comment faire)
     
    for (i=0, i=L, i=i+10)for (j=0, j=H, j=j+10)
                 
       printf(« Coordonnées du nœud n ») ;
       printf(« %f, %f, 0 n », i, j) ;
                 
            
    printf(« Entrez un nombre de couches compris entre 1 et 3 n ») ;
    scanf(« %d, &k) ;
    À ce niveau, je ne sais pas comment lui faire faire la différence entre 1, 2 et 3 couches, ce qui conditionne pourtant la suite du programme. Le code qui suit fait comme si il y avait 3 couches. Pourriez vous s’il vous plaît m’ aider pour que, par exemple si je lui rentre un nombre de couches égal à 1 ou 2, le programme m’ élimine automatiquement les cas en trop ?
    printf(« Entrez les coordonnées d’ un point appartenant à l’ interface entre les couches 1 et 2 n ») ;
    scanf(« %f, %f », &i_1, &j_1) ;
     
    printf(« Entrez les coordonnées d’ un second point appartenant à l’ interface entre les couches 1 et 2 avec i_2>i_1 n ») ;
    scanf(« %f, %f », &i_2, &j_2) ;
     
    if (i_2<i_1)
    printf(« Vous êtes vraiment un âne, on vous avait dit i_2>i_1 n ») ;
    else () ; Ai-je le droit de ne rien mettre entre les parenthèses du else si la condition est satisaite ?Sinon, que dois-je mettre comme instructions ?
     
    a=(j_2-j_1)/(i_2-i_1) ;
    b=(j_1-a*i_1) ;
     
    printf(« Entrez les coordonnées x et y d’ un point n ») ;
    scanf(« %f, %f », &x, &z) ;
     
    if (a*x + b – y >0)
        printf(« Le point se situe dans la couche 2 ou 3 n ») ;
        printf(« Entrez les coordonnées d’ un point appartenant à l’ interface entre les couches 2 et 3 n ») ;
        scanf(« %f, %f », &i_3, &j_3) ;
     
        printf(« Entrez les coordonnées d’ un second point appartenant à l’ interface entre les couches 1 et 2 avec i_4>i_3 n ») ;
        scanf(« %f, %f », &i_4, &j_4) ;
        if (i_4<i_3)
        printf(« Vous le faites exprès ? On a dit i_4>i_3 n ») ;
        else () ;
     
        a_1=(j_4-j_3)/(i_4-i_3) ;
        b_1=(j_3-a_1*i_3) ;
                     if (a_1*x + b_1 – y >0)
                     printf(« Le point se situe dans la couche 3 n ») ;
                     else(« Le point est dans la couche 2 n ») ;
    else
            printf(« Le point se situe dans la couche 1 n ») ;
     
    return 0 ;
     
    
    Voilà. Je ne l’ai pas testé (Je l’ai tapé sur mon ordi portable sur lequel je n’ai pas de compilateur de C). Quelqu’un pourrait-il me dire si il voit des erreurs énormes, ce que je dois faire aux endroits où j’ai mis des annotations avec pour objectif d’arriver au but décrit tout en haut ?

    Merci beaucoup et bon week end à tout le monde

    @+

    [EDIT] traduction en style C du code précédent (plus quelques omisssion {," )
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include "cond_limite_ext.h"
     
    int main(void)
    { 
    //Largeur du profil :
      int L=13000 ;
    // Hauteur du profil :
      int H=2000 ;
     
      float i, j, x, y, a, b, a_1, b_1, i_1, i_2, i_3, i_4, j_1, j_2, j_3, j_4 ;
      /* Ici, j’ ai un problème car si le nombre de couches est de seulement
       1 ou 2, je vais me retrouver avec des floats en trop qui ne serviront
       à rien dans mon programme. Est-ce un problème de déclarer des floats
       potentiellement inutiles en fonction des instructions (en l’ occurrence
       le nombre de couches) que l’ on rentre ensuite ? */
      int k ; /*Je voudrais que cet entier ne puisse prendre que les valeurs
               1, 2 ou 3, mais je ne sais pas très bien comment faire) */
     
      for (i=0, i=L, i=i+10)
      {
        for (j=0, j=H, j=j+10)
        {
         printf(" Coordonnées du nœud \n") ;
         printf(" %f, %f, 0 \n", i, j) ;
        }
      }
      printf(" Entrez un nombre de couches compris entre 1 et 3 \n") ;
      scanf(" %d", &k) ;
    /* À ce niveau, je ne sais pas comment lui faire faire la différence entre
     1, 2 et 3 couches, ce qui conditionne pourtant la suite du programme.
     Le code qui suit fait comme si il y avait 3 couches. Pourriez vous
     s’il vous plaît m’ aider pour que, par exemple si je lui rentre un nombre
     de couches égal à 1 ou 2, le programme m’ élimine automatiquement les cas
     en trop ?
     */
      printf(" Entrez les coordonnées d’ un point appartenant à l’ interface entre les couches 1 et 2 \n") ;
      scanf(" %f, %f ", &i_1, &j_1) ;
     
      printf(" Entrez les coordonnées d’ un second point appartenant à l’ interface entre les couches 1 et 2 avec i_2>i_1 \n") ;
      scanf(" %f, %f ", &i_2, &j_2) ;
     
      if (i_2<i_1)
        printf(" Vous êtes vraiment un âne, on vous avait dit i_2>i_1 \n ") ;
      else () ;
      /* Ai-je le droit de ne rien mettre entre les parenthèses du else si
       la condition est satisaite ? Sinon, que dois-je mettre comme instructions ?*/
     
      a=(j_2-j_1)/(i_2-i_1) ;
      b=(j_1-a*i_1) ;
     
      printf(" Entrez les coordonnées x et y d’ un point \n ") ;
      scanf(" %f, %f ", &x, &z) ;
     
      if (a*x + b - y >0)
        printf(" Le point se situe dans la couche 2 ou 3 \n ") ;
        printf(" Entrez les coordonnées d’ un point appartenant à l’ interface entre les couches 2 et 3 \n ") ;
        scanf(" %f, %f ", &i_3, &j_3) ;
     
        printf(" Entrez les coordonnées d’ un second point appartenant à l’ interface entre les couches 1 et 2 avec i_4>i_3 \n ") ;
        scanf(" %f, %f ", &i_4, &j_4) ;
        if (i_4<i_3)
        printf(" Vous le faites exprès ? On a dit i_4>i_3 \n ") ;
        else () ;
     
        a_1=(j_4-j_3)/(i_4-i_3) ;
        b_1=(j_3-a_1*i_3) ;
                     if (a_1*x + b_1 - y >0)
                     printf(" Le point se situe dans la couche 3 \n") ;
                     else(" Le point est dans la couche 2 \n ") ;
    else
            printf(" Le point se situe dans la couche 1 \n ") ;
     
    return 0 ;
     
    }

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Manifestement, il n'aime pas mes backslashs et autres accolades. Il les a remplacées par des notations absurdes, mais en pratique, ils y sont

    ++

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    /* Ici, j’ ai un problème car si le nombre de couches est de seulement
    1 ou 2,...*/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      printf(" Entrez un nombre de couches compris entre 1 et 3 \n") ;
      scanf(" %d", &k) ;
    A ce moment, tu connais le nombre de couches
    Il peut être alors interessant de te tourner vers l'allocation dynamique :
    - tu auras le nombre de variables qui te convient
    - tu auras tes variables sous forme de tableau, donc ordonnées


    et les autres ....
    les comparaisons ne se font pas avec = mais ==

    /* Ai-je le droit de ne rien mettre entre les parenthèses du else si
    la condition est satisaite ? Sinon, que dois-je mettre comme instructions ?*/
    Le else ne comporte pas de parenthèses ni de conditions complémentaires à celles du if. Si tu n'as pas besoin du else, alors ne le mets pas, c'est simple !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Merci d'être intervenu.

    J'ai cependant deux questions concernant ce que tu as écrit: au risque de passer pour un âne, je ne suis pas sûr de savoir ce qu'est l' allocation dynamique. Pourrais-tu s'il te plaît développer ce point?

    La seconde question concerne ce que tu dis quand il fat que je remplace = par ==. Pourquoi devrais-je faire cela? Il s'agit d'une simple boucle

    @+

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Flo Flo Voir le message
    je ne suis pas sûr de savoir ce qu'est l' allocation dynamique. Pourrais-tu s'il te plaît développer ce point?
    La création d'un objet à l'exécution. C'est souvent le cas de tableaux dont la taille n'est connue qu'à l'exécution.

    On utilise alors malloc() / free()... Relire ton cours de C.
    La seconde question concerne ce que tu dis quand il fat que je remplace = par ==. Pourquoi devrais-je faire cela? Il s'agit d'une simple boucle
    Curieuse question...

    = est l'opérateur d'affectation
    == est l'opérateur de comparaison

    encore une fois, relis ton cours, et utilise l'opérateur qui répond à ton problème.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    C'est bien là qu'est mon problème: je n'ai jamais eu de cours de C, pas plus que de programmation en général et je me retrouve à devoir en faire

    J'ai acheté un bouquin de C, mais e n'est pas forcément suffisant et ça ne m'étonne donc pas vraiment que je pose des questions étranges de temps en temps.

    Pour en revenir à mon programme, dans ma boucle, je ne suis pas sûr de voir ni de comprendre pourquoi ma syntaxe avec un seul signe = et pas un double est fausse. Je veux que mon programme passe en revue tous les i de 0 à L. D'après les exemples de boucles que j'ai pu voir, il n'y avait pas de double signe == dans les boucles. Mais peut être suis-je une fois de plus complètement à l' Ouest...

    Quant à cette allocation dynamique, je ne sais pas trop quoi penser de malloc et free dans la mesure où je n'ai aucune idée de la syntaxe à utiliser pour parvenir au résultat que je souhaite.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    normalement, ton bouquin de C devrait suffir.

    Tu as les man pages (les pages d'aide) ici-même :

    http://man.developpez.com/man3/
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans les instructions de contrôle, il y a une expression de test :
    for(exp1; exp2; exp3)....
    - exp1 et exp3 sont des expressions qui possèdent un effet de bord (sinon elle ne servent à rien), c'est à dire (pour simplifier) qu'elles modifient la valeur d'une variable
    - exp2 est une expression à valeur booléenne, c'est à dire dont le résultat est estimé comme étant Vrai ou Faux. Elle peut ne pas avoir d'effets de bord. Les expressions booléennes sont obtenues comme résultats des opérateurs de comparaison (== != < <= > >=) combinés éventuellement avec les opérateurs logiques && , || ou !

    Le mécanisme est le suivant :
    1- exp1 est évaluée
    2- exp2 est évaluée. Si elle est Vrai, le corps de la boucle for est exécuté
    3- Si le corps de la boucle a été exécuté, après son exécution exp3 est évaluée et on retourne en 2

    Autre exemple :
    if(exp)...
    else ...
    Ici aussi exp est une expression à valeur booléenne. Si elle est Vrai, le corps du if est exécuté. Si elle est Fausse et si il y a une clause else, le corps du else est exécuté.
    pourquoi ma syntaxe avec un seul signe = et pas un double est fausse.
    Il n'y a pas d'erreur de syntaxe, il n'est pas interdit d'écrire = au lieu de ==, mais ce n'est pas ce que tu veux faire
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Oki. Merci pour la boucle. Je ne referai plus cette bêtise à l'avenir.

    Et concernant l' allocation dynamique, quelqu'un pourrait il m'aider sur la syntaxe à suivre?

    Bonne soirée à tout le monde

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    malloc() pour allouer et free() pour libérer
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/05/2009, 22h06
  2. eclipse trier une liste de points désordonnés
    Par pvoncken dans le forum Physique
    Réponses: 0
    Dernier message: 23/10/2007, 13h56
  3. Obtenir la zone minimum englobante d'une liste de points(x,y)
    Par Chekov dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/02/2007, 16h18
  4. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05
  5. [ plugin ][ extension point ] liste des points d'extension
    Par Satch dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 19/03/2004, 09h34

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