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

C++ do/while loop and calling functions?

本文关键字:调用 函数 循环 while C++do      更新时间:2023-10-16

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

再次感谢您的帮助!

/* 
 • 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;
}

只需清除

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时,它会发现换行符仍在缓冲区中,不等待额外的输入。

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