历届C语言上海市等级试题及参考答案Word格式.docx
《历届C语言上海市等级试题及参考答案Word格式.docx》由会员分享,可在线阅读,更多相关《历届C语言上海市等级试题及参考答案Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
![历届C语言上海市等级试题及参考答案Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/10/e2b67c4e-969f-4c53-a0e0-9b6d1a701c76/e2b67c4e-969f-4c53-a0e0-9b6d1a701c761.gif)
));
(5)执行下列程序后的输出结果是什么?
#defineSQR(x)x*x
voidmain()
{
ints=8,a=2,b=3;
s=SQR(a+b)*4;
printf(“s=%d\n”,s);
}
(6)设有定义structdate{
intday;
charmonth;
intyear;
}dd,*pd=&
dd;
试写出引用结构变量dd的成员dd.day的其他两种描述形式。
(7)设有如下程序段:
inta[4]={0,4,5,13},*p;
p=&
a[2];
++(*p)=%d\n"
++(*p));
printf("
*--p=%d\n"
*--p);
*p++=%d\n"
*p++);
%d\n"
a[0]);
试写出执行该程序段后的输出结果。
试题二(12分,每小题6分)
阅读下列程序,把程序的输出结果写在答卷纸的对应栏内。
(1)
【程序2.1】
#include<
stdio.h>
{
intk[]={65,30,3,123,831,54};
intj,m1=32767,m2=0,n1,n2;
for(j=0;
j<
6;
j++)
if(m1>
k[j])
{m1=k[j];
n1=j;
}
elseif(m2<
{m2=k[j];
n2=j;
}
m1=%d,n1=%d\n"
m1,n1);
m2=%d,n2=%d\n"
m2,n2);
(2)
【程序2.2】
voidfunc(int*x,inty)
statick=3;
y=*x+y;
*x=y%k;
k++;
*x=%d,y=%d\n"
*x,y);
voidmain()
intx=12,y=5;
func(&
x,y);
x1=%d,y1=%d\n"
x,y);
y,x);
x2=%d,y2=%d\n"
试题三(12分,每小题6分)
下列程序中都有三个错误,按题中的计算要求,纠正错误,并以“将#XX”行改为“YYYY”的形式进行解答,把解答写在答卷纸的对应栏内。
代码左边的#1、#2、…是附加的行号。
(1)用冒泡排序法求出由21个整数组成的数组的中间值,并输出所有大于中间值的偶数。
【程序3.1】
#0#include<
#1voidmain()
#2{
#3inti,j,temp;
#4intarray[21];
#5for(i=0;
i<
21;
i++)scanf("
%d"
array[i]);
#6for(i=0;
i++)
#7for(j=0;
j<
20;
j++)
#8if(array[j]>
array[j+1])
#9{
#10temp=array[j];
#11array[j]=array[j+1];
#12array[j+1]=temp;
#13}
#14printf("
array[10]);
#15for(i=0;
10;
#16if(array[i]/2==0)printf("
%d"
array[i]);
#17}
(2)用下面的方法可以计算y年m月d日是星期几(w):
w=[y-1+(y-1)/4–(y-1)/100+(y-1)/400+y_d(y,m,d)]%7
其中,符号/表示计算整数商,%表示计算余数,y_d(y,m,d)表示y年m月d日是从同年元旦算起到该日的总天数。
【程序3.2】
#1intday_tab[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
#2inty_d(inty,intm,intd){
#3inti,all;
#4y=y%4==0&
y%100||y%400==0;
#5for(i=0;
i<
=m;
i++)all+=day_tab[i];
/*统计某月份(m月)之前的天数*/
#6all+=y;
/*对闰年考虑2月份是29天*/
#7returnall+d;
#8}
#9voidmain(){
#10inty=2005,m=7,d=11,w;
#11w=y-1+(y-1)/4–(y-1)/100+(y-1)/400+y_d(y,m,d);
#12w%=7;
#13printf("
%d年%d月%d日是星期%d\n"
,y,m,d,w);
#14}
试题四(18分,每小题9分)
按指定的要求编写程序段,把解答写在答卷纸的对应栏内。
(1)输入无符号整型范围内的整数,求出它的位数以及各位数字之和。
(2)将长度为n的字符串s分成两个子串,前m(任意值)个字符生成子串s1,后n-m个字符生成子串s2。
约定:
当m≥n时,s1等于原串,s2为空串;
当m≤0时,s1为空串,s2等于原串。
编写程序段时,可以使用库函数strcpy。
试题五(15分,每个空格3分)
阅读下列问题描述和相应的程序,把应填入其中(n)处的内容写在答卷纸的对应栏内。
【问题描述】
本程序运行时,从键盘不断接收用户输入的字符串并进行处理,直到用户输入的字符串为“end”时终止。
对用户输入的每个字符串的处理是:
将字符串内的每一个十进制数字字符置换成下列表格中右边所对应的一个字符串(所有其他字符不变),然后将转换的结果显示在屏幕上;
并分别计算每个数字的置换次数。
十进制数字字符
置换成
(Zero)
1
(One)
2
(Two)
3
(Three)
4
(Four)
5
(Five)
6
(Six)
7
(Seven)
8
(Eight)
9
(Nine)
例如,若用户输入的字符串为
Page112-Line3,
则程序5的输出是:
Page(One)(One)(Two)-Line(Three)
数字0到9的置换次数分别是0211000000
【程序5】
{char*table[]={"
(Zero)"
"
(One)"
(Two)"
(Three)"
(Four)"
"
(Five)"
(Six)"
(Seven)"
(Eight)"
(Nine)"
};
charstr1[64],str2[255],*p;
intj,k,n,no[10];
for(;
;
){
Input:
"
);
gets(
(1));
/*读入字符串*/
for(k=0;
k<
k++)no[k]=0;
if(strcmp(str1,"
end"
)==0)
(2)_;
/*输入end时程序运行终止*/
for(j=k=0;
str1[j]!
='
\0'
++j)/*对输入字符串进行扫描*/
{
if((3))/*当前字符不是数字字符*/
{str2[k++]=str1[j];
continue;
/*当前字符是数字字符*/
n=str1[j]-'
0'
no[n]++;
for(p=table[n];
*p!
++p)
str2[k++]=(4);
/*把要置换的字符串逐个连接到str2上*/
str2[k]=(5);
/*置字符串结束符于str2末尾*/
%s\n"
str2);
for(k=0;
k++)printf("
no[%d]=%d\t"
k,no[k]);
试题六(15分,每个空格3分)
阅读下列问题描述和相应的C程序,把应填入其中(n)处的内容写在答卷纸的对应栏内。
【问题描述】
建立一个带有头结点的单向链表,并将存储在字符串s中的字符依次转存到链表的各个结点中。
然后,按相反顺序输出链表内容。
【程序6】
stdlib.h>
structnode{
chardata;
structnode*next;
};
(1)create_list(char*s){/*函数定义首部,确定函数值的返回类型*/
structnode*head,*p,*q;
head=(structnode*)malloc(sizeof(structnode));
p=q=head;
while(*s!
)
{p=(structnode*)malloc(sizeof(structnode));
p->
data=
(2);
/*字符串中的字符存到链表中*/
q->
next=p;
q=(3);
/*工作指针q相应后移,为下一个字符转存作准备*/
s++;
next=NULL;
return(4);
/*返回所建立的链表*/
voidpr_in_reverse_order(structnode*p)/*采用递归算法定义*/
{
if(p!
=NULL)
{pr_in_reverse_order(p->
next);
/*先按相反顺序输出除去第一个节点后的链表内容*/
printf("
%2c"
(5));
/*输出第一个节点内容*/
charstr[]="
linklist"
structnode*head;
head=create_list(str);
pr_in_reverse_order(head->