2014-09-27 1 views
0

Я работаю над программой оплаты работника на C, и я пытаюсь найти лучший способ организации кода для расчета платы за Часового Работника. Я хочу использовать оператор switch вместо инструкций if. Мне просто интересно, возможно ли это? Будут ли случаи нуждаться в стоимости или могут ли они оставаться пустыми? Например, можно ли использовать только «футляр:« вместо «casevalue1:«? Я знаю, что если я использую оператор switch, то, вероятно, мне придется использовать if, чтобы проверить, что то, что вводит пользователь, действительно. Или я должен просто придерживаться кучи, если?C - Заявление о выводе vs Если заявление для оплаты труда сотрудника?

В случае, если вам интересно, вот направления, которые я должен следовать:

  1. компания платит своим сотрудникам, как: а) менеджеры, которые получают фиксированную еженедельную зарплату; б) почасовые работники, получающие фиксированную почасовую зарплату до первые 40 часов работы и «время-полтора», т. е. в 1,5 раза почасовую зарплату за сверхурочные часы; c) комиссионные работники, которые получают 250 долларов США плюс 5,7% от своих еженедельных продаж; или d) сдельщики, которые получают фиксированную сумму за товар за за каждый произведенный товар.

Напишите программу для расчета недельной оплаты за каждого сотрудника. Вы не знаете количество сотрудников заранее. Каждый тип работник имеет свой собственный код заработной платы:

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 

Вот код, который я до сих пор для почасовой функции 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». Надеюсь, я никого не смутил. Я, вероятно, сделал несколько ошибок, и я должен отметить, что я ОЧЕНЬ новичок в программировании на С.

EDITED

я редактировал, если заявление следующим образом:

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

Возможно, вам нужно будет привести пример того, как выглядит лодка, если будут выглядеть утверждения. Значения случая в переключателях необходимы, за исключением случая по умолчанию, если нет другого случая. Кажется разумным использовать переключатель для типа сотрудника и просто вызвать функцию для выполнения расчетов и так далее. –

+0

Вот что должна делать функция calcHourlyWorkerPay. Он должен выполнять вычисления для Частного Рабочего. Я не размещал весь свой код здесь (это было бы более полезно), потому что я уже закричал на него. – InSeriousNeedOfAspirin

+0

Я не вижу никаких вложенных операторов 'if' в вашем коде и кроме типов сотрудников, я не вижу, где вы могли бы использовать оператор' switch'. Но стилистическое замечание: избавьтесь от своих '# define'ов. Сделать сотрудник «enum» и добавить глобальные константные константы для других констант. – 5gon12eder

ответ

0

Во-первых, вы проверяете, является ли (totalHoursWorked> = 0) в одном выражении, и (totalHoursWorked < = 0) в состоянии «else». Проверка на равенство нулю должна существовать только в одной из этих проверок. Вы также должны учитывать общие выражения, чтобы упростить их, например, вы уже проверяете, находятся ли значения, такие как totalHoursWorked, в пределах границ одного условия, но вы проверяете его дальше, если выражение оценивается как false, потому что вы слишком сложны это, объединив его с чеком для hourlyPayRate. Если вам нужно знать, не сработало ли выражение с переменной, вы должны сделать эту единственную переменную в этом выражении и сохранить проверки работоспособности для других значений до тех пор, пока не пройдет первая проверка.

Также неясно, что произойдет, если значение находится вне допустимого диапазона при попытке повторного входа. Если это не удается, оно попросит вас повторно ввести значение, но оно не будет проверено снова. Вы должны поместить логику ввода и проверки в конструкцию, которая будет повторяться до тех пор, пока значение не будет находиться в пределах диапазона (или они указывают, что они хотят выйти) независимо от того, сколько раз они вводят недопустимые значения.

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

Смежные вопросы