2001年上海高等学校计算机等级考试试卷
二级(C语言)
(本试卷答卷时间为120分钟)
试题一(28分,每小题4分)
解答下列各小题,把正确的解答写在答卷纸的对应栏内。
1)试写出下列数学表达式的C语言表达式
2)设有如下程序段:
        int a=2,b=5,c;
        c=21%9/(float)a+4/b*b;
        printf(“%d\n”,c);
试写出其输出结果。
3)设有如下程序段:
        int a=0,b=0,c=0,x;
        x=(a=50)&&(b=0)&&(c=100);
        printf(“%d,%d,%d,%d\n”,x,a,b,c);
试写出其输出结果。
4)设有如下程序段:
        int a=-1;
        printf(“%d,%u,%x,%o\n”,a,a,a,a);
试写出其输出结果。
5)试写出
        printf(“\n%d\t%d”,(5^2),(5^2));
的输出结果。
6)设有如下程序段:
        int a[][5]={1,2,3,4,5,6,7,8,9,10};
        int (*p)[5]=a;
        printf(“%d\n”,*(p[1]+3));
试写出其输出结果。
7)设有如下定义:
        FILE *fp1,*fp2;
假定fp1fp2已正确指向它们要操作的文本文件,试描述执行语句
        fputc(fgetc(fp1),fp2);
的含义。
试题二(12分,每小题6分)
读程序。把程序的输出结果写在答卷纸的对应栏内。
1
[程序2.1]
#include “stdio.h”
main()
{
  int a[]={0,10,20,30,40,50,60};
  int x=5,*p;
  p=a+2;
  x+=*(p++); printf(“\nx=%d”,x);
  x-=(*p)++; printf(“\nx=%d”,x);
  x*=*(++p); printf(“\nx=%d”,x);
  x/=++(*p); printf(“\nx=%d”,x);
  }
2
[程序2.2]
#include “stdio.h”
main()
{
  int test(int);
  printf(“\ns=%d”,test(10)); 
  printf(“\ns=%d”,test(10)); 
  printf(“\ns=%d”,test(10)); 
  }
int test(int n)
{
  static int x=100;
  int s,y=100;
  x=2*x;
  y=2*y;
  s=n+x+y;
  return s;
  }
试题三(12分,每小题6分)
改错。下列程序中都有三个错误,按原来程序的要求,纠正错误,并以“将第?行改为XXX”的形式解答,代码左边的“#1”、“#2”、…是附加的行号。
1)程序3.13×4矩阵中的最大元素及其所在行和列的位置。数组元素可能有大于0,等于0或小于0的值。程序中三行有错,请纠正。
[程序3.1]
#1  #include “stdio.h”
#2  #define M 3
#3  #define N 4
#4  main()
#5  { int a[M][N],max,i,j;
#6    int row,column;
#7    for(i=0;i<M;i++)
#8        for(j=0;j<N;j++)
#9          scanf(“%d”,a[i][j]);
#10    max=0; 
#11    for(i=0;i<M;i++)
#12      for(j=0;j<N;j++)
#13          if(max<a[i][j])
#14          { max=a[i][j]; row=i; column=j; }
#15    printf(“\nmax=%d,row=%d,column=%d”,max,row,column);
#16    }
2)程序3.2中的主函数main()调用aver()函数,用来统计某数组中值大于0和小于0的元素个数(等于0的元素个数不统计)。并求数组中所有元素的平均值。平均值通过函数返回,其余两个统计结果通过形式参数的方法返回。程序中三行有错,请纠正。
[程序3.2]
#1  #include “stdio.h”
#2  main()
#3  {  double aver(int[],int,int*,int*);
#4      int c1,c2,x[]={0,12,33,-9,-5,27,80,0,54,-63};
#5      double av;
#6      av=aver(x,10,c1,c2);
#7      printf(“\nc1=%d,c2=%d,aver=%f”,c1,c2,av);
#8      }
#9  double aver(int a[],int n,int *p1,int *p2)
#10  {  int i;
#11    double sum=0;
#12    *p1=*p2=0;
#13    for(i=0;i<n;i++)
#14    {  sum=sum+a[i];
#15        if(a[i]>0)
#16            (*p1)++
#17        else
#18            (*p2)++;
#19        }
#20      return sum/n;
#21      }
试题四(18分,每小题6分)
按指定的要求编写函数或C程序,把解答写在答卷纸的对应栏内。
1)编写函数,根据公式1公里=5/8英里,把英里数转换为公里数。
2)编写函数,实现计算n个元素组成的整型数组中去掉一个最大值和一个最小值后的平均值(如有多个相同的最大值和最小值,只要去掉一个,且设n大于2)。
3)设计函数,求整数n的阶乘,并在主函数中调用该函数(通过循环结构)计算下列多项
式:
        y=1!+3!+5!+7!
试题五(15分)
阅读下列程序说明和它的代码,把应填入其中空格计算机二级哪个最容易过_______(n)________处的C代码写在答卷纸的对应栏内。
[程序5说明]
本程序的功能是把两个字符串合并且按升序排列。首先对字符串aASCII码值从小到大升序排列,然后把字符串b中的字符按升序规则插入到已排好序的字符串a中去。
[程序5]
#include “stdio.h”
#include “string.h”
main()
{  int i,j,k,n;
  char a[80]=”zkcvbn”,b[80]=”askd”;
  n=strlen(a);
  for(________(1)________;i++)
      for(________(2)________;j++)
        if(a[j]<a[i])
            k=a[i],a[i]=a[j],a[j]=k;
  for(k=0;b[k];k++)
  {  for(j=0;b[k]>a[j]&&a[j];j++);
      for(i=n;i>=j;i--)
        __________(3)__________;
      ___________(4)___________;
      a[______(5)______]=‘\0’;
      }
  printf(“\nmerge string is %s”,a);
  }
试题六(15分)
    阅读下列程序说明和它的代码,把应填入其中空格_____(n)______处的C代码写在答卷纸的对应栏内。