2017-10-24 3 views
-3

Ich fand, dass ich anfangen musste, getline (cin, Eingang) zu verwenden; für meine Benutzereingaben. Ich habe herausgefunden, wie man stringstream benutzt, um einen String von einem Benutzer in einen int zu konvertieren, so dass ich die Zahlen in mathematischen Funktionen speichern und verwenden kann.Wie würden Sie eine Zeichenfolge an eine Funktion übergeben und eine ganze Zahl zurückgeben?

Wenn Sie zum Beispiel sagen, dass Sie einen Benutzer nach einer Studenten-ID fragen müssen, können Sie dies leicht als Zeichenfolge speichern, da es selten ist, dass Sie irgendeine Art von mathematischen Gleichungen verwenden müssen. Wenn Sie jedoch nach Noten fragen würden, die Sie durchschnittlich auswerten und in GPAs umwandeln müssten, ist das eine andere Geschichte.

Ich möchte im Wesentlichen den Benutzer bitten, eine Zahl über getline einzugeben, dann wandeln Sie die Eingabe in ein int, aber als eine Funktion, so dass ich nicht jedes Mal, wenn ich etwas konvertieren muss, die gleiche Transaktion eingeben muss .

Beispiel:

#include<iostream> 
#include<conio.h> 
#include<string> 
#include<sstream> 

using namespace std; 

class students{ 

    int s1, s2, s3; 
    string name, id, input; 

public: 
    void getData(){ 
      cout << "Enter ID: "; 
      getline(cin, id); 

      cout << "Enter Name: "; 
      getline(cin, name); 

      while(true){ 
       cout << "Enter grades for Math: "; 
       getline(cin, input); 

       stringstream convert(input); 
       if(convert >> s1) 
        break; 
       cout << "Invalid Grade; Please Try Again! " << endl; 
      } 
      while(true){ 
       cout << "Enter grades for Science: "; 
       getline(cin, input); 

       stringstream convert(input); 
       if(convert >> s2) 
        break; 
       cout << "Invalid Grade; Please Try Again! " << endl; 
      } 
      while(true){ 
       cout << "Enter grades for English: "; 
       getline(cin, input); 

       stringstream convert(input); 
       if(convert >> s3) 
        break; 
       cout << "Invalid Grade; Please Try Again! " << endl; 
      } 
    } 

    void showData(){ 
     cout << "\n" << id << "\t" << name << "\tMath: " << s1 << "\tScience: " << s2 << "\tEnglish: " << s3; 
    } 
}; 

int main(){ 
    students s[20]; 
    int i, numOfStudents; 
    string input; 

    while(true){ 
     cout << "\nNumber of Students? "; 
     getline(cin, input); 

     stringstream convert(input); 
     if(convert >> numOfStudents) 
      break; 
     cout << "Invalid Grade; Please Try Again! " << endl; 
    } 

    for(i = 0; i < numOfStudents; i++){ 
     s[i].getData(); 
    } 

    for(i = 0; i < numOfStudents; i++){ 
     s[i].showData(); 
    } 

    _getch(); //Only there to keep the command line window open. 
    return 0; 
} 
+0

Nicht sicher, was Sie fragen - es ist für die Unterzeichnung einer Funktion ist ein int zu nehmen und einen String zurückkehr ? – Steve

+3

Es gibt mehrere Möglichkeiten, dies zu tun. 'std :: istringstream',' std :: stoi() 'usw. – user0042

Antwort

4

Sie benötigen eine Funktion. Etwas wie:

int getGrade(const std::string& subject) 
{ 
    while(true){ 
     std::cout << "Enter grades for " << subject << ": " << std::flush; 
     std::string input; 
     std::getline(std::cin, input); 

     std::stringstream convert(input); 
     int result; 
     if(convert >> result) 
      return result; 
     std::cout << "Invalid Grade; Please Try Again! " << std::endl; 
    } 
} 

Verwendung wäre so etwas wie:

s1 = getGrade("Math"); 
+0

Ich sehe! Das Thema als String zu verlassen, entging mir völlig. Ich danke dir sehr! Ich praktiziere nur für meine eigene Zeit, also war dies nur ein kleines persönliches Projekt, das ich für mich selbst mache, um meine Programmierung zu verbessern. – JRuxDev

+0

Sie könnten es tatsächlich als 'const char * 'in diesem Fall übergeben - ich neige dazu, standardmäßig auf' std :: string' zu setzen, es sei denn, es gibt einen anderen guten Grund. –

0

Extract einem Ihrer Schleifen in eine andere Funktion und parametrisieren Ihre "Fragetext":

int get_input(const char* what) 
{ 
    while(true) 
    { 
     cout << what; 
     string input; 
     getline(cin, input); 

     int temp; 
     stringstream convert(input); 
     if(convert >> temp) return temp; 

     cout << "Invalid input; Please Try Again! " << endl; 
    } 
} 
+1

Sie geben nichts zurück, wenn die Eingabe ungültig ist ... – Sean

2

Sie in der Zeichenfolge als Verweis übergeben kann const und nutzen die std::stoi Funktion:

int getGrade(const std::string& s) { 
    try { 
     int result = std::stoi(s); 
     return result; 
    } 
    catch (std::invalid_argument) { 
     std::cout << "Could not convert to integer."; 
     return -1; 
    } 
} 

und es verwenden, wie die folgenden:

int main() { 
    int x; 
    std::string s1; 
    std::cout << "Enter grade: "; 
    std::getline(std::cin, s1)   
    x = getGrade(s1); 
} 
0

Was möchten Sie zu tun ist, den Code zu extrahieren, die Sie wie so in seine eigene Funktion kopiert:

... 

int readGrade(const char* subject) { 
    while(true) { 
     cout << "Enter grade for " << subject << ": "; 
     string input; 
     getline(cin, input); 

     stringstream convert(input); 
     int n; 
     if(convert >> n) 
      return n; 
     cout << "Invalid grade, please try again." << endl; 
    } 
} 

class students{ 

    int s1, s2, s3; 
    string name, id, input; 

public: 
    void getData(){ 
     cout << "Enter ID: "; 
     getline(cin, id); 

     cout << "Enter Name: "; 
     getline(cin, name); 

     s1 = readGrade("Math"); 
     s2 = readGrade("Science"); 
     s3 = readGrade("English"); 
    } 

    void showData(){ 
     cout << "\n" << id << "\t" << name << "\tMath: " << s1 << "\tScience: " << s2 << "\tEnglish: " << s3; 
    } 
}; 

... 
+1

Snap! (Große Köpfe denken ähnlich). –

Verwandte Themen