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

Fermé
knmm Messages postés 1 Date d'inscription vendredi 19 mai 2023 Statut Membre Dernière intervention 19 mai 2023 - Modifié le 7 juin 2023 à 12:31
mamiemando Messages postés 33134 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 mai 2024 - 7 juin 2023 à 12:24

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

Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 mai 2024 913
19 mai 2023 à 18:16
0
[Dal] Messages postés 6184 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 mai 2024 1 087
Modifié le 19 mai 2023 à 18:39

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 33134 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 mai 2024 7 756
7 juin 2023 à 12:24

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