C - Смена заявления против заявления на выплату сотруднику?
Я работаю над программой оплаты труда на C и пытаюсь найти лучший способ организации кода для расчета заработной платы за почасовую оплату труда. Я хочу использовать оператор switch вместо загрузки операторов if. Мне просто интересно, возможно ли это? Нужны ли значения случаям или они могут остаться пустыми? Например, могу ли я использовать просто "case:" вместо "case value1:"? Я знаю, что если я использую оператор switch, то мне, вероятно, придется использовать if для проверки того, что введенные пользователем данные действительны. Или я должен просто придерживаться кучу если?
Если вам было интересно, вот указания, которым я должен следовать:
- Компания платит своим сотрудникам как: а) менеджерам, которые получают фиксированную еженедельную зарплату; b) почасовые работники, которые получают фиксированную почасовую оплату за первые 40 часов работы и "в полтора раза", то есть в 1,5 раза больше их почасовой оплаты за сверхурочные часы; в) комиссионеры, которые получают 250 долларов плюс 5,7% от их еженедельных продаж; или г) сдельные работники, которые получают фиксированную сумму за изделие за каждый произведенный товар.
Напишите программу для расчета еженедельной оплаты для каждого сотрудника. Вы не знаете количество сотрудников заранее. Каждый тип сотрудника имеет свой собственный код оплаты:
1 для менеджеров
2 для почасовых работников
3 для комиссионеров
4 для Работников.
Напишите отдельную функцию для обработки каждого типа кода оплаты. Используйте переключатель, чтобы вычислить оплату каждого сотрудника на основе кода оплаты этого сотрудника. В переключателе предложите пользователю ввести соответствующие факты, необходимые программе для расчета заработной платы каждого сотрудника на основе кода оплаты этого сотрудника.
При необходимости добавьте проверки разумности (например, зарплата от 0 до 100000, отработанные часы от 0 до 84, часовая ставка от 0 до 250, еженедельные продажи от 0 до 1000000, количество штук от 1 до 1000, заработная плата за штуку от 0,01 до 1000 Используйте константы).
Вот константы программы: #include
// constants
#define MANAGERS 1
#define HOURLY_WORKERS 2
#define COMMISSION_WORKERS 3
#define PIECEWORKERS 4
#define STOP_PROGRAM -1
#define COMMISSION_PERCENT 0.057
#define COMMISSION_PAY 250
#define OVERTIME_HOURS 1.5
#define MAX_HOURS_WORKED 40
Вот код, который у меня есть для функции Hourly Worker:
void calcHourlyWorkerPay()
{
float hourlyPayRate;
int totalHoursWorked;
float totalPay;
printf("You entered 2 for Hourly Worker.\n\n");
printf("Enter hourly pay rate.\n"
"(Entry must be between 0 and 250): ");
scanf ("%f", &hourlyPayRate);
printf("Enter total hours worked.\n"
"(Entry must be between 0 and 84): ");
scanf ("%d", &totalHoursWorked);
if ((totalHoursWorked <= MAX_HOURS_WORKED) && (totalHoursWorked >= 84))
{
}
}
Причина, по которой я спрашиваю, заключается в том, что я хочу добавить к этому подтверждение, когда пользователь вводит число, которое не находится в диапазоне от 0 до 84, он говорит что-то вроде "Неверный ввод, введите число от 0 до 84". Я также хочу добавить проверку, в которой, если пользователь вводит почасовую ставку, которая не находится в диапазоне от 0 до 250, он говорит что-то вроде "Неверный ввод, введите число от 0 до 250". Надеюсь, я никого не смутил. Я, вероятно, допустил несколько ошибок, и должен отметить, что я ОЧЕНЬ новичок в программировании на Си.
РЕДАКТИРОВАНИЕ
Я отредактировал оператор if следующим образом:
if (((totalHoursWorked >= 0) && (totalHoursWorked <= 84)) && ((hourlyPayRate >= 0) && (hourlyPayRate <= 250)))
{
totalPay = totalHoursWorked * hourlyPayRate;
}
else if ((totalHoursWorked <= 0) || (totalHoursWorked >= 84))
{
printf("\n\nINVALID!!! Total hours worked MUST be between 0 and 84.\n\n");
printf("Enter total hours worked.\n"
"(Entry must be between 0 and 84): ");
scanf ("%d", &totalHoursWorked);
}
else if ((hourlyPayRate <= 0) || (hourlyPayRate >= 250))
{
printf("\n\nINVALID!!! Hourly pay rate MUST be between 0 and 250.\n\n");
printf("Enter hourly pay rate.\n"
"(Entry must be between 0 and 250): ");
scanf ("%f", &hourlyPayRate);
}
else
{
totalPay = (MAX_HOURS_WORKED * hourlyPayRate) + ((hoursWorked - MAX_HOURS_WORKED) * hourlyPayRate * OVERTIME_HOURS);
}
Это правильно и будет ли это работать?
1 ответ
Например, вы проверяете, находится ли (totalHoursWorked >= 0) в одном выражении, и (totalHoursWorked <= 0) в условии "else". Проверка на равенство с нулем должна существовать только в одной из этих проверок. Вам также следует выделить общие выражения, чтобы упростить их - например, вы уже проверяете, находятся ли значения, такие как totalHoursWorked, в пределах одного условия, но вы перепроверяете его еще раз, если выражение оценивается как false, потому что вы слишком усложнили это, комбинируя это с проверкой для hourlyPayRate. Если вам необходимо узнать, не было ли выражение, содержащее переменную, неудачным, вы должны сделать эту переменную единственной в этом выражении и сохранить проверки работоспособности для других значений, пока не пройдет первая проверка.
Также не ясно, что происходит, если значение выходит за пределы диапазона при повторной попытке ввода. Если произойдет сбой, он попросит вас повторно ввести значение, но оно больше не будет проверяться. Вам необходимо поместить логику ввода и проверки в конструкцию, которая будет повторяться до тех пор, пока значение не окажется в пределах диапазона (или они указывают, что хотят выйти), независимо от того, сколько раз они вводят недопустимые значения.
Поскольку основное внимание уделяется использованию констант, значения, которые вы используете для проверки правильности, также должны быть постоянными.