鱼C论坛

 找回密码
 立即注册
查看: 1198|回复: 6

[已解决]去除数组中的负数

[复制链接]
发表于 2020-5-6 22:01:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是题目:
调用函数f,去除数组中的负数,输入数组x[7],输出结果1 3 4 6,输出使用格式控制"%5d"。

这是代码:
  1. #include<stdio.h>
  2. void f(int *a,int *m)
  3. {
  4. &#160;&#160;&#160;&#160;int i,j;
  5. &#160;&#160;&#160;&#160;for(i=0;i<*m;i++)
  6. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(a[i]<0)
  7. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  8. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(j=i--;j<*m-1;j++)
  9. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;a[j]=a[j+1];
  10. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;*m=*m-1;&#160;&#160;&#160;&#160;
  11. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  12. }

  13. int main()
  14. {
  15. &#160;&#160;&#160;&#160;int i,n=7,x[7]={1,-2,3,4,-5,6,-7};
  16. &#160;&#160;&#160;&#160;f(x,&n);
  17. &#160;&#160;&#160;&#160;for(i=0;i<n;i++)
  18. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;printf("%5d",x[i]);
  19. &#160;&#160;&#160;&#160;return 0;
  20. }
复制代码

请问那个“j=i--”是什么意思呢
最佳答案
2020-5-8 21:53:44
Marcccccy 发表于 2020-5-8 19:48
哦豁 我有点没弄明白就……是不是i自减以后就会回到外循环呀

不会,只要j<*m-1这个条件成立就不会退出循环,j = i-- 是指每次把 i 赋值给 j 之后再减1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-6 22:02:16 | 显示全部楼层
  1. #include<stdio.h>
  2. void f(int *a,int *m)
  3. {
  4.         int i,j;
  5.         for(i=0;i<*m;i++)
  6.                 if(a[i]<0)
  7.                 {
  8.                         for(j=i--;j<*m-1;j++)
  9.                                 a[j]=a[j+1];
  10.                         *m=*m-1;       
  11.                 }
  12. }

  13. int main()
  14. {
  15.         int i,n=7,x[7]={1,-2,3,4,-5,6,-7};
  16.         f(x,&n);
  17.         for(i=0;i<n;i++)
  18.                 printf("%5d",x[i]);
  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-6 22:02:53 | 显示全部楼层
一楼的那个代码太乱了,我也不知道为啥会这样……重新弄了一下……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-6 22:12:45 | 显示全部楼层
本帖最后由 THU_LSM 于 2020-5-6 22:13 编辑
Marcccccy 发表于 2020-5-6 22:02
一楼的那个代码太乱了,我也不知道为啥会这样……重新弄了一下……


j=I-- 是说,先把i的值赋给j,再把i的值减去1。
这段代码的逻辑是说,如果a[i]是负数,那么就把a[i]拿掉,再把a[i+1]开始后面的所有元素都往前挪一个位置。
所以,原先ai 位置的负数会没了,取而代之的是原来的a[i+1]。
所以需要把i减1再回到外层for循环,不然的话,是检查不到原先的i+1那个位置的数字是不是负数。因为回到外层循环的时候,原来的a[i+1]实在第i个位置的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-8 19:48:04 | 显示全部楼层
THU_LSM 发表于 2020-5-6 22:12
j=I-- 是说,先把i的值赋给j,再把i的值减去1。
这段代码的逻辑是说,如果a是负数,那么就把a拿掉,再 ...

哦豁 我有点没弄明白就……是不是i自减以后就会回到外循环呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-8 21:53:44 | 显示全部楼层    本楼为最佳答案   
Marcccccy 发表于 2020-5-8 19:48
哦豁 我有点没弄明白就……是不是i自减以后就会回到外循环呀

不会,只要j<*m-1这个条件成立就不会退出循环,j = i-- 是指每次把 i 赋值给 j 之后再减1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 23:40:49 | 显示全部楼层

明白辽,谢谢您!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表