2017-05-21 2 views
0

Programme FizzBuzz. L'utilisateur entre des nombres séparés par une virgule. Le programme lit l'entrée et informe l'ordinateur s'il est divisible par 3, 5 ou les deux. Lorsque l'utilisateur entre 15,5,30, le programme ne sortira que le premier nombre, 15 et s'arrête là. Qu'est-ce que je fais mal?Conversion de chaîne en vecteur d'entiers

void processVector(vector<int> intVector) 
{ 
    bool loop; 
    for (int i = 0; i < intVector.size(); i++) 
    { 
     loop = true; 
    } 
} 

int main() 
{ 

    cout << "Welcome to the FizzBuzz program!" << endl; 

    cout << "This program will check if the number you enter is divisable by 
      3, 5, or both." << endl; 


    cout << "Please enter an array of numbers separated by a comma like so, 
      5,10,15" << endl; 
    cin >> userArray; 

    vector<int> loadVector(string inputString); 
    istringstream iss(userArray); 
    vector <int> v; 

    int i; 

    while (iss >> i); 
    { 
     v.push_back(i); 
     if (iss.peek() == ',') 
      iss.ignore(); 


     if (i % 15 == 0) 
     { 
      cout << "Number " << i << " - FizzBuzz!" << endl; 

     } 
     else if (i % 3 == 0) 
     { 
      cout << "Number " << i << " Fizz!" << endl; 

     } 

     else if (i % 5 == 0) 
     { 
      cout << "Number " << i << " Buzz!" << endl; 

     } 

     else 
     { 
      cout << "Number entered is not divisable by 3 or 5." << endl;  
     } 
    } 

    system("pause"); 

} 
+0

S'il vous plaît modifier votre question pour contenir [mcve] – Slava

+0

Jolie parmi les choses que vous faites mal sont: Le défaut d'inclure les fichiers d'en-tête, le défaut de déclarer 'userArray'. Tout en boucle avec un corps vide. Appeler 'system()' quand vous n'en avez pas besoin. Déclarer 'loadVector()' mais ne jamais l'appeler. Définir 'processVector()' mais ne jamais l'utiliser de quelque façon que ce soit. –

+0

@ Ben Voigt, Merci, Ben, j'ai les fichiers d'en-tête, je n'ai pas copié le code dans son intégralité dans le post. fichiers d'en-tête sont je .... #include "stdafx.h" #include #include #include #include #include ...... je regarderai sur le reste . Merci encore pour l'aide – Ang316

Répondre

0

Voici comment j'aborder le problème:

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

int main() { 
    std::cout << "!!!Hello World!!!" << std::endl; // prints !!!Hello World!!! 
    std::cout << "Please enter your numbers seperated by a comma (5, 3, 5, 98, 278, 42): "; 

    std::string userString; 
    std::getline(std::cin, userString); 
    std::vector<int> numberV; 

    size_t j = 0; // beginning of number 
    for(size_t i = 0; i < userString.size(); i++){ 
     if((userString[i] == ',') || (i == userString.size() -1)){ // could also use strncmp 
      numberV.push_back(std::stoi(userString.substr(j, i))); // stoi stands for string to int, and .substr(start, end) creates a new string at the start location and ending at the end location 
      j = i + 1; 

     } 
    } 

    for(size_t n = 0; n < numberV.size(); n++){ 
     std::cout << numberV[n] << std::endl; 
    } 

    return(0); 

}

Cela devrait vous donner une méthode pour résoudre le problème (sans manipuler la partie FizzBuzz de votre programme) que je trouver personnellement plus simple.

La forme de base pour l'utilisation de fonctions est:

<return type> <function_name(<inputs)>{ 
    stuff 
}; 

Ainsi, une fonction de base qui prend une chaîne et retourne un vecteur (ce que vous voulez) serait:

std::vector myStringToVector(std::string inputString){ 
    std::vector V; 
    // your code (see the prior example for one method of doing this) 
    return(V); 
}; 

Il a également On dirait qu'ils veulent une fonction séparée pour la sortie de vos valeurs vectorielles, cela pourrait ressembler à quelque chose comme:

void myVectorPrint(std::vector inputVector){ 
    // your code (see prior example for a method of printing out a vector) 
}; 
+0

@Aarin Covrig Merci, cela semble plus simple, cependant, par les instructions que je dois inclure deux fonctions par instructions comme Créer une fonction qui va convertir la chaîne d'entrée en un vecteur d'entiers. La fonction doit ressembler à ceci: vecteur loadVector (string inputString) Ecrire une autre fonction qui produira les résultats du traitement du vecteur d'entiers par rapport aux règles FizzBuzz définies à la semaine 2. Afficher la sortie selon les règles de la Attribution de la semaine 2 La fonction devrait ressembler à ceci: void processVector (vecteur intVector) – Ang316

+0

Vous pouvez facilement modifier le code pour travailler dans les fonctions, vous pouvez prendre le code commençant par la définition de 'j' et se terminant à la fin de la boucle for et le mettre dans une fonction qui prend une chaîne et retourne un vecteur. Je crois que votre fonction de vecteur de processus a besoin de travailler aussi, il semble que vous êtes censé traiter vos déclarations d'impression à l'intérieur. –

+0

J'ai ajouté un peu plus d'informations et du pseudo code, vous pouvez utiliser ceci avec le reste du code fourni pour résoudre votre problème, puisque c'est un devoir que je ne vais pas résoudre complètement pour vous (mais, vous tous vraiment besoin de faire est de le démonter et l'adapter à ces fonctions de couple pour répondre aux exigences de vos instructeurs). –

0

Merci @Aaron pour l'aide. Voici le code terminé et ça marche super! J'ai dû prendre un peu plus de temps pour faire des recherches et essayer de comprendre quel ordre et quoi mettre en termes de fonctions et comment les appeler. J'apprécie toute l'aide comme j'ai dit que je suis un noob.

#include "stdafx.h" 
#include <iostream> 
#include<sstream> 
#include<string> 
#include<vector> 

using namespace std; 


vector<int> loadVector(string inputString) 
{ 
stringstream ss(inputString); 
vector <int> numberV; 

int n; 

size_t j = 0; // beginning of number 
for (size_t n = 0; n < inputString.size(); n++) 
{ 
    if ((inputString[n] == ',') || (n == inputString.size() - 1)) 
    { 
     numberV.push_back(std::stoi(inputString.substr(j, n))); 
     j = n + 1; 

    } 

} 


return numberV; 
} 
void processVector(vector<int> intVector) 
{ 
for (int i = 0; i < intVector.size(); i++) 
{ 
    int n = intVector.at(i); 
    if (n % 15 == 0) 
    { 
     cout << "Number " << n << " - FizzBuzz!" << endl; 
    } 
    else if (n % 3 == 0) 
    { 
     cout << "Number " << n << " Fizz!" << endl; 
    } 

    else if (n % 5 == 0) 
    { 
     cout << "Number " << n << " Buzz!" << endl; 
    } 

    else 
    { 
     cout << "Number entered is not divisable by 3 or 5." << endl; 
    } 
} 
} 

int main() 
{ 
cout << "Welcome to the FizzBuzz program." << endl 
    << "Please enter an array of numbers separated by comma's (5, 10, 15)" 
    << endl; 

string inputString; 
getline(cin, inputString); 

try 
{ 
    vector<int> intVector = loadVector(inputString); 
    processVector(intVector); 
} 
catch (const exception& e) 
{ 
    cout << "Exception caught: '" << e.what() << "'!;" << endl; 
} 
system("pause"); 
return 0; 
}