2017-01-31 10 views
1
#include<iostream> 
#include<string> 
#include<iomanip> 

using namespace std; 

struct EmployeeData 
{ 
    string employeeName; 
    float overtime; 
    float grossPay; 
    float hoursWorked; 
    float hourlyRate; 
    float statetaxOwed; 
    float statetaxRate; 
    float fedtaxOwed; 
    float fedtaxRate; 
    float netPay; 
    float totalgp; 
    float totalft; 
    float totalst; 
    float totalnp; 
}; 

EmployeeData employee[4]; //array of 4 employees 
void calculate_stats(EmployeeData& employee); 

int main() 
{ 
for (int i = 0; i < 4; ++i) 
    { 
    cout << "Please enter Employee #" << (i+1) << "'s" << " name: "; 
    cin.ignore(); 
    getline(cin, employee[i].employeeName); 
    cout << "Please enter Employee #" << (i+1) << "'s hours worked: "; 
    cin >> employee[i].hoursWorked; 
    cout << "Please enter Employee #" << (i+1) << "'s hourly rate: "; 
    cin >> employee[i].hourlyRate; 
    cout << "Please enter Employee #" << (i+1) << "'s Federal Tax Rate: "; 
    cin >> employee[i].fedtaxRate; 
    cout << "Please enter Employee #" << (i+1) << "'s State Tax Rate: "; 
    cin >> employee[i].statetaxRate; 
    cout << endl; 
    } 

for (int i = 0; i < 4; ++i) 
    { 
    calculate_stats(employee[i]); 

    cout << setprecision(2) << showpoint << fixed; 
    cout << "Employee #" << (i+1) << "'s name is: " << employee[i].employeeName << endl; 
    cout << "Employee #" << (i+1) << "'s Gross Pay is: $" << employee[i].grossPay << endl; 
    cout << "Employee #" << (i+1) << "'s Federal Taxes owed is: $" << employee[i].fedtaxOwed << endl; 
    cout << "Employee #" << (i+1) << "'s State Taxes owed is: $" << employee[i].statetaxOwed << endl; 
    cout << "Employee #" << (i+1) << "'s Net Pay is: $" << employee[i].netPay << endl; 
    cout << endl; 
    } 

cout << "Total Gross Pay: " << employee[4].totalgp << endl; //here is the problem 
cout << "Total Federal Tax Owed: " << employee[4].totalft<< endl; 
cout << "Total State Tax Owed: " << employee[4].totalft<< endl; 
cout << "Total Net Pay: " << employee[4].totalft << endl; 

} 

void calculate_stats(EmployeeData& employee) 
{ 
    if (employee.hoursWorked>40) { 
     employee.hoursWorked = ((employee.hoursWorked-40) * (1.5)) + 40; 
    } 
    else { 
     employee.hoursWorked = employee.hoursWorked; 
    } 
    employee.grossPay = employee.hoursWorked * employee.hourlyRate; 
    employee.fedtaxOwed = employee.grossPay * (employee.fedtaxRate/100); 
    employee.statetaxOwed = employee.grossPay * (employee.statetaxRate/100); 
    employee.netPay = (employee.grossPay - employee.fedtaxOwed- employee.statetaxOwed); 
    employee.totalgp = employee.totalgp + employee.grossPay; 
    employee.totalft = employee.totalft + employee.fedtaxOwed; 
    employee.totalst = employee.totalst + employee.statetaxOwed; 
    employee.totalnp = employee.totalnp + employee.netPay; 
} 

for-loops 외부에 해당 cout 블록을 포함하지만 반드시 메인에 포함해야합니다. 계산 통계를 사용하여 출력이 변경되지 않았습니다. 생산액이 모두 0.00을 제공하고 있습니다 ... 그들은 4 명의 직원 모두에게 완전한 총계가되어야합니다. (따라서 4 명의 직원 모두의 총 임금이 1000 인 경우 전체 총 임금은 4000이되어야합니다. 이는 제가 계산 한 총액입니다 내 계산에 :.? employee.totalgp = employee.totalgp + employee.grossPay; 여기 당신을 감사 나는이 문제를 해결하려면 어떻게 ... 출력 (잘못된 디스플레이의 스냅 샷, 나머지는 잘 작동)의 모습주 내부의 배열에서 총계를 인쇄하는 방법

Total Gross Pay: 0.00 
Total Federal Tax Owed: 0.00 
Total State Tax Owed: 0.00 
Total Net Pay: 0.00 
Press any key to continue . . . 

입니다

+1

'employee [4]'이 (가) 존재하지 않습니다. 그것에 액세스하는 것은 정의되지 않은 동작입니다. –

+0

변수에서'[4]'를 제거하면 오류가 발생합니다. 변수에서'employee [4] .'를 제거하면 오류가 발생합니다. 액세스 할 수없는 경우 모든 Employee 값을 합산하기 위해 액세스해야하는 항목은 무엇입니까? – MichelleZ

답변

1

! 값은 주로 운이 좋기 때문에 0으로 인쇄됩니다. 배열은 EmployeeData employee[4]으로 정의되어 employee[0] ~ employee[3]에 액세스 할 수 있습니다. 인쇄용 employee[4]에 액세스하는 것은 액세스 할 수 있습니다 배열에 할당 된 것 이상의 메모리를 필요로합니다.

그 외에도 코드와 함께 메모리 위치에 아무 것도 저장하지 않습니다. 그리 나쁜 것은 아닙니다. calculate_stats

employee.totalgp = employee.totalgp + employee.grossPay; 
employee.totalft = employee.totalft + employee.fedtaxOwed; 
employee.totalst = employee.totalst + employee.statetaxOwed; 
employee.totalnp = employee.totalnp + employee.netPay; 

각 호출은, 서로 다른 위치에서 global 값을 저장하는 누적 수를 가지고 당신의 시도를 물리 치고있다 : 당신은 각 레코드에 두 번 데이터의 각 세트를 저장 않습니다. 누적 합계를 저장하고 해당 오브젝트에 값을 쓰려면 별도의 EmployeeData 인스턴스를 정의해야합니다.

합계를 저장하기위한 새로운 구조가 있으면 기존의 calculate_stats 메서드에서 위의 네 줄을 변경하여 전체 합계 구조를 업데이트하십시오.

+0

Ahhhhhhhh 나는 본다 ... 나는 그것을하는 시도 할 것이다. 나는 다른 구조체를 필요로 할지도 모른다라고 생각했다. – MichelleZ

+0

자, 그래서'EmployeeTotals'라는'struct'를 만들고'totalgp, totalft, totalst와 totalnp'을 넣습니다. 'EmployeeTotals grandtotal;이라는 이니셜 라이저를 생성 한 다음, 계산의 첫 부분 인'calculateTotalals (EmployeeTotals & grandtotal)'을 작성했습니다 :'grandtotal.totalgp = grandtotal.totalgp + employee.grossPay;'그러나 ... 그것은 지금 직원 밑에서 나에게 오류를 준다. 모든 직원 변수에 액세스 할 수없는 경우 어떻게 할 수 있습니까? 나는 매우 혼란 스럽다. 도움을 주셔서 감사합니다 .... – MichelleZ

+0

@MichelleZ'grandtotal' 인스턴스를 배열과 같은 수준으로 정의하면 위에서 설명한대로 현재'calculate_stats' 메서드에서 직접 액세스 할 수 있습니다. –