C语言。删去一维数组中所有相同的数,使之只剩一个。程序如下求改错。

/*请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,一维数组中的数据是:... /* 请编写函数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。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
*/

#include <stdio.h>
#define N 80

int fun(int a[], int n)
{int i,k,s;
s=n;
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;}
return s;
}

void 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");

}
展开
 我来答
568099997
2012-09-23
知道答主
回答量:4
采纳率:0%
帮助的人:5.5万
展开全部
他这个是有错误的,222最后会变成22,只有再把他那个fun里的实现方法在复制一遍才可以消除。因为你看a[]={2,2,2,3};的话,a[0]==a[1]判断,成立,a[0]=a[1]依次赋值过去。可是再往后i已经变成2,再往后是a[2]==a[3]的判断,也就是2==3,显然不成立,所以保留了两个相邻的2。即结果等于a[]={2,2,3}.
解决方法是再次的复制这个for语句下,就OK了。
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{int i,k,s;
s=n;
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
{
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
}
}
for(i=0;i<n;i++)
{
if(a[i]==a[i+1])
{
for(k=i;k<n;k++)
a[k]=a[k+1];
s--;
}
}
return s;
}
void 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<20;i++)
printf("%3d",a[i]);
printf("\n%d\n",n);

}
ph12
推荐于2017-12-16 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1364
采纳率:0%
帮助的人:1917万
展开全部
for(i=0;i<n;i++) /*修改:此处改成i<n-1*/
{
if(a[i]==a[i+1]) /*错误:c从0~n-1取值,此处i+1已越界了*/
for(k=i;k<n;k++) /*修改:此处改成k<n-1*/
a[k]=a[k+1]; /*错误:c从0~n-1取值,此处k+1已越界了*/
由于a[k]=a[k+1]; 保证了最后一位已经移到前面,因此修改的地方,不会发生漏选错误。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenqa08
2011-12-22 · TA获得超过275个赞
知道答主
回答量:105
采纳率:0%
帮助的人:111万
展开全部
你的算法错误,我帮你修改如下!
我的算法比较简单,你仔细跟踪下便知。

int fun(int a[], int n)
{
int i, k, s;

s = n;
for(i = 0, k = 0; i < n - 1; i++)
{
for(NULL; k++, k < n; NULL) //把k++放在条件处,因为if 和else共用
{
if(a[i] == a[k])
s--;
else
{
a[i + 1] = a[k];
break;
} //else
}//for
}//for

return s;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淦海瑶s1
2011-12-22 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:765万
展开全部
int fun(int a[], int n)
{
int i,k=0;
int b[N];
b[0]=a[0];
for(i=1;i<n;i++)
if(b[k]==a[i])
continue;
else
b[k++]=a[i];
for(i=0;i<=k;i++)
a[i]=b[i];
return k+1;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式