Définir la taille d'un tableau (Matrice) par l'utilisateur en C+

- - Dernière réponse :  Mus - 27 nov. 2014 à 19:27
Bonjour,
Et bien je veut bien savoir s'il y a une méthode pour définir un tableau en laissant à l'utilisateur le choix d'introduire le nombre des cases.
Par exemple:
cin>>n;
char tab[n];

Merci
Afficher la suite 

9 réponses

Messages postés
3797
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 novembre 2019
90
0
Merci
Bonjour.

Oui, il suffit de lui demander:
#include <vector>

int main()
{
  int size = 0;
  std::vector<int> tab;

  std::cout << "Taille ? ";
  std::cin >> size;

  tab.resize(size);

  return 0;
}


Je recommande néanmoins l'utilisation de ".push_back" d'un "vector", qui te permet d'ajouter des éléments sans se soucier de la taille.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
0
Merci
Salut, merci pour votre réponse.
Maintenant, une 2ème question se pose:
pour effectuer un traitement (comme l'affectation) sur ce type, comment je doit faire? J'ai essayé d'affecter comme suit : tab[i]=............ mais il n'en accepte pas.
Merci encore.
Commenter la réponse de Mus
0
Merci
Oh merci, c'est vraiment génial.
Est_ce utile même pour les matrices ?
Si oui, comment je doit faire?
J'ai essayé cette instruction : tab.resize(size , size);
mais ça ne marche pas.
Merci encore.
Commenter la réponse de Mus
Messages postés
3797
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 novembre 2019
90
0
Merci
Exemple d'utilisation:

1) Affectation après une taille donnée (bof, pas terrible):
#include <vector>

int main()
{
  int size = 3;
  std::vector<int> tab;
  tab.resize(size);
  tab[0] = 789;
  tab[1] = 35;
  tab[2] = 41;

  for (int i = 0; i < tab.size(); ++i)
    std::cout << tab[i] << std::endl;

  return 0;
}


2) Ajout d'éléments. La taille du tableau est dynamique (mieux !):
#include <vector>

int main()
{
  int size = 3;
  std::vector<int> tab;
  tab.push_back(789);
  tab.push_back(35 );
  tab.push_back(41);

  for (int i = 0; i < tab.size(); ++i)
    std::cout << tab[i] << std::endl;

  return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
ttp://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
0
Merci
Je suis d'accord. Mais pour un tableau multidimensionnel, comment faire la déclaration(2 dimensions par exemple)?
Merci beaucoup
Commenter la réponse de Mus
Messages postés
3797
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 novembre 2019
90
0
Merci
Faudrait peut être préciser ta question dès le début...

Tu fais soit un std::vector< std::vector<int> > ou alors tu utilises un tableau simple pour y stocker des dimensions. Via la formule: x + y * taille;
Un exemple ici:
https://github.com/cptpingu/game/blob/master/src/Core/Array2D.hh

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
0
Merci
Non non, ce n'est pas ce que je cherche
J'ai bien compris votre première réponse.
La question maintenant: est-ce qu'on peut faire la même chose en modifiant cette instruction:
std::vector< std::vector<int> >
en
std::vector< std::vector<int, int> >
Commenter la réponse de Mus
Messages postés
3797
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
8 novembre 2019
90
0
Merci
Si si, c'est exactement ce que tu recherches !
Pour faire un tableau à double dimension (pour une matrice par exemple), ma réponse précédente répond à ta question...

"std::vector< std::vector<int, int> >" n'a aucun sens (et est d'ailleurs impossible). C'est bien "std::vector< std::vector<int> >" que tu veux. Maintenant, comme c'est un peu chiant de manier un "std::vector< std::vector<int> >", je te proposais une classe qui faisait ce boulot pour toi.

Relis attentivement ma réponse précédente. Et cherche des exemples de "std::vector< std::vector<int> >" sur le net. Tu peux aussi utiliser la classe que je te propose, au choix.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
0
Merci
Ok, je vais relire l'exemple de la classe.
Merci beaucoup pour votre aide.
Salut
Commenter la réponse de Mus