首页 > 解决方案 > 如何将循环中的信息存储到数组中

问题描述

我需要为几个员工输入信息并计算一些东西,并将每个员工的信息输出到单个控制台,我需要使用数组。

问题是我真的不知道如何将循环中的信息存储到数组中。练习截图在这里

我问用户有多少个工人,值进入“工人”变量,然后我创建 int employees[workers] 数组,所以循环中的迭代次数由用户的输入决定。

我的循环的问题在于,无论有多少员工,它都不会重复这些问题。

我使用 do while 循环和“Count”变量来控制重复次数,但输入一次信息后,它只是显示结果,而不是再次提问。

我也尝试了while循环和“count”变量,但这次它只询问有多少员工,它只显示空输出。

int main()
{
//************************DECLARATIONS**********************

    typedef char INFO;

    INFO f_name[30];
    INFO m_name[10];
    INFO l_name[30];

    int count; // tracks the number of iterations in do loop
    int workers;
    double rate;
    double hrs_worked;
    double gross_inc;
    double overtime;
    double tax_total;
    float net;

    float STATE_TAX;
    float FED_TAX;
    float UNI_FEE;
    const double OVERTIME_R = 1.5;

//*****************INPUT FROM USER***************************
    cout << "Enter amount of workers" << endl;
    cin >> workers;

    int employees[workers];

    while(count < workers)
    {

        cout << "Enter worker's First name: " << endl;
        cin.getline(f_name, (sizeof(f_name)-1));

        cout << "Enter worker's middle name initial: " << endl;
        cin.getline(m_name, (sizeof(m_name)-1));

        cout << "Enter worker's last name: " << endl;
        cin.getline(l_name, (sizeof(l_name)-1));

        cout << "Enter number of hours worked: " << endl;
        cin >> hrs_worked;

        // If statement activates if user enters incorrect values
        // and asks to reenter the correct value.
        if(hrs_worked < 0 || hrs_worked > 60)
        {
            while(hrs_worked < 0 || hrs_worked > 60)
            {
                cout << "Must be between 0 and 60: " << endl;
                cin >> hrs_worked;
            }
        }

        cout << "Enter Rate Per Hour: " << endl;
        cin >> rate;

        // If statement activates if user enters incorrect values
        // and asks to reenter the correct value.
        if(rate < 0 || rate > 50)
        {
            while(rate < 0 || rate > 50)
            {
                cout << "Must be between 0 and 50: " << endl;
                cin >> rate;
            }
        }
        count++;
    }
    system("clear");
//**********************************CALCULATIONS*****************
    // Calculates overtime if employee worked more than 40 hrs

    if(hrs_worked > 40)
    {
        overtime = (hrs_worked - 40.0) * rate * OVERTIME_R;
    }

    gross_inc = (rate * hrs_worked) + overtime;
    STATE_TAX = gross_inc * 0.06;
    FED_TAX = gross_inc * 0.12;
    UNI_FEE = gross_inc * 0.02;
    tax_total = STATE_TAX + FED_TAX + UNI_FEE;
    net = gross_inc - (tax_total)


    return 0;
}   

目前优先级是建立一个正确的循环并将循环中的信息存储到一个数组中。输出不是此时的主要焦点。

标签: c++arraysloops

解决方案


第一个问题是你需要了解这一行发生了什么:

    int count; // tracks the number of iterations in do loop

您可以简单地输出此变量的值:

    cout << "count: " << count << endl;

之后,您应该阅读一些关于在 C++ 中定义和声明变量的内容(它不是同一个“操作”)。

如果您只需要一个简单的解决方案,我可以告诉您您的count变量将具有一些“垃圾”值。解决它的最简单方法是将其初始化为起始值。在分析上下文之后,我可以假设这int count = 0;将是正确的起始值。

我想可能还有其他问题,但这与您的问题直接相关。

祝你在 C++ 上好运!我还建议您深入了解 C++ 基础知识,首先要了解变量的定义和声明是什么。

[更新]

在您发布更新后,我想补充一点:

    int i; // will be used in for loop

不要那样做。如果您希望它在“for 循环”中使用,请在此处对其进行初始化。

    int workers = 0;

如果此变量表示“工人数量”,则应根据其含义对其进行命名,例如

    int numberOfWorkers = 0;

您的问题来自这个 li(n)e(s):

    // typedef for string data types    
    typedef char INFO;

不幸的是,您在此评论中对自己撒谎。这不是string类型。Yourtypedef是 a 的别名,char因此它只存储一个字符,而不是 a string

它应该是

    // typedef for string data types    
    typedef char* INFO;

但在我看来,这是多余的,因为 typenameINFO什么也没说。另外你必须记住,如果你想解决这个问题,你还必须为这些 c-string 成员(f_name, m_name, l_name)设置一些固定的大小,因为 c-strings 的大小是恒定的。

还有另一种解决方案——如果你想用 C++ 编写代码,最好不要使用std::stringc-strings。简而言之,就像类型元素std::string的动态大小数组/容器一样工作。char

您也可以简单地替换 c 样式的“动态”数组:

    struct employee *emp = new employee[workers];

例如 std::vector:

    std::vector<employee> emp;
    emp.reserve(workers);

(也不需要在这一行中使用 struct 关键字)。

另一个错误发生在所有输入检查中,例如:

    while(emp[i].hrs_worked < 0 || emp[i].hrs_worked > 60)
    {
        cout << "Must be between 0 and 60: " << endl;
        cin >> emp[i].hrs_worked;
    }

它会导致无限循环(我检查过)。为什么?因为您没有清理输入缓冲区,所以这里的示例:如何刷新 cin 缓冲区?

我认为您还可以考虑将此结构更改为类,并考虑为您的类重载 i/o 流运算符(运算符<< 和运算符>>),这将简化对employee对象的 i/o 操作。

最后一句话 - 请通过编辑以前的问题而不是将其作为答案来发布您的更新。

再一次 - 祝你学习 C++ 好运!


推荐阅读