广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
SIEMENS海南省儋州市 西门子代理商——西门子华南一级总代理

1.2 实战示例

本节多数示例取自实际项目。表形式为一维数组、二维数组和结构体数组;表内容有数据、字符串和函数指针。基于表驱动的思想,表形式和表内容可衍生出丰富的组合。

1.2.1 字符统计

问题:统计用户输入的一串数字中每个数字出现的次数。

普通解法主体代码如下:

INT32U aDigitCharNum[10] = {0}; /* 输入字符串中各数字字符出现的次数 */
INT32U dwStrLen = strlen(szDigits);

INT32U dwStrIdx = 0;
for(; dwStrIdx < dwStrLen; dwStrIdx++)
{
   switch(szDigits[dwStrIdx])
   {
       case'1':
           aDigitCharNum[0]++;
           break;
       case'2':
           aDigitCharNum[1]++;
           break;
       //... ...
       case'9':
           aDigitCharNum[8]++;
           break;
   }
}

这种解法的缺点显而易见,既不美观也不灵活。其问题关键在于未将数字字符与数组aDigitCharNum下标直接关联起来。

以下示出更简洁的实现方式:

for(; dwStrIdx < dwStrLen; dwStrIdx++)
{
aDigitCharNum[szDigits[dwStrIdx] - '0']++;
}

上述实现考虑到0也为数字字符。该解法也可扩展至统计所有ASCII可见字符。

1.2.2 月天校验

问题:对给定年份和月份的天数进行校验(需区分平年和闰年)。

普通解法主体代码如下:

switch(OnuTime.Month)
{
   case1:
   case3:
   case5:
   case7:
   case8:
   case10:
   case12:
       if(OnuTime.Day>31 || OnuTime.Day<1)
       {
           CtcOamLog(FUNCTION_Pon,"Don't support this Day: %d(1~31)!!!\n", OnuTime.Day);
           retcode = S_ERROR;
       }
       break;
   case2:
       if(((OnuTime.Year%4 == 0) && (OnuTime.Year%100 != 0)) || (OnuTime.Year%400 == 0))
       {
           if(OnuTime.Day>29 || OnuTime.Day<1)
           {
               CtcOamLog(FUNCTION_Pon,"Don't support this Day: %d(1~29)!!!\n", OnuTime.Day);
               retcode = S_ERROR;
           }
       }
       else
       {
           if(OnuTime.Day>28 || OnuTime.Day<1)
           {
               CtcOamLog(FUNCTION_Pon,"Don't support this Day: %d(1~28)!!!\n", OnuTime.Day);
               retcode = S_ERROR;
           }
       }
       break;
   case4:
   case6:
   case9:
   case11:
       if(OnuTime.Day>30 || OnuTime.Day<1)
       {
           CtcOamLog(FUNCTION_Pon,"Don't support this Day: %d(1~30)!!!\n", OnuTime.Day);
           retcode = S_ERROR;
       }
       break;
   default:
       CtcOamLog(FUNCTION_Pon,"Don't support this Month: %d(1~12)!!!\n", OnuTime.Month);
       retcode = S_ERROR;
       break;
}


展开全文
相关产品
拨打电话 微信咨询 发送询价