Как хранить информацию из цикла в массив - PullRequest
0 голосов
/ 25 января 2019

Мне нужно ввести информацию и рассчитать некоторые данные для нескольких сотрудников, и вывести информацию о каждом сотруднике в единую консоль, и мне нужно использовать массивы.

Проблема в том, что я не знаю, как хранить информацию из цикла в массиве.Снимок экрана с упражнением: здесь

Я спрашиваю пользователя, сколько там работников, и значение входит в переменную «работники», затем я создаю массив int employee [worker], поэтому числоколичество итераций в цикле определяется пользовательским вводом.

Проблема с моим циклом состоит в том, что он не повторяет вопросы независимо от количества сотрудников.

Я использовал команду 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;
}   

В настоящий момент приоритет состоит в том, чтобы установить правильный цикл и сохранить информацию из цикла в массив.На данном этапе вывод не является основным фокусом.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

[ОБНОВЛЕНИЕ] По сути, код был мусором, однако он заставил меня вспомнить и многому научиться.вот как я переделал код:

Я использовал используемые struct, указатель и оператор "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;
}
0 голосов
/ 25 января 2019

Первая проблема заключается в том, что вам нужно понять, что произошло в этой строке:

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

Вы можете просто вывести значение этой переменной:

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

И после этого вы должны прочитать немного об определении и объявлении переменных в C ++ (это не та же самая «операция»).

Если вам нужно простое решение, я могу сказать, что ваша переменная count будет иметь некоторое «мусорное» значение. Самый простой способ решить это - инициализировать его начальным значением. После анализа контекста я могу предположить, что int count = 0; будет правильным начальным значением.

Полагаю, могут быть и другие проблемы, но эта напрямую связана с вашим вопросом.

Желаю вам удачи с C ++! Я также предлагаю вам изучить основы C ++, начав с понимания того, что такое определение и объявление переменных.

[UPDATE]

Я хочу добавить немного после того, как вы опубликовали свое обновление:

    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. Ваш typedef является псевдонимом char, поэтому он хранит только один символ, а не string.

должно быть

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

Но, по моему скромному мнению, это избыточно, поскольку имя типа INFO ничего не говорит. Также вы должны помнить, что если вы хотите это исправить, вы также должны установить некоторый фиксированный размер для этих членов c-строки (f_name, m_name, l_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 в этой строке).

Другая ошибка возникает во всех проверках ввода, например ::1010*

    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?

Я думаю, вы также можете рассмотреть возможность изменения этой структуры в класс и рассмотреть возможность перегрузки потоковых операторов ввода-вывода (operator << и operator >>) для вашего класса, что упростит операции ввода-вывода над employee объектами.

И последнее замечание - пожалуйста, опубликуйте свое обновление, отредактировав предыдущий вопрос, а не помещая его в качестве ответа.

И еще раз - желаю вам удачи в изучении C ++!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...