今天一个同事问我一个问题,他说要用几百个if语句才能判断,我一看可以用表驱动法解决,问题抽象如下:
有一个学生成绩表,当成绩<60,打D,成绩在60-80,打C,成绩在80-90之间,打B,成绩在90-100,打A;
typedef struct _StudentGrade{
unsigned int mark;
char grade;
}StudentGrade;
static const StudentGrade StudentGrade_table[]={
{60,'D'},
{80,'C'},
{90,'B'},
{100,'A'},
};
char GetGrade(unsigned int mark)
{
char student_grade='D';
unsigned int table_len=sizeof(StudentGrade_table)/sizeof(StudentGrade_table[0]);
if (mark<60)
{
return StudentGrade_table[0].grade;
}else if (mark>=100)
{
return StudentGrade_table[table_len-1].grade;
}
for(unsigned int i = 0 ; i <table_len; i++)
{
if (mark>=StudentGrade_table[i].mark &&mark<StudentGrade_table[i+1].mark)
{
student_grade=StudentGrade_table[i+1].grade;
break;
}
}
return student_grade;
}
使用表驱动法,可以很方便的增加表的项,而不要修改程序,程序的健壮性好.