江苏省计算机等级考试二级C语言考点分析XWord文档格式.docx
《江苏省计算机等级考试二级C语言考点分析XWord文档格式.docx》由会员分享,可在线阅读,更多相关《江苏省计算机等级考试二级C语言考点分析XWord文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
printf(“\nx=%d”,x);
程序运行时输出的第一行是_________,第二行是________,最后一行是________。
答案:
1,14,1x=10
(3)2001年春填空第4题
以下程序输出结果是________
{printf(“%d”,fun(5));
fun(intn)
{if(n==1)return1;
returnn-fun(n-1);
3
(4)2001年春填空第12题
以下程序实现将a数组中后8个元素从大到小排序的功能
voidsort(int*x,intn)
{inta[12]={5,3,7,4,2,9,8,32,54,21,6,43},k;
sort(______,8);
for(k=0;
k<
12;
k++)printf(“%d”,a[k]);
{intj,t;
if(n==1)return;
for(j=1;
j<
n;
j++)
if(_______)
{t=x[0];
x[0]=x[j];
x[j]=t;
sort(x+1,________);
本题结合了冒泡排序法,第一个空填:
a+4;
第二个空填:
x[0]<
x[j];
第三个空填:
n-1
(5)2001年春填空第8题
以下程序运行时第一行输出________,第二行输出________。
voidrev(int*p,intn)
{intt;
if(n>
1)
{t=p[0];
[0]=p[n-1];
p[n-1]=t;
rev(p+1,n-2);
{intj,a[5]={1,2,3,4,5};
rev(a+1,4);
for(j=0;
5;
j++)printf(“%d”,a[j]);
printf(“\n”;
rev(a,3);
输出结果:
1543245132
(6)2002年秋填空题第11题(P7-11)
{inta[3][3],i,j;
numlist(&
a[0][0],9);
for(i=0;
i<
3;
i++)
{for(j=0;
j++)printf(“%d,”,a[i][j]);
printf(“\n”);
numlist(int*p,intn)
{inti;
i++)p[i]=num(i);
num(intn);
{if(n==0)return1;
returnnum(n-1)*2+1;
程序运行时输出的第一行是:
1,3,7
(7)2003年春填空题第11题(P17-11)
longfunc(longx)
{if(x<
100)returnx%10;
elsereturnfunc(x/100)*10+x%10;
{printf(“Theresultis:
%ld\n”,func(132645));
程序运行结果是Theresultis:
365
(8)2003年秋填空题第11题(P26-11)
voidfun(int*p1,int*p2);
{inti,a[6]={1,2,3,4,5,6};
fun(a,a+5);
i++)printf(“%2d”,a[i]);
voidfun(int*p1,int*p2)
if(p1<
p2)
{t=*p1;
p1=*p2;
*p2=t;
fun(p1+=2,p2-=2);
}
程序运行结果是624351
(9)2004年春(P37-11)
voidf(inta[],intn,intx,int*c);
{inta[10]={1,3,5,2,3,5,3,7,4,1},t=0;
f(a,10,5,&
t);
printf(“%d”,t);
voidf(inta[],intn,intx,int*c)
{if(n==0)return;
if(a[0]>
=x)(*c)++;
f(a+1,n-1,x,c);
程序运行结果是3
(10)2004年秋(P52-14)
本例结合了二分法求方程的根。
见“方程求根”
(11)P68-14
本例结合了牛顿迭代法求方程的根。
三、二维数组
(1)2004年秋填空第12题(P51-12)
以下程序运行时输出结果的第一行是________,第二行是______,第三行是________。
#defineN3
{inti,j,k=1,a[N][N]={0};
i<
N/2+1;
{for(j=0;
=i;
j++)a[j][i-j]=k++;
for(;
2*N;
{for(j=i+1-N;
=N-1;
N;
j++)printf(“%4d”,a[i][j]);
124357689
(2)2005年春填空第12题(P66-12)
以下程序运行时输出结果的第二行为______,第四行为______,第六行_______。
voidchange(ints[3][3],intd)
{inti,j,k;
if(d==0)
{for(i=0;
for(j=i+1;
j<
j++){k=s[i][j];
s[i][j]=s[j][i];
s[j][i]=k;
3-i;
s[i][j]=s[2-j][2-i];
s[2-j][2-i]=k;
{ints[3][3]={1,2,3,4,5,6,7,8,9},i,j,k,n;
change(s,0);
{for(j=0;
j++)printf(“%4d”,s[i][j]);
change(s,1);
for(i=0;
258987321
四、链表应用
(1)2003年秋填空第17题(P30-17)
设有一个线性单链表的结点定义如下:
structnode
{intd;
structnode*next;
};
函数intcopy_dellist(structnode*head,intx)的功能是:
将head指向的单链表中存储的所有整数从小到大依次复制到x指向的整形数组中并撤消该链表;
函数返回复制到x数组中的整数个数。
算法:
找出链表中数值最小的结点,将其值存储到x数组中,再将该结点从链表中删除,重复以上操作直到链表为空为止。
intcopy_dellist(structnode*head,intx)
{structnoe*pk,*pj,*pm,*pn;
intdata,k=0;
while(head!
=0)
{pk=head;
data=pk->
d;
pn=pk;
while(________!
{pj=pk->
next;
if(_______<
data){data-pj->
pm=pk;
pn=pj;
pk=pj;
x[k++]=pn->
if(_________)pm->
next=pn->
elsehead=pn->
free(pn);
_____________;
答案:
pk->
nextpj->
dpn!
=headreturnk
(2)2004年春填空第17题(P41-17)
设某链表上每个结点的数据结构为:
typedefstructnode
}NODE;
函数NODE*invert(NODE*head)的功能是:
将head指向的单链表逆置,即原链表最后一个结点变为第一个结点,原来倒数第二个结点变成第二个结点,以此类推。
在逆置过程中不建立新的链表。
NODE*invert(NODE*head)
{NODE*p,*q,*r;
if(head==0||__________)returnhead;
p=head;
q=p->
while(q!
{r=__________;
q->
next=p;
p=q;
q=r;
__________=0;
head=__________;
returnhead;
head->
next==0q->
nexthead->
nextp
(3)2004年秋填空第13题P51-13
以下程序运行时输出结果的第一行是________,第二行是________,第三行是_________。
stdlib.h>
NODE*insert(NODE*head,intx,intkey)
{NODE*s,*p,*q;
s=(NODE*)malloc(sizeof(NODE));
s->
d=key;
next=NULL;
if(head==NULL){head=s;
if(head->
d==x){s->
next=head;
head=s;
{q=head;
p=q->
while((p->
d!
=x)&
&
(p->
next!
=NULL)){q=p;
p=p->
if(p->
next=s;
else{s->
p->
voidprint(NODE*head);
{if(head==NULL)return;
while(head->
=NULL)
{printf(“%d,”,head->
d);
head=head->
printf(“%d\n”,head->
{NODE*head=NULL;
head=insert(head,0,3);
print(head);
head=insert(head,3,1);
head=insert(head,4,5);
31,31,3,5
(4)2005年春填空题第13题(P66-13)
以下程序运行时输出结果的第一行为________,第二行为_________,第三行为__________。
structnode*create(void)
{structnode*head=NULL,*p,*q=NULL;
inti;
for(i=2;
=9;
{p=(structnode*)malloc(sizeof(structnode));
d=i;
if(head==NULL)head=p;
elseq->
q=p;
voidprint(structnode*head);
structnode*delst(structnode*head,int*n)
{intcount=0;
structnode*p,*q,*r;
p=r=head;
while(p!
{q=p->
{if((q->
d)%(p->
d)==0)
{r->
next=q->
free(q);
count++;
q=r->
else{r=q;
q=q->
p=p->
*n=count;
voidmain()
{inty;
structnode*head;
head=creat();
head=delst(head,&
y);
printf(“%d”,y);
2,3,4,5,6,7,8,92,3,5,74
五、字符串处理
(1)2003年春填空第10题(P16-10)
以下程序运行时输出第一行是_______,第二行是________。
string.h>
intconvert(chars1[],chars2[])
{inti=0,j,s;
chartab[8][4]={“000”,”001”,”010”,”011”,”100”,”101”,”110”,”111”};
for(i=0,j=0;
s1[i]!
=’\0’;
i++,j=j+3)
strcpy(&
s2[j],tab[s1[i]-‘0’]);
for(i=0,s=0;
strlen(s2);
i++)s=s*2+s2[i]-‘0’;
returns;
{charss1[]=”15”,ss2[80];
inty;
y=convert(ss1,ss2);
printf(“%d\n%s”,y,ss2);
分析:
本程序将八进制数字组成的字符串ss1转换成二进制字符串和十进制数。
13001101
(2)2003年春填空第12题(P17-12)
函数loop(s,m,n,str)的功能是:
对字符串str中,从下标为s的字符开始的所有间隔为m的字符进行循环左移,即:
str[s]←s[s+m],str[s+m]←s[s+3m],str[s+2m]←s[s+3m],…,str[s+(k-1)m]←s[s+km],str[s+km]←s[s](k为整数,下标s+km不越界),共做n次。
例如,调用loop(1,2,1,str)前后str中数据的变化情况如下:
str中初始数据:
ABCDEFGHIJK
移位后str数据:
ADCFEHGJIBK
voidloop(ints,intm,intn,char*str);
{charbuf[81];
strcpy(buf,”ABCDEFGHIJK”);
puts(buf);
loop(1,2,2,buf);
voidloop(ints,intm,intn,char*str)
{charc;
intk,i,len;
len=strlen(str);
{k=________;
c=str[k];
while(k+m<
________)
{str[k]=str[k+m];
k=________;
__________=c;
slenk+mstr[k]
(3)2004年秋填空第16题(P40-16)
以下程序中函数strmerge的功能是:
合并a和b两个有序的字母字符串(字典序)而产生一个新的字符串,在合并的过程中删除重复出现的字符,合并后的字符串仍然保持原序并保存到c指向的数组中,函数返回在合并过程中删除的字符个数。
main函数中输出合并后的字符串“copy”以及在合并过程中删除的字符个数3。
intstrmerge(char*a,char*b,char*c)
{inti=0,j=0,k=0;
chart;
while(a[i]!
=’\0’&
__________)
{if(a[i]==b[j]){t=a[i];
i++;
__________;
elseif(a[i]<
a[j])t=a[i++];
elset=b[j++];
if(t!
=c[k-1])________=t;
while(a[i])
if(a[i]!
=c[k-1]c[k++]=a[i++];
elsei++;
while(b[j])
if(b[j]!
=c[k-1]c[k++]=b[j++];
elsej++;
c[k]=’\0’;
return_________;
{staticchars1[10]=”ccp”,s2[10]=”oppy”,s3[20];
intn;
n=strmerge(s1,s2,s3);
puts(s3);
printf(“%d”,n);
a[j]!
=’\0’j++c[k++]i+j-k
(4)2004年秋填空第6题(P49-6)
以下程序运行时输出结果是________。
{char*s,*s1=”Here”;
s=s1;
while(*s1)s1++;
printf(“%d\n”,s1-s);
本程序是求指针s1所指向的字符串的长度。
4
(5)2004年秋填空第11题(P50-11)
以下程序运行时输出结果的第一行是_______,第二行是______。
voidprocess(char*s1,char*s2,char*s3,intd)
{inti=0,j=0,len1=strlen(s1),len2=strlen
(2),len3=0;
while(i<
len1&
len2)
{if(d==1&
s1[i]<
s2[j]||d==2&
s1[i]>
s2[j])
s3[len3++]=s2[i++];
s3[len3++]=s2[j++];
{chars1[]=”bl”,s2[]=”el”,s3[]=”lb”,s4[]=”le”,s[20];
process(s1,s2,s,1);
puts(s);
process(s3,s4,s,2);
函数process()完成的功能:
(1)当d==1时,从s1、s2两字符串中依次取最小的字符放入s3中,直到有一个字符串结束,最后将未结束的字符串中剩余的字符加到s3的后面;
(2)当d==2时,从s1、s2两字符串中依次取最大的字符放入s3中,直到有一个字符串结束,最后将未结束的字符串中剩余的字符加到s3的后面。
belllleb
(6)2005年秋填空第11题(P65-11)
以下程序运行时输出结果的第一行为_______,第二行为______。
intprocess(char*s1,char*s2,char*s3)
{inti=0,j=0,len1=strlen(s1),len2=strlen(s2),len3=0;
len1;
len2;
if(s1[i]==s2[i])break;
if(j>
=len2)s3[len3++]=s1[i];
s3[len3]=’\0’;
returnlen1-len