{int a[20]={1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5,-1,-2,-3,-4,-5}; int i,m,n,f=0; scanf("%d",&n); for(i=0;i<20;i++) if(a[i]==n){ f=1; m=i; } if(f!=0) printf("%d,%d\n", n,m+1); else printf(" %d not found !\n",n); }
7 回答
已采纳
天地不仁_以_万物为刍狗
TA贡献2条经验 获得超0个赞
{int a[20]={1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5,-1,-2,-3,-4,-5}; int i,m,n,f=0; scanf("%d",&n); for(i=0;i<20;i++) if(a[i]==n){ f=1; m=i; //输出结果是4,14,而不是4,5----是因为当在控制台输入了4的时候,进入for循环,进行if判断,从数组a[20]中寻找符合 if(a[i] == n),即a[i] == 4的数组元素;从数组中可以看出,符合条件的数组元素有两个:分别为a[3]、a[13],当a[3] == 4满足if判断的时候,执行if语句内部的代码片段(此时的【 i == 3 ,n == 4 ,m == i == 3 】);【重点到了】:当i == 3执行完之后,此时for循环并没有结束条件(即 break跳出for循环),此时for循环继续向下执行,i == 3,i++之后为4,不满足判断条件,然后i++之后为5,还是不满足判断条件......直到a[13] == 4的时候,满足判断条件,然后执行if内部代码片段(重复一遍,此时的 m === 3!!!依旧是上一次i == 3的时候赋的值),当执行到m==i的时候,变量m重新赋值为i的当前值(即13),到了此处if语句的内部代码片段不会再执行,直到for循环结束。 //此时的 f == 1 , i == 19(因为for循环执行到最后) , m == 13(即第二次重新赋的值) //结论:然后代码执行到下面的【printf("%d,%d\n", n,m+1);】语句 ,n == 4, m+1 =13+1==14 //要想最终的输出结果是4,5那么久应该在if语句执行了 m = i ,这个表达式之后让循环结束,那么此时的m保持的值就是第一次持有的值(【 i == 3 ,n == 4 ,m == i == 3 】) break; //加上此句即可 } if(f!=0) //当if语句后面只有一行代码的时候 {} 可以省略,楼主这种写法没问题。但是从代码的可读性上来说,这种习惯不好,建议不要省略{} printf("%d,%d\n", n,m+1); else printf(" %d not found !\n",n); }
堇延未七
TA贡献36条经验 获得超19个赞
首先你的问题就有问题哦~ 如果想返回某个数字第一次出现的位置,那么4在已经定义的数组中第一次出现的位置为4,而不是5;
程序结果输出的是数字最后一次出现的位置,因为在for循环中,并没有在第一次找到后break跳出循环,所以它会一直往下找。
int main() { int a[20]={1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5,-1,-2,-3,-4,-5}; int i,m,n,f=0; scanf("%d",&n); for(i=0;i<20;i++){ if(a[i]==n){ f=1; m=i; break; } } if(f!=0) printf("%d,%d\n",n,m+1); else printf(" %d not found !\n",n); return 0; }
惟愿_无事常相见
TA贡献30条经验 获得超25个赞
你的for循环只包含了第一个if语句,遍历完整个数组后如果指定值在数组中有多个,那么你定义的m值就会被重复赋值,留下的就是指定值最后一次出现在数组中的索引,然后才会跳出for循环。加g个break让if语句第一次判定成功就跳出循环结果就是4,5 了。
- 7 回答
- 0 关注
- 1871 浏览
添加回答
举报
0/150
提交
取消