对于这道C语言题请大家帮忙看看,答案是什么意思啊,还有请看看我写的哪儿不对啊,谢谢了

请编写函数fun,该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如:若一维数组中的数据是: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>
#define N 80
int fun(int a[], int n)
{int i,t,j=0,*p=a;
t=p[[0];
for(i=0;i<=n;i++)
if(t==p[i]);
else
{a[j]=t;t=p[i];j++
}
if(i>=n)
a[i]=t;
return j;
}
main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n");
}

我写的
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{int b=0,i,j,t;
for(i=0;i<n;i++)
if(a[i]>a[i+1])
{t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if(a[i]==a[j])
{a[j]=a[j+1];
b++;
}
n=n-b;
return n;
}
main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
printf("The original data :\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n");
}

第1个回答  2012-02-17
int fun(int a[], int n)
{int b=0,i,j,t;
//for(i=0;i<n;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}//数据本有序,冒这一次泡是不必要的
//如果数据无序,冒泡排序也是双重循环不是只冒一次
//for(i=0;i<n;i++)//不需两层循环,一层即可处理完毕
for(b=1, j=1; j<n; j++) //<<<改 for(j=i;j<n;j++)
if(a[j-1] != a[j]) //<<<改 if(a[i]==a[j])//跟前一个数相比是否重复(有序的,相同的数一定相邻)
{
a[b] = a[j]; //<<<改 a[i] = a[j+1]; //只重写一回所有不同的数到前面, b跟踪不同数的个数
b++; //不同数的个数
}
return b;
//n=n-b;
//<<<return n;
}
第2个回答  2012-02-15
int fun(int a[], int n)
{
int i,t,j=0,*p=a;//定义一个指针p指向a数组首地址。
t=p[0]; //给t赋初值为数组第一个元素值
for(i=0;i<n;i++) //遍历整个数组a , 去掉等号,否则会越界
if(t==p[i]); //如果t和当前元素值相等,则不做任何操作
else
{ //如果t和当前数值不相等,则将t赋值给a[j],即从数组a的首地址开始保存新的数组数据,覆盖原来的数据。j=0,1,2.......,并将新的元素值赋值给t
a[j]=t;t=p[i];j++;
}
//if(i>=n) a[i]=t; 这句没有用途,属于答案中的BUG
a[j]=t ; //增加此句,保存下最后一个值,不然会丢一个。
return j+1; //返回新的数组的长度
}追问

为什么把啊【i】=t放到最后呢??这样顺序不就不是降序了吗??请您帮忙

本回答被网友采纳
第3个回答  2012-02-15
int i,t,j=0,*p=a; //数组指针 p[i]=a[i]
t=p[0];
for(i=0;i<=n;i++)
{
if(t==p[i]); //只考虑不相同的元素,实际a[0]没变,
//将后面的和前面不同的元素依次放在数组中 ,
//j就是不同元素的个数
else
{
a[j]=t;
t=p[i];
j++;
}
}
你写的没看,但是建议现在尽量不要用双for,有很多好的算法要自己想,这种直接的句子就不要写了,不利于锻炼思维。