簡體   English   中英

c++ 具有重載函數和用戶輸入的指針

[英]c++ pointers with overloaded functions and user input

我收到多個錯誤。我已經嘗試過使用不同的變量和不同的數據類型。 我顯然不明白如何正確使用指針。 我不是在找人給我答案,我想了解更多並在可能的情況下自己弄清楚但是我被卡住了 - 非常感謝任何建議。

我總是很坦率——這是為了學校的作業。 除了在我的 function 中至少使用一個指針示例的要求外,我已經完成並滿足所有其他評分要求。

這里的例子,我試圖在 main 和 case 2 中使用一個帶有雙倍 employeeSalary的指針。 早些時候我試圖將它們與我的 function 原型一起使用,但這似乎也不起作用。 我在 ConsoleApplication5.exe 的 0x00007FFB0897EBCE (msvcp140d.dll) 處拋出異常:0xC0000005:訪問沖突寫入位置 0x0000000000000000。

#include <iostream>
#include <iomanip>
using namespace std;

double grossPay(const int number, double hours, double pay); // hourly function
double grossPay(int number, double salary); // salary function
double grossPay(int company, int project, int number, double hours, double pay);  // contract function
double grossPay(int institution, int department, double hours, double pay); // intern function


int main() {
    // prompt user for type of employee and give EOF instructions.
    cout << "Enter '1' for hourly. Enter '2' for salaried." << endl;
    cout << "Enter '3' for contracter. Enter '4' for intern." << endl;
    cout << endl;
    cout << "Terminate input by using <ctrl> z on Windows then press enter." << endl;
    cout << "Terminate input by using <ctrl> z on UNIX / Linux / Mac OS X then press enter." << endl;

    int employeeType{ 0 };

    int employeeNumber{ 0 };
    double overtimePay{ 0 };

    // salaried
    double *employeeSalary{ 0 };

    // hourly
    double hoursWorked{ 0 };
    double payRate{ 0 };

    // contractor
    int companyNum{ 0 };
    int projectNum{ 0 };

    // intern
    int schoolCode{ 0 };
    int departmentCode{ 0 };

    while (cin >> employeeType) {

        switch (employeeType) {
        case 1:
            // HOURLY employee prompts and output
            cout << "Enter employee number: " << endl;
            cin >> employeeNumber;
            cout << "Enter number of hours employee worked: " << endl;
            cin >> hoursWorked;
            cout << "Enter employees pay rate: " << endl;
            cin >> payRate;

            while (hoursWorked > 50 || hoursWorked < 0) {
                hoursWorked = -1;

                cout << "Input invalid, please enter acceptable work hours for hourly employee (0-50):" << "\n" << endl;

                cin >> hoursWorked;

            }

            if (hoursWorked > 0 || hoursWorked < 50) {
                cout << setprecision(2) << fixed;
                cout << "Gross pay of employee #" << employeeNumber << " is $" << grossPay(employeeNumber, hoursWorked, payRate) << endl;
                cout << endl;
            }


            break;

        case 2:
            // SALARIED employee prompts and output
            cout << "Enter employee number: " << endl;
            cin >> employeeNumber;
            cout << "Enter employees salary: " << endl;
            cin >> *employeeSalary;
            
            cout << setprecision(2) << fixed;
            cout << "Gross pay of employee #" << employeeNumber << " is $" << grossPay(employeeNumber, *employeeSalary) << endl;
            cout << endl;

            break;

        case 3:
            // CONTRACT employee prompts and output
            cout << "Enter company number: " << endl;
            cin >> companyNum;
            cout << "Enter project number: " << endl;
            cin >> projectNum;
            cout << "Enter employee number: " << endl;
            cin >> employeeNumber;
            cout << "Enter number of hours employee worked: " << endl;
            cin >> hoursWorked;
            cout << "Enter employees pay rate: " << endl;
            cin >> payRate;

            while (hoursWorked > 40 || hoursWorked < 0) {
                hoursWorked = -1;

                cout << "Input invalid, please enter acceptable work hours for contract employee (0-40):" << "\n" << endl;
                cin >> hoursWorked;
            }

            if (hoursWorked > 0 || hoursWorked < 40) {
                cout << setprecision(2) << fixed;
                cout << "Gross pay of contractor #" << employeeNumber << " is $" << grossPay(companyNum, projectNum, employeeNumber, hoursWorked, payRate) << endl;
                cout << endl;
            }

            break;

        case 4:
            // INTERN prompts and output
            cout << "Enter institution code: " << endl;
            cin >> schoolCode;
            cout << "Enter department code: " << endl;
            cin >> departmentCode;
            cout << "Enter number of hours employee worked: " << endl;
            cin >> hoursWorked;
            cout << "Enter employees pay rate: " << endl;
            cin >> payRate;

            while (hoursWorked > 20 || hoursWorked < 0) {
                hoursWorked = -1;

                cout << "Input invalid, please enter acceptable work hours for an intern (0-20):" << "\n" << endl;
                cin >> hoursWorked;
            }

            if (hoursWorked > 0 || hoursWorked < 20) {
                cout << setprecision(2) << fixed;
                cout << "Gross pay of the intern is $" << grossPay(schoolCode, departmentCode, hoursWorked, payRate) << endl;
                cout << endl;
            }

            break;
        }

        cout << "Enter '1' for hourly. Enter '2' for salaried." << endl;
        cout << "Enter '3' for contracter. Enter '4' for intern." << endl;
        cout << endl;

    }

    cout << endl;
    cout << "Thank you for using this program. " << endl;

}


// validation in main code
// hourly function
double grossPay(const int number, double hours, double pay) {
    double hourlyWeek{ 0 };

    if (hours > 40.00) {
        hourlyWeek = (pay * 40.00) + ((hours - 40.00) * (pay * 1.50));
    }

    else {
        hourlyWeek = (hours * pay);
    }

    return hourlyWeek;
}

// salary function
double grossPay(int number, double salary) {
    double salaryWeek{ 0 };

    salaryWeek = (salary/52.00);

    return salaryWeek;
}

//contractor function
double grossPay(int company, int project, int number, double hours, double pay) {
    double contractWeek{ 0 };

    contractWeek = (hours * pay);

    return contractWeek;

}

// intern function
double grossPay(int institution, int department, double hours, double pay) {
    double internWeek{ 0 };

    if (hours > 15.00) {
        internWeek = (pay * 15) + ((hours - 15) * (pay * 1.25));
    }

    else {
        internWeek = (hours * pay);
    }


    return internWeek;
}

如果將代碼縮減為最簡單的重現錯誤的示例,則會得到:

int main() {
  // salaried
  double *employeeSalary{ 0 }
  *employeeSalary = 1000;

  return 0;
}

你有一個指針,你“取消引用”它(也就是說你嘗試使用它指向的東西)。 但它沒有指向任何東西。 您嘗試寫入不屬於您的 memory 空間,並且出現錯誤。 您必須將指針指向某物:

int main() {
  // salaried
  double salary(0);
  double *pSalary = &salary;

  *pSalary = 1000;

  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM