Correction d'un petit exercice

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde, voila je viens de terminer le tutoriel sur la récursivité de ce site, j’ai réussi à faire un petit exercice en utilisant la récursivité (je l’avais précédemment réussi à le faire mais j’étais dans l’incapacité de faire une fonction renvoyant un tableau contenant la liste de matches).

Je viens vers vous pour demander une correction, critique, revu de code et si possible me fournir une piste plus intéressante et plus facile pour faire la même chose (sachant qu’il existe plusieurs manières de faire en C++). Et si jamais ces autres façons de procéder demandent des notions que je n’ai pas encore appris (vu que je débute actuellement la lecture du chapitre : Des fonctions somme toute lambdas), ils seront quand même les bienvenus (vu que je relis souvent mes anciens postes et les explications que j’avais reçu, étonnant mais il m’arrive de mieux comprendre certaines choses que je n’avais pas compris à ce moment là).

Consigne de l’exercice tiré du tutoriel :

"je dispose d’une liste de joueurs d’un jeu à deux joueurs (échecs, ping-pong, etc.), et je veux créer une liste de matches, de telle sorte que chaque joueur joue contre tous les autres joueurs une seule fois."

Voici le code :

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

std::vector<std::string> make_matches (
    int taille, std::vector<char> & p, std::vector<std::string> m);

// --------------------------------------------------------------------------------------------

int main ()
{
    std::vector<char> players { 'A', 'B', 'C', 'D' };
    std::vector<std::string> m {};

    int taille { 0 };
    std::cout << "Liste de joueurs : " << std::endl;
    for (char const & player : players)
    {
        std::cout << "Joueur : " << player << std::endl;
        ++ taille;
    }

    if (taille > 1)
    {
        std::vector<std::string> matches { make_matches (taille, players, m) };
    
        std::cout << std::endl;
        std::cout << "Liste de matches : " << std::endl;
        for (auto const & match : matches)
        {
            std::cout << match << std::endl;
        }

        int total { (taille * (taille - 1)) / 2 };
        std::cout << "Total de matches : " << total << std::endl;
    }

    else
    {
        std::cout << "\nListe de matches : " << 0 << std::endl;
        std::cout << "\nTotal matches : " << 0 << std::endl;
    }

    return 0;
}

// --------------------------------------------------------------------------------------------

std::vector<std::string> make_matches (
    int taille, std::vector<char> & p, std::vector<std::string> m)
{
    assert (taille >= 0 and "la taille ne doit pas etre negative.");

    if (taille == 1)
    {
        return m;
    }

    else
    {
        auto last_it { std::end (p) - 1 };
        char const last_character { * last_it };
        p.pop_back ();
 
        for (char const & player : p)
        {

            std::string complete_chain {};
            std::string const against { " vs " };
            
            complete_chain += last_character;
            complete_chain += against;
            complete_chain += player;

            m.push_back (complete_chain);
        }

        m.push_back ( " "); // par souci d'affichage 

        return make_matches (taille - 1, p, m);
    }
}

Et voici une autre version non-récursive de cet exercice :

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


std::vector<int> do_decomposition (int nb_players);
std::vector<std::string> make_matches (std::vector<int> const & joueurs);

// ------------------------------------------------------------------------------------

int main ()
{
    int const nb_players { 5 };

    if (nb_players > 1)
    {
        auto const joueurs { do_decomposition (nb_players) };
        int total { 0 };
        
        std::cout << "Liste de joueurs : " << std::endl;
        for (int const & joueur : joueurs)
        {
            std::cout << "joueur : " << joueur << std::endl;
            total += joueur;
        }

        auto matches { make_matches (joueurs) };
        std::cout << std::endl;
        
        std::cout << "Liste de matches : " << std::endl;
        for (auto const & match : matches)
        {
            std::cout << match << std::endl;
        }

        std::cout << "total de matches : " << total << std::endl;
    }

    else
    {
        std::cout << "Nombre de joueurs : " << nb_players << std::endl;
        std::cout << "Total de matches : " << 0 << std::endl; 
    }

    return 0;
}

// -------------------------------------------------------------------------------------

std::vector<int> do_decomposition (int nb_players)
{
    assert (nb_players > 1 and "the number of players must be greater than 1.");

    std::vector<int> matches {};

    while (nb_players > 1)
    {
        -- nb_players;
        matches.push_back (nb_players);
    }

    return matches;
}

// -------------------------------------------------------------------------------------

std::vector<std::string> make_matches (std::vector<int> const & joueurs)
{
    assert (std::size (joueurs) >= 1 and "la liste de joueurs ne doit pas etre vide.");

    std::vector<std::string> matches {};
    
    int i { 1 };
    auto it { std::cbegin (joueurs) };
    
    int taille { 0 };
    for (int const & joueur : joueurs)
    {
        ++ taille;
    }

    while (i <= taille)
    {
        int j { i + 1 };
        int k { 0 };

        while (k < * it)
        {
            std::string chaine_complete {};
            std::string contre { " vs " };
    
            chaine_complete += std::to_string (i);
            chaine_complete += contre;
            chaine_complete += std::to_string (j);

            matches.push_back (chaine_complete);

            ++ j;
            ++ k;
        }

        matches.push_back (" ");  // par souci d'affichage

        ++ it;
        ++ i;
    }

    return matches;

}

Bref il y a la possibilité de demander la saisie a l’utilisateur mais par souci de raccourcir le code j’ai omis. Merci en avance.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte