先从一道题目说起......
描述:
给定一个n个元素的整型数组,请将其中重复的数字剔除。
输入:两行,第一行为一个大于零的整数n,表示数组有n个元素;第二行为输入的数组元素。
输出:去重后的数组。
先送上一个错误的代码:
include
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i>a[i];
//第一层循环,取出数组中的元素
//第二层循环,用第一层循环中该元素后面的每个数分别与其比较
for(int i=0;i
用数据验证,当输入5,数组元素依次为1、2、3、4、4时,去重后显示1 2 3 4 ,好像功能完成得不错,然而当我们输入1 1 1 1 1等特殊一点的数据后,结果显示为1 1 ,还是有重复的数据!这就是逻辑错误了,也就是本题选择的算法不对。其实语法错误非常好检查,只要细点心,根据编译器错误提示不断改正就行了,然而对于逻辑错误,却非常难找。上段代码运行后之所以出现重复的数据,在于if(a[j]==a[i]),也就是当第j个数据与第i个数据重复后,将第j个数据删掉,后面的数据依次前移,然后j++进入下一次循环。这种情况忽视了这样一个事实,即第二循环中第j个数据删除后,第j+1个数据前移成为第j个数据,若此时该数据与第一循环中第i个数据重复,则循环变量j++忽略了此时的第j个数据(即移动前的第j+1个数据),因此导致还会出现重复的数据。
改正方法:把if(a[j]==a[i])改为while(a[j]==a[i])再变成循环,使得后面数据前移后即使第j的位置上还有重复的数据,则此时还在j的循环内(循环变量j没有加1),当前移的数据(第j位置的数据)不等于第一层循环中第i个数据时才退出循环,进入第二层循环的下一个数据(j++)。
由此可见,逻辑错误真的很难找准,因此要求我们在编写代码的时候一定要思路清晰、考虑周全,防止难以觉察的错误逻辑影响整个做题过程。
特别声明:文章来源用户上传并发布,本站只提供信息存储服务,不拥有所有权,内容仅供参考。