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
Bonjour,

Voila, je dois créer un championnat de foot avec poule classement etc.. Seulement je bloque dès la création des poules.

Voici mon script :

#include <iostream> 
#include <ctime> 
#include <stdlib.h> 

using namespace std; 

int main () 
{ 
    const string pays[12] = {"FRANCE","ESPAGNE","IRLANDE","ROUMANIE","ESPAGNE","ALLEMAGNE","PAYS-BAS","ALLEMAGNE","ITALIE","PORTUGAL","SUISSE","GEORGIE"}; 
    string liste[12] = {"FRANCE","ESPAGNE","IRLANDE","ROUMANIE","ESPAGNE","ALLEMAGNE","PAYS-BAS","ALLEMAGNE","ITALIE","PORTUGAL","SUISSE","GEORGIE"}; 
    int i,alea; 
    string poule[4]; 
    srand(time(NULL)); 
    for (i=0;i<=3;i++) 
    { 
        alea=rand()%12; 
        if (liste[alea]!="") 
        { 
        poule[i]=liste[alea]; 
        liste[alea]=""; 
        } 
        else //ET LA JE SAIS PAS QUOI METTRE ; 
        cout<<poule[i]<<endl; 
    } 
} 


À else je ne sais pas quoi mettre : pour mettre dans poule[i] un nom d'équipe qui n'a toujours pas été tirée.
A voir également:

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
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

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
0