c 提示错误expected) before ; token_语法错误与逻辑错误,你更害怕谁?

99e942361a6ce9770953ec31a52cd984.png

先从一道题目说起......

描述:

给定一个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当编译的时候,会显示语法错误,“18:5: error: expected ';' before 'n'”,提示少了个分号,当加上分号后,编译就可以通过了。

用数据验证,当输入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++)。

由此可见,逻辑错误真的很难找准,因此要求我们在编写代码的时候一定要思路清晰、考虑周全,防止难以觉察的错误逻辑影响整个做题过程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值