C++ : tracer des points dans un repère 2D en mode texte

knmm Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'aimerais écrire un programme qui demande les coordonnées (x, y) d'un point à l’utilisateur et affiche ces derniers dans un repère, dont l'axe des x va jusqu'à 50 et l'axe des y jusqu'à 9.

Comment faire cela à l'aide de tableaux, s'il vous plaît  Cela doit ressembler à peu près à ça :

3 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 

Salut knmm,

 comment faire cela a laide des tableaux svp

Les "tableaux" n'ont rien à voir.

Pour placer des caractères à l'écran à des emplacements précis dans un programme console sous Windows, tu peux utiliser l'API Windows :

https://forums.commentcamarche.net/forum/affich-25223584-langage-c-gotoxy-sur-devc#1

Si tu utilises un autre système d'exploitation (tu ne précises pas), tu devras faire autrement, car il n'y a pas de fonction standard en C ou C++ pour faire cela.

Note que les coordonnées de l'écran seront gérées différemment par rapport à ton repère cartésien, et tu devras faire des translations. En général, les coordonnées à l'écran sont comptée à partir de 0 à partir du coin supérieur gauche.

De plus, si tu veux faire comme dans ta photo tu devras gérer une mise à l'échelle pour les nombres en abscisses où chaque colonne de l'écran représente 1/10ème d'un entier et chaque ligne 1/2 entier pour les ordonnées.

0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 

Bonjour,

En l'occurrence, je pense que l'exercice vise précisément à se passer de l'API windows, mais c'est clair que ça simplifierait grandement la tâche. Par ailleurs, je suspecte que knmm fait allusion aux tableaux car les coordonnées de ses points sont stockées sous forme d'un tableau.

Comme la question est posée dans le forum C++, la structure idéale pour stocker les points est donc une liste de paire de coordonnées entières et positives, ce qui s'écrit :

#include <list>
#include <utility>

typedef std::pair<
    std::size_t,
    std::size_t
> point_t;

typedef std::list<point_t> points_t;

points_t initialiser_points() {
    points_t points;
    points.push_back(std::make_pair(3, 5));
    // ...
    return points;
}

Ensuite, il faut écrire une double boucle for : la première itère sur les lignes de caractères de haut en bas et la seconde, imbriquée dans la première, sur les colonnes de caractères de gauche à droite.

bool contient_point(const points_t & points, const point_t & point) {
    return points.find(point) != points.end();
}

void tracer(const points_t & points) {
  // Axe des ordonnées + points
  for (std::size_t i = 0; i < 9; i++) {
      std::size_t y = 9 - i;
      std::cout << y << " |";
      for (std::size_t j = 0; i < 50; j++) {
          std::size_t x = j;
          // Si un point (x, y) est présent dans points, le dessiner sinon écrire espace
          std::cout << (contient_point(points, point) ? 'x' : ' ');
      }
      std::cout << std::endl;
  }

  // Axe des abscisses
  for (std::size_t j = 0; i < 50; j++) {
      std::cout << "-";
  }
  std::cout << std::endl;
  for (std::size_t j = 0; i < 50; j++) {
      if (j % 10 == 0) {
          std::cout << (j / 10);
      } else {
          std::cout << ' ';
      }
  }
  std::cout << std::endl;
}

Il ne reste plus qu'à appeler ces fonctions depuis une fonction main :

int main() {
    points_t points = initialiser_points();
    tracer_points(points);
    return 0;
}

Bonne chance

0