C ++做/while循环和调用函数? [英] C++ do/while loop and calling functions?

查看:196
本文介绍了C ++做/while循环和调用函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果用户输入"y",他们想继续执行,则尝试使该程序循环运行时遇到麻烦.顺便说一下,我是编程的超级新手,所以对您的帮助将不胜感激.我认为最好的方法是在主代码中添加一个do/while并在用户名k处添加,如果他们想在代码末尾继续操作,但是我很快意识到,除非我调用前面的方法进行用户输入,否则这是行不通的和输出.这就是问题所在.

I am having trouble trying to get this program to loop if user enter 'y' they'd like to continue. I'm super new to programming by the way so any help is greatly appreciated. I figured the best was to add a do/while in main and as k the user if they'd like to continue at the end of the code but, I quickly realized that wouldn't work unless I called the previous methods for user input and output. That's where the issue is arising.

再次感谢您的帮助!

/* 

 • 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'并重复之前,将在定义处调用构造函数,并在循环的右括号处调用析构函数.)

Because the variables s1 and s2 are inside the do-while loop, they'll be recreated on each iteration. (The constructor will be called at the definition, and the destructor will be called at the closing brace of the loop, before it tests choice == 'y' and repeats).

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

The other problem you run into is that your standard input isn't in a state compatible with calling s1.InputData() again. Because you just used the >> extraction operator to read choice, parsing stopped at the first whitespace, and there is (at least) a newline leftover in the buffer. When Student::InputData calls getline, it will find that newline still in the buffer and not wait for additional input.

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

This is the same reason you used cin.ignore after reading numClasses. You'll want to do the same here.

这篇关于C ++做/while循环和调用函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆