首页 > 解决方案 > C++ 获取“控件可能会到达 Johnson-Trotter 代码上的非空函数的末尾

问题描述

我能做些什么来消除这个警告?我需要在某处添加另一个 return 语句还是需要在函数中更改某些内容?

也有人可以帮我在 Johnson-Trotter 算法中添加箭头。让他们指示方向会很好,但我对如何去做感到很困惑;虽然这不是现在的主要问题,但我只想让程序运行。先感谢您。

这些是带有警告的两个函数:


   int searchArr(int k[], int n, int mobile)
   {
       for(int i = 0; i < n; i++)
       {
         if (k[i] == mobile)
         {
            return i + 1;
         }
       }
   }


int printOnePerm(int k[], bool dir[], int n)
{
    int mobile = getMobile(k, dir, n);

    int pos = searchArr(k, n, mobile);

    if (dir[k[pos - 1] - 1] == RIGHT_TO_LEFT)
    {
        swap(k[pos - 1], k[pos -2]);
    }
    else if (dir[k[pos - 1] - 1] == LEFT_TO_RIGHT)
    {
        swap(k[pos], k[pos -1]);
    }

    for(int i = 0; i < n; i++)
    {
        if (k[i] > mobile)
        {
            if (dir[k[i] - 1] == LEFT_TO_RIGHT)
            {
                dir[k[i] - 1] = RIGHT_TO_LEFT;
            }
            else if(dir[k[i] - 1] == RIGHT_TO_LEFT)
            {
                dir[k[i] - 1] = LEFT_TO_RIGHT;
            }
        }
    }

    for(int i = 0; i < n; i++)
    {
        cout << k[i];
    }

    cout << endl;
}

标签: c++

解决方案


对于第一个函数 searchArr(),一个问题是如果未找到该值,您希望它返回什么。由于返回值在 [1,n] 范围内,我猜测零表示未找到。

只要有可能,我更喜欢设计最后只有一个返回的函数。可以在函数开始时设置默认失败值。当找到值时我会退出循环,或者使用默认值设置。

这是我要写的:

int searchArr(int k[], int n, int mobile)
   {
       int ret = 0;  /* not found value */

       for(int i = 0; i < n; i++)
       {
         if (k[i] == mobile)
         {
            ret = i + 1;
            break;
         }
       }

       return ret;
   }

或者,也许更模糊一点,如果在数组中找不到该值,那么当 for 循环完成时i将等于n 。这将是一个可能的功能:

int searchArr(int k[], int n, int mobile)
   {
       for(int i = 0; i < n; i++)
       {
         if (k[i] == mobile)
         {
            break;
         }
       }

       if (i < n)
          return i + 1;
       else
          return 0;
   }

for 循环可以缩小到

for(int i = 0; i < n && k[i] != mobile; i++) ;

并且回报可以缩小到

return (i < n) ? i + 1 : 0;

虽然我通常不鼓励使用 ?: 运算符。

如上所述,第二个函数不返回任何值,应声明为“void”。


推荐阅读