表驱动法解决实际问题

今天一个同事问我一个问题,他说要用几百个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;

}

 

使用表驱动法,可以很方便的增加表的项,而不要修改程序,程序的健壮性好.

 

你可能感兴趣的:(重构)