问题就在截图里。

这是我的代码和方法。但是结果是关闭的,我认为小时值和速率值是pay_rate函数没有相应更新。
#include <iostream>
#include <stdio.h>
float pay_rate(float, float*);
float total_pay(float, float, float*);
int main() {
float h, rate, total_salary = 0;
printf("Input worked hours: ");
scanf("%f", &h);
pay_rate(h, &rate);
// printf("%f", rate);
total_pay(h ,rate,&total_salary);
printf("\n%f", total_salary);
}
float pay_rate(float hour, float* rate) {
float temp = 0;
if (0 < hour && hour <= 40)
{
*rate = 12.5;
hour = (hour)-40;
// printf("\n%f", hour)/;
} else if (0 < hour && hour <= 4) {
*rate = 15;
hour = hour-4;
// printf("\n%f", *hour);
} else if (hour > 0) {
*rate = 20;
// printf("\n%f",*hour);
}
return *rate;
}
float total_pay(float hours, float rate, float* salary){
*salary = rate * hours;
return *salary;
}当我输入41个小时时,结果是820。但是结果必须是40*12.5,然后是+1*15,它等于515。
发布于 2022-11-16 09:34:56
你误解了这个问题。因此,即使是手动预期的输出也是错误的。
首先,你需要计算一个基薪率,它只取决于A、B、C或D类。
类别是一个输入参数。它必须通过读取从用户(A或B或C或D),然后基本工资率是固定的。
然后,根据工作时间的不同,超过给定阈值的工作时间的一部分(而且只有一部分)将乘以一个因子。
因此,如果它超过44,那么只有超过44小时才会乘以2,大于40或小于等于44的数将乘以1.5。在0到40之间的工作时间将以基本工资率支付。
在简单的C++中,您可以编写如下内容:
#include <iostream>
// Get the pay rate based in the pay category
double pay_rate(const char payCategory) {
double result = 0;
if (payCategory == 'A')
result = 12.5;
else if (payCategory == 'B')
result = 15;
else if (payCategory == 'C')
result = 20;
else if (payCategory == 'D')
result = 25;
else
std::cerr << "\n*** Error: Invalid Pay Category\n\n";
return result;
}
// Calculate the toal weekly pay based on pay category and hours worked
double total_pay(const char payCategory, const unsigned int hours) {
// The result
double pay = 0;
// Get base hourly rate
double hourlyRate = pay_rate(payCategory);
// Was the working time more than 44 hours?
if (hours > 44)
pay = (hours-44) * hourlyRate * 2 + 4 * hourlyRate * 1.5 + 40 * hourlyRate;
// NOt more than 44. Maybe more than 40?
else if (hours > 40)
pay = (hours-40) * hourlyRate * 1.5 + 40 * hourlyRate;
else
// Just in the range of 0-4ß
pay = hours * hourlyRate;
return pay;
}
int main() {
// Give user instruction. Enter Pay Category and number of hours worked
std::cout << "Enter payment category (one of A,B,C,D) and number of hours worked:\n";
// Get input from user and validate it
char payCategory = '\0';
unsigned int hours = 0;
if ((std::cin >> payCategory >> hours) and (payCategory=='A' or payCategory=='B' or payCategory=='C' or payCategory=='D'))
// Input was valid. SHow result
std::cout << "\n\n\nTotal salary: " << total_pay(payCategory, hours);
else
std::cerr << "\n\n*** Error: Invalid Input\n\n";
}。
。
使用更先进的方法,我们将使代码数据被驱动。也就是说,您只需要给出数据,所以类别数据和范围数据。
这样,您可以简单地修改值,逻辑和代码将是相同的。
例如,请参见:
#include <iostream>
#include <map>
std::map<char, double> salaryByCategory {{'A', 12.5}, {'B', 15}, {'C', 20}, {'D', 25}};
std::map<unsigned int, double> overtimeFactor{{0,1},{40,1.5},{44,2}};
int main() {
// Give user instruction. Enter Pay Category and number of hours worked
std::cout << "Enter payment category (one of A,B,C,D) and number of hours worked:\n";
// Get input from user and validate it
char payCategory = '\0';
unsigned int hours = 0;
if ((std::cin >> payCategory >> hours) and salaryByCategory.count(payCategory) == 1) {
// Get base salary based on category
double baseSalary{salaryByCategory[payCategory]};
// This is the resulting payment that we will output at the end
double payment{};
// Calculate total payment
for (auto riter = overtimeFactor.rbegin(); riter != overtimeFactor.rend(); ++riter) {
// If we are above an upper border
if (hours > riter->first) {
// Calculate hours that are above the max threshold
const unsigned int hoursAbove = hours - riter->first;
// Payment for this range
payment += (hoursAbove * riter->second * baseSalary);
// New hours (without the already calculated one)
hours -= hoursAbove;
}
}
// Show result
std::cout << "\n\nResult: " << payment << '\n';
}
else
std::cerr << "\n\n*** Error: Invalid Input\n\n";
}https://stackoverflow.com/questions/74455192
复制相似问题