Divise et conquiers.
Divisez votre tâche relativement complexe en deux ou plusieurs tâches plus petites. Ensuite, implémentez chaque tâche plus petite. Chacune des tâches plus petites devrait être plus facile en soi que la tâche originale. Après avoir implémenté chaque petite tâche, vous finissez par implémenter votre tâche originale.
Votre première étape consiste à lire chaque équipe et ses scores. Cette information est donnée sur chaque ligne de votre fichier d'entrée. Ainsi, votre première petite tâche consiste à lire les informations d'une équipe à la fois :
std::string teaminfo;
while (std::getline(std::cin, teaminfo).good())
{
// Ici résident les dragons.
}
La partie "Ici résident les dragons" est l'endroit où vous prendrez la seule ligne de texte lue dans teaminfo
et la analyserez. Ce sera la prochaine tâche, mais l'important est que vous ayez maintenant conquis la première tâche plus petite : lire les scores d'une équipe. C'est maintenant fait. Maintenant, vous devez trouver comment extraire les différentes données que vous voulez. C'est cela la partie "Ici résident les dragons".
D'après ce que je comprends de la question, les trois derniers éléments d'information sur chaque ligne de texte sont les trois scores, séparés par des espaces. Et tout le reste, jusqu'à ce point, est le nom de l'équipe.
Ainsi, la tâche à faire est de supprimer les trois dernières valeurs délimitées par des espaces blancs de la ligne. C'est également une tâche relativement complexe. Donc, elle doit aussi être divisée et conquise en plusieurs petites tâches individuelles.
La première chose à faire est de supprimer les espaces blancs superflus à la fin de la ligne lue. Vous n'avez pas indiqué s'il était possible qu'il y ait des espaces blancs en fin de ligne. Dans le cas contraire, cette étape peut être omise. Mais, si les espaces blancs en fin de ligne doivent être supprimés, faisons-le :
while (!teaminfo.empty() && teaminfo[teaminfo.size()-1] == ' ')
teaminfo=teaminfo.substr(0, teaminfo.size()-1);
Une approche assez basique, mais c'est suffisant. Ainsi, les espaces blancs en fin de ligne ont été supprimés.
Ok, la dernière tâche restante est de supprimer les trois dernières valeurs de la ligne. Divisons cela à nouveau. Commençons par écrire une fonction qui supprime la dernière valeur de la ligne, et la retourne :
std::string removeLastValue(std::string &line)
{
size_t p=line.rfind(' ');
std::string word;
if (p == std::string::npos) // Cas particulier, dernière mot.
{
p=0;
word=line;
}
else
{
word=line.substr(p+1);
}
while (p > 0 && line[p-1] == ' ')
--p;
line=line.substr(0, p);
return word;
}
Vous n'avez pas clarifié quel est le résultat attendu en cas d'entrée incorrecte, lorsque la ligne est trop courte et ne contient pas de nom d'équipe avec trois scores. Ici, une entrée incorrecte aboutit à un retour d'une chaîne vide.
Quoi qu'il en soit, tout après le dernier espace est extrait dans word
; puis, une rapide boucle recule sur les espaces précédant le dernier mot dans la line
, et supprime la line
jusqu'à ce point. Nous avons terminé.
Les tâches restantes à conquérir sont maintenant triviales : appelez cette fonction trois fois pour supprimer les trois dernières valeurs de la chaîne teaminfo
. Ce qui reste est le nom de votre équipe, évidemment. De plus, chaque mot supprimé est de type std::string
, et vous devez simplement convertir chacun en un double
.
C'est quelque chose que vous devriez être capable de faire par vous-même, et je n'ai pas besoin de l'écrire.