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

Posted

技术标签:

【中文标题】如何将循环中的信息存储到数组中【英文标题】:How to store information from loop into an array 【发布时间】:2019-01-25 07:43:06 【问题描述】:

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

问题是我真的不知道。练习截图为here

我询问用户有多少个工人,并将值放入“工人”变量,然后我创建 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;
   

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

【问题讨论】:

rate 需要存入数组吗? 我认为这是为了某种学校作业 - 你可以使用 std::vectorstd::string 吗?这些会让你的生活更轻松(并且你的代码更简洁),但是有些学校会倒退(恕我直言),让你先用艰难的方式去做,然后再向你展示简单的方法...... 分配说“无功能”和“使用 typedef 字符串数据类型”。运气不好 定义一个代表一个工人的结构,然后使用一个数组。 不应该将count 初始化为0 开头吗? :-o 【参考方案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(s):

    // typedef for string data types    
    typedef char INFO;

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

应该是

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

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

还有另一种解决方案 - 如果您想用 C++ 编写代码,请首选 std::string 而不是 c-strings。简而言之,std::string 就像 char 类型元素的动态大小数组/容器。

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

    struct employee *emp = new employee[workers];

例如标准::向量:

    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 流运算符(运算符>),这将简化对 employee 对象的 i/o 操作。

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

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

【讨论】:

我想不同意你的观点,但我不能,因为从你的角度来看,你所说的一切都是绝对正确的哈哈。问题是我一年后才回到 C++,我已经忘记了很多东西。这个练习让我记住了大部分内容,也教会了我很多东西。 我确实成功了。我编辑了几乎大部分的代码。我会在早上上传更正的版本。 @DavidGordeladze 请告诉我您为什么不同意我的观点以及您认为有什么问题?我只是好奇。【参考方案2】:

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

我使用了结构体、指针和“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;

【讨论】:

以上是关于如何将循环中的信息存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何从数组中获取信息到消息中?

如何在不循环的情况下将数组的内容复制到 C++ 中的 std::vector?

使用 laravel 4 上的循环将数据数组存储到单个数组中

将文件中的数据存储到数组中

汇编语言中的循环

如何将 For 循环结果转换为数组,然后在 C# 中计算结果数组的整数?