如何将信息从循环存储到数组中

时间:2019-01-25 07:43:06

标签: c++ arrays loops

我需要输入信息并为多名员工计算一些资料,然后将每位员工的信息输出到单个控制台中,并且我需要使用数组。

问题是我真的不知道如何将循环中的信息存储到数组中。练习的屏幕截图为here

我问用户有多少个工人,并且该值进入“ workers”变量中,然后创建int employee [workers]数组,因此循环中的迭代次数由用户的输入确定。

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

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

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

null

目前优先考虑的是建立正确的循环并将循环中的信息存储到数组中。 此时,输出不是主要重点。

2 个答案:

答案 0 :(得分:1)

第一个问题是您需要了解此行中发生的情况:

    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:

    // typedef for string data types    
    typedef char INFO;

很遗憾,您在此评论中撒谎。 这不是string类型。您的typedefchar的别名,因此它仅存储一个字符,而不存储string

应该是

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

但是在我的拙见中,这是多余的,因为类型名INFO什么也没说。 另外,您还必须记住,如果要解决此问题,还必须为这些c字符串成员(f_namem_namel_name)设置一些固定大小,因为c字符串是指具有恒定的大小。

还有另一种解决方案-如果您想用C ++进行编码,则首选std::string而不是c字符串。简而言之,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;
    }

它导致无限循环(我检查了)。 为什么?因为您没有清理输入缓冲区,所以请在此处进行示例:How do I flush the cin buffer?

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

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

再说一次-祝您学习C ++一切顺利!

答案 1 :(得分:0)

[UPDATE]基本上,代码是垃圾,但是它使我记住并学习了很多东西。所以这就是我重新编写代码的方式:

我使用了有用的结构,指针和“ new”运算符。

唯一有问题的部分是输入部分,因为如果我输入多个字符,程序基本上会跳过所有内容,只显示一个模板:

cout << "Enter first name of employee    "<<i+1<<" : " << endl;
cin  >> emp[i].f_name;

cout << "Enter middle name of employee   "<<i+1<<" : " << endl;
cin  >> emp[i].m_name;

cout << "Enter last name of employee     "<<i+1<<" : " << endl;
cin  >> emp[i].l_name;

cout << "Hours of work by employee " << i+1 << ": " << endl;
cin >> emp[i].hrs_worked;

输出结果如下:output

//*********************** Preprocessor Directives *********************
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <cmath>
#include <stdlib.h>
#include <string.h>

using namespace std;

// Constants
const double OVERTIME_R = 1.5;
#define STATE_TAX 0.06
#define FED_TAX 0.12
#define UNION_FEE 0.02

// typedef for string data types
typedef char INFO;

// using struct to store employee info
struct employee
{
    INFO f_name;
    INFO m_name;
    INFO l_name;
    float rate;
    float hrs_worked;
    float gross;
    float overtime;
    float state_tax;
    float fed_tax;
    float uni_fee;
    float net;
};

//******************************* main ********************************

int main()
{

    int workers = 0;
    int i; // will be used in for loop
    float total_gross = 0;
    float avg_gross = 0;

//*****************Process***************************

    // asking number of employees
    cout << "Enter the number of employees: " << endl;
    cin >> workers;

    // array of employees
    struct employee *emp = new employee[workers];

    for(i = 0; i < workers; i++)
    {

        cout << "Enter first name of employee    "<<i+1<<" : " << endl;
        cin  >> emp[i].f_name;

        cout << "Enter middle name of employee   "<<i+1<<" : " << endl;
        cin  >> emp[i].m_name;

        cout << "Enter last name of employee     "<<i+1<<" : " << endl;
        cin  >> emp[i].l_name;

        cout << "Hours of work by employee " << i+1 << ": " << endl;
        cin >> emp[i].hrs_worked;

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

        cout << "Rate Per Hour of employee " << i+1 << ": " << endl;
        cin >> emp[i].rate;

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

        // if employee has worked over 40 hrs. this statement activates.
        if(emp[i].hrs_worked > 40)
        {
            emp[i].overtime = (emp[i].hrs_worked - 40.0) * emp[i].rate *         
OVERTIME_R;
        }

        // Calculating the taxes.
        emp[i].state_tax = emp[i].gross * STATE_TAX;
        emp[i].fed_tax = emp[i].gross * FED_TAX;
        emp[i].uni_fee = emp[i].gross * UNION_FEE;
        emp[i].net= emp[i].gross - (emp[i].state_tax + emp[i].fed_tax +                 
  emp[i].uni_fee);

        // Total Gross
        total_gross += emp[i].gross;
    }

//**********************************OUTPUT****************************
    cout << endl;
    cout << endl;
    cout << "\t\t\t\t" <<"Data Housing Corp. Weekly Payroll" << endl;
    cout << "\t\t\t\t" <<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
    cout << "First Name" << setw(5) << "MI" << setw(13) << "Last Name" <<     setw(18)
         << "Rate per hour" << setw(18)<< "Hours worked" << setw(12)<< "Overtime"
         << setw(10)<< "Gross" << setw(15)<< "State tax"
         << setw(10)<< "Fed tax" << setw(15)<< "Union fee" << setw(10)<< "Net" << endl;
    cout << "==========" << setw(5) << "==" << setw(13) << "=========" <<     setw(18)
         << "=============" << setw(18)<< "============" << setw(12)<< "========"
         << setw(10)<< "=====" << setw(15)<< "========="
         << setw(10)<< "=======" << setw(15)<< "=========" << setw(10)<< "==="     << endl;

for ( i = 0  ; i < workers ;  i++)
    {
        cout << setw(10) << emp[i].f_name << setw(5) << emp[i].m_name << setw(13)
        << emp[i].l_name << setw(18) << emp[i].rate << setw(18)<<     emp[i].hrs_worked
        << setw(12)<< emp[i].overtime << setw(10)<< emp[i].gross << setw(15)
        << emp[i].state_tax << setw(10)<< emp[i].fed_tax << setw(15)<< emp[i].uni_fee
        << setw(10) << fixed << showpoint <<setprecision(2)<< emp[i].net << endl;
    }
    return 0;
}