循环用户输入的更好方法

时间:2015-09-17 13:54:25

标签: c++ loops io

所以我一直在研究一个小程序,询问用户学习给定主题的名称/小时数,然后进行一些计算并显示结果。现在,为了获得4个主题的输入,我这样做:

#include <iostream>

using namespace std;

int main() 
{

string topic1 = "";
string topic2 = "";
string topic3 = "";
string topic4 = "";
/* could have more topics here */

double hoursStudying1 = 0;
double hoursStudying2 = 0;
double hoursStudying3 = 0;
double hoursStudying4 = 0;

cout << "Topic name: ";
getline(cin, topic1);

cout << "Time studying for " << topic1 << ": ";
cin >> hoursStudying1;
cin.ignore();

cout << "Topic name: ";
getline(cin, topic2);

cout << "Time studying for " << topic2 << ": ";
cin >> hoursStudying2;
cin.ignore();

cout << "Topic name: ";
getline(cin, topic3);

cout << "Time studying for " << topic3 << ": ";
cin >> hoursStudying3;
cin.ignore();

/* calculate stuff here */

/* display the results */
cout << "For " << topic1 << " you spent " << hoursStudying1 << " hours studying" << endl;
/* etc */

return 0;
}

我是初学者,但我知道必须有更有效的方法来实现这一目标:(。我如何使用,例如,do...while循环甚至是for循环显示我所研究的每个主题/小时(按顺序)的一组提示,我现在正在做什么?我正在寻找任何人重写我的程序或类似的东西那,但请给我一些关于他们代码的指示。非常感谢你们!

编辑:非常感谢您提供给我的所有示例和指示。我会和他们一起玩,并发布一些我自己的代码,让你知道它是如何工作的。

5 个答案:

答案 0 :(得分:2)

您需要使用数组或列表,然后循环遍历它们。您可以有两个单独的数组,一个用于保存主题名称,另一个用于保存小时研究,或者您可以定义一个包含主题名称和研究小时数的类,然后使用该类的元素数组。

最重要的是,您需要学习如何使用数组或集合。

答案 1 :(得分:2)

您可以使用struct

typedef struct _element {
string topic;
double hoursStudying;
} element;

然后你可以定义array这样的元素

element journal[ 4 ];

现在您可以考虑使用循环来处理数组journal

亲自尝试:用以上提示编写完整的程序并告诉我们......

在这样做之后,尝试将结构转换为一个类,确定需要哪些成员函数然后实现它们。再次,让我们知道......

答案 2 :(得分:1)

我会做类似的事情:

cout << "Enter topic name or 'quit'";
while(true)
{
    cin<< foo;
    if(foo == 'quit')
        break;
    else
    {
        //Do stuff with foo
    }
}

显然你会想要处理奇怪的输入(“qUiT”),但这就是循环结构。

答案 3 :(得分:1)

  

我如何使用例如do ... while循环甚至for循环来显示每个主题/小时的提示数量(按顺序),正如我现在所做的那样?

您应该创建一个用于存储数据的数组,而不是为其创建单独的变量。之后,使用循环来提示和接收输入。它可以是while循环或for循环。 (通常,当您确定要迭代的次数时,请使用for-loop。当无法确定迭代次数时使用while-loop

示例:

double hoursStudying[5] = {0};

for(int x=0; x<5; x++){   //5 can be replaced with a variable indicating array size
    cout << "Time studying for " << topic << " " << x << ": ";
    cin >> hoursStudying[x];
    cin.ignore();
}

为了显示输出,它将是相同的。只需使用循环迭代数组值。

示例:

for(int x=0; x<5; x++){   
    cout << "For " << topic << " " << (x+1) << " you spent " 
        << hoursStudying[x]<< " hours studying" << endl;
}

答案 4 :(得分:-1)

这是用C ++编写程序的正确方法:

文件Topic.h:

    #pragma once
    #include <sstream>
    #include <string>

    using namespace std;

    class Topic {
        string name;
        double hours;
    public:
        Topic(string name, double hour);
        ~Topic();
        void setName(const string & _name) {
            name = _name;
        }
        void setHours(double & _hours) {
            hours = _hours;
        }
        void addHours(double & _hours) {
            hours += _hours;
        }
        string getName() const {
            return name;
        }
        double getHours() const {
            return hours;
        }
        string print() const;
    };

文件Topic.cpp

#include "Topic.h"


Topic::Topic(string name = "", double hour = 0.0) :
    name(name), hours(hour) {
}

Topic::~Topic() {
}

string Topic::print() const {
    ostringstream output;
    output << "For " << name << " you spent " << hours << " hours studying.";
    return output.str();
}

File Topics.h:

#pragma once
#include <vector>
#include <sstream>
#include <string>
#include "Topic.h"

using namespace std;

class Topics {
    vector<Topic> topics;
public:
    Topics();
    ~Topics();
    void add(const Topic & topic) {
        topics.push_back(topic);
    }
    Topic get(const unsigned int & index) const {
        return topics[index];
    }
    string printAll() const;
};

File Topics.cpp:

#include "Topics.h"

Topics::Topics()
{
}

Topics::~Topics()
{
}

string Topics::printAll() const {
    ostringstream output;
    for (Topic topic : topics) {
        output << topic.print() << endl;
    }
    return output.str();
}

File Source.cpp

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include "Topic.h"
#include "Topics.h"

using namespace std;

Topic input() {
    string name;
    double hours;

    cout << "Topic name: ";
    cin >> name;

    cout << "Time studying for " << name << ": ";
    cin >> hours;

    cout << endl;

    return Topic(name, hours);
}

Topics inputCycle()
{
    Topics topics;
    int n;

    cout << "How many topics you have ?" << endl;
    cin >> n;

    for (int i = 0; i < n; i++)
        topics.add(input());

    return topics;
}

void printAll(const Topics & topics) {
    cout << topics.printAll() << endl;
}

int main()
{
    printAll(inputCycle());

    system("PAUSE");
    return false;
}