很难理解你在问什么,而且你的逻辑在数学/地理上似乎并不准确。先决条件似乎是:
- 你有一个从传感器读取的角度,0-360 度。
- 你想打印这个角度的方向,直东是角度 0。
- 指南针的方向是(逆时针)E、ENE、NE、NNE、N 等。
- 总而言之,罗盘上有 16 个这样的方向。因此,我们需要将 360 度分成 16 个不同的方向。不幸的是,360/16 = 22.5,不是偶数。
- 由于 360/16 不是偶数,我们要么必须使用浮点类型,要么在 CPU 受限的低端嵌入式系统的情况下,很可能是这里的情况,将所有整数乘以 10。
如果上述假设是正确的,那么您可以执行以下操作:
const char* DIRECTION [16] =
{
  "E",
  "ENE",
  "NE",
  "NNE",
  "N",
  "NNW",
  "NW",
  "WNW",
  "W",
  "WSW",
  "SW",
  "SSW",
  "S",
  "SSE",
  "SE",
  "ESE"
};
const char* get_direction (int angle)
{
  angle = angle % 360; /* convert to angles < 360 degrees */
  /* Formula: index = angle / (max angle / 16 directions) */
  /* Since 360/16 is not an even number, multiply angle and max angle by 10, to eliminate rounding errors */
  int index = angle*10 / (3600/16);
  if(index == 15) /* special case since we start counting from "the middle of east's interval" */
  {
    if(angle*10 > 3600-(3600/16)/2)
    {
      index = 0; /* east */
    }
  }
  return DIRECTION [index];
}
int main()
{
  printf("%s\n", get_direction(0));    /* E   */
  printf("%s\n", get_direction(22));   /* E   */
  printf("%s\n", get_direction(23));   /* ENE */
  printf("%s\n", get_direction(45));   /* NE  */
  printf("%s\n", get_direction(180));  /* W   */
  printf("%s\n", get_direction(348));  /* ESE */
  printf("%s\n", get_direction(349));  /* E   */
  printf("%s\n", get_direction(360));  /* E   */
  getchar();
}
与检查每个间隔相比,这样做的优点是执行时间是确定的,并且与巨大的 switch-case 相比,分支预测更少。
请注意,浮点数将使代码更具可读性,如果您有该选项,则应使用该选项。但我假设这是一个低端嵌入式系统,即 8 位或 16 位 MCU 应用程序。