Marcccccy 发表于 2020-5-6 22:01:09

去除数组中的负数

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

这是代码:
#include<stdio.h>
void f(int *a,int *m)
{
    int i,j;
    for(i=0;i<*m;i++)
        if(a<0)
        {
            for(j=i--;j<*m-1;j++)
                a=a;
            *m=*m-1;    
        }
}

int main()
{
    int i,n=7,x={1,-2,3,4,-5,6,-7};
    f(x,&n);
    for(i=0;i<n;i++)
        printf("%5d",x);
    return 0;
}
请问那个“j=i--”是什么意思呢

Marcccccy 发表于 2020-5-6 22:02:16

#include<stdio.h>
void f(int *a,int *m)
{
        int i,j;
        for(i=0;i<*m;i++)
                if(a<0)
                {
                        for(j=i--;j<*m-1;j++)
                                a=a;
                        *m=*m-1;       
                }
}

int main()
{
        int i,n=7,x={1,-2,3,4,-5,6,-7};
        f(x,&n);
        for(i=0;i<n;i++)
                printf("%5d",x);
        return 0;
}

Marcccccy 发表于 2020-5-6 22:02:53

一楼的那个代码太乱了,我也不知道为啥会这样……重新弄了一下……

THU_LSM 发表于 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是负数,那么就把a拿掉,再把a开始后面的所有元素都往前挪一个位置。
所以,原先ai 位置的负数会没了,取而代之的是原来的a。
所以需要把i减1再回到外层for循环,不然的话,是检查不到原先的i+1那个位置的数字是不是负数。因为回到外层循环的时候,原来的a实在第i个位置的。

Marcccccy 发表于 2020-5-8 19:48:04

THU_LSM 发表于 2020-5-6 22:12
j=I-- 是说,先把i的值赋给j,再把i的值减去1。
这段代码的逻辑是说,如果a是负数,那么就把a拿掉,再 ...

哦豁 我有点没弄明白就……是不是i自减以后就会回到外循环呀

18202486056 发表于 2020-5-8 21:53:44

Marcccccy 发表于 2020-5-8 19:48
哦豁 我有点没弄明白就……是不是i自减以后就会回到外循环呀

不会,只要j<*m-1这个条件成立就不会退出循环,j = i-- 是指每次把 i 赋值给 j 之后再减1

Marcccccy 发表于 2020-5-9 23:40:49

18202486056 发表于 2020-5-8 21:53
不会,只要j

明白辽,谢谢您!{:10_287:}
页: [1]
查看完整版本: 去除数组中的负数