求详解啊!表示看不懂!!
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{
int i,j=1;
for(i=1;i<n;i++)
if(a[j-1]!=a[i]) /*若该数与前一个数不相同,则要保留*/
a[j++]=a[i];
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;void NONO ();
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");
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf; int a[N], n, i, j ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {
fscanf(rf, "%d", &n) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
n = fun(a, n) ;
for(j = 0 ; j < n ; j++) fprintf(wf, "%4d", a[j]) ;
fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
这种一眼看不懂的程序,就一步一步慢慢看。
j初始化为1。
进入for循环,i=1,j=1,如果a[0]不等于a[1],那么将a[1]赋值给a[1],虽然看起来像是没有意义的一步,但假如a[0]等于a[1]了,就直接进行下一个循环,i自增为2,此时进if判断,如果a[0]等于a[2],那么再进入下一个for循环,i又自增为3。。。就这样循环下去,与a[0]相同的都被忽略了,也就是未保留它们的值,但只要一遇到与a[0]不一样的值,就将该值依次写在a[0]后面,覆盖a中原来的值,这样最后a中值就都是不重复的了。