需要修改什么才能在此C代码中获得所需的结果

时间:2012-01-04 13:35:05

标签: c

我编写了一小段代码,可以在一维数组上执行运行长度编码类型的东西,但仍然远远没有达到预期的结果。

main()
{
    int a[8]={2,0,0,0,3,0,0,9};
    int i,temp,ct=0,flag,m;
    int found[90]={0};
    for(i=0;i<=7;i++)
    {
        if(!a[i])
        {
            ct++;
            if(!found[a[i]])
            {
                flag=i;
                found[a[i]]=1;
            } 
        } 
    }

    a[flag]=ct;
    m=ct;    
    for(i=0;i<m;i++)
    {
        printf("%d",a[i]);
    }       
}/* end of main*/

现在对于上面的数组我希望输出一些

 2 5 0 3 9

但是我的代码正在变得

 2 5 0 0 3

我可以就此提出任何建议吗?

3 个答案:

答案 0 :(得分:3)

不应该运行长度编码将2,0,0,0,3,0,0,9变为2 1 0 3 3 1 2 0 9 1?

1)我看到的第一件事是错误的是你没有看整个阵列。你正在使用&lt;在8之前停止,但也在7停止,所以你只评估数组项目0 - 6。

2)如果ct代表计数,它永远不会重置(仅在声明时ct = 0)。它的作用是:a [flag] = ct;它会覆盖您的原始数据。它基本上跟踪了i的价值。

这是我刚刚整理的版本:

#define SZ 8

main()
{
    int a[SZ]={2,0,0,0,3,0,0,9};
    int i; //absolute position

    int runningCount = 1; //because we start at array index 1 and not zero

    for (i = 1; i <= SZ; i++) {
        if (a[i - 1] == a[i]) //value same as one before it...
           runningCount++;
        else { // new value found. print last one, and the count of the last one.
            printf("%d %d ", a[i - 1], runningCount);
            runningCount = 1; //reset for next loop
        }
    }

    return 0;
}

输出为2 1 0 3 3 1 0 2 9 1

根据下面留下的评论,你的算法实际上看起来像这样:

#define SZ 8

main()
{
    int a[SZ]={2,0,0,0,3,0,0,9};
    int i; //absolute position

    int zero_count = 0; //target zeros specifically...

    for (i = 0; i < SZ; i++) {
        if (a[i] == 0)
           zero_count++;
    }

    //now write it out in a bizarre, unparsable format again...

    for (i = 0; i < SZ; i++) {

        if (a[i] != 0)           //write out all non zero values
            printf("%d ", a[i]);

        if (i == 0) { //this says put the zero count after the first number was printed
           printf("%d 0 ", zero_count); //inserting it into a strange place in the array
        }

    }

    return 0;
}

输出:2 5 0 3 9

答案 1 :(得分:0)

你的for循环中需要一个&lt; =

for(i=0;i<=7;i++)

而不是

for(i=0;i< 7;i++)

否则你会错过最后一个元素。

答案 2 :(得分:0)

您似乎正在做的是(a)计算数组中出现0的次数,以及(b)用该计数替换第一次出现的0。目前尚不清楚这是一个有用的编码方式。

在任何情况下,你都没有得到你想要的结果,至少部分是因为你只修改了数组的一个元素。我怀疑你想要的,或者至少你想要的是,当遇到它们时,将数组的非零元素移到左边。

以您提议的方式压缩阵列有什么用?是否有其他一些代码需要重建原始代码,如果是这样,您希望如何从您期望的结果中这样做?