2013-10-07 27 views
0

因此,我要根据员工为公司工作的年数输入确定员工的基本工资。开关,数值范围

我要做到这一点使用开关结构,我给定的范围如下:

年数worked_ __ _base工资

0 – 5     $ 9,500 
6 – 11     $12,700 
12 – 17     $15,300 
18 – 29     $22,600 
>= 30     $26,800 

所以,我怎么对案件做范围如果我不想正确处理所有数字?

这不是太麻烦,但我必须根据销售额计算佣金,并且范围为0-3,999.99美元和16,000-23,999.99美元。

+0

看看C4.5学习算法。它可以生成一个决策树,这很容易重写成switch/if语句。 – BartoszKP

回答

1

所以对于第一部分,您只需要声明一个开关,其中多个个案遵循一个代码路径。就像这样:

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来处理这种事情。

+0

司是解决方案,谢谢! – cb1295

+0

作业让我们先用if语句,然后用case来做。如果是更容易。 – cb1295

+0

我想的很多。实际上,你不会为这种数据使用交换机(交换机通常只限于一组特定的值),但这是一个有用的学习练习:) –

2

如果你被迫使用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) 
    .. 
+0

不幸的是,我不允许使用if语句。 – cb1295

+0

我写了这样的年份开关,但后来委托范围太大,无法做到这一点。 – cb1295

0

如果你需要创建动态的范围的W/O硬编码, 你可以使用这个片段

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; 
}