博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道面试题作为blog的开头
阅读量:4662 次
发布时间:2019-06-09

本文共 1436 字,大约阅读时间需要 4 分钟。

题目:200ms获取一次汽车当前行驶速度,计算30S内平均速度,若超过100KM/S,则开始报警,否则停止报警。设计一个函数供其他人调用,要求效率尽可能的高。

思考了一下,这个函数应该是在一个定时器中断服务函数中调用的,可能影响效率的只有求平均速度这一点,因为可能用到除法。我给出的答案如下:

1 /*! 200ms获取一次当前行驶速度,计算30秒内平均速度,若超过100km/s 则报警,否则停止报警 */ 2 #define SPEED_INVERVAL          200                         // 获取当前速度的间隔 3 #define SPEED_TIME              30*1000                     // 计算平均速度要统计的总时间 4 #define SPEED_NR                (SPEED_TIME/SPEED_INVERVAL) // 计算平均速度要统计的速度次数 5 #define AVERAGE_SPEED           100                         // 报警速度 6 #define TOTAL_SPEEDS            (AVERAGE_SPEED*SPEED_NR)    // 报警总速度 7  8 static int speeds[SPEED_NR];                                /* 当前速度*/ 9 static int index = 0;                                       /* 当前速度要存储的位置索引*/10 static int count = 0;                                       /* 已计算平均速度次数*/11 static int TotalSpeed = 0;                                  /* 当前总速度*/12 13 extern void BeepStart(void);                                /* 开始报警 */14 extern void BeepStop(void);                                 /* 停止报警*/15 16 /*! 计算平均速度,若超过平均速度则开始报警,否则停止报警*/17 void CheckSpeed(int CurSpeed)18 {19     if(count
= TOTAL_SPEEDS){ /* 判断总速度是否超过报警总速度*/31 BeepStart();32 }else{33 BeepStop();34 }35 }

知识点:

1.用了一个数组做循环队列,保存最近的30×1000/200=150次速度,这样就简化了平均速度的计算。

2.把平均速度的比较转化成最近150次总速度与总平均速度的比较,这样可以省去计算平均速度除法带来的开销。

转载于:https://www.cnblogs.com/chengjinguang/p/3610744.html

你可能感兴趣的文章