计算机二级 C语言部分.docx
《计算机二级 C语言部分.docx》由会员分享,可在线阅读,更多相关《计算机二级 C语言部分.docx(22页珍藏版)》请在冰豆网上搜索。
计算机二级C语言部分
C语言部分(2010秋)
一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)
21.以下关于C源程序的叙述中,正确的是(21)。
A.注释只能出现在程序的开始位置或语句后面
B.一行中不能写多条语句
C.一条语句可以分写在多行中
D.一个源程序只能保存在一个文件中
22.C源程序中的命令#include与#define是在(22)阶段被处理的。
A.预处理B.编译C.连接D.执行
23.以下语句中有语法错误的是(23)。
A.printf("%d",0xAB);B.printf("%f",3.45E2.5);
C.printf("%d",037);D.printf("%c",'\\');
24.已有声明“intx=5,y;floatz=2;”,以下表达式中语法正确的是(24)。
A.y=x%zB.x>0?
y=x:
y=-x
C.y=x/2=zD.y=x=z/2
25.已知字母A的ASCII码是65,字母a的ASCII码是97,变量c中存储了一个大写字母的编码。
若要求将c中大写字母编码转换成对应小写字母编码,则以下表达式中不能实现该功能的是(25)。
A.c=tolower(c)B.c=c+32
C.c=c-'A'+'a'D.c=(c+'A')%26-'a'
26.一元二次方程ax2+bx+c=0有两个相异实根的条件是a≠0且b2-4ac>0,以下选项中能正确表示该条件的C语言表达式是(26)。
A.a!
=0,b*b-4*a*c>0B.a!
=0||b*b-4*a*c>0
C.a&&b*b-4*a*c>0D.!
a&&b*b-4*a*c>0
27.以下关于break和continue语句的叙述中正确的是(27)。
A.break和continue语句都可以出现在switch语句中
B.break和continue语句都可以出现在循环语句的循环体中
C.在循环语句和switch语句之外允许出现break和continue语句
D.执行循环语句中的break或continue语句都将立即终止循环
28.若有一函数定义为“intf(intx,int*y){returnx/*y;}”,声明该函数的正确形式是(28)。
A.voidf(int,int);B.int*f(int,int*);
C.intf(int*,int*)D.intf(int,int*)
29.已知有声明chara[]="program",*p=a+1;”,则执行以下语句不会输出字符a的是(29)。
A.putchar(*p+4);B.putchar(*(p+4));
C.putchar(a[sizeof(a)-3]);D.putchar(*(a+5));
30.已有定义和声明:
structstudent
{intno;
charname[20];
struct{intyear,month,day;}birth;
}s;
若要求将日期“1989年11月12日”保存到变量s的birth成员中,则能实现这一功能的程序段是
(30)。
A.year=1989;month=11;day=12;
B.s.year=1989;s.month=11;s.day=12;
C.birth.year=1989;birth.month=11;birth.day=12
D.s.birth.year=1989;s.birth.month=11;s.birth.day=12;
二、填空题(将答案填写在答题纸的相应题号内,每个答案只占一行,共30分)
基本概念
1.若有声明“doublen;”则数学公式“
n(4n2-1)”对应的C语言表达式的正确形式是
(1)。
2.已知有声明“charch;inta;”执行语句“scanf("%c%d",&ch,&a);”时如果从键盘输入的数据是“123”,则变量a得到的值是
(2)。
3.若有声明“inta=0,b=1,c=2;”,执行语句“if(a>0&&++b>0)c++;elsec--;”后,变量a、b、c的值分别是(3)。
4.若有以下宏定义:
#defineM(a,b)-a/b
则执行语句“printf("%d",M(4+3,2+1));”后输出结果为(4)。
5.声明“FILE*p;”中的类型标识符“FILE”是在头文件(5)中定义的。
阅读程序
6.以下程序运行时输出到屏幕的结果为(6)。
#include
enum{A,B,C,D}x;
voidmain()
{chars[]="your";
for(x=B;x<=D;x++)
putchar(s[x]);
}
7.以下程序运行时输出到屏幕的结果为(7)。
#include
voidmain()
{ints[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i,j;
for(i=0;i<12;i++)
{j=s[i];
c[j]++;
}
for(i=1;i<5;i++)printf("%d",c[i]);
}
8.以下程序运行时输出到屏幕的结果为(8)。
#include
intfun(intx)
{staticintc,y;
if(c==0)y=1;
elsey=y+x;
c++;
returny;
}
voidmain()
{inti;
for(i=0;i<2;i++)
printf("%d",fun
(2));
}
9.以下程序运行时输出到屏幕的结果中第一行为(9),第二行为(10)。
#include
voidfun(int*a,intb)
{while(b>0)
{*a+=b;
b--;
}
}
voidmain()
{intx=0,y=3;
fun(&x,y);
printf("%d\n%d\n",x,y);
}
10.以下程序运行时输出到屏幕的结果为(11)。
#include
intf(intx)
{if(x==0||x==1)return3;
returnx*x-f(x-2);
}
voidmain()
{printf("%d\n",f(3));}
11.以下程序运行时输出到屏幕的结果中第一行为(12),第二行为(13)。
#include
#include
voidcompute(char*s)
{intt,r;
charop;
for(r=0;isdigit(*s);s++)/*isdigit(*s)判断s指向的字符是否为数字字符*/
r=r*10+*s-'0';
while(*s)
{op=*s++;
for(t=0;isdigit(*s);s++)
t=t*10+*s-'0';
switch(op)
{case'+':
r=r+t;break;
case'-':
r=r-t;break;
case'*':
r=r*t;break;
case'/':
if(t)r=r/t;else{puts("devideerror");return;}
}
}
printf("%d\n",r);
}
voidmain()
{compute("12+6-19+2");
compute("12/6*19/2");
}
12.以下程序运行时输出到屏幕的结果中第一行为(14),第二行为(15),第三行为(16)。
算法提示:
将Fibonacci数列(1,1,2,3,5,8,13,…)前6个数填入a数组。
#include
#defineN3
voidmain()
{inti,j,a[N][N]={1},f1=0,f2=1,temp;
for(i=1;ifor(j=0;j<=i;j++)
{if(j<=i)
{a[i][j]=f1+f2;
temp=f1;
f1=f2;
f2=f1+temp;
}
}
for(i=0;i{for(j=0;jprintf("%5d",a[i][j]);
printf("\n");
}
}
13.以下程序运行时输出屏幕的结果中第一行为(17),第二行为(18)。
#include
typedefstruct
{intdm;/*产品代码*/
char*mc;/*产品代码*/
longje;/*金额*/
}PRO;
voidmain()
{inti,j,k,n=3;
PROsell[10]={{101,"apple",100},{301,"orange",100},
{101,"apple",200}},xy;
for(i=0;i{k=i;
for(j=i+1;jif(sell[k].dm&&sell[k].jek=j;
if(k!
=i)
{xy=sell[i];sell[i]=sell[k];sell[k]=xy;}
}
for(i=0;iprintf("%15d%10s%5d\n",sell[i].dm,sell[i].mc,sell[i].je);
}
完善程序
14.以下程序中函数floatfun(intm)的功能是计算s=s1+s2+s3+s4的值,其中s1、s2、s3、s4用下列公式计算。
请完善程序以达到要求的功能。
s1=1+
+
+
+…+
s2=1+
+
+
+…+
s3=1+
+
+
+…+
s4=1+
+
+
+…+
算法提示:
s=1+1+1+1+
+
+
+
+…+
+
+
+
#include
floatfun(intm)
{inti,n;
floats=0,t;
for(n=1;n<=m;n++)
{t=(19);
for(i=1;i<5;i++)
{t=(20);
s+=t;
}
}
returns;
}
main()
{printf("%f",fun(50));}
15.以下程序将同时出现在数组a和b中的数据复制到数组c中。
例如,如果数组a中的数据是{8,5,7,1,6,4,9},数组b中的数据是{2,9,3,7,4,5,10},则数组c中的结果数据为{5,7,4,9}。
以下程序中,in函数判断x中存储的整数是否在a指向的数组前n个元素中出现,如果出现则函数返回1,否则返回0。
请完善程序以达到要求的功能。
#include
intin(inta[],intn,intx)
{inti;
for(i=0;iif((21))return1;
return0;
}
voidmain()
{inta[7]={8,5,7,1,6,4,9},b[7]={2,9,3,7,4,5,10},c[7]={0},i,j=0;
for(i=0;i<7;i++)
if((22))c[j++]=a[i];
for(i=0;(23);i++)
printf("%d\t",c[i]);
}
16.以下程序根据输入的年份及该年中的第几天,计算并输出这一天的“年/月/日”。
例如,若输入“2010,100”则输出“2010/4/10(表示2010年的第100天是4月10日)”。
试完善程序以达到要求的功能。
提示:
能被4整除并且不能被100整除的年份是闰年,能被400整除的年份也是闰年,其他年份是平年。
#include
intleap(intyear)
{inty;
y=year%4==0&&year%100!
=0||year%400==0;
returny;
}
voidmonth_day(intyear,intyearday,int*month,int*day)
{intk,p;
inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
p=leap(year);
for(k=1;yearday>(24);k++)
yearday=yearday-tab[p][k];
*month=k;
*day=(25);
}
voidmain()
{intyear,days,month,day;
printf("Inputyearanddays!
\n");
scanf("%d,%d",&year,&days);
if(leap(year)==1&&days<=366||leap(year)==0&&days<=365)
{month_day(year,days,(26));
printf("\n%d/%d/%d",year,month,day);
}
elseputs("daysiswrong!
");
}
17.本题所列Bind函数的功能是实现两个多项式的合并操作,试完善Bind函数以实现要求的功能。
算法提示:
Bind函数所在的程序采用单向链表存储多项式,多项式的每一项分别存储在链表的一个节点中。
节点的数据结构如下:
typedefstructnode
{inta;/*系数*/
intn;/*指数*/
structnode*next;
}NODE;
函数NODE*Bind(NODE*h1,NODE*h2)的形式参数h1和h2分别是两个按“指数”值降序排列的有序单向链表的头指针(简称这两个链表为h1链表和h2链表),h3是一个新建的按“指数”值降序排列的有序单向链表头指针(简称h3链表)。
Bind函数完成h1链表与h2链表中分别存储的两个多项式的合并操作,合并后的多项式保存到h3链表中,函数返回h3链表头指针的值。
算法提示:
若h1指向节点与h2指向节点的“指数”值相同,则将这两个节点的“系数”值相加并取两节点中任一个节点的“指数”值,结果保存到一个新申请的节点中;如果新节点的“系数”值不为零则将新节点添加到h3链表的尾部,否则放弃新节点;分别修改h1和h2使其指向所在链表的下一个节点。
若h1指向节点与h2指向节点的“指数”值不相同,则将其中“指数”值较大节点的“系数”和“指数”值复制到一个新申请的节点中,将新节点添加到h3链表尾部,修改被复制节点的链表头指针使其指向下一个节点。
重复上述操作直到处理完h1链表和h2链表中全部节点为止。
例如:
h1链表中存储的多项式为:
-2x5+3x4+2x2+3,h2链表中存储的多项式为:
2x5+5x4+4x+7,
保存到h3链表中的多项式为:
8x4+2x2+4x+10。
#include
NODE*Bind(NODE*h1,NODE*h2)
{NODE*h3=NULL,*p1,*p2;
while((27))
{p1=(NODE*)malloc(sizeof(NODE));
if((28)&&h1&&h2)
{p1->a=h1->a+h2->a;
p1->n=h1->n;
if(p1->a==0){free(p1);p1=0;}
h1=h1->next;
h2=h2->next;
}
else
{if(h1->n>h2->n||h1&&h2==0)
{p1->a=h1->a;
p1->n=h1->n;
h1=h1->next;
}
if(h1->nn||h2&&h1==0)
{p1->a=h2->a;
p1->n=h2->n;
h2=h2->next;
}
}
if(p1)
if(h3==NULL)h3=p2=p1;
else
{(29)=p1;
p2=p1;
}
}
if((30))p2->next=NULL;
returnh3;
}
C语言部分(2011春)
一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)
21.以下关于预处理命令的叙述中错误的是(21)。
A.预处理命令由预处理程序解释
B.程序中的预处理命令是以#开始的
C.若在程序的一行中出现多条预处理命令,这些命令都是有效的
D.预处理命令既可以出现在函数定义的外部,也可以出现在函数体内部
22.有如下程序段:
charp1[80]="NanJing",p2[20]="Young",*p3="Olympic";
strcpy(p1,strcat(p2,p3));
printf("%s\n",p1);
执行该程序段后的输出是(22)。
A.NanJingYoungOlympicB.YoungOlympic
C.OlympicD.NanJing
23.已知有声明"intx[2][3]={0},*p=x[0];",以下表达式中有语法错误的是(23)。
A.x[0]=1B.p[0]=1C.*p=1D.x[0][0]=1
24.程序中已有预处理命令"#include"和声明"charx=4,y,*z",以下表达式中能通过编译且无警告信息的是(24)。
A.y=sqrt(x)%2B.y="x"C.y='x'+1D.y=&'x'
25.已知有定义和声明:
struct
{intx;}a[4]={{1},{1},{4},{6}},b;
以下语句中语法正确的是(25)。
A.if(a[0]==a[1])b=a[0];B.if(a[0].x==a[1].x)b=a[0];
C.if(a[0]->x==a[1]->x)b=a[0];D.if(!
(a[0]-a[1]))b=a[0];
26.已知有声明"intx,a=3,b=2;",则执行赋值语句"x=a>b++?
a++:
b++;"后,变量x、a、b的值分别为(26)。
A.343B.334C.333D.434
27.下列符号中可用作变量名的是(27)。
A.CaseB.a-bC.$cdD.2ab
28.执行以下程序后的结果是(28)。
#include
voidmain()
{intx=3;
do
{printf("%d\t",x=x-3);
}while(!
x);
}
A.输出一个数:
0B.输出一个数:
3
C.输出2个数:
0和-3D.无限循环,反复输出数
29.以下关于C语言函数的叙述中,正确的是(29)。
A.在一个函数体中可以定义另一个函数,也可以调用其他函数
B.在一个函数体中可以调用另一个函数,但不能定义其他函数
C.在一个函数体中不可调用另一个函数,也不能定义其他函数
D.在一个函数体中可以定义另一个函数,但不能调用其他函数
30.设有声明"inta=4,b=3,c=5;",以下4个程序段中有3个程序段的执行效果是相同的,另一个执行效果不同的是(30)。
A.if(a>b)c=a,a=b,b=c;B.if(a>b){c=a,a=b,b=c;}
C.if(a>b)c=a;a=b;b=c;D.if(a>b){c=a;a=b;b=c;}
二、填空题(将答案填写在答题纸的相应题号内,每个答案只占一行,共30分)
基本概念
1.除goto语句外,在循环结构中执行
(1)语句可提前结束本次循环直接进入下一次循环。
2.若有程序段"inta[10],*p=a,*q;q=&a[5];",则表达式q-p的值是
(2)。
3.执行语句序列"inta,b;a=b=4;a+=b%3;"后,变量a、b的值分别是(3)。
4.执行程序段"intx=0x6c;printf("x=%x\n",x);"后的输出结果为(4)。
5.使用TURBO系统编译C语言源程序后生成的文件名后缀是(5)。
阅读程序
6.以下程序运行时输出到屏幕的结果是(6)。
#include
#defineL10
#defineCL+L
voidmain()
{intArea;
Area=C*L;
printf("%d\n",Area);
}
7.以下程序运行时输出到屏幕的结果是(7)。
#include
enum{A,B,C=4}i;
voidmain()
{intk=0;
for(i=B;iprintf("%d",k);
}
8.以下程序运行时输出到屏幕的结果是(8)。
#include
voidfun(inta)
{printf("%d",a%10);
if(((a=a/10)!
=0))fun(a);
}
voidmain()
{inta=-13;
if(a<0)
{printf("-");
a=-a;
}
fun(a);
}
9.以下程序运行时若输入“201010”,则输出到屏幕的结果中第一行是(9),第三行是
(10)。
#include
char*fun(intn)
{staticchars[20];
staticintc;
chart[10]={0},i=0,j,k;
while(n>0)
t[i++]=n%10+'0',n=n/10;
puts(t);
for(j=0;j
k=t[j],t[j]=t[i-1-j],t[i-1-j]=k;
strcat(s,t);
if(c<1){strcat(s,"/");c++;}
elsestrcat(s,"\0");
returns;
}
voidmain()
{inti,m;char*p;
for(i=0;i<2;i++)
{scanf("%d",&m);
p=fun(m);
}
puts(p);
}
10.以下程序运行时输出到屏幕的结果中第一行是(11),第二行是(1