Piocher aléatoirement dans un tableau

Fermé
RollK - 23 nov. 2011 à 17:29
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 4 déc. 2011 à 21:05
Bonjour, je voudrais tirer aléatoirement une chaîne de caractère contenu dans un tableau, je débute et j'ai fait ce code qui, malheureusement ne marche pas... :

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
int const Prenom(5);
vector<string> listeNoms(Prenom);

   listeNoms[0] = 'Quentin';
   listeNoms[1] = 'Charles';
   listeNoms[2] = 'Jean';
   listeNoms[3] = 'Mathieu';
   listeNoms[4] = 'Theodule';
   listeNoms[5] = 'Marc';


string nomAleatoire;


   for(int i(0); i<listeNoms; ++i)
   {
      nomAleatoire = listeNoms[i];
   }


srand(time(0));

    nomAleatoire = rand() % 5;

   cout << "Elève choisit " << nomAleatoire << endl;

   return 0;
}


Voili voilou, si vous pouviez m'expliquer, ce serait sympa, merci.
A voir également:

11 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
24 nov. 2011 à 18:35
Je connais rien au c++, alors je t'aide comme je peux, et dans ce qui me parait flagrant, c'est que la boucle ne sers à rien et qu'il faut que tu accède à ton tableau avec pour indice le nombre aléatoire... ça doit donner un truc comme ça :
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
int const Prenom(5);
vector<string> listeNoms(Prenom);

   listeNoms[0] = 'Quentin';
   listeNoms[1] = 'Charles';
   listeNoms[2] = 'Jean';
   listeNoms[3] = 'Mathieu';
   listeNoms[4] = 'Theodule';
   listeNoms[5] = 'Marc';

string nomAleatoire;

srand(time(0));

   nomAleatoire = listeNoms[rand() % 5];

   cout << "Elève choisit " << nomAleatoire << endl;

   return 0;
}
0
Salut, alors je ne sais pas ce que j'ai fait, mais j'ai mélangé C et C++ il me semble au niveau des includes...

En tout cas, je lance ton programme, puis après, j'ai message d'erreur qui me dit :" Programme a cessé de fonctionner..."

Alors, j'enlève #include <ctime> et #include <cstdlib>, mais là après mon programme ne se lance et affiche pleins d'erreur.

Merci de ton aide.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
29 nov. 2011 à 18:37
Il faut peut-être que tu relances un sujet là, car au vu de mes notions en C, je ne peux t'aider d'avantage et ceux qui peuvent t'aider doivent penser que quelqu'un s'en occupe déjà !
Pense à préciser dans l'intitulé que c'est du C...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 15:16
1)
int const Prenom(5);
Tu as 6 valeurs dans ton tableau pas 5, alors autant mettre 6 non ?
Pourquoi appeler ta variable Prenom alors que c'est un entier ?

2)
listeNoms[0] = 'Quentin';
Une chaîne de caractères ça se met entre guillemets pas avec des apostrophes.

3)
string nomAleatoire;

for(int i=0; i<listeNoms; i++)
{
    nomAleatoire = listeNoms[i];
}
listeNoms est un vector, pas un entier, tu ne peux pas faire i<listeNoms.
De plus ta boucle ne sers à rien, tu ne fais que récupérer le dernier nom de la liste dont tu ne te sers pas ensuite.

4)
nomAleatoire = rand() % 5;
Ce n'est toujours pas 5, mais 6. De plus comme l'a indiqué Nicocorico, rand%5 renvoit un entier pas une string.

5)
cout << "Elève choisit " << nomAleatoire  << endl

Tu ne peux pas utiliser des string avec cout, il faut faire une conversion en char*

6)
#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

int main()
{
	srand(time(0));

	vector<string> listeNoms;
	
	listeNoms.push_back("Quentin");
	listeNoms.push_back("Charles");
	listeNoms.push_back("Jean");
	listeNoms.push_back("Mathieu");
	listeNoms.push_back("Theodule");
	listeNoms.push_back("Marc");

	int nombreAleatoire = rand() % listeNoms.size();
	string nomAleatoire = listeNoms.at(nombreAleatoire);

	cout << "Elève choisit " << nomAleatoire.c_str() << endl;

	return 0;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut,

Merci beaucoup, mais je rencontre une erreur à la ligne 9, rand(time(0)); "was not déclared in this scope"
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 17:33
C'est parce que tu as enlevé <ctime>, il faut le garder.
0
non, je l'ai laissé, j'ai entièrement copié le code que tu m'as transmis.

Et c'est quoi .c_str() ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 17:47
Moi je n'ai pas d'erreur.
c_str() c'est la conversion d'un string en char* pour l'affichage avec cout dont je parlais en 5)
0
d'accord, mais j'ai toujours cette erreur, je programme sus Code::block
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 18:40
Ce n'est pas rand(time(0)); mais srand(time(0));
D'ailleurs c'est ce que j'avais mis...
0
Oui oui, mais en fait j'avais deux erreurs avec srand, alors j'ai mis rand pour voir,et ça m'a mis une seule erreur.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 18:43
Et bien laisse le srand, et donne les deux messages d'erreurs que tu as...
0
Oui, voici :


C:\Users\RollK\Projets\ZIMZIM\main.cpp||In function 'int main()':|
C:\Users\RollK\Projets\ZIMZIM\main.cpp|9|error: 'srand' was not declared in this scope|
C:\Users\RollK\Projets\ZIMZIM\main.cpp|20|error: 'rand' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings ===|
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 19:00
Remets #include <cstdlib> aussi pour voir ;-)
0
Ca marche ! Mais à quoi sert cette librairie ? iostream ne suffisait pas ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
4 déc. 2011 à 19:14
<iostream> c'est pour cout et endl
<ctime> pour time
<cstdlib> pour rand et srand (mais chez moi elle est peut-être inclus automatiquement)
<vector> pour vector
<string> pour string mais il est inclus dans <iostream>, et <vector> donc ce n'est pas nécessaire de le rajouter
0
D'accord, merci et at.() sert à quoi ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 4/12/2011 à 21:06
Regarde la documentation : at
Si tu utilises listeNoms[nombreAleatoire] ça fera la même chose.
0