2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)_第1页
2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)_第2页
2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)_第3页
2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)_第4页
2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)_第5页
已阅读5页,还剩60页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)学校:________班级:________姓名:________考号:________

一、单选题(12题)1.若变量已正确定义,有下列程序段:inta=3,b=5,c=7;if(a>B)a=b;c=a;if(c!=A)c=b;printf("%d,%d,%d\n",a,b,C);其输出结果是()。A.程序段有语法错B.3,5,3C.3,5,5D.3,5,7

2.下列说法不正确的是()。

A.图的遍历是从给定的源点出发每一个顶点仅被访问一次

B.图的深度遍历不适用于有向图

C.遍历的基本算法有两种:深度遍历和广度遍历

D.图的深度遍历是一个递归过程

3.若在定义语句:inta,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是()。

A.scanf("%d",a,b,c);

B.scanf("%d%d%d",a,b,c):

C.scanf("%d",p);

D.scanf("%d",&p);

4.拥有PC机并以拨号方式接入网络的用户需要配置()

A.CD-ROMB.ModemC.电话机D.鼠标

5.

6.设x、Y和z是int型变量,且x=4,y=6,z=8,则下列表达式中值为0的是()。

A.xYB.x<=YC.x‖y+zy-zD.!((x

7.若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是()。

A.-3B.9C.-12D.6

8.设有如下定义语句:intm[]={2,4,6,8,10},*k=m;以下选项中,表达式的值为6的是()。

A.*(k+2)B.k+2C.*k+2D.*k+=2

9.有以下程序:#include<stdio.h>main(){intx=3,y=5,z1,z2;z1=y^x^y;z2=x^y^x;printf(“%d,%d\n”,z1,z2);}程序运行后的输出结果是()。

A.7,7B.5,3C.8,8D.3,5

10.若有以下定义,则对a数组元素地址的正确引用是()。

inta[5],*p=a;A.A.p5B.*a1C.&a1D.&a[0]

11.有以下程序:程序运行后的输出结果是()。

A.5B.2C.3D.8

12.设有以下语句

typedefstructS

{intg;charh;}T;

则下面叙述中正确的是()A.可用S定义结构体变量B.可以用T定义结构体变量C.S是struct类型的变量D.T是structS类型的变量

二、2.填空题(12题)13.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。以下函数求出链表中所有链结点数据域的和值,作为函数值返回。请在下划线内填入正确内容。

{intdata;structlink*next;}

main()

{structlink*head;

sum(head);

┆}

sum(【】);

{structlink*p;ints=0;

p=head->next;

while(p){s+=p->data;p=p->next;}

return(s);}

14.以下定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。

structnode

{intinfo;

【】link;};

15.设有以下定义和语句,则*(*(p+2)+1)的值为【】。

inta[3][2]={10,20,30,40,50,60},(*p)[2];

p=a;

16.下列程序的运行结果是______。

#include<stdio.h>

longfunc(intx)

{longp;

if(x==0||x==1)

return(1);

p=x*func(x-1);

return(p);

}

main()

{printf("%d\n",func(4));

}

17.下面程序把从终端读入的10个整数以二进制方式写入一个名为bi.dat的新文件中。

#include<stdio.h>

FILE*fp;

main()

{inti,j;

if(fp=fopen(【】)==NULL)exit(0);

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

{scanf("%d",&j);

fwrite(&j,sizeof(int),1,【】;

}

fclose(fp);

}

18.设有下列的程序段;

charstr[]="Hello";

char*ptr;

ptr=str;

执行上面的程序段后,*(ptr+5)的值为______。

19.最简单的交换排序方法是______。

20.funl函数的调用语句为funl(&a,&b,&c);。它将3个整数按由大到小的JI匣序调整后依次放入a,b,c三个变量中,a中放最大数,请填空。

voidfun2(int*x,int*y)

{intt;

t=*x;*x;*y;*y=t;

}

voidfunl(int*pa,int*pb,int*pc)

{if(*pc>*pb)fun2(【】);

if(*pa<*pc)fun2(【】);

if(*pa<*pb)fun2(【】);

}

21.执行以下程序后,输出#号的个数是【】。

#include<stdio.h>

main()

{inti,j;

for(i=1;i<5;i++)

for(j=2;j<=i;j++)putchar('#');

}

22.下列程序的输出结果是【】。

intt(intx,inty,intcp,intdp)

{cp=x*x+y*y;

dp=x*x-y*y;

}

main()

{inta=4,b=3,c=5,d=6;

t(a,b,c,d);

printf("%d\n",c,d);

}

23.设在主函数中有以下定义和函数调用语句,且函数fun为void型,请写出函数fun的首部【】。要求形参名为b。

main()

}doubles[10][22];

intn;

fun(s);

}

24.以下程序的功能是从名为filea.dat的文本文件中逐个读入字符并显示在屏幕上。请填空。

#include<stdio.h>

main()

{FILE*fp;charch;

fp=fopen(【】);

ch=fgetc(fp);

while(!feof(fp)){putchar(ch);ch=fgetc(fp);}

putchar('\n');fclose(fp);

}

三、3.程序设计题(10题)25.程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以m。

例如:若m的值为2,a数组中的值为:

注意:部分源程序存在文件PROGl.C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

26.请编写函数fun,其功能是:计算并输出当x<0.97时下列多项式的值,直到|Sn-Sn-2

|<0.000001为止。

例如,在主函数中从键盘给x输入0.21后,输出为:s=1.100000。

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

27.请编写函数fun(),该函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。

例如,若二维数组中的数据为:

WWWW

SSSS

HHHH

则字符串中的内容应是WSHWSHWSHWSH。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

#defineM3

#defineN4

voidfun(char(*s)[N],char*b)

{

}

main()

{

chara[100],w[M][N]={{'W','W','W','W'},

{'S','S','S','S'},{'H','H','H','H'}};

inti,j;

printf("Thematrix:\n");

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

{for(j=0;j<N;j++)

printf("%3c",w[i][j]);

printf("\n");

}

fun(w,a);

printf("TheAstring:In");

puts(a);

printf("\n\n");

}

28.编写函数fun(),它的功能是;根据以下公式求p的值,结果由函数值带回。m与n为两个正数且要求m>n。

P=m!/n!(m-n)!),例如:m=12,n=8时,运行结果为495.000000。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

floatfun(intm,intn)

{

}

main()

{

clrscr();

printf("p=%f\n",fun(12,8));

}

29.请编写一个函数unsignedfun(unsignedw),w是一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w的后n-1位的数作为函数值返回。

例如:w值为5923,则函数返回923;若w值为923,则函数返回23。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

unsignedfun(unsignedw)

{

}

main()

{

unsignedx;

clrscr();

printf("Enteraunsignedinteger

number:");

scanf("%u",&x);

printf("Theoriginaldatais:%u\n",x);

if(x<10)

printf("Dataerror!");

else

printf("Theresult:%u\n",fun(x));

}

30.请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,一维数组中的数据是:2223445666677899101010。

删除后,数组中的内容应该是:2345678910。

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

31.请编写函数fun,其功能是将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。

例如,当a=16,b=35,调用该函数后,c=5361。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

voidfun(inta,intb/long*c)

{

}

main()

{

inta,b;

longc;

clrscr();

printf("Inputa,b;");

scanf("%d%d",&a,&b);

fun(a,b,&c);

printf("Theresultis:%ld\n",c);

}

32.假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言中提供的字符串函数。

例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是ABCDEFG。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio,h>

#include<stdio,h>

voidfun(char*a)

{

}

main()

{

chars[81];

printf("Enterastring:\n");

gets(s);

fun(s);

printf("Thestringafterdeleted:\n");

puts(s);

}

33.请编写一个函数fun(),它的功能是:找出一维数组元素中最大的值和它所在的下标,最大值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。

主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdlib.h>

#include<stdio.h>

voidfun(inta[],intn,int*max,int*d)

{

}

main()

{

inti,x[20],max,index,n=10;

randomize();

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

{

x[i]=rand()%50;

printf("%4d",x[i]);

/*输出一个随机数组*/

}

printf("\n");

fun(x,n,&max,&index);

printf("Max=%5d,Index=%4d\n",max,index);

}

34.请编写函数fun(),该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,若一维数组中的数据是:

2223445666677899101010

删除后,数组中的内容应该是:

2345678910。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

#defineN80

intfun(inta[],intn)

{

}

main()

{

inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,

8,9,9,10,10,10,10},i,n=20;

printf("Theoriginaldata:\n");

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

printf("%3d",a[i]);

n=fun(a,n);

printf("\n\nThedataafterdeleted

:\n");

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

printf("%3d",a[i]);

printf("\n\n");

}

四、单选题(0题)35.下列语句组中,正确的是()。

五、单选题(0题)36.有以下程序

include<stdio.h>

main()

{chara[30],b[30];

scanf(“%s”,a);

gets(b);

printf(“%s\n%s\n”,a,b);

}

程序运行时若输入:

howareyou?Iamfine<回车>

则输出结果是A.howareyou?Iamfine

B.howareyou?1amfine

C.howareyou?Iamfine

D.howareyou?

六、单选题(0题)37.有以下程序:

程序运行后的输出结果是()。

A.1,2,6,24,120,B.1,2,3,4,5,C.1,1,1,1,1,D.1,2,4,6,8,

参考答案

1.B解析:本题考查的是程序结构设计中if语句的应用,当if判断条件成立时就执行其后的相关语句,否则不执行,本题中第一个if条件不成立,故不执行“a=b”,接着执行“c=a”,此时第二个if条件也不成立,故不执行其后语句,最终c的值为3。

2.C

3.C

\n题中整型指针变量P存放的是变量C的地址。所以本题答案为C。

\n

4.B

5.B

6.D本题考查逻辑运算符的使用。当“”的两个运算对象都是逻辑l时,表达式返回值才是1;“‖”的两个运算对象至少有一个是逻辑1时,表达式返回值也是l,x<y为1,!z为0,10为1,0‖为1,因此,!l为0。

7.C解析:本题中首先定义一个整型变量a并给它赋初值为3,在表达式中,从右开始执行,即先执行“a-=a*a;”等价于a=a-a*a即a=3-3*3=-6,此时a的值为-6,接着执行“a+=a-;”相当于执行a=a+a即a=-6+(-6)=-12,此时a的值为-12。所以,4个选项中选项C符合题意。

8.A本题考查数组和指针,*k指针是指向rn数组的首地址,所以要使表达武的值为6,只需要指针指向第m[2],所以答案选择A。-

9.D是按位异或运算,其功能是参与运算的两个数,按位异或,如果两个相应位相同,结果为0,否则为1。接位异或运算满足如下规则:①满足交换律;②一个数与0异或的结果仍是原数;③一个数与1异或的结果是原数按位取反。所以题干中,“y^x^y”等价于等价于“y^y^x”,等价于“0^x”,等价于x,即“z1=x”;“x^y^x”等价于“x^x^y”,等价于“0^y”,等价于y,即“z2=y”,输出结果为:3,5。故本题答案为D选项。

10.D本题考查如何引用数组元素的地址。选项A)中,p5引用的是af51的地址,而数组a只有5个元素,即a[0]、a[1]、a[2]、a[3]、a[4],所以引用错误;选项B)中,*a1指的是将数组a的第一个元素加1;选项C)中,这种引用方式错误;选项D)中,&a[0]引用的是数组的首地址。

11.D题干中,函数fun的第2个参数通过指针作为函数返回值,它的功能是通过递归,求得fun(n)的值为fun(n-1)+fun(n-2)。由于当n取值为1和2时,值为1。所以可知整个数列如下:1,1,2,3,5,8,…,即某一项是前两项之和。所以当n取值为6时,fun(6,*s)返回s的值为3+5=8。本题答案为D选项。

12.B解析:结构体类型的定义格式为:

strcut结构体名

{成员说明列表};

结构体变量的定义有3种形式:第一种:定义结构体型的同时定义结构体变量如:strcut结构体名{成员说明列表}变量;第二种先定义一个结构体类型,然后使用该类型来定义结构体变量,如:strcutstudent{成员说明列表):student变量;第三种:定义一个无名称的结构体类型的同时定义结构体变量,如:Strctstudent{成员说明列表}变量。和上面三种情况比较我们不难得知只有选项B是正确的。所以,4个选项中选项B符合题意。

13.structlink*headstructlink*head解析:因为本题中是用结构体变量构成了链表,所以要从链表头节点逐个节点的引用结构体的数据域,需要有个指向结构体变量的指针依次指向各个节点,即p=p->next,而用指针引用结构体成员数据的方法为:p->data。注意:结构体变量和共用体变量之间的区别为联系。

14.structnode*structnode*解析:本题中的结构类型名为structnode,所以空白处应填:structnode*。即定义一个指向自身的结构体指针。

15.6060解析:程序中定义a是一个3行2列的二维数组,p是指向两个元素的一维数组指针,并让p指向二维数组a的首行。则代码*(*(p+2)+1)中的p+2指向二维数组a的第三行a[2],*(p+2)指向a[2[]0],*(p+2)+1指向a[2][1],*(*(p+2)+1)是引用a[2][1],其值是60。

16.2424解析:本题考查函数的循环调用。p=x*func(x-1),当x=4时,不满足if语句的条件,p=4*func(3),x=3也不满足条件,则func(3)=3*func(2),func(2)=2*func(1),x=1满足条件return(1),则输出结果为4*3*2*1=24。

17."bi.dat"fp'bi.dat'\r\nfp解析:打开文件函数fopen的参数是文件名,因此有fopen('bi.dat');而写文件的参数是文件指针,因此有fwrite(&j,sizeof(int),1,fp);

18.'\0''\\0'解析:本题涉及字符数组和指针的两个知识点:①在C语言中,字符型数组在存放字符串时会自动在末尾加上字符串结束标识符'\\0'所以题中数组str有6个元素。②ptr指向数组str的首地址,ptr+5是指向str[5],*(ptr+5)是引用str[5]的值,即'\\0'。

19.冒泡排序冒泡排序解析:交换排序是指借助数据元素之间的互相交换进行排序的一种方法。冒泡排序是一种最简单的交换排序方法,它是通过相邻元素之间的相互交换逐步将线性表变成有序。

20.pcpb或pbpcpcpa或papcpbpa或papbpc,pb或pb,pc\r\npc,pa或pa,pc\r\npb,pa或pa,pb解析:本题主要考查形参为指针变量时,形参和实参间的数据传递。系统为fun2的两个形参开辟了对应的基类为int型的临时指针变量,并通过空格处的实参把地址传递给形参x,y。

21.66解析:本题中i循环执行4次,当i=1时,j循环执行0次;当i=2时,j循环执行1次;当i=3时,j循环执行2次;当i=4时,j循环执行3次,所以输出#号的个数是0+1+2+3=6。

22.5656解析:本题中a,b,c,d是实参,x,y,cp,dp是形参。C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参中元仍保留并维持原值。因此,程序的输出结果是56。

23.voidfun(double*b)或voidfun(doubleb[10][12])voidfun(double*b)或voidfun(doubleb[10][12])解析:本题考查数组名作函数参数。程序中被调用函数fun(s)的实参s是数组名,而s为double型数组名,所以函数fun的形参类型为double*。

24.“filea.dat”“r”“filea.dat”,“r”解析:考查对文件的操作。fopen函数的调用方式通常为fopen(文件名,使用文件方式)。本题中要求程序可以打开filea.dat文件,并且是要读取文件中的内容,所以空白处应当填入'filea.dat','r'。

25.

解析:该程序功能是使数组右上半三角元素中的值乘以m。本题中首先要确定右上角半角元素的特点,然后对元素逐个进行乘以m的操作。其中,右上角的元素是行下标小于等于列下标的元素。

26.

解析:该程序功能是计算并输出当x<0.97时题干中给出的多项式的值。根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行累加求和。

27.voidfun(char(*s)[N]char*b){intijk=0;for(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/for(j=0;j<M;j++)b[k++]=s[j][i];b[k]='\0';}voidfun(char(*s)[N],char*b)\r\n{\r\ninti,j,k=0;\r\nfor(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/\r\nfor(j=0;j<M;j++)\r\nb[k++]=s[j][i];\r\nb[k]='\\0';\r\n}解析:看到程序后,我们很容易便能想到用循环嵌套的方法,本题中按列的顺序依次放到一个字符串中,所以列标变化慢,行标变化快。注意其中第1个循环条件为i<N(即列),第2个循环的条件为J<M(即行),这是因为在循环的嵌套中越在内层,循环变化就越快。另外,在编写程序中注意是s[j][i]而非s[i][j]。

28.floatfun(intmintn){inti;doublep=1.0;for(i=1;i<=m;i++)p=p*i;/*求m!*/for(i=1;i<=n;i++)p=p/i;/*求m!/n!*/for(i=1;i<=m-n;i++)p=p/i;/*求m!/(n!(m-n)!)*/returnp;}floatfun(intm,intn)\r\n{\r\ninti;\r\ndoublep=1.0;\r\nfor(i=1;i<=m;i++)p=p*i;/*求m!*/\r\nfor(i=1;i<=n;i++)p=p/i;/*求m!/n!*/\r\nfor(i=1;i<=m-n;i++)p=p/i;/*求m!/(n!(m-n)!)*/\r\nreturnp;\r\n}解析:本题中,欲求P的值,需要先求m,n,m-n的阶乘值,可用循环语句实现。注意阶乘值应当是double类型,若定义x,y,z为整型变量,则p=x/(y*z)中的除法为整数除法。

29.unsignedfun(unsignedw){if(w>=10000)returnw%10000;/*求出n位整数w的后n-1位的数*/if(w>=1000)returnw%1000;if(w>=100)returnw%100;if(w>=10)returnw%10;}unsignedfun(unsignedw)\r\n{\r\nif(w>=10000)\r\nreturnw%10000;/*求出n位整数w的后n-1位的数*/\r\nif(w>=1000)\r\nreturnw%1000;\r\nif(w>=100)\r\nreturnw%100;\r\nif(w>=10)\r\nreturnw%10;\r\n}解析:我们首先应该明白无符号整数的定义形式,若它大于10000(5位)时,将10000对它求余则结果为后4位;当它大于1000(4位)时,将1000对它求余则结果为后3位,花此类推。特别注意这里所有if()的顺序不能颠倒。

30.

解析:该程序功能是删去一维数组中所有相同的数,使之只剩一个。解题思路是,首先在函数中定义临时变量指向每一个元素,然后在循环过程中将临时值和其他元素进行比较,如果相同,那么跳过相同字符。

31.voidfun(intaintblong*c){*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;}voidfun(inta,intb,long*c)\r\n{\r\n*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;\r\n}解析:语句“*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;”是将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。注意“/”和“%”的用法。

32.voidfun(char.*a){intij=0;for(i=0;a[i]!='\0';i++)if(a[i]1='*')a[j++]=a[i];/*若不是要删除的字符'*'则留下*/a[j]='\0';/*最后加上字符结束符'*'/}voidfun(char.*a)\r\n{\r\ninti,j=0;\r\nfor(i=0;a[i]!='\\0';i++)\r\nif(a[i]1='*')\r\na[j++]=a[i];/*若不是要删除的字符'*'则留下*/\r\na[j]='\\0';/*最后加上字符结束符'*'/\r\n}解析:同样的问题我们在前面也碰到过,本题中是删除多余字符('*')。所以用循环从字符串的开始往后一个一个进行比较,若不是要删除的字符(用ifa[i]!='*')来控制)则留下。注意下标变量j要从0开始,最后还要加上字符串结束符'\\0'。

33.voidfun(inta[]intnint*maxint*d){inti;*max=a[0];*d=0;for(i=0;i<n;i++)/*将最大的元素放入指针max所指的单元最大元素的下标放入指针d所指的单元*/if(*max<a[i]){*max=a[i];*d=i;}}voidfun(inta[],intn,int*max,int*d)\r\n{\r\ninti;\r\n*max=a[0];\r\n*d=0;\r\nfor(i=0;i<n;i++)/*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d所指的单元*/\r\nif(*max<a[i])\r\n{*max=a[i];*d=i;}\r\n}解析:该程序直接使用形参max和d,由于它们都是指针变量,所以要引用它所指向的变量时要对它进行指针运算,也即*号运算。

34.intfun(inta[]intn){intij=l;for(i=1;i<n;i++)if(a[j-1]!=a[i])/*若该数与前一个数不相同则要保留*/a[j++]=a[i];returnj;/*返回不同数的个数*/}intfun(inta[],intn)\r\n{\r\ninti,j=l;\r\nfor(i=1;i<n;i++)\r\nif(a[j-1]!=a[i])/*若该数与前一个数不相同,则要保留*/\r\na[j++]=a[i];\r\nreturnj;/*返回不同数的个数*/\r\n}解析:本题程序的流程是:让i,j都从1开始,其中j用于控制删除后剩下的数中的下标,i用于搜索原数组中的元素。j始终是新数组已有元素中最后一个元素的下一个元素的下标,所以if()中的条件是a[j-1]!=a[i],其中a[j-1]就是新数组中的最后一个元素,若条件成立,则表示出现了不同的值,所以a[i]要留下到新数组中。注意本题中i,j的初值都要从1开始,该算法只能用于数组已排序的题目中。

35.A字符型指针变量可以用选项A)的赋值方法:char*s;s=”Olympictt;,选项C)的写法:char*s,s={1.Olympic”};是错误的。字符数组可以在定义的时候初始化:chars[]_IfIOlympic”l;或者chars[]=”Olympic'1.都是正确的,但是不可以在定义字符数组后,对数组名赋值(数组名是常量,代表数组首地址)。所以选项B)和选项D)都是错误的。对于本例,选项B)、D)中字符数组S的大小至少为8,才能存放下字符串(字符串的末尾都有结束标志“\0”)。

36.B

37.Astatic静态变量只在声明时初始化一次。mul()累乘,第一次init=1,init}=val,第二次init=1,val=2,第三次init=2,val=3,第四次init=6,val=4,第五层init=24,val=5,因此结果为l,2,6,24,120。故答案为A选项。

2022年安徽省滁州市全国计算机等级考试C语言程序设计模拟考试(含答案)学校:________班级:________姓名:________考号:________

一、单选题(12题)1.若变量已正确定义,有下列程序段:inta=3,b=5,c=7;if(a>B)a=b;c=a;if(c!=A)c=b;printf("%d,%d,%d\n",a,b,C);其输出结果是()。A.程序段有语法错B.3,5,3C.3,5,5D.3,5,7

2.下列说法不正确的是()。

A.图的遍历是从给定的源点出发每一个顶点仅被访问一次

B.图的深度遍历不适用于有向图

C.遍历的基本算法有两种:深度遍历和广度遍历

D.图的深度遍历是一个递归过程

3.若在定义语句:inta,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是()。

A.scanf("%d",a,b,c);

B.scanf("%d%d%d",a,b,c):

C.scanf("%d",p);

D.scanf("%d",&p);

4.拥有PC机并以拨号方式接入网络的用户需要配置()

A.CD-ROMB.ModemC.电话机D.鼠标

5.

6.设x、Y和z是int型变量,且x=4,y=6,z=8,则下列表达式中值为0的是()。

A.xYB.x<=YC.x‖y+zy-zD.!((x

7.若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是()。

A.-3B.9C.-12D.6

8.设有如下定义语句:intm[]={2,4,6,8,10},*k=m;以下选项中,表达式的值为6的是()。

A.*(k+2)B.k+2C.*k+2D.*k+=2

9.有以下程序:#include<stdio.h>main(){intx=3,y=5,z1,z2;z1=y^x^y;z2=x^y^x;printf(“%d,%d\n”,z1,z2);}程序运行后的输出结果是()。

A.7,7B.5,3C.8,8D.3,5

10.若有以下定义,则对a数组元素地址的正确引用是()。

inta[5],*p=a;A.A.p5B.*a1C.&a1D.&a[0]

11.有以下程序:程序运行后的输出结果是()。

A.5B.2C.3D.8

12.设有以下语句

typedefstructS

{intg;charh;}T;

则下面叙述中正确的是()A.可用S定义结构体变量B.可以用T定义结构体变量C.S是struct类型的变量D.T是structS类型的变量

二、2.填空题(12题)13.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。以下函数求出链表中所有链结点数据域的和值,作为函数值返回。请在下划线内填入正确内容。

{intdata;structlink*next;}

main()

{structlink*head;

sum(head);

┆}

sum(【】);

{structlink*p;ints=0;

p=head->next;

while(p){s+=p->data;p=p->next;}

return(s);}

14.以下定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。

structnode

{intinfo;

【】link;};

15.设有以下定义和语句,则*(*(p+2)+1)的值为【】。

inta[3][2]={10,20,30,40,50,60},(*p)[2];

p=a;

16.下列程序的运行结果是______。

#include<stdio.h>

longfunc(intx)

{longp;

if(x==0||x==1)

return(1);

p=x*func(x-1);

return(p);

}

main()

{printf("%d\n",func(4));

}

17.下面程序把从终端读入的10个整数以二进制方式写入一个名为bi.dat的新文件中。

#include<stdio.h>

FILE*fp;

main()

{inti,j;

if(fp=fopen(【】)==NULL)exit(0);

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

{scanf("%d",&j);

fwrite(&j,sizeof(int),1,【】;

}

fclose(fp);

}

18.设有下列的程序段;

charstr[]="Hello";

char*ptr;

ptr=str;

执行上面的程序段后,*(ptr+5)的值为______。

19.最简单的交换排序方法是______。

20.funl函数的调用语句为funl(&a,&b,&c);。它将3个整数按由大到小的JI匣序调整后依次放入a,b,c三个变量中,a中放最大数,请填空。

voidfun2(int*x,int*y)

{intt;

t=*x;*x;*y;*y=t;

}

voidfunl(int*pa,int*pb,int*pc)

{if(*pc>*pb)fun2(【】);

if(*pa<*pc)fun2(【】);

if(*pa<*pb)fun2(【】);

}

21.执行以下程序后,输出#号的个数是【】。

#include<stdio.h>

main()

{inti,j;

for(i=1;i<5;i++)

for(j=2;j<=i;j++)putchar('#');

}

22.下列程序的输出结果是【】。

intt(intx,inty,intcp,intdp)

{cp=x*x+y*y;

dp=x*x-y*y;

}

main()

{inta=4,b=3,c=5,d=6;

t(a,b,c,d);

printf("%d\n",c,d);

}

23.设在主函数中有以下定义和函数调用语句,且函数fun为void型,请写出函数fun的首部【】。要求形参名为b。

main()

}doubles[10][22];

intn;

fun(s);

}

24.以下程序的功能是从名为filea.dat的文本文件中逐个读入字符并显示在屏幕上。请填空。

#include<stdio.h>

main()

{FILE*fp;charch;

fp=fopen(【】);

ch=fgetc(fp);

while(!feof(fp)){putchar(ch);ch=fgetc(fp);}

putchar('\n');fclose(fp);

}

三、3.程序设计题(10题)25.程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以m。

例如:若m的值为2,a数组中的值为:

注意:部分源程序存在文件PROGl.C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

26.请编写函数fun,其功能是:计算并输出当x<0.97时下列多项式的值,直到|Sn-Sn-2

|<0.000001为止。

例如,在主函数中从键盘给x输入0.21后,输出为:s=1.100000。

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

27.请编写函数fun(),该函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。

例如,若二维数组中的数据为:

WWWW

SSSS

HHHH

则字符串中的内容应是WSHWSHWSHWSH。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

#defineM3

#defineN4

voidfun(char(*s)[N],char*b)

{

}

main()

{

chara[100],w[M][N]={{'W','W','W','W'},

{'S','S','S','S'},{'H','H','H','H'}};

inti,j;

printf("Thematrix:\n");

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

{for(j=0;j<N;j++)

printf("%3c",w[i][j]);

printf("\n");

}

fun(w,a);

printf("TheAstring:In");

puts(a);

printf("\n\n");

}

28.编写函数fun(),它的功能是;根据以下公式求p的值,结果由函数值带回。m与n为两个正数且要求m>n。

P=m!/n!(m-n)!),例如:m=12,n=8时,运行结果为495.000000。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

floatfun(intm,intn)

{

}

main()

{

clrscr();

printf("p=%f\n",fun(12,8));

}

29.请编写一个函数unsignedfun(unsignedw),w是一个大于10的无符号整数,若w是n(n≥2)位的整数,则函数求出w的后n-1位的数作为函数值返回。

例如:w值为5923,则函数返回923;若w值为923,则函数返回23。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

unsignedfun(unsignedw)

{

}

main()

{

unsignedx;

clrscr();

printf("Enteraunsignedinteger

number:");

scanf("%u",&x);

printf("Theoriginaldatais:%u\n",x);

if(x<10)

printf("Dataerror!");

else

printf("Theresult:%u\n",fun(x));

}

30.请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,一维数组中的数据是:2223445666677899101010。

删除后,数组中的内容应该是:2345678910。

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

31.请编写函数fun,其功能是将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。

例如,当a=16,b=35,调用该函数后,c=5361。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

voidfun(inta,intb/long*c)

{

}

main()

{

inta,b;

longc;

clrscr();

printf("Inputa,b;");

scanf("%d%d",&a,&b);

fun(a,b,&c);

printf("Theresultis:%ld\n",c);

}

32.假定输入的字符串中只包含字母和*号。请编写函数fun(),它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言中提供的字符串函数。

例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是ABCDEFG。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<conio,h>

#include<stdio,h>

voidfun(char*a)

{

}

main()

{

chars[81];

printf("Enterastring:\n");

gets(s);

fun(s);

printf("Thestringafterdeleted:\n");

puts(s);

}

33.请编写一个函数fun(),它的功能是:找出一维数组元素中最大的值和它所在的下标,最大值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。

主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdlib.h>

#include<stdio.h>

voidfun(inta[],intn,int*max,int*d)

{

}

main()

{

inti,x[20],max,index,n=10;

randomize();

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

{

x[i]=rand()%50;

printf("%4d",x[i]);

/*输出一个随机数组*/

}

printf("\n");

fun(x,n,&max,&index);

printf("Max=%5d,Index=%4d\n",max,index);

}

34.请编写函数fun(),该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,若一维数组中的数据是:

2223445666677899101010

删除后,数组中的内容应该是:

2345678910。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include<stdio.h>

#defineN80

intfun(inta[],intn)

{

}

main()

{

inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,

8,9,9,10,10,10,10},i,n=20;

printf("Theoriginaldata:\n");

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

printf("%3d",a[i]);

n=fun(a,n);

printf("\n\nThedataafterdeleted

:\n");

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

printf("%3d",a[i]);

printf("\n\n");

}

四、单选题(0题)35.下列语句组中,正确的是()。

五、单选题(0题)36.有以下程序

include<stdio.h>

main()

{chara[30],b[30];

scanf(“%s”,a);

gets(b);

printf(“%s\n%s\n”,a,b);

}

程序运行时若输入:

howareyou?Iamfine<回车>

则输出结果是A.howareyou?Iamfine

B.howareyou?1amfine

C.howareyou?Iamfine

D.howareyou?

六、单选题(0题)37.有以下程序:

程序运行后的输出结果是()。

A.1,2,6,24,120,B.1,2,3,4,5,C.1,1,1,1,1,D.1,2,4,6,8,

参考答案

1.B解析:本题考查的是程序结构设计中if语句的应用,当if判断条件成立时就执行其后的相关语句,否则不执行,本题中第一个if条件不成立,故不执行“a=b”,接着执行“c=a”,此时第二个if条件也不成立,故不执行其后语句,最终c的值为3。

2.C

3.C

\n题中整型指针变量P存放的是变量C的地址。所以本题答案为C。

\n

4.B

5.B

6.D本题考查逻辑运算符的使用。当“”的两个运算对象都是逻辑l时,表达式返回值才是1;“‖”的两个运算对象至少有一个是逻辑1时,表达式返回值也是l,x<y为1,!z为0,10为1,0‖为1,因此,!l为0。

7.C解析:本题中首先定义一个整型变量a并给它赋初值为3,在表达式中,从右开始执行,即先执行“a-=a*a;”等价于a=a-a*a即a=3-3*3=-6,此时a的值为-6,接着执行“a+=a-;”相当于执行a=a+a即a=-6+(-6)=-12,此时a的值为-12。所以,4个选项中选项C符合题意。

8.A本题考查数组和指针,*k指针是指向rn数组的首地址,所以要使表达武的值为6,只需要指针指向第m[2],所以答案选择A。-

9.D是按位异或运算,其功能是参与运算的两个数,按位异或,如果两个相应位相同,结果为0,否则为1。接位异或运算满足如下规则:①满足交换律;②一个数与0异或的结果仍是原数;③一个数与1异或的结果是原数按位取反。所以题干中,“y^x^y”等价于等价于“y^y^x”,等价于“0^x”,等价于x,即“z1=x”;“x^y^x”等价于“x^x^y”,等价于“0^y”,等价于y,即“z2=y”,输出结果为:3,5。故本题答案为D选项。

10.D本题考查如何引用数组元素的地址。选项A)中,p5引用的是af51的地址,而数组a只有5个元素,即a[0]、a[1]、a[2]、a[3]、a[4],所以引用错误;选项B)中,*a1指的是将数组a的第一个元素加1;选项C)中,这种引用方式错误;选项D)中,&a[0]引用的是数组的首地址。

11.D题干中,函数fun的第2个参数通过指针作为函数返回值,它的功能是通过递归,求得fun(n)的值为fun(n-1)+fun(n-2)。由于当n取值为1和2时,值为1。所以可知整个数列如下:1,1,2,3,5,8,…,即某一项是前两项之和。所以当n取值为6时,fun(6,*s)返回s的值为3+5=8。本题答案为D选项。

12.B解析:结构体类型的定义格式为:

strcut结构体名

{成员说明列表};

结构体变量的定义有3种形式:第一种:定义结构体型的同时定义结构体变量如:strcut结构体名{成员说明列表}变量;第二种先定义一个结构体类型,然后使用该类型来定义结构体变量,如:strcutstudent{成员说明列表):student变量;第三种:定义一个无名称的结构体类型的同时定义结构体变量,如:Strctstudent{成员说明列表}变量。和上面三种情况比较我们不难得知只有选项B是正确的。所以,4个选项中选项B符合题意。

13.structlink*headstructlink*head解析:因为本题中是用结构体变量构成了链表,所以要从链表头节点逐个节点的引用结构体的数据域,需要有个指向结构体变量的指针依次指向各个节点,即p=p->next,而用指针引用结构体成员数据的方法为:p->data。注意:结构体变量和共用体变量之间的区别为联系。

14.structnode*structnode*解析:本题中的结构类型名为structnode,所以空白处应填:structnode*。即定义一个指向自身的结构体指针。

15.6060解析:程序中定义a是一个3行2列的二维数组,p是指向两个元素的一维数组指针,并让p指向二维数组a的首行。则代码*(*(p+2)+1)中的p+2指向二维数组a的第三行a[2],*(p+2)指向a[2[]0],*(p+2)+1指向a[2][1],*(*(p+2)+1)是引用a[2][1],其值是60。

16.2424解析:本题考查函数的循环调用。p=x*func(x-1),当x=4时,不满足if语句的条件,p=4*func(3),x=3也不满足条件,则func(3)=3*func(2),func(2)=2*func(1),x=1满足条件return(1),则输出结果为4*3*2*1=24。

17."bi.dat"fp'bi.dat'\r\nfp解析:打开文件函数fopen的参数是文件名,因此有fopen('bi.dat');而写文件的参数是文件指针,因此有fwrite(&j,sizeof(int),1,fp);

18.'\0''\\0'解析:本题涉及字符数组和指针的两个知识点:①在C语言中,字符型数组在存放字符串时会自动在末尾加上字符串结束标识符'\\0'所以题中数组str有6个元素。②ptr指向数组str的首地址,ptr+5是指向str[5],*(ptr+5)是引用str[5]的值,即'\\0'。

19.冒泡排序冒泡排序解析:交换排序是指借助数据元素之间的互相交换进行排序的一种方法。冒泡排序是一种最简单的交换排序方法,它是通过相邻元素之间的相互交换逐步将线性表变成有序。

20.pcpb或pbpcpcpa或papcpbpa或papbpc,pb或pb,pc\r\npc,pa或pa,pc\r\npb,pa或pa,pb解析:本题主要考查形参为指针变量时,形参和实参间的数据传递。系统为fun2的两个形参开辟了对应的基类为int型的临时指针变量,并通过空格处的实参把地址传递给形参x,y。

21.66解析:本题中i循环执行4次,当i=1时,j循环执行0次;当i=2时,j循环执行1次;当i=3时,j循环执行2次;当i=4时,j循环执行3次,所以输出#号的个数是0+1+2+3=6。

22.5656解析:本题中a,b,c,d是实参,x,y,cp,dp是形参。C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参中元仍保留并维持原值。因此,程序的输出结果是56。

23.voidfun(double*b)或voidfun(doubleb[10][12])voidfun(double*b)或voidfun(doubleb[10][12])解析:本题考查数组名作函数参数。程序中被调用函数fun(s)的实参s是数组名,而s为double型数组名,所以函数fun的形参类型为double*。

24.“filea.dat”“r”“filea.dat”,“r”解析:考查对文件的操作。fopen函数的调用方式通常为fopen(文件名,使用文件方式)。本题中要求程序可以打开filea.dat文件,并且是要读取文件中的内容,所以空白处应当填入'filea.dat','r'。

25.

解析:该程序功能是使数组右上半三角元素中的值乘以m。本题中首先要确定右上角半角元素的特点,然后对元素逐个进行乘以m的操作。其中,右上角的元素是行下标小于等于列下标的元素。

26.

解析:该程序功能是计算并输出当x<0.97时题干中给出的多项式的值。根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行累加求和。

27.voidfun(char(*s)[N]char*b){intijk=0;for(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/for(j=0;j<M;j++)b[k++]=s[j][i];b[k]='\0';}voidfun(char(*s)[N],char*b)\r\n{\r\ninti,j,k=0;\r\nfor(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/\r\nfor(j=0;j<M;j++)\r\nb[k++]=s[j][i];\r\nb[k]='\\0';\r\n}解析:看到程序后,我们很容易便能想到用循环嵌套的方法,本题中按列的顺序依次放到一个字符串中,所以列标变化慢,行标变化快。注意其中第1个循环条件为i<N(即列),第2个循环的条件为J<M(即行),这是因为在循环的嵌套中越在内层,循环变化就越快。另外,在编写程序中注意是s[j][i]而非s[i][j]。

28.floatfun(intmintn){inti;doublep=1.0;for(i=1;i<=m;i++)p=p*i;/*求m!*/for(i=1;i<=n;i++)p=p/i;/*求m!/n!*/for(i=1;i<=m-n;i++)p=p/i;/*求m!/(n!(m-n)!)*/returnp;}floatfun(intm,intn)\r\n{\r\ninti;\r\ndoublep=1.0;\r\nfor(i=1;i<=m;i++)p=p*i;/*求m!*/\r\nfor(i=1;i<=n;i++)p=p/i;/*求m!/n!*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论