c++ - 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;
}
解决方案
对于第一个函数 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”。
推荐阅读
- xslt - 如何创建导致空节点序列的源
- javascript - 为什么 Angular 创建版本低于已安装版本的项目?
- xcode - Xcode 12 - 下载更多模拟器运行时为空
- python - 将 csv 文件读入字典
- flutter - 颤振包得到ERORR 66 linux:无法解压缩gz流接收数据时连接关闭,路径=''
- javascript - 将图像保存到从云存储加载的磁盘?
- java - Spring 不建议开发人员使用哪个注解 @Autowired,为什么?
- python - 连接错误('
: 无法建立新连接:[Errno 111] Connection denied') - angular - HTML Date Picker 不接受 Angular 中的 DateTime 类型
- reactjs - setState 在尝试将其保存到 LocalStorage 时记录旧值