全部问题 > 当前问题

求详解啊!表示看不懂!!

#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) ;

}


匿名课官 2016-9-20 20:28:29

共 2 个回答

qqq 2016-9-20 21:05:13

这种一眼看不懂的程序,就一步一步慢慢看。

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中值就都是不重复的了。

过客 2017-1-23 12:18:25

回复 qqq:做这道真题时写法跟答案略有出入,但得到结果是正确的,但是评分时说错误。想问一下,考试时这类编程题只有一种答案吗,还是只要结果正确就可以?

问题来自: 编程题真题