Probleme C++

Fermé
DouDou62 - 22 janv. 2007 à 20:28
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 25 janv. 2007 à 10:13
Bonjour, Je vais brievement vous exposer mon probleme !!

Je suis en BTS info, et nous avons des PTI à réaliser !
Cela concerne la PTI C++ ( Logique vu le forum )

En fait, je suis en train de creer un projet qui permettra de gerer une saison de football en passant par le calendrier, le report des résultats de match etc ...

Le probleme c'est que je n'arrive pas à gerer le calendrier !

Je voudrais le réaliser comme tous les calendriers des championnats normaux ! C'est à dire, que pour une journée, une équipe ne peut jouer qu'une seule fois, et qu'elle ne peut pas jouer contre la meme equipe sur d'autres journées ... !

Un petit aperçu du TabRencontre !


[B]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19[/B]
[B]1[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]2[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]3[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]4[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]5[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]6[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]7[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]8[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]9[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]10[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]11[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]12[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]13[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]14[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]15[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]16[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]17[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]18[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]19[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[B]20[/B] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


TabRencontre initialisé ! A gauche les NumEquipe, en haut les Journées !



Je vous laisse un petit bout de code que j'ai réalisé à la va vite !

[CODE]srand((unsigned) time(&t));
NumEquipe = 1;
do
{
Adversaire = rand()%21;
if (TabRencontre[NumEquipe][Journee].Adversaire != 0)
{
NumEquipe = NumEquipe +1;
}
else
{
if(NumEquipe == Adversaire)
{
Adversaire = rand()%21;
}
else
{
TabRencontre[NumEquipe][Journee].Adversaire = Adversaire;
TabRencontre[Adversaire][Journee].Adversaire = NumEquipe;
Match = Match +1;
NumEquipe = NumEquipe +2;
}
}
}while ((Match < Matchparjournee) && (NumEquipe < NbEquipe));[/CODE]


En espérant avoir des idées de votre part !

Merci !


[B][SIZE="1"][COLOR="Blue"]balise [code] rajoutée par r0d. Merci d'y penser la prochaine fois.[/COLOR][/SIZE][/B]

5 réponses

En clair je voudrais savoir ce que vous feriez à ma place !!!
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
22 janv. 2007 à 21:47
du Volley.
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
23 janv. 2007 à 09:40
.
0
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
23 janv. 2007 à 14:11
C'est gentil de nous laisser un petit bout de code réalisé à la va vite :))
0

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

Posez votre question
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
25 janv. 2007 à 10:13
En fait j'avais commencé à faire qqch mais le site est tombé en rade au moment où je l'ai corrigé :p

Bon mais l'idée est somme toute assez simple
- on a un planning par équipe, qui contrôle individuellement qu'une équipe peut en rencontrer une autre
- un planning qui chapotte les planning de chaque équipe, et qui vérifie si les deux équipes peuvent se rencontrer

Au niveau des identifiants d'équipe j'ai tout mis en template pour que ce soit plus fun, ce qui permet d'utiliser indifféremment des chaines ou des int. Seules deux choses sont importantes :
- nobody représente pas d'équipe et est en fait l'objet par défaut (0 si l'id est un nombre, chaine vide si c'est une chaine...) et il est important qu'aucune équipe ne porte cet identifiant.
- il faut qu'une relation d'ordre (opérateur <) soit définie sur les id afin que l'on puisse construire des map et des set.

#include <vector>
#include <map>
#include <set>
#include <string>
#include <cassert>
#include <iostream>

typedef std::string equipe_id_t;

template <typename Tequipe_id>
inline Tequipe_id nobody(){
    return Tequipe_id();
}

// Le parametre template est une classe quelconque (un entier, une chaine...)
// une relation d'ordre < doit etre définie
template <typename Tequipe_id>
class planning_equipe_t{
    protected:
        typedef std::vector<Tequipe_id> matchs_t;   /// Ses matchs programmés
        matchs_t matchs;
        Tequipe_id equipe_id;                       /// Le numero de l'équipe
    public:
        planning_equipe_t(){}

        /// Le constructeur
        planning_equipe_t(const unsigned int & nb_jour,const Tequipe_id & equipe_id0):
            matchs(matchs_t(nb_jour)),
            equipe_id(equipe_id0)
        {
            std::fill(matchs.begin(),matchs.end(),nobody<Tequipe_id>());
        }

        /// Chercher si l'equipe est libre un jour donné
        bool est_libre(const unsigned int & no_jour) const {
            const unsigned int nb_jour = matchs.size();
            assert(no_jour < nb_jour);
            return (matchs[no_jour] == nobody<Tequipe_id>());
        }

        /// Chercher quel jour l'équipe retourne un adversaire
        inline std::pair<typename matchs_t::const_iterator,bool>
        chercher_match(const Tequipe_id & adversaire) const{
            typename std::vector<Tequipe_id>::const_iterator
                mit (matchs.begin()),
                mend(matchs.end());
            for(;mit!=mend;++mit){
                if (*mit == adversaire) return std::make_pair(mit,true);
            }
            return std::make_pair(mend,false);
        }

        /// Est ce que ce match est programmable ?
        bool match_valide(const Tequipe_id & adversaire,const unsigned int & no_jour) const{
            if(adversaire == equipe_id){
                std::cerr << "L'équipe " << equipe_id
                    << " ne peut pas jouer contre elle même !" << std::endl;
                return false;
            }
            if(!est_libre(no_jour)){
                std::cerr << "L'équipe " << equipe_id
                    << " rencontre déjà quelqu'un le jour "
                    << no_jour << std::endl;
                return false;
            }
            std::pair<typename matchs_t::const_iterator,bool> p = chercher_match(adversaire);
            if (p.second){
                std::cerr << "L'équipe " << equipe_id << " rencontre déjà l'equipe "
                    << adversaire << " le jour " << p.second << std::endl;
                return false;
            }
            return true;
        }

        /// Programmer match
        void programmer_match(const Tequipe_id & adversaire,const unsigned int & no_jour){
            assert(match_valide(adversaire,no_jour));
            matchs[no_jour] = adversaire;
        }
};

template <typename Tequipe_id>
class planning_t{
    protected:
        typedef std::map<Tequipe_id,planning_equipe_t<Tequipe_id> > planning_global_t;
        planning_global_t planning_global;

    public:
        /// Construire la grille de rencontre
        planning_t(const std::set<Tequipe_id> & equipes){
            const unsigned int
                nb_equipe = equipes.size(),
                nb_jour = equipes.size();
            typename std::set<Tequipe_id>::const_iterator
                equipes_it (equipes.begin()),
                equipes_end(equipes.end());
            for(;equipes_it!=equipes_end;++equipes_it){
                const Tequipe_id & equipe_id = *equipes_it;
                planning_global[equipe_id] = planning_equipe_t<Tequipe_id>(nb_jour,equipe_id);
            }
        }

        /// Definir une rencontre (si elle est possible)
        bool definir_rencontre(
            const Tequipe_id & x,
            const Tequipe_id & y,
            const unsigned & no_jour
        ){
            assert(planning_global.find(x)!=planning_global.end());
            assert(planning_global.find(y)!=planning_global.end());
            planning_equipe_t<Tequipe_id> &
                planning_x = planning_global[x],
                planning_y = planning_global[y];
            if(planning_x.match_valide(y,no_jour) && planning_y.match_valide(x,no_jour)){
                planning_x.programmer_match(y,no_jour);
                planning_y.programmer_match(x,no_jour);
                std::cout << "Rencontre " << x << " vs " << y << " jour " << no_jour
                    << " programmée" << std::endl;
                return true;
            }
            std::cerr << "La rencontre " << x << " vs " << y << " jour " << no_jour
                << " n'a pas pu être programmée" << std::endl;
            return false;
        }

        /// Recuperer le planning d'une equipe
        inline std::pair<typename planning_global_t::const_iterator,bool>
        recuperer_planning_equipe(const Tequipe_id & equipe_id) const{
            return planning_global.find(equipe_id);
        }
};

int main(){
    // Les equipes du championnat
    std::set<equipe_id_t> equipes;
    {
        equipes.insert("tapir");
        equipes.insert("plop");
        equipes.insert("ccm");
    }

    // Preparer le planning
    planning_t<equipe_id_t> planning(equipes);
    planning.definir_rencontre("tapir","plop",1);
    planning.definir_rencontre("tapir","ccm",1);
    return 0;
}

Bonne chance
0