Créer une poule de championnat
Résolu/Fermé
kristof94
Messages postés
2
Date d'inscription
samedi 8 décembre 2012
Statut
Membre
Dernière intervention
12 janvier 2013
-
Modifié par mamiemando le 20/01/2013 à 02:16
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 janv. 2013 à 02:12
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 janv. 2013 à 02:12
A voir également:
- Créer un calendrier de championnat
- Créer un compte google - Guide
- Créer un compte gmail - Guide
- Comment créer un groupe whatsapp - Guide
- Créer un compte instagram sur google - Guide
- Comment creer un pdf - Guide
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié par mamiemando le 20/01/2013 à 02:19
Modifié par mamiemando le 20/01/2013 à 02:19
En fait tu dois boucler jusqu'à trouver une chaîne non vide si j'ai compris ce que tu voulais faire. Donc à mon avis c'est plus un truc du genre
Bon sinon tu peux faire des trucs un peu plus jolis. Ci-dessous je te propose une solution qui tire parti des containers de la STL. On va définir une fonction qui extrait d'un ensemble (std::set) de n éléments le ième élément (où i est une valeur aléatoire) et le supprime.
https://forums.commentcamarche.net/forum/affich-37604421-introduction-a-la-stl-en-c-standard-template-library
http://www.cplusplus.com/reference/set/
http://www.cplusplus.com/reference/iterator/advance/
Explication du code :
Dans cet exemple j'ai écrit la fonction correspondante (pop_element) qui raisonne sur un ensemble générique (noté ici T) d'éléments (d'où le template). Dans ton cas tu l'appliques à un ensemble de std::string (std::set<std::string>), mais tu pourrais réutiliser cette fonction sur un std::set de ce que tu veux.
L'iterator "it" est positionné sur le premier élément de l'ensemble ("France" dans cet exemple). Ensuite je tire avec rand une valeur aléatoire entière, mais comme je veux une valeur comprise entre 0 et n (ou n est le nombre d'équipe), je calcule rand modulo n. Ainsi rand() % elements.size() calcule une position aléatoire comprise entre 0 et n - 1.
Ensuite je positionne mon iterator sur ce ième élément (tu peux voir pour faire très simple un iterator comme une sorte de pointeur, sauf que ça va beaucoup plus loin). Ainsi *it correspond bien à ma ième chaîne, et je stocke cet élement dans la variable "element". Ensuite je supprime la valeur située à cette position de mon ensemble, puis je retourne la valeur récupérée. On a donc bien extrait d'un ensemble de n éléments le ième élément avec i compris entre 0 et n.
Passons au main. J'initialise la graine (srand) pour mon tirage aléatoire, puis je construis un ensemble de chaînes (tu peux en insérer autant que tu veux, ici j'en ai mis juste 4). Puis j'extrais n équipes de cet ensemble (donc toutes).
À l'exécution on obtient :
Bonne chance
do { alea = rand() % 12; } while(list[alea] == ""); poule [i] = liste[alea]; list[alea] = "";
Bon sinon tu peux faire des trucs un peu plus jolis. Ci-dessous je te propose une solution qui tire parti des containers de la STL. On va définir une fonction qui extrait d'un ensemble (std::set) de n éléments le ième élément (où i est une valeur aléatoire) et le supprime.
https://forums.commentcamarche.net/forum/affich-37604421-introduction-a-la-stl-en-c-standard-template-library
http://www.cplusplus.com/reference/set/
http://www.cplusplus.com/reference/iterator/advance/
#include <set> #include <string> #include <cstdlib> #include <ctime> #include <iostream> template <typename T> T pop_element(std::set<T> & elements) { typename std::set<T>::iterator it(elements.begin()); std::advance(it, rand() % elements.size()); T element = *it; elements.erase(it); return element; } int main() { srand(time(NULL)); std::set<std::string> equipes; equipes.insert("France"); equipes.insert("Allemagne"); equipes.insert("Espagne"); equipes.insert("Angleterre"); std::size_t n = equipes.size(); for(std::size_t i = 0; i < n; ++i) { std::cout << pop_element(equipes) << std::endl; } return 0; }
Explication du code :
Dans cet exemple j'ai écrit la fonction correspondante (pop_element) qui raisonne sur un ensemble générique (noté ici T) d'éléments (d'où le template). Dans ton cas tu l'appliques à un ensemble de std::string (std::set<std::string>), mais tu pourrais réutiliser cette fonction sur un std::set de ce que tu veux.
L'iterator "it" est positionné sur le premier élément de l'ensemble ("France" dans cet exemple). Ensuite je tire avec rand une valeur aléatoire entière, mais comme je veux une valeur comprise entre 0 et n (ou n est le nombre d'équipe), je calcule rand modulo n. Ainsi rand() % elements.size() calcule une position aléatoire comprise entre 0 et n - 1.
Ensuite je positionne mon iterator sur ce ième élément (tu peux voir pour faire très simple un iterator comme une sorte de pointeur, sauf que ça va beaucoup plus loin). Ainsi *it correspond bien à ma ième chaîne, et je stocke cet élement dans la variable "element". Ensuite je supprime la valeur située à cette position de mon ensemble, puis je retourne la valeur récupérée. On a donc bien extrait d'un ensemble de n éléments le ième élément avec i compris entre 0 et n.
Passons au main. J'initialise la graine (srand) pour mon tirage aléatoire, puis je construis un ensemble de chaînes (tu peux en insérer autant que tu veux, ici j'en ai mis juste 4). Puis j'extrais n équipes de cet ensemble (donc toutes).
À l'exécution on obtient :
(mando@silk) (~) $ ./a.out Espagne Allemagne France Angleterre (mando@silk) (~) $ ./a.out Espagne Angleterre Allemagne France (mando@silk) (~) $ ./a.out Angleterre France Espagne Allemagne
Bonne chance