C ++ do / while循环和调用函数?

时间:2014-09-28 23:43:48

标签: c++ loops methods do-while

如果用户输入'y'他们想要继续,我无法尝试让这个程序循环。顺便说一下,我对编程非常陌生,所以非常感谢任何帮助。我认为最好是在main中添加do / while,如果他们想在代码结束时继续添加,那么我很快意识到除非我调用以前的方法进行用户输入,否则无法工作和输出。这就是问题出现的地方。

再次感谢您的帮助!

/* 

 • Ask the user if they want to enter the data again (y/n).
 • If ’n’, then the program ends, otherwise it should clear the student class object and
 repeat the loop (ask the user to enter new data...).

 */
#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class Student {
    public:
    Student();
    ~Student();
    void InputData();       // Input all data from user
    void OutputData();      // Output class list to console
    void ResetClasses();        // Reset class list
    Student& operator =(const Student& rightSide);  // Assignment operator

private:
    string name;
    int numClasses;
    string *classList;
};


//array intialized to NULL
Student::Student() {
    numClasses = 0;
    classList = NULL;
    name = "";
}

//Frees up any memory of array
Student::~Student() {

if(classList != NULL) {
    delete [] classList;
}
}

// This method deletes the class list
// ======================
void Student::ResetClasses() {
    if(classList != NULL) {
        delete [ ] classList;
        classList = NULL;
}
numClasses = 0;
}



//inputs all data from user (i.e. number of classes)
//using an array to store classes
void Student::InputData() {
 int i;

// Resets the class list in case the method
// was called again and array wasn't cleared
ResetClasses();

cout << "Enter student name." << endl;
getline(cin, name);
cout << "Enter number of classes." << endl;
cin >> numClasses;
cin.ignore(2,'\n');   // Discard extra newline
if (numClasses > 0) {
    //array to hold number of classes
    classList = new string[numClasses];
    // Loops through # of classes, inputting name of each into array
    for (i=0; i<numClasses; i++) {
        cout << "Enter name of class " << (i+1) << endl;
        getline(cin, classList[i]);
    }
}
cout << endl;
}

// This method outputs the data entered by the user.
void Student::OutputData() {

int i;
cout << "Name: " << name << endl;
cout << "Number of classes: " << numClasses << endl;
for (i=0; i<numClasses; i++) {
    cout << "  Class " << (i+1) << ":" << classList[i] << endl;
}
cout << endl;
}


/*This method copies a new classlist to target of assignment.  If the operator isn't overloaded       there would be two references to the same class list.*/
Student& Student::operator =(const Student& rightSide) {

int i;
// Erases the list of classes
ResetClasses();
name = rightSide.name;
numClasses = rightSide.numClasses;

// Copies the list of classes
if (numClasses > 0) {
    classList = new string[numClasses];
    for (i=0; i<numClasses; i++) {
        classList[i] = rightSide.classList[i];
    }
}
return *this;
}

//main function
int main() {
    char choice;
do {
// Test our code with two student classes
Student s1, s2;

s1.InputData();     // Input data for student 1
cout << "Student 1's data:" << endl;
s1.OutputData();        // Output data for student 1

cout << endl;

s2 = s1;
cout << "Student 2's data after assignment from student 1:" << endl;
s2.OutputData();        // Should output same data as for student 1

s1.ResetClasses();
cout << "Student 1's data after reset:" << endl;
s1.OutputData();        // Should have no classes

cout << "Student 2's data, should still have original classes:" << endl;
s2.OutputData();        // Should still have original classes

cout << endl;
cout << "Would you like to continue? y/n" << endl;
cin >> choice;
if(choice == 'y') {

    void InputData();       // Input all data from user
    void OutputData();      // Output class list to console
    void ResetClasses();        // Reset class list
}
} while(choice == 'y');

return 0;
}

1 个答案:

答案 0 :(得分:0)

摆脱

if(choice == 'y') {

    void InputData();       // Input all data from user
    void OutputData();      // Output class list to console
    void ResetClasses();        // Reset class list
}

因为变量s1s2在do-while循环中,所以它们将在每次迭代时重新创建。 (构造函数将在定义中调用,析构函数将在循环的右括号中调用,然后再测试choice == 'y'并重复)。

您遇到的另一个问题是您的标准输入处于与再次呼叫s1.InputData()兼容的状态。因为您刚刚使用>>提取运算符来读取choice,所以解析在第一个空格处停止,并且缓冲区中至少有一个换行符。当Student::InputData调用getline时,它会发现换行符仍在缓冲区中,而不是等待其他输入。

这与您在阅读cin.ignore后使用numClasses的原因相同。你想在这里做同样的事。

相关问题