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

1   (20171)

1、  移动通信指的是处于移动状态的对象之间的通信,最有代表性的是手机——个人移动通信系统。下列有关移动通信的叙述中,错误的是___________

A.   基站是个人移动通信系统的重要组成部分,它负责与其周围区域内所有手机进行通信

B.   无论是最早的第1代个人移动通信,还是处于发展中的5G,均是采用数字通信技术

C.   2代移动通信以语音传输技术为核心,但可提供收发短信息等数据量很少的数据业务

D.   目前智能手机分为多种产品类型,全网通手机一般可以接入国内三大运营商的所有网络

B

解析: 最早的第1代个人移动通信采用模拟通信技术。

4

2、  数十年来,硬盘一直是计算机中最重要的外存储器。下列有关硬盘的叙述中,错误的是_________

A.   通常硬盘的盘片两面均可记录数据,因而盘片两侧各有一个磁头

B.   所有的硬盘均有多个盘片组成,一般不会仅使用一个盘片,盘片数越多则容量越大

C.   硬盘盘片直径一般为3.52.51.8英寸等,台式PC通常采用3.52.5英寸硬盘

D.   目前内置硬盘的接口大多数为SATA接口,它以告诉串行方式传输数据

B

解析: 硬盘一般由14个或15个盘片组成,盘片宜少不宜多,单碟盘片的容量越大越好。

2

3、  下列有关信息、信息技术、信息产业、信息化的叙述中,错误的是_________

A.   信息的表现形式多种多样,其分类也不计其数

B.   所有的信息技术均采用电子技术(含激光技术)进行信息的收集、传递、加工、存储等

C.   信息产业是战略性先导产业,其科技创新含量高,知识、智力和技术密集

D.   信息化是当今世界发展的大趋势,是我国增强国际竞争力和提高综合国力的关键之一

B

解析: 信息技术的历史非常长,主要是为了提高人们的信息器官功能,协助人们进行信息处理的技术,现代信息技术采用电子技术(含激光技术)进行信息的收集、传递、加工、存储等  

1

4、  根据不同的应用需求,数字音频采用的编码方法有多种,文件格式也各不相同。下列的音频格式中,由美国Dolby公司开发的、在DVD和数字电视等领域广泛使用的是______

A.   WAV

B.   MP3

C.   AC3

D.   ACC

C

解析: MP3是一种音频压缩技术,由于这种压缩方式的全称叫MPEG Audio Layer3,所以人们把它简称为MP3;WMA是微软制订的音频压缩文件格式,比mp3标准晚,比mp3还小,比mp3音质还好 , 采用未压缩编码方式;美国杜比公司开发的AC3, DVD和数字电视等领域广泛使用;相对于mp3AAC格式的音质更佳,文件更小。  

5

5、  主机上用于连接I/O设备的各种插头、插座,统称为I/O接口。下列I/O接口中,近年来生产的大多数笔记本电脑通常不具有的接口(或者说通常不配备的接口)是______

A.   PS/2

B.   USB

C.   SATA

D.   VGA

A

解析: PS/2是早期连接有线鼠标的接口,现在主要使用USB接口了 

2

6、  数值、文字、图像、声音等不同的信息在计算机中的表示方法是不同的。下列相关叙述中,错误的是______

A.   数值为负的整数在计算机中通常采用“反码”的方法进行表示

B.   文字由一系列“字符”构成,每个字符通常使用1-4个字节的二进制编码表示

C.   黑白图像在数据库时,每个像素一般采用8位二进制无符号整数表示

D.   声音信息在数字化时,每个取样的样本一般使用8位、12位、14位或16位二进制数表示

A

解析: 数值为负的整数在计算机中通常采用“补码”的方法进行表示 

1

7、  字符集及其编码是计算机中表示、存储、处理和交换文本信息的基础,但由于历史原因,目前不同系统或应用中使用的字符编码方案并不统一。下列有关汉字编码的叙述中,错误的是______

A.   在我国最早颁布的汉字编码字符集GB 2312仅包含6000多个汉字,其中没有繁体汉字

B.   无论是GB 2312GBK,还是GB 18030,其中西文字符均为单字节编码,汉字均为双字节编码

C.   目前在互联网的许多应用中采用UTF-8编码,该编码方案采用可变长度字符编码

D.   目前在Windows操作系统中常使用UTF-16编码,在该编码方案中汉字编码使用2个字节表示

B

解析: GB 2312中字符全部采用双字节  

5

8、  操作系统是计算机中重要的一种系统软件,应用软件必须在操作系统的管理和支持下运行。下列有关操作系统的叙述中,错误的是______

A.   操作系统承担着资源分配和调度等任务,以保证程序正常有序地运行

B.   目前大多数操作系统都向用户提供图形用户界面,它以窗口形式显示程序运行状态

C.   操作系统通常由操作系统内核和许多配套软件、程序库等组成

D.   所有的计算机都必须安装操作系统才能工作,操作系统的运行不依赖任何其他软件

D

解析: 操作系统启动前依赖于底层的BIOS程序,通过引导加载程序将操作系统加载到内存中并运行。

3

9、  按照软件权益的处置方式来分类,软件可以分为商品软件、共享软件、自由软件等多种类型,下列相关叙述中,错误的是______

A.   所有的商品软件都需要用户付费购买其使用权,且软件升级均需要再次付费

B.   共享软件通常是"买前免费试用"的具有版权的软件,过了试用期则付费可继续使用

C.   自由软件倡导的软件"非版权"原则,允许拷贝、修改和自由传播

D.   大多数开源软件都是多人合作,义务开发的成果,其发展促进了软件共享和技术创新

A

解析:商品软件升级有的需要付费,有的不需要付费。

3

10、              随着互联网技术和应用的发展,Web已经从信息发布与查询平台发展成为多种信息处理应用的平台,下列有关叙述中,错误的是_______

A.   静态网页通常指那些内容基本不变的网页,除非网页作者(发布者)对其修改并重新发布

B.   动态网页的内容通常不是预先确定的,而是根据用户请求提供的参数实时生成的页面

C.   Web平台上运行的信息处理系统(如淘宝、京东等)都是使用动态网页技术开发实现的

D.   目前所有的动态网页都是使用微软公司的ASP.NET技术开发而成的

D

解析:动态网页技术有多种,Asp.net, Php,Jsp 

3

 

【程序设计理论】

1.         执行以下程序时输出_______

#include<stdio.h>

float p=1.5;

void fun(void)

{

  int  p=1;

}

#define  p  2.5

int  main()

{

   fun();

   printf( "%d" , (int)p) ;return 0;

}

A1

B2

C1.5

D2.5

B

解析: 本题考核的是,变量名称相同时,访问作用范围小的变量,具体见题目详细讲解。

7

2.         以下库函数中能将键盘输入的一串数字字符串转换为int类型数据的库函数是______

Ascanf

Bgets

Cgetchar

Dgerch

A

解析:通过scanf(“%d”,变量内存地址) 可以实现将键盘输入的一串数字字符串转换为int类型数据,gets用于给字符数组赋值,getchar用于给字符变量赋值  

4

3.         已有声明"int a[5],*b=a,(*c)[3],*d[3];",以下表达式中有语法错误的是____

A a[0]=0

B b[0]=0

C.  c[0]=0;

D.  d [0]=0

C

解析: 变量声明中 int (*c)[3]的含义是声明一个变量c,指向一块内存空间,这块内存空间中只能存放行地址的内存编号,具体见视频讲解。

10

4.         已知ab为参加某逻辑运算的两个操作数,该逻辑运算规则为当且仅当ab中只有一个为真时结果才为真,其他情况下结果均为假。以下用于表示该逻辑运算的表达式是____
A
!a||b

Ba&&!b

C(a&&b) &&!(a||b)

D(a||b) &&! (a&&b)

D

解析: 可以分别采用当a=1b=1a=0,b=0a=1,b=0a=0b=1时带入公式计算,只有D选项符合题目要求。

3

5.         执行语句”fp=fopen(“my.dat”,”r+”);”后,程序对文件my.dat中数据的读写操作权限为_______

A 只读

B 只写

C.  可读且可覆盖写

D.  可读且可追加写

C

解析:只读通过r实现,只写通过w实现,通过r+实现对数据进行读且可覆盖写, 可读且可追加写通过aa+实现  

13

6.         以下程序运行时,输出结果中第一行是____________   ,第二行是____________  

#include<stdio.h>

int  main()

{

  int  n,s=0,t=1;

  for(n=1;n<=3;n++)

      t=t*n,s=s+t;

  printf( "%d\n%d" , t,s ) ;

  return 0;

}

6@9

解析: 因文字解析不如视频讲解清晰,具体见视频详细讲解。

6

7.         以下程序运行时,输出结果中第一行是____________   ,   第二行是____________   ,第三行是____________  

#include <stdio.h>

int funp(int  m )

{

  int  i;

  for(i=2;i<=m/2;i++)

      if(m%i==0)return 0;

  return 1;

}

int  guess(int  a[][3],int  m,int  n )

{

   int  i,k,j,t=0;

   if(m%2)m++;

   for(i=m;i<=n;i+=2)

   {

    for(k=3;k<=i/2;k+=2)

      if(funp(k))

         {

        j=i-k;

        if(funp(j))

              {

           a[t][0]=i;a[t][1]=k;a[t][2]=j;

            t++;

           break;

              }

      }

   }

   return t;

}

int   main()

{

   int  a[100][3],i,k;

   k=guess(a,6,10);

   for(i=0;i<k;i++)

     printf("%3d%3d %3d\n ",a[i][0],a[i][1],a[i][2]);

   return 0;

}

6  3  3@8  3  5@10  3  7

解析: 因文字解析不如视频讲解清晰,具体见视频详细讲解。

7

8.         以下程序运行时,输出结果中第一行是_____________,第二行是______________

#include<stdio.h>

int strmerge(char *a,char *b,char *c)

{

  int i=0,j=0,k=0;

  char   t;

  while(a[i]!='\0' && b[j]!='\0')

  {

    if(a[i]==b[j])

      t=a[i],i++,j++;

    else

      if(a[i]<b[j])   t=a[i++];

      else  t=b[j++];

      if(k==0)  c[k++]=t;

      else  if(t!=c[k-1])  c[k++]=t;

  }

 

  while (a[i]!='\0')

  {

    if(k==0) c[k++]=a[i];

      else  if(a[i]!=c[k-1])  c[k++]=a[i];

    i++;

  }

  while(b[j]!='\0')

  {

    if(k==0)  c[k++]=b[j];

    else if(b[j]!=c[k-1])  c[k++]=b[j];

    j++;

  }

  c[k]='\0';

  return  i+j-k;

}

 

 

int  main()

{

   int  n;

   char  s1[10]="ccp",s2[10]="oppy",s3[20];

   n=strmerge(s1,s2,s3);

   puts(s3);

   printf("%d",n);

   return 0;

}

 

copy@3

解析: 因文字解析不如视频讲解清晰,具体见视频详细讲解。

7

9.         以下程序运行时,输出结果中第一行是_______,第二行是____________,第三行是________

 

以下程序运行时,输出结果中第一行是,第二行是,第三行是。

#include<stdio.h>

struct node

{

    int d;

    struct node *next;

};

int copylist( struct node *head ,int x[])                 

{

    int data,k=0;  

    struct node *pk,*pj,*pm,*pn;                

    while(head!=0)     

    {

        pk=head;   data=pk->d;   pn=pk;

        while(pk->next!=0)              

        {

            pj = pk->next;

            if(pj->d < data)            

            {  data=pj->d;   pm=pk;    pn=pj;   }

            pk=pj;

        }

        x[k++]=pn->d;

        if(pn!=head)

           pm->next=pn->next;       

        else  

           head=pn->next;

    }

    return k;

}

int main()

{

    int n,i,b[10];

    struct node a[]={{4},{2},{3}},*head=a;   

    a[0].next=a+1;a[1].next=a+2;

    n=copylist(head,b);

    for(i=0;i<n;i++)

        printf("%d\n",b[i]);

    return 0;

}

 

2@3@4

解析: 因文字解析不如视频讲解清晰,具体见视频详细讲解。

11

 

1(完善程序):

【要求】

1.打开T盘中文件myf0.c,按以下程序功能完善文件中的程序。

2.修改后的源程序仍保存在Tmyf0.c文件中,请勿改变myf0.c的文件名。

【程序功能】

  已知方程x2-3x+2=0在区间[0,1.5]内有一实根。以下程序中函数root为递归函数,采用二分法(半分区间法)求方程f(x)=0在区间[a,b]内的一个近似实根x。当|f(x)|<10-8时,x即为所求的近似实根。

【测试数据与运行结果】

    输出:One root is 1.000000

【待完善的源程序】

#include <stdio.h>

#include<conio.h>

#include <math.h>

double  f ( double x )

{  

    return x*x-3*x+2;

}

double  root ( double a,double b )

{

    double m=   1   ,x=0 ;        

    if(fabs(f(m))<1e-8)    

        x=   2  ;           

    else

    {

        if(   3    *f(m)>0 )   

            a=m;

        else 

            b=m;

        x=root(  4   ); 

    }

    return x ;

 }

int main()

{

    printf("One root is %lf",root(0,1.5));

    getch();

    return 0;

}

 

 

2(改错题):

【要求】

1.打开T盘中文件myf1.c,按以下程序功能改正文件中程序的错误。

2.可以修改语句中的一部分内容,调整语句次序,增加变量声明或预处理命令,但不能增加其他语句,也不能删去整条语句。

3.修改后的源程序仍保存在Tmyf1.c文件中,请勿改变myf1.c的文件名。

【程序功能】

 以下程序中函数sort的功能是对a指向的数组中前n个元素作如下处理:

 1)若数组元素值的十进制表示不足四位,则取原数加上十进制数1000作为该元素的值,若超过四位数则取其低三位数加上十进制数1000作为该元素的值,否则其值保持不变。

 2)按每个数组元素值的十进制表示中的高两位数升序排序;如果高两位数相等,则按低两位数降序排序。

【测试数据与运行结果】

测试数据:

     7115,5405,505,810,7108,9016,9005,3412,13511,4509

输出:

       1511   1505   1810   3412   4509

       5405   7115   7108   9016   9005

【含有错误的源程序】

#include <stdio.h>

#include<conio.h>

#define N 10

void sort(int a[],int n);

int main()

{

    int i;

    int a[n]={7115,5405,505,810,7108,9016,9005,3412,13511,4509};

    sort(a,N);

    for(i=0;i<N;i++)

        printf((i+1)%5 ? "%7d":"%7d\n",a[i]);

    getch();

    return 0;

}

void sort(int a[], int n)

{

    int i,j,k,x;

    for(i=0;i<n;i++)

    {

        if(!(1000<=a[i]<=9999))     

            a[i]=1000+a[i]%1000;

    }

    for(i=0;i<n-1;i++)

    {

        k=i;

        for(j=i+1;j<n-1;j++)          

          if((a[k]/100)>(a[j]/100)) k=j;

        else

          if(a[k]/100=a[j]/100&&a[k]%100<a[j]%100) k=j;

        if (k!=i)

            x=a[i],a[i]=a[k],a[k]=x;

    }

}

 

 

 

3(编程题):

【要求】

1.打开T盘中文件myf2.c,在其中输入所编写的程序。

2.数据文件的打开、使用、关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。

3.请勿改变myf2.c的文件名。

【程序功能】

   统计字符串中出现的不同英文字母(不区分大小写)各自出现的次数。

【编程要求】

1.编写函数int tongji(char x[],char a[],int c[])。函数功能是统计仅在x指向的字符串中出现的不同英文字母各自出现的次数(字母不区分大小写),按字典序依次将字符串中出现的字母保存到a指向的数组中,将每个字母出现的次数对应保存到c指向的数组中,函数返回字符串中出现的不同字母的数量。

2.编写main函数。函数功能是声明3个一维数组并用测试字符串初始化其中一个数组,用3个数组作实参调用tongji函数,将统计结果输出到屏幕及文件myf2.out 中。最后将考生本人准考证号输出到文件myf2.out中。

【测试数据与运行结果】

    测试字符串:Good Lucky

    输出:

        C: 1

        D: 1

        G: 1

        K: 1

L: 1

        O: 2

        U: 1

        Y: 1

 

#include <stdio.h>

 

int tongji(char x[],char a[],int c[])

{

   int i=0,k=0;

   char b;

   while(x[i])

   {

         if(x[i]>='A' && x[i]<='Z')

         {    b=x[i];

           c[b-65]++;

         }

         if(x[i]>='a' && x[i]<='z')

         {  

               b=x[i];

         c[b-65-32]++;

         }

      i++;

   }

 

 

 

   for(i=0;i<26;i++)

   {

      if(c[i]>0)

         {

                a[k]=i+65;

                c[k]=c[i];

                k++;

         }

   }

 

   return k;

}

 

 

int main()

{

  FILE *fp;

  int k,i;

  char x[]="Good Lucky";

  char a[26];

  int c[26]={0};

  fp=fopen("myf2.out","w+");

  if(fp==NULL)

  {

    printf("ERROR");

       return 0;

  }

 

  k=tongji(x,a,c);

  for(i=0;i<k;i++)

  {

     printf("%c:%d\n",a[i],c[i]);

        fprintf(fp,"%c:%d\n",a[i],c[i]);

  }

  fprintf(fp,"My Exam Number is 001122");

  fclose(fp);

  return 0;

}

 

 

 

 

 

#include <stdio.h>

 

int tongji(char x[],char a[],int c[])

{

   int i=0;

   int k=0;

   char b;

   char a1[26]={0};

   int c1[26]={0};

 

   while(x[i])

   {

          if(x[i]>='A' && x[i]<='Z' || x[i]>='a' && x[i]<='z')

          {

                 b=x[i];

                 if(x[i]>='a' && x[i]<='z')

                 {

              b=x[i]-32;

                 }

                 a1[b-65]=b;

           c1[b-65]++;

            

          }

          i++;

   }

 

   for(i=0;i<26;i++)

   {

          if(c1[i]>0)

          {

         a[k]=a1[i];

               c[k++]=c1[i];

          }

 

   }

   return k;

}

 

int main()

{

   FILE *fp;

   char x[]="Good Lucky";

   char a[26]={0};

   int c[26]={0};

   int i,k;

   fp=fopen("myf2.out","w+");

 

   k=tongji(x,a,c);

 

   for(i=0;i<k;i++)

   {

     printf("%c:%d\n",a[i],c[i]);

        fprintf(fp,"%c:%d\n",a[i],c[i]);

   }

 

   fclose(fp);

   return 0;

  

 

}