2010-06-21 6 views
2

L'entrée est une chaîne [] comme ci-dessous.Comment commander une chaîne [] en C++

"CSE111: CSE110 Math101"

"CSE110:"

je commander les chaînes basées sur une certaine logique. Par exemple ma sortie doit être un string[] comme

"CSE110", "MATH122", "CSE111"

Ma question est

  1. Lors de la numérisation à travers le réseau d'entrée, si l'on chaîne est sélectionnée pour être la première chaîne du tableau de sortie, puis comment ignorer toutes les occurrences de cette chaîne particulière, pendant que je continue à traiter le string[] pour la deuxième chaîne de sortie, etc.

Par exemple:

Entrée:

"CSE111: CSE110 Math101"

"CSE110:"

Si CSE110 est choisi pour être la première chaîne de la sortie , puis quand je balaie la chaîne d'entrée [] pour que la deuxième chaîne fasse partie de la sortie, je ne devrais pas considérer CSE110.

Comment puis-je y parvenir? La réponse que je suis impatient de quelque chose comme:

  1. magasin l'entrée dans une chaîne [] boucle
  2. à travers les chaînes une par une à l'aide strtok ou stringstream opérateur >>.
  3. Une fois la première chaîne se trouve ... bla bla bla ....

espère que ma question est assez claire. Je serai heureux de fournir plus de détails.

Edit1: Plus Explication

Les chaînes représentent l'ordre dans lequel les classes doivent prendre. Si une classe a un pré-requis, le pré-requis doit être pris en premier. c'est à dire. si l'entrée est

"CSE111: CSE110 MATH101" 
"CSE110:" 

Le CSE111 de classe a un pré-requis de CSE110 Math101. Donc, je dois d'abord considérer CSE1110 (pas de pré-requis) - MATH101 ((pas de pré-requis) et ensuite CSE111. (D'autres cravates peuvent être cassées dans l'ordre alphabétique.) J'espère que cela aide ..

+3

Je ne peux pas comprendre la logique que vous essayez d'expliquer du tout. Je pense qu'il serait extrêmement utile pour vous d'examiner s'il s'agit en fait de deux problèmes distincts: 1) analyser les entrées et les stocker dans une structure de données, puis 2) générer la sortie appropriée en fonction des données d'entrée. – Joe

+0

Oui, c'est correct. Je suis impatient de trouver des solutions aux deux problèmes –

+2

Comme Dieu est mon témoin, je ne peux m'empêcher de regarder cela et de penser: «Peut-être que si vous avez écrit ceci comme un« Makefile »... -_-; –

Répondre

6

Je l'espère maintenant: Pour une chaîne de la forme A: B C D, le cours A a B, C, et D comme prérequis.

Dans ce cas, vous voulez une cartographie d'un cours à ses conditions, par exemple .:

typedef std::set<std::string> CourseSet; 
typedef std::map<std::string, CourseSet> Prerequisites; 

Maintenant, vous pouvez remplir un Prerequisites par tokenizing, en utilisant la première partie de la clé et une CourseSet comme valeur.

Comme il semble que vous voulez que l'une des commandes possibles pour tous les cours de l'entrée, vous pouvez alors effectuer les opérations suivantes:

  • réunir les conditions préalables pour les cours (c.-à inclure les cours dont ils dépendent indirectement sur)
  • maintenant a>b si a a b comme condition préalable
  • si b n'a pas a comme une utilisation préalable, par exemple l'ordre lexicographique
+1

Je pense qu'il essaie aussi de spécifier la première valeur, avec le reste du tableau trié normalement –

+0

Eh bien, je ne peux pas utiliser std: sort() car Ce n'est pas un simple tri que je dois faire Les chaînes représentent l'ordre dans lequel les classes doivent être prises. -requis, le pré-requis doit être pris en premier, c'est-à-dire si l'entrée est "CSE111: CSE110 Math101" "CSE110:" Le CSE111 de classe a une condition préalable de CSE110 Math101. Donc, je dois d'abord considérer CSE1110 (pas de pré-requis) - MATH101 ((pas de pré-requis) et ensuite CSE111. (D'autres cravates peuvent être cassées par ordre alphabétique.) J'espère que cela aide .. –

+0

@Eternal: Je reçois votre les prérequis maintenant, mais pour l'instant je ne vois qu'une liste de dépendances - quelle est l'entrée réelle pour laquelle vous voulez générer la liste des cours? –