C++ : tracer des points dans un repère 2D en mode texte
Fermémamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 7 juin 2023 à 12:24
3 réponses
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.
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