编写函数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()。
运行:
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‘,那么左边++,但右边不动;结束条件是左边>右边;