c编写函数voidfun(int*x,int n)删除有n个数据的数组x中所有包含数字6的数据,后续的剩余元素赋值为-1。

编写函数voidfun(int*x,int n),它的功能是:删除有n个数据的数组x中所有包含数字6的数据,后续的剩余元素赋值为-1。n为数组长度,规定x中数据都为正数。如程序运行时若输入:122 1461 6234 16 11 663 911 2671 381 6 删除后输出: 122 11 911 381 -1 -1 -1 -1 -1 -1
自己的程序如下,求指正
#define N 10
#include<stdio.h>
void fun(int *x,int n)
{
int i,j;
j=N;
for(i=0;i<j;i++)
while(x[i]>0)

{
if(x[i]%10==6)
{
for(;i<j-1;i++)
x[i]=x[i+1];
x[N-1]=-1;
i=i-1;
j=j-1;
}break;
x[i]=(int)(x[i]/10);
}

}

void main()
{
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
fun(a,N);
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
}

修改了一下你的子函数fun()。

void fun(int *x,int n)
{
    int i,j, k, temp;
    
    i = 0; j = n-1;    
    while(i <= j) {
        temp = x[i];
        while (temp > 0) {
            if (temp % 10 == 6) {
                for (k = i+1; k <=j; k++)
                    x[k-1] = x[k];
                x[j] = -1;
                j --;
                break;
            }
            temp /= 10;
        }
        if (temp == 0) i++;
    }    
}

运行:

122  11  911  381  -1  -1  -1  -1  -1  -1

你原先的函数,问题比较多:

① 既然是函数,就不要再把全局变量或宏,如N,代入了。 那样破坏了函数的完整性。

② 在for循环里面改变循环变量是大忌~,比如你原先的

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

for(;i<j-1;i++) {

i=i-1;  j=j-1;}

}

还是循环里面套循环的变量的改变!!!

③ 循环比较移动这块,逻辑不清,错误不少。

* 比如你改变了x[]的值,如果该值不含‘6’,是不是也改变了?

* 你的结果貌似没用让这些值改变,多亏了 for(;i<j-1;i++) ,这是你另一个错误,漏了一个{反而帮助了你,这个循环,只作了一件事:x[i]=x[i+1]; 后面的不在循环内;

* 而再后面的break就不是地方,无论if(x[i]%10==6)这句成立与否如何,都break出了while这个循环。。。;

* x[N-1]=-1;这句,除了N的问题,逻辑上也有问题,每次都是n-1这个固定位置上的数值被赋值-1了,如果前面有数据含‘6',那么 它应该前移啊~

④ 正确的逻辑应该是:从左右两头作标记,数据含‘6’,则把后面的数据依次前移,然后把右边数据赋值-1,“右边”位置向左移一位,-- ,但此时左边的位置不动,因为要判断,前移后的数据是否也含’6‘;如果数据不含’6‘,那么左边++,但右边不动;结束条件是左边>右边;

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜