江苏省高校计算机等级考试命题研究院 江苏省高校计算机等级考试辅导
2015年3月全国二级C语言考试真题第3套

106套

一、基本操作

   给定程序中,函数fun的作用是:不断从终端读入整数,由变量a统计大于0的个数,用变量c来统计小于0的个数,当输入0时结束输入,并通过形参pa和pb把统计的数据传回主函数进行输出。

    请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结

果。

    注意:源程序存放在考生文件夹下的BLANK1.C中。

 

          不得增行或删行,也不得更改程序的结构!

 #include  <stdio.h>
void  fun( int *px,  int  *py)
{
/**********found**********/
   int  __(1)__ ;
   scanf( "%d", &k );
/**********found**********/
   while  __(2)__
   {  if (k>0 ) a++;
      if(k<0 ) b++;
/**********found**********/
      __(3)__;
   }
   *px=a;  *py=b;
}
main()
{  int  x,  y;
   fun( &x, &y );
   printf("x=%d  y=%d\n", x,y );
}

 

   二、简单应用

  给定程序modi1.c的主函数中,将a、b、c三个结点链成一个单向链表,并给各结点的数据域赋值,函数fun( )的作用是:累加链表结点数据域中的数据作为函数值返回。

    请改正函数fun中指定部位的错误,使它能得出正确的结果。

 

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

#include  <stdio.h>
typedef  struct  list
{  int  data;
   struct list  *next;
} LIST;
int fun(LIST *h)
{  LIST  *p;
/**********found**********/
   int  t;
   p=h;
/**********found**********/
   while( *p )
   {
/**********found**********/
      t=t+p.data;
      p=(*p).next;             
   }
   return  t;
}
main()
{  LIST  a, b, c, *h;
   a.data=34;  b.data=51;  c.data=87;  c.next='\0';
   h=&a;  a.next=&b;  b.next=&c;
   printf("总和 = %d\n",fun( h ));
}

 

 

   三、综合应用

  请编写函数fun,其功能是分别统计形参t所指二维数组中字母A和C的个数。

    注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何

 

内容,仅在函数fun的花括号中填入所编写的若干语句。

 #include  <stdio.h>
#include  <stdlib.h>
#define  M  14
void NONO();
void  fun( char (*t)[M], int *a ,int *c)
{

 

}

void  get( char (*s)[M] )
{  int  i, j;
   for( i=0; i<M; i++ )
   {  for( j=0; j<M; j++)
      {  s[i][j]=65+rand()%12; printf( "%c ",s[i][j]); }
      printf("\n");
   }
}

main()
{  char  a[M][M];
   int   x, y;
   get (a);
   fun ( a, &x,&y );
   printf("A = %d   C = %d\n",x,y);
   NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j, x, y ;
  char  a[M][M];

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for( i=0; i<M; i++ )
  {  for( j=0; j<M; j++)
     {  fscanf(fp, "%c ", &a[i][j]); }
  }
  fun ( a, &x,&y );
  fprintf(wf, "A=%d\n", x) ;
  fprintf(wf, "C=%d\n", y) ;
  fclose(fp) ;
  fclose(wf) ;
}

 

 

一、基本操作答案

 

【参考答案】

 

(1)    a=0,b=0,k

(2)    k!=0

(3)    scanf( "%d", &k )

 

【考点分析】

 

主要考察考生对循环结构的理解。

 

【解题思路】

 

填空1a=0,b=0,k下面的scanf函数用到变量k,需要提前定义,在while循环中使用了临时存放正负数个数的变量a,b,因此也要提前定义。

 

填空2( k!=0 )根据题意,输入0时结束程序,因此当k!=0时进入循环记录正负数的个数。

 

填空3scanf( "%d", &k ) 需要不断从终端输入整数,因此在循环体内添加输入操作。

 

 二、简单应用答案

 

【参考答案】

 

(1)    int t;改为int t=0;

(2)    *p 改为p或者p!=NULL

(3)    p.data改为p->data

 

【考点分析】

 

主要考察考生对于操作符.->的异同的理解,指针只能有->,数组元素可以有.或者->

 

【解题思路】

 

(1) int t;改为int t=0; 题目中变量t是用来存放累加和的,必须初始化。

(2)*p 改为p或者p!=NULL,题目中*p是结构体,不能转化为bool型;

 

(3)p.data改为p->datap是指针,只能用p->,不能用p.

 

三、综合应用答案

【参考答案】

 

int i=0,j=0;//循环统计的下标

         *a=0;//初始化a字符统计的个数

         *c=0; //初始化c字符统计的个数

         for(i=0;i<M;i++)//

         {

                   for(j=0;j<M;j++)//

                   {

                            if(t[i][j]=='A')//字符是a,计数

                                     (*a)++;

                            if(t[i][j]=='C') //字符是c,计数

                                     (*c)++;

                    }

         }

 

【考点分析】

 

主要考察考生对多重循环的理解与使用,以及字符串的比较

 

【解题思路】

 

对二维数组的行列分别循环,行优先,查找数组中元素为A或者C,分别对其进行计数