Поэтому я должен определить базовый оклад для сотрудника на основе количества лет работы сотрудника в компании.
Я должен сделать это, используя структуры переключателей, и мне заданы диапазоны следующим образом:
Количество лет работы_ __ _ Базовая зарплата
0 – 5 $ 9,500
6 – 11 $12,700
12 – 17 $15,300
18 – 29 $22,600
>= 30 $26,800
Итак, как мне сделать диапазоны для случаев, если я не хочу, чтобы правильный случай для всех чисел?
Это не слишком много хлопот с этим, но тогда я должен выяснить комиссию, основанную на продажах, и имеет диапазоны $ 0-3999.99 и $ 16,000-23,999.99.
Поэтому для первой части вам просто нужно объявить коммутатор, где несколько случаев следуют одному коду. Как это:
int baseSalary
switch (yearsWorked)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
baseSalary = 9500;
break;
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
baseSalary = 12700;
break;
... etc ...
}
Для второй части коммутатор для каждого отдельного номера в диапазоне тысяч довольно неосуществим, но с небольшим умным разделением его можно сделать одинаково легким. Если вы разделите 2000 на 1000, вы получите 2, и если вы разделите 2500 на 1000, вы также получите 2 (с остатком 500). Используя это, вы можете сгенерировать оператор switch:
int sales = 2100;
int salesRange = sales / 1000; // (salesRange = 2)
int commission
switch (salesRange)
{
case 0: // $0-999 sales
case 1: // $1000-1999 sales
case 2: // $2000-2999 sales
case 3: // $3000-3999 sales
commission = <some number here>;
break;
... etc ...
}
При этом предполагается, что "использовать переключатель" является частью школьного задания или аналогичного. Как говорили другие люди, вам лучше использовать операторы if с диапазоном (например, if (sales >= 0 && sales <= 3999)
), чем использовать переключатель для такого рода вещей.
Если вы вынуждены использовать инструкцию switch
то рассмотрите тот факт, что несколько случаев могут быть соединены вместе:
switch (years) {
case 0:
case 1:
case 2:
..
return 9500;
case 6:
case 7:
..
}
Но утверждение if
кажется более подходящим для проблемы:
if (years >= 0 && years <= 5)
..
else if (years >= 6 && years <= 11)
..
Если вам необходимо динамическое создание диапазонов без жесткого кодирования, вы можете использовать этот фрагмент
struct BaseSalary
{
int requiredExperience; // years in company
int amount; // salary amount
};
struct SortCondition
{
bool operator()(const BaseSalary& lhs, const BaseSalary& rhs)
{
return lhs.requiredExperience < rhs.requiredExperience;
}
};
struct SearchCondition
{
bool operator() (const BaseSalary& s, int exp)
{
return s.requiredExperience < exp;
}
};
// Fill base salary list in any appropriate way
BaseSalary s1;
s1.requiredExperience = 3; // [0 - 3]
s1.amount = 3500;
BaseSalary s2; // (3 - 7]
s2.requiredExperience = 7;
s2.amount = 7000;
BaseSalary s3; // (7-10]
s3.requiredExperience = 10;
s3.amount = 11000;
std::vector<BaseSalary> salaries;
salaries.push_back(s2);
salaries.push_back(s3);
salaries.push_back(s1);
// Sort salaries in ascending order of experience
std::sort(salaries.begin(), salaries.end(), SortCondition());
// Get base salary based on experience
int exp_to_search = 5;
std::vector<BaseSalary>::iterator it = std::lower_bound(salaries.begin(), salaries.end(), some_exp, SearchCondition());
if(it == salaries.end())
{
// > 10 years
}
else
{
int amount = it->amount;
}