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 :

Fonction renvoie tableau de structures


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Fonction renvoie tableau de structures
    Bonjour / Bonsoir,

    Je suis en période d'examen et je ne croyais pas que ces structures etaient aussi difficiles woah.
    Voici l'énoncé:

    - Donner la définition d'une structure permettant de représenter un triangle par la longueur de ses 3 cotés.
    (ça, ca va, mais apres..)

    - Donner le code complet d'une fonction qui a deux paramètres d'entrées, un entier n > 0 qui est le nombre de triangles rectangles recherché, un entier borne > 0 l'entier qui borne la longueur de chaque coté des ces triangles. Cette fonction a aussi un paramètre de sortie representant le nombre de triangle trouvés. Cette fonction renvoie un tableau de n triangles rectangles dont les longueurs des cotés est borné par "borne" et tel que les perimetres des triangles trouvé soient tous differents.

    Ce que je comprends c'est qu'elle renvoie un tableau de structures.
    Que veut il dire par "parametre de sortie"?? c'est la meme chose que ce qu'il appelle n non?

    J'ai essayé mais je n'arrive pas a terminer, voici :
    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
     
    struct triangle { 
    int a; 
    int b; 
    int c; }; 
     
    triangle tab[n] fonction(int n, int borne) 
    { 
    int p=0; 
    while (p<=n) { 
    for (int c=0; c<=borne; c++) 
    { for(int b=0; b<=borne; b++) 
    for(int a=0; a<=borne; a++) 
    if (a*a+b*b=c*c) 
    p=p+1 
    .....
    Je m'arrete ici, car je ne sais pas comment stocker les valeurs a,b,c qui verifient le triangle rectangle dans une structure "nouvelle" a chaque fois..

    mercii !!

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    En effet l'énoncé n'est pas clair, il parle de paramètre de sortie représentant le nombre de triangle trouvés et la fonction renvoie un tableau de n triangles rectangles.
    Hors en C++, une fonction ne peut pas retourner un tableau (à la rigueur une référence ou bien mais un pointeur sur une zone dynamique oui, mais c'est du C et à oublier en C++).
    Voilà l'interface correspondant à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    triangle* fonction( int n , int borne , int *pNbTrouves ) {
       ...
       triangle* tabTriangles = new triangle[ nbTrouves ];
       tabTriangles[i].a = ...
       ...
       *pNbTrouves = nbTrouves; // retour par paramètre de sortie
       return tabTriangles ; // retour d'un tableau dynamique, l'appelant devra faire delete[] du tableau recu
    }

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne sais pas ce que tu as vu en cours, mais pour moi, un tableau de triangles, ça s'écrit : std::vector<Triangle>, et ça on peut le retourner sans problèmes d'une fonction.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    Mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : Mai 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour, je vous remercie d'avoir pris le temps de me répondre!

    dalfab, oui tu as raison car la prof m'a répondu en email et a bien mis un pointeur dans les paramètres, cependant je ne vois pas beaucoup moi.. Comment avoir l'idée de mettre un pointeur en paramètre ? Que veux tu dire par "retour par paramètre de sortie"..

    JolyLoic, je n'ai pas vu ça en cours donc je suppose que on ne doit pas procéder comme ça..

    Ensuite voici le code que je lui ai envoyé et qu'elle a "commenté" :

    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 <iostream>
     
    struct triangle{
    int a;
    int b;
    int c; };
     
    // on doit utiliser double ou float (voir le texte)
     
    triangle * fonction(int n, int borne, int * nb)
    // il manque un paramètre de sortie pour le nb de triangles trouvés
    {
    int cpt=0;
    /*il faut créer un tableau de triangles de taille n, même si ce tableau risque d'être trop grand.
    */
     
    while (cpt<=n) {
    for(int c=0; c<=borne; c++) {
      for(int b=0; b<=borne; b++)
      for(int a=0; a<=borne; a++)
    //il faut penser à générer des triangles distincts.
       if (a*a+b*b=c*c)
        cpt=cpt+1; 
     
     
     
    // à la fin, *nb=cpt
     
    return ...
    Voilà donc on doit bien créer un tableau dynamique comme été mentionné par dalfab, mais taille n comme dit la prof: triangle* tabTriangles = new triangle[ n ]; Mais que veut elle dire par "des triangle distincts, je sais qu'elle fait référence à l'énoncé ou on dit que les triangles ne doivent pas avoir le meme périmetre mais je bloque ici..

    ce qui me ramène à écrire ce code:

    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
    #include <iostream>
     
    struct triangle{
    int a;
    int b;
    int c; };
     
    // on doit utiliser double ou float (voir le texte)
     
    triangle * fonction(int n, int borne, int * nb)
    // il manque un paramètre de sortie pour le nb de triangles trouvés
    {
    int cpt=0;
    triangle* tabTriangles = new triangle[ n ];  /*il faut créer un tableau de triangles de taille n, même si ce tableau risque d'être trop grand.
    */
     
    while (cpt<=n) {
    for(int c=0; c<=borne; c++) {
      for(int b=0; b<=borne; b++)
      for(int a=0; a<=borne; a++)
    //il faut penser à générer des triangles distincts. COMMENT?
       if (a*a+b*b=c*c)
        cpt=cpt+1; 
    // je vais remplir le tableau //
    tabTriangle [cpt]= struct { int a; int b; int c} // Est ce qu'on peut remplir le tableau comme ça? vu que a,b,c changent avec la boucle..
     
     
     
    // à la fin, *nb=cpt
     
    return tabTriangle;
    }

    Si mon remplissage est juste, il me reste à modifier le code pour que les triangles n'aient pas le meme périmètre!!

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Pour l'initialisation d'un triangle en une fois, il faut définir un constructeur triangle (as-tu appris cela?).

    Quelque chose me perturbe encore dans l'énoncé.
    Il faut retourner des triangles rectangles où chaque côté est inférieur à une limite. Rien ne dit que les côtés ont une valeur entière, s'ils sont flottants on a une infinité de possibilités. Inversement, il existe peu de possibilités telles que les 3 côtés soient tous des nombres entiers.
    Si on pose que le côté 'c' est l'hypoténuse et qu'elle doit être entiè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
    for ( a = 1 ; a <= borne ; ++a ) { // on commence a 1, un cote ne peut pas etre nul
       for ( b = a ; b <= borne ; ++b ) { // on force b>= a pour ne pas prendre 2 triangles symetriques et qui seraient elimines au test du perimetre
          double cote_c = std::sqrt( a*a + b*b ); // longueur 'brute' du cote c
          int c = std::lround(cote_c);   // on prend la valeur entiere la plus proche
          if ( a*a + b*b == c*c ) {  // on verifie bien que cela tombe juste
             if ( c <= borne ) { // c aussi doit etre inferieur a la borne {
                // triangle elligible a condition qu'il n'ai pas le même perimetre qu'un precedent
                int perimetre = a + b + c;
                // faire ici une boucle de recherche dans les triangles precedents et comparer les perimetres
                ...
                if ( ! dejaVuUnTriangleAvecCePerimetre ) {
                   tabTriangle[nbTrianglesTrouves].a = a;
                   tabTriangle[nbTrianglesTrouves].b = b;
                   tabTriangle[nbTrianglesTrouves].c = c;
                   ++nbTrianglesTrouves;
                }
             }
          }
       ...

  6. #6
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Est-ce que la prof qui t'a répondu par email est celle qui a rédigé l'énoncé ?
    Je pose cette question car :
    • Quand j'étais en école d'ingé, un seul prof écrivait les énoncés des exercices mais plusieurs encadrants de TP le corrigeaient, chacun pour les élèves de son groupe de TP.
    • Utiliser un flottant pour les longueurs des côtés des triangles est moins cohérent qu'un entier, du moins avec les informations présentes dans ton premier message.


    C'est moins cohérent pour deux raisons :
    • Dans l'énoncé, la borne de la longueur de chaque côté d'un triangle est un entier, pas un flottant.
    • Comme le dit dalfab, si les longueurs des triangles étaient des flottants, on aurait une infinité de possibilités.
      Par exemple, la fonction suivante retournerait un triangle rectangle :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      Triangle creerTrianglePytagoricien(double perimetre) {
          Triangle result{perimetre/4, perimetre/3, perimetre*5/12};
          return result;
      }
      Pour avoir un nombre fini de possibilités, il faudrait une contrainte supplémentaire, par exemple devoir parcourir une collection prédéfinie de triangles.
      La fonction aurait alors un nouveau paramètre d'entrée : ladite collection.
      Or, l'énoncé dit bien que la fonction n'a que 2 paramètres d'entrée, pas 3.
      Ou alors, ladite collection est une variable globale à laquelle la fonction accède directement, mais c'est moche.

Discussions similaires

  1. Passage de tableau de structure à une fonction
    Par Kefass dans le forum Débuter
    Réponses: 2
    Dernier message: 18/08/2009, 19h07
  2. Comment passer un tableau de structure à une fonction
    Par mackla dans le forum Débuter
    Réponses: 12
    Dernier message: 01/06/2008, 17h21
  3. tableau de structure en parametre fonction
    Par Dark_Alex69 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/11/2007, 18h38
  4. Réponses: 2
    Dernier message: 12/05/2007, 01h57
  5. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00

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