一个C程序的疑问

来源:百度知道 编辑:UC知道 时间:2024/07/07 16:31:49
原题是:编写fun函数int fun(int a[], int n),删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,一维数组中的数据是:2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10,删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10。在主函数中输入数据并调用函数得到结果。

我的程序如下:
# include <stdio.h>
void main ()
{
int fun (int a[],int n);
int a[50];
int i,n,m;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
m=fun(a,n);
for (i=0;i<m;i++)
printf("%d ",a[i]);
printf("\n");
}

int fun (int a[],int n)
{
int i,j;
for (i=0;i<n;)
{

if (a[i]==a[i+1])
{
for (j=i;j<n-1;j++) /*问题在这里*/
a[j]=a[j+1];
n--;
}
else i++;
}
return (n);
}

结果输出时数组最后一个元素没有输出.
但如果将出问题的地方改成j<n就好了.但两次貌似并没有改变fun的返回值.而且前一种好像更符合逻辑.哪位高手指点下为什么会有这样的不同.

这有什么好说的,当然是j<n拉,
当你j=n-1的时候,这个时候的你数组都没到最后一个元素,你比的时候最后一个元素就没比

j<n或者j<=n-1

这样在向前移位时才能将最后一位(n-1)移到(n-2)处

int fun (int a[],int n)
{
int i,j;
for (i=0;i<n;)
{

if (a[i]==a[i+1])
{
for (j=i;j<n-1;j++)
a[j]=a[j+1];
n--;
}
else i++;
}
return (n);
}
-----------
for (i=0;i<n;)
改为:
for (i=0;i+1<n;)
你看看是不是这个问题