2021年山东省济南市全国计算机等级考试C语言程序设计预测试题(含答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2021年山东省济南市全国计算机等级考试C语言程序设计预测试题(含答案) 学校:________ 班级:________ 姓名:________ 考号:________
一、单选题(12题)
1. 拥有PC机并以拨号方式接入网络的用户需要配置( )
A.CD-ROM
B.Modem
C.电话机
D.鼠标
2.算术运算符和圆括号有不同的运算优先级,对于表达式“a+ b+c* (d+e)”,关于执行顺序,以下说法正确的是()。
A.先执行“(d+e)”得r2,再执行“c*r2”得r3,再执行“a+b”得r1,最后执行“r1 +r3”得表达式最后结果
B.先执行“a+b”得r1,再执行“(d+e)”得r2,再执行“c*r2”得r3,最后执行“r1 +r3”得表达式最后结果
C.先执行“(d+e)”得r2,再执行“c*r2”得r3,再执行“b+r3”得r4,最后执行“a+r4”得表达式最后结果
D.先执行“a+b”得r1,再执行“r1+c”得r5,再执行“(d+e)”得r2,最后执行“r5 *r2”得表达式最后结果
3.以下选项中,能表示逻辑值“假”的是()
A.1
B.0.000001
C.0
D.100.0
4.堆的形状是一棵_______。
A.二叉排序树
B.满二叉树
C.完全二叉树
D.平衡二叉树
5. 设q1和q2是指向一个float型一维数组的指针变量,k为float型变量,则不能正确执行的语句是( )。
A.k=*q1+*q2;
B.q1=k;
C.q1=q2;
D.k=*q1*(*q2);
6. 请选出正确的程序段
A.int*p; scanf("%d",p);…
B.int*s,k;*s=100;…
C.int *s,k;char*p,c;s=&k;p=&c;*p='a';…
D.int *s,k;char *p,e;s=&k;p=&c;s=p;*s=1;…
7.有以下程序:
程序运行后的输出结果是()。
A.34
B.55
C.10
D.18
8.设x为int型变量,则执行以下语句后,x的值为( )。
x=10;x=x-=x-
x;
A.10
B.20
C.40
D.30
9.若有定义:int*p[3];,则以下叙述中正确的是()。
A.定义了一个基类型为int的指针变量p,该变量具有三个指针
B.定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C.定义了一个名为*p的整型数组,该数组含有三个int类型元素
D.定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
10.
11.若有以下程序
则程序的输出结果是
A.China!
B.to China!
C.me you to China!
D.you to China!
12.以下程序的主函数中调用了在其面前定义的fun函数
#include<stdio.h>
.
.
.
main()
{double a[15],k;
k=fun(a);
.
.
.
}
则以下选项中错误的fun函数首部是()。
、A.double fun(double a[l5])
B.double fun(double *a)
C.double fun(double a[])
D.double fun(double a)
二、2.填空题(12题)
13. 下列程序的运行结果是______。
main()
{ int i,a[10];
a[0]=a[1]=1;
for(i=2;i<5;i++)
a[i]=a[i-2]+a[i-1];
for(i=0;i<5;i++)
{ if(i%2==0) printf("\n");
printf("%d",a[i]);
}
}
14. 阅读程序:
main( )
{ char strl[]="how do you do",str2[10];
char * p1=strl,* p2=str2;
scanf("%s”,p2);
printf("%s”,p2);
printf("%s\n",p1);
}
运行上面的程序,输入字符串HOW DO YOU DO 则程序的输出结果是【】。
15. 以下函数rotate的功能是:将a所指N行N列的二维数组中的最后一行放到b所指二维数组的第0列中,把a所指二维数组中的第0行放到b所指二维数组的最后一列中,b所指二维数组中其他数据不变。
#define N 4
void rotade(int a[][N],int b[][N])
{ int I,j;
for(I=0;I<N;I++)
{ b[I][N-1]=【】;【】=a[N-1][I]; } }
16. 输出指针数组各元素所指的整数值和它存放的地址值。
#include <stdio.h>
main()
{ int i;
int a[5]={1,3,5,7,9};
int*num[5];
int【】;
for(i=0;i<5;i++)
num[i]=【】;
p=num+0;
for(i=0;i<5;i++)
{ printf("%d %d\n",【】);
p++;
}
}
17. 一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体"项目主管"与实体"项目"的联系属于【】的联系。
18. 下面程序的运行结果是( )。
#define POW(r)r*r main() {int x=2,y=3,t;t=POW(x+y);printf("%d\n",t);}
19. 软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。
编码和测试属于【】阶段。
20. 以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。
struct st
{ char name[20];double score;};
main()
{ struct st ex;
printf("ex size:%d\n",sizeof(【】));}
21. 在树形结构中,树根结点没有______。
22. 以下程序运行后的输出结果是【】。
#include <stdio.h>
#define S(x) 4 * x * x + 1
main( )
{ int i=6,j=8;
prinff("% d \ n" , S( i + j) );
}
23. 函数compare的功能是比较两个字符串是否相等,若相等则函数返回1,否则返回o,请填空。
compare(char s[],char t[])
{
int i=0
while(s[i]==t[i]&&【】)i++;
return(【】?1:0);
}
24. 以下程序的功能是从键盘输入若干学生的成绩,并输出最高成绩和最低成绩,当输入负数时结束。
请填空。
#include <stdio.h>
main()
{ float x,amax,amin;
scanf("%f",&x);
amax=x;amin=x;
while(【】)
{ if(x>amax)amax=x;
else
if(【】) amin=x;
scanf("%f",&x);
}
printf("\n amax=%f\n amin=%f\n",amax,amin);
}
三、3.程序设计题(10题)
25. 函数fun的功能是:将s所指字符串中除了下标为奇数、同时ASCII 值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为:“ABCDEFGl2345”,其中字符A的ASCII码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII码值为奇数,所在数组中的下标也为奇数,因此不应当删除,其他依此类推。
最后t所指的数组中的内容应是:“135”。
注意:部分源程序存在文件PROGl.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
26. 请编写函数fun(),它的功能是:求出1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数并将它们放在9所指的数组中,通过n返回这些数的个数。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括
号中填入所编写的若干语句。
试题程序:
#include <conio.h>
#include <stdio.h>
void fun(int *a,int *n)
{
}
main( )
{
int aa[1000],n,k;
clrscr();
fun(aa,an);
for(k=0;k<n;k++)
if((k+1)%10==0)
{
printf("%5d",aa[k]);
printf("\n");/*—行写10个数*/
}
else
printf("%5d",aa[k]);
}
27. 编写程序,实现矩阵(3行3列)的转置(即行列互换)。
例如,若输入下面的矩阵:
100 200 300
400 500 600
700 800 900
则程序输出:
100 400 700
200 500 800
300 600 900
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include <stdio.h>
#include <conio.h>
int fun (int array[3][3])
{
}
main()
{
int i,j;
int array [3][3]={{100,200,300},{400,
500,600},{700,800,900}};
clrscr();
for (i-0;i<3;i++)
{for (j=0;j<3;j++)
printf("%7d ",array[i] [j]);
printf("\n ");
}
fun(array);
printf("Converted array:\n ");
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
}
28. 编写函数fun,其功能是:根据以下公式求P的值,结果由函数值
带回。
m与n为两个正整数且要求m>n。
例如:m=12,n=8时,运行结果为495.000000。
注意:部分源程序在文件PROGl.C文件中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
29. 请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。
例如,给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、11.0,输出应为:s=35.951014。
注意:部分源程序在文件PROGl.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
30. 请编写函数fun(),它的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(含p,p<n-1)的数组元素平移到数组的最后。
例如:一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。
移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。
部分源程序在文件PROG1.C中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include<stdiO.h>
#define N 80
void fun(int *w,int p,int n)
{
}
main()
{in[ a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};int i,p,n=15;
printf("The odginal data:\n");
for(i=0;i<n;i++)printf("%3d",a[i]);
printf("\nEnter p:");
scanf("%d",&p);
fun(a,p,n);
printf ("\n The data after moving:\n");
for(i=0;i<n;i++)printf("%3d”,a[i]);
}
31. 请编写函数fun,其功能是:计算并输出给定10个数的方差:
例如,给定的10个数为95.0、89.0、76.0、65.0、88.0、72.0、85.0、81.0、90.0、56.0,输出为s=11.730729。
注意:部分源程序在文件PROGl.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
32. 请编写函数fun,其功能是:计算并输出下列多项式的值:
例如,在主函数中从键盘给n输入15,则输出为:s=2.718282。
注意:要求n的值大于1但不大于100。
部分源程序在文件PROGl.C
中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
33. 函数fun的功能是:将s所指字符串中除了下标为偶数、同时ASCII 值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一含新串放在t所指的数组中。
例如,若s所指字符串中的内容为:“ABCDEFGl23456”,其中字符A的ASCII码值为奇数,因此应当删除:其中字符B的ASCII码值为偶数,
但在数组中的下标为奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶数,因此不应当删除,其他依此类推。
最后t所指的数组中的内容应是:“246”。
注意:部分源程序存在文件PROGl.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
34. 请编写函数fun( ),其功能是:将所有大于1小于整数m的素数存入xx所指数组中,素数的个数通过k传回。
例如,输入25,则应输出2 3 5 71113 17 19 23。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include<conio.h>
#include<stdio.h>
void fun(int m,int *k,int xx[ ])
{
}
main( )
{
int m,n,zz[100];
clrscr( );
printf("/nPlease enter an integer number between 10 and 100:");
scanf("%d",&n);
fun(n,&m,zz);
printf("\n\nThere are%d prime numbers
less than %d:",m,n);
for(n=0;n<m;n++)
printf("\n %4d",zz[n]);
}
四、单选题(0题)
35.以下叙述中正确的是()。
A.C语言编译系统对标识符的长度没有规定
B.C语言标识符的规定长度因系统而异
C.C语言规定标识符长度最多允许16个字符,超长报错
D.C语言规定以下划线开头的标识符长度必须大于1
五、单选题(0题)
36.一个顺序栈一旦声明,其占用空间的大小()。
A.已固定
B.可以变动
C.不能固定
D.动态变化
六、单选题(0题)
37. 以下程序的输出结果是______。
main() { int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};
printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1];a[3][0]); }
A.650
B.1470
C.5430
D.输出值不定
参考答案
1.B
2.B题干表达式中,圆括号的优先级最高,乘法运算符次之,加法运算符最低。
同优先级中,加法运算符的结合性从左向右结合,所以题干中的表达式执行顺序是:先执行“a+b”得r1,再执行“(d+e)” 得r2,再执行“c*r2”得r3,最后执行“r1+r3”得表达式最后结果。
故本题答案为B选项。
3.C\n本题考查逻辑值假,在程序中非0字符表示逻辑真,0表示逻辑假,所以答案选择C。
\n
4.C
5.B解析:选项A)是将指针q1和q2所指向的变量值相加,然后赋给k;选项B)中,float型数据和指针型数据之间不能进行赋值运算:选项C)中,是两个指针变量之间的赋值:选项D)中,是两个指针型变量所指向的两个float型数据相乘。
6.C解析:本题的选项A)和B)犯了同样的错误,即指针变量在定义后并没有指向具体的变量。
也就是说,指针变量中没有确定的地址值,它的值是不可预见的,所指的单元也是不可预见的,因此不能进行赋值操作。
另外,在选项D)中,s是int型指针变量,p是char型指针变量,所指向的内存单元所占用的字节数是不同的,因而不能将字符指针变量p的值赋给整型指针变量s。
7.D
题干中,函数fun的功能是通过递归,将数组a中下标为0~n-1位置的元素累加,作为函数返回值返回。
main函数调用fun时,传入的a+2作为数组参数,传入n的值是4,所以函数返回值是元素a[2]、a[3]、a[4]、a[5]的和,程序输出18。
本题答案为D选项。
8.A
执行x=x-=x-x语句可写成x=x- (x-x),可看出结果为10,故八选项正确。
9.B解析:当一个数组中的元素均为指针类型数据时,该数组就称为指针数组。
int *p[3]表示此数组是指针类型的,每个数组元素(指针变量)都是指向一个整型的指针变量。
10.B
11.D
该程序首先定义*a和b[],并进行初始化。
主函数中通过外层for循环语句,遍历字符数组b[],并且将符合if条件语句的字符赋给数组p;for内层循环语句,遍历字符数组a[]。
再将符合if条件语句的结果输出。
因此D选项正确。
12.A
由题可知fun的参数为变量,而a[15]为常量,所以答案为A。
13.1 1<CR>2 3<CR>5(<CR代表换行)1 1<CR>2 3<CR>5(<CR,代表换行) 解析:本题通过语句“for(i=2;i<5;i++)a[i]=a[i-2]+a[i-];”将数组中前面两项的和赋值给数组当前元素,得到a的值应为(1,1,2,3,5)。
语句if(i%2==0)pfintf('\\n')是要将数组中的元素以每行2个的形式输出。
14.HOW how do you do
15.a[0][I] b[I][0]a[0][I] , b[I][0] 解析:b[i][N-1]= a[0][i]实现把a所指二维数组中的第0行放到b所指二维数组的最后一列中,\ue008b[I][0]=a[N-1][I] 实现将a所指N行N列的二维数组中的最后一行放到b所指二维数组中的第0列。
16.**p a+I **p*p
17.一对多(或1∶N)一对多(或1∶N) 解析:两个实体集间的联系实际上是实体集间的函数关系,这种函数关系可以有3种,即一对一(1∶1)的联系、一对多(1∶N)或多对一(N∶1)的联系和多对多(N∶N)的联系。
18.11
19.开发开发解析:软件生命周期(SDLC,软件生存周期)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系
统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,其中的编码和测试属于开发阶段。
20.struct st或exstruct st或ex 解析:结构体类型数据,其数据成员各自占据不同的存储空间,整个结构体变量所占存储单元的字节数为每一个数据成员所占的存储空间的和。
注意:共用体变量所占存储单元字节数的计算。
21.前件前件
22.8181 解析:带参数的宏定义是按#define命令行中指定的字符串从左到右进行替换。
本题替换后得到:4*i+j*i+j+1,代入i,j的值得81。
23.s[i]&&t[i]或s[i]!='\0'&&t[i]!='\0' !(s[i]-t[i])s[i]&&t[i]或s[i]!='\\0'&&t[i]!='\\0'\r\n!(s[i]-t[i]) 解析:while后括号中的判断条件为两个字符串相同位置上的字符相等,且两个字符串都没有结束,则循环。
故第一空应该填s[i]&&t[i]或其他等价表达式。
如果两个字符串完全相等,则while循环退出时s[i]和t[i]的值同时为0,否则s[i]和t[i]不相等。
故表达式s[i]-t[i]在字符串相等时为0,不相等时为非0,所以第二空应该填!(s[i]-t[i])就满足题意了。
24.x>=0 x<aminx>=0 x<amin 解析:本题先从键盘接受数值,并分别赋给amax(用于保存最高成绩)和amin(用于保存最低成绩),然后通过while循环控制是否结束输入,并且通过if语句来给amax和amin赋值。
25.解析:该程序功能是将字符串中除了下标为奇数、ASCII值也为奇数的字符外,其余的全都删
除。
解题过程利用if判断表达式选择符合条件的字符,然后将符合条件的字符放入指定的字符串。
26.void fun(int*aint*n) { int i.j=0;for(i=1;i<=1000;i++) /*求1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数并放入数组a中*/ if((i%5==0||i%13==0)&&i%65!=0) a[j++]=i;*n=j; /*传回满足条件的数的个数*/ }void fun(int*a,int\u3000*n) \r\n {\r\n int i.j=0;\r\n for(i=1;i<=1000;i++) /*求1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数,并放入数组a中*/\r\n if((i%5==0||i%13==0)&&i%65!=0)\r\n a[j++]=i;\r\n *n=j; /*传回满足条件的数的个数*/\r\n } 解析:注意本题题目是找出能被5或13整除但不能同时被5和13整除的所有整数。
能同时被5和13整除的整数一定能被65整除,且不能被65整除的数不一定就是能被5或13整除的数。
所以可得出程序中的if()。
按运算优先级可知(i%5==0||i%13==0),注意,两边必须要有小括号。
27.int fun (int array[3][3]) { int ijt; for(i=0;i<3;i++) /*将右上三角和左下三角对换实现行列互换*/ for(j=i+1;j<3;j++) {t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } }int fun (int array[3][3])\r\n {\r\n int i,j,t;\r\n for(i=0;i<3;i++) /*将右上三角和左下三角对换,实现行列互换*/\r\n for(j=i+1;j<3;j++)\r\n {t=array[i][j];\r\n array[i][j]=array[j][i];\r\n array[j][i]=t;\r\n }\r\n } 解析:注意对矩阵转置后仍然存回其本身时,只能循环矩阵中的一个角(本程序是右上半三角)。
控制右上半三角的方法是在第2个循环中j从i+1或i开始,左下半三角的方法是在第2个循环中写成for(j=0;j<i;j++),若要控制所有元素在第2个循环要写成
for(j=0;j<3;j++)。
28.
解析:(1)该程序功能是对组合数公式求值。
它的解题思路,可以分解为以下几步:求m!→求n!→求(m-n)!→求组合数的值。
(2)从已给部分源程序的main主函数开始入手,主函数中的
“printf(“P=%f\n”,fun(12,8));”语句中“fun(12,8)”将12、8传递给fun 中的m与n,fun函数实现对组合数的求佰。
29.解析:该程序功能是计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。
在循环中,首先确定相邻元素之间的关系,然后对其进行平均值平方根之和的操作。
30.void fun(int*wint pint n) {int iJ;int a[N];for(i=0;i<=p;i++)a[i]=w[i] for(i=p+1j=0;i<n;i++j++)w[j]=w[i];for(i=0;i<=p;i++)w[n-p-
1+i]=a[i];}void fun(int*w,int p,int n) \r\n {int i,J;\r\n int a[N];\r\n for(i=0;i<=p;i++)a[i]=w[i]\r\n for(i=p+1,j=0;i<n;i++,j++)w[j]=w[i];\r\n for(i=0;i<=p;i++)w[n-p-1+i]=a[i];\r\n } 解析:将数组后面的元素向前平移,肯定会将前面的元素覆盖。
因此,可以定义一个数组用来暂时存放前面的元素。
可以先将w[0]~w[p]依次赋给a[0]~a[p];然后将w[p]~w[n—1)
移到数组的前面:再将a[0]~a[p)依次赋给w[n-p-1+i]~w[n—1]。
31.解析:该程序功能是计算并输出给定10个数的方差。
解题思路是,根据题干中给出的方差公式首先计算出x’的值,然后计算根号里面的值,最后求其平方根。
32.解析:该程序功能是计算并输出多项式的值。
该题的解题思路是。
根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行累加求和。
33.
解析:该程序功能是将字符串中除了下标为偶数、ASCII值也为偶数的字符外,其余的全都删除。
解题过程利用if条件判断表达式选择符合条件的字符,然后将符合条件的字符放入指定的字符串。
34.void fun(int mint *kint XX[]) { int ijtn=0;for(i=2;i<m;i++) /*找出大于1小于整数m的素数*/ { t=l;for(j=2;j<i;j++) if(i%j==0) { t=0;break;} if(t==1) xx[n++]=i;} *k=n;/*返回素数的个数*/ }void fun(int m,int *k,int XX[])\r\n {\r\n int i,j,t,n=0;\r\n for(i=2;i<m;i++) /*找出大于1小于整数m的素数*/\r\n { \r\n t=l;\r\n for(j=2;j<i;j++) \r\n if(i%j==0)\r\n {\r\n t=0;\r\n break;\r\n } \r\n if(t==1)\r\n xx[n++]=i;\r\n }\r\n *k=n;/*返回素数的个数*/\r\n } 解析:这道题是考查一个数是不是素数,只要掌握了判断素数的方法,问题便能顺利解决,请以此题为例,掌握判断素数的方法。
35.B对于标识符的长度(即一个标识符允许的字符个数),C语言编译系统是有规定的,即标识符的前若干个字符有效,超过的字符将不被识别。
不同的C语言编译系统所规定的标识符有效长度是不同的。
故本题答案为B选项。
36.A
37.A解析:对未给出初始值的整数数组元素,被默认初始化为零。