江苏省计算机等级考试二级C语言考点分析.docx
- 文档编号:30301492
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:31
- 大小:23.27KB
江苏省计算机等级考试二级C语言考点分析.docx
《江苏省计算机等级考试二级C语言考点分析.docx》由会员分享,可在线阅读,更多相关《江苏省计算机等级考试二级C语言考点分析.docx(31页珍藏版)》请在冰豆网上搜索。
江苏省计算机等级考试二级C语言考点分析
江苏省计算机等级考试(二级C语言)考点分析一、宏定义
二级考试必考的,必须让学生明白:
宏替换只是原样替换。
(1)2002年秋填空第7题
#defineN3
#defineY(n)((N+1)*n)
则执行语句“z=2*(N+Y(5+1));”后,z的值是_______。
替换时原样替换后的式子为:
z=2*(3+((3+1)*5+1));
(2)2005年春填空第10题
#include
#defineADD(x,y)x+y
main()
{inta=15,b=10,c=20,d=5;
printf(“%d\n”,ADD(a,b)/ADD(c,d));
上面程序输出结果为_________。
二、递归应用
(1)2000年秋填空第5题
main()
{ints,p[9]={1,2,3,4,5,6,7,8,9};
printf(“\n%d”,add(p,5));
}
add(int*p,intn)
{if(n==1)return*p;
elsereturn*p+add(p+1,n-1);
}
程序输出结果是________。
结果为:
15
(2)2000年秋填空第8题
fun(intn,int*s)
{intf1,f2;
if(n==1||n==2)*s=1;
else
{fun(n-1,&f1);fun(n-2,&f2);
*s=2*f1+f2+1;printf(“\n%d,%d”,f1,f2);
}
}
main()
{intx;
fun(4,&x);printf(“\nx=%d”,x);
}
程序运行时输出的第一行是_________,第二行是________,最后一行是________。
答案:
1,14,1x=10
(3)2001年春填空第4题
以下程序输出结果是________
main()
{printf(“%d”,fun(5));}
fun(intn)
{if(n==1)return1;
returnn-fun(n-1);
}
结果为:
3
(4)2001年春填空第12题
以下程序实现将a数组中后8个元素从大到小排序的功能
voidsort(int*x,intn)
main()
{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]);
}
voidsort(int*x,intn)
{intj,t;
if(n==1)return;
for(j=1;j if(_______) {t=x[0];x[0]=x[j];x[j]=t;} sort(x+1,________); } 本题结合了冒泡排序法,第一个空填: a+4;第二个空填: x[0] 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);} } main() {intj,a[5]={1,2,3,4,5}; rev(a+1,4); for(j=0;j<5;j++)printf(“%d”,a[j]); printf(“\n”; rev(a,3); for(j=0;j<5;j++)printf(“%d”,a[j]); } 输出结果: 1543245132 (6)2002年秋填空题第11题(P7-11) main() {inta[3][3],i,j; numlist(&a[0][0],9); for(i=0;i<3;i++) {for(j=0;j<3;j++)printf(“%d,”,a[i][j]); printf(“\n”); } } numlist(int*p,intn) {inti; for(i=0;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; } main() {printf(“Theresultis: %ld\n”,func(132645));}程序运行结果是Theresultis: 365 (8)2003年秋填空题第11题(P26-11) voidfun(int*p1,int*p2); main() {inti,a[6]={1,2,3,4,5,6}; fun(a,a+5); for(i=0;i<5;i++)printf(“%2d”,a[i]); } voidfun(int*p1,int*p2) {intt; if(p1 {t=*p1;p1=*p2;*p2=t;fun(p1+=2,p2-=2);} } 程序运行结果是624351 (9)2004年春(P37-11) #include voidf(inta[],intn,intx,int*c); main() {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 main() {inti,j,k=1,a[N][N]={0}; for(i=0;i {for(j=0;j<=i;j++)a[j][i-j]=k++;} for(;i<2*N;i++) {for(j=i+1-N;j<=N-1;j++)a[j][i-j]=k++;} for(i=0;i {for(j=0;j printf(“\n”); } } 答案: 124357689 (2)2005年春填空第12题(P66-12) 以下程序运行时输出结果的第二行为______,第四行为______,第六行_______。 #include voidchange(ints[3][3],intd) {inti,j,k; if(d==0) {for(i=0;i<3;i++) for(j=i+1;j<3;j++){k=s[i][j];s[i][j]=s[j][i];s[j][i]=k;} } else for(i=0;i<3;i++) for(j=0;j<3-i;j++){k=s[i][j];s[i][j]=s[2-j][2-i];s[2-j][2-i]=k;}} main() {ints[3][3]={1,2,3,4,5,6,7,8,9},i,j,k,n; change(s,0); for(i=0;i<3;i++) {for(j=0;j<3;j++)printf(“%4d”,s[i][j]); printf(“\n”); } change(s,1); for(i=0;i<3;i++) {for(j=0;j<3;j++)printf(“%4d”,s[i][j]); printf(“\n”); } } 输出结果: 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(________! =0) {pj=pk->next; if(_______d;pm=pk;pn=pj;} pk=pj; } x[k++]=pn->d; if(_________)pm->next=pn->next; elsehead=pn->next; free(pn); } _____________; } 答案: pk->nextpj->dpn! =headreturnk (2)2004年春填空第17题(P41-17) 设某链表上每个结点的数据结构为: typedefstructnode {intd; structnode*next; }NODE; 函数NODE*invert(NODE*head)的功能是: 将head指向的单链表逆置,即原链表最后一个结点变为第一个结点,原来倒数第二个结点变成第二个结点,以此类推。 在逆置过程中不建立新的链表。 NODE*invert(NODE*head) {NODE*p,*q,*r; if(head==0||__________)returnhead; p=head; q=p->next; while(q! =0) {r=__________; q->next=p;p=q;q=r; } __________=0; head=__________; returnhead; } 答案: head->next==0q->nexthead->nextp (3)2004年秋填空第13题P51-13 以下程序运行时输出结果的第一行是________,第二行是________,第三行是_________。 #include #include typedefstructnode {intd; structnode*next; }NODE; NODE*insert(NODE*head,intx,intkey) {NODE*s,*p,*q; s=(NODE*)malloc(sizeof(NODE)); s->d=key;s->next=NULL; if(head==NULL){head=s;returnhead;} if(head->d==x){s->next=head;head=s;returnhead;}else {q=head;p=q->next; while((p->d! =x)&&(p->next! =NULL)){q=p;p=p->next;}if(p->d==x){s->next=p;q->next=s;} else{s->next=NULL;p->next=s;} returnhead; } } voidprint(NODE*head); {if(head==NULL)return; while(head->next! =NULL) {printf(“%d,”,head->d);head=head->next;} printf(“%d\n”,head->d); } main() {NODE*head=NULL; head=insert(head,0,3);print(head); head=insert(head,3,1);print(head); head=insert(head,4,5);print(head); } 答案: 31,31,3,5 (4)2005年春填空题第13题(P66-13) 以下程序运行时输出结果的第一行为________,第二行为_________,第三行为__________。 #include #include structnode {intd; structnode*next; } structnode*create(void) {structnode*head=NULL,*p,*q=NULL; inti; for(i=2;i<=9;i++) {p=(structnode*)malloc(sizeof(structnode)); p->d=i;p->next=NULL; if(head==NULL)head=p; elseq->next=p; q=p; } returnhead; } voidprint(structnode*head); {if(head==NULL)return; while(head->next! =NULL) {printf(“%d,”,head->d);head=head->next;} printf(“%d\n”,head->d); } structnode*delst(structnode*head,int*n) {intcount=0;structnode*p,*q,*r; p=r=head; while(p! =NULL) {q=p->next; while(q! =NULL) {if((q->d)%(p->d)==0) {r->next=q->next;free(q);count++;q=r->next;} else{r=q;q=q->next;} } p=p->next; } *n=count;returnhead; } voidmain() {inty; structnode*head; head=creat(); print(head); head=delst(head,&y); print(head); printf(“%d”,y); } 答案: 2,3,4,5,6,7,8,92,3,5,74 五、字符串处理 (1)2003年春填空第10题(P16-10) 以下程序运行时输出第一行是_______,第二行是________。 #include intconvert(chars1[],chars2[]) {inti=0,j,s; char tab[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;i returns; } main() {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 #include #include voidloop(ints,intm,intn,char*str); main() {charbuf[81]; strcpy(buf,”ABCDEFGHIJK”);puts(buf); loop(1,2,2,buf);puts(buf); } voidloop(ints,intm,intn,char*str) {charc;intk,i,len; len=strlen(str); for(i=0;i {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。 #include 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++;__________;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 江苏省 计算机等级考试 二级 语言 考点 分析