全国计算机等级考试二级C语言资料(机试) - 图文

发布时间 : 星期三 文章全国计算机等级考试二级C语言资料(机试) - 图文更新完毕开始阅读

分类三:函数类错误(考试重点、难点,出现的频率非常高)

? 题型一:函数定义时出错

1、给定程序MODI1.C中函数fun的功能是:根据形参m的值(2≤m≤9〕,在 printf ( \ } }

【参考答案】:

m行m列的二维数组中存放如下所示规律的数据,由main函数输出。 例如,若输入 2 | 若输入 4 则输出: | 则输出:

1 2 | 1 2 3 4 2 4 | 2 4 6 8 | 3 6 9 12 | 4 8 12 16 请改正程序函数中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! #include #include #define M 10

int a[M][M] = {0} ;

/**************found**************/ void fun(int **a, int m) { int j, k ;

for (j = 0 ; j < m ; j++ ) for (k = 0 ; k < m ; k++ )

/**************found**************/ a[j][k] = k * j ; }

main ( )

{ int i, j, n ;

printf ( \ scanf (\ fun ( a, n ) ;

for ( i = 0 ; i < n ; i++)

{ for (j = 0 ; j < n ; j++) printf ( \

第 9 页(1) void fun(int a[][M], int m)(2)a[j][k]=(k+1)*(j+1);

2、给定程序MODI1.C中函数 fun 的功能是:求S的值。 例如,当k为10时,函数值应为:1.533852。 请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#include #include

/************found************/ void fun( int k )

{ int n; double s, w, p, q; n = 1; s = 1.0;

while ( n <= k ) { w = 2.0 * n; p = w - 1.0; q = w + 1.0; s = s * w *w/p/q;

n++; }

/************found************/ return s }

main ( ) {

printf(\}

【参考答案】

(1) float fun(int k)(2)return s;

共 30 页

3、给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将长的那个字符串的首地址作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! #include

/**********found**********/ char fun(char *s, char *t)

{ int sl=0,tl=0; char *ss, *tt; ss=s; tt=t; while(*ss) { sl++;

/**********found**********/ (*ss)++; }

while(*tt) { tl++;

/**********found**********/ (*tt)++; }

if(tl>sl) return t; else return s; }

main()

{ char a[80],b[80];

printf(\ \

printf(\ \ printf(\}

【参考答案】

(1) char *fun(char *s,char *t)(2)ss++;(3)tt++; 【解题技巧】函数头部容易出错的几个地方:

(1)int fun(int m);------>int fun(int m)函数定义时末尾的分号是多余的

第 10 页 (2)int fun(int m) int i=20;char ch;--->int fun(int m){ 函数名后必须要有大括号 (3)void fun(int a,int b)---->void fun(int *a,int *b)参数类型不对

(4)void fun(int a,b)------->void fun(int a,int b)相同类型的参数也要分开定义 (5)void fun(int a[][],int n)------>void fun(int a[][10],int n)数组定义时二维下标不能省略

(6)voidfun(int n)----->void fun(int n)返回值类型和函数名之间有空格 注意函数定义的一般格式,关注容易出错的地方,如下图:

正确形式 错误形式 double fun(int a,int b) int fun(int a,b); { { int k=2; int k=2; while(k<=m&&(k%b)) while(k<=m&&(k%b)) k++; k++; ……. ……. if(k= =a) if(k=a) return 1.0; return 1.0; else return 0.0 else return 0.0 } } 当++、- -与*结合问题,搞清楚什么时候应该加括号。搞清楚什么时候该加*号 ++、- -和*是同一优先级,结合性是从右向左

*p++; 是指针p向后移动一个存储单元 然后取指针p所指变量的值。

(*p)++; 是将指针p所指变量的值自增1. ? 题型二:返回值错误

4、下列给定程序中,函数fun的功能是:统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意:字母不分大、小写。例如:若输入THIs is a boot,则输出应该是1、0、2、2、0。请改正程序中的错误,使它能得出正确结果。 #include #include

/**********found**********/ fun(char *s,int num[5])

共 30 页

{int k,i=5;

for(k=0;k

/**********found**********/ num[i]=0; for(;*s;s++) {i=-1;

/**********found**********/ switch(s)

{ case ?a?:case ?A?:{i=0;break;} case ?e?:case ?E?:{i=1;break;} case?i?:case?I?:{i=2;break;} case?0?:case ?0?:{i=3;break;} case?u?:case?U?:{i=4;break;} }

if(i>=0) num[i]++; }} main() {

int i;char s[30];int num[5]={0}; printf(\请输入一个字符串:\\n\gets(s); fun(s,num); for(i=0;i<5;i++)

printf(\、\}

【参考答案】

(1)void fun(char *s,int num[5]) (2)num[k]=0; (3)switch(*s) 【解题技巧】返回值错误主要表现在以下四个方面:

(1)有return语句,但缺少返回值类型,fun(int n)----->double fun(int n) 经常考

(2)缺少返回值。函数定义时有返回值类型,但程序中缺少return 语句

第 11 页 (3)返回值类型和函数定义时的类型不一致。

如调用函数时返回值为double类型,但定义时为int类型,int fun(int a){ }——>double fun(int a){ }

(4)返回值不对,如:return (a)----->return (b);

分类四:编译预处理、链表类错误

? 题型一:带参数的宏定义出错

1、给定程序MODI1.C中函数fun的功能是:计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x和y的值不等,z和y的值不等。例如,当x的值为9、y的值为11、z的值为15时,函数值为 -3.50。 请改正程序中的错误,使它能得出正确结果。 #include #include #include

/************found************/ #define FU(m,n) (m/n) float fun(float a,float b,float c) { float value;

value=FU(a+b,a-b)+FU(c+b,c-b); /************found************/ Return(Value); }

main()

{ float x,y,z,sum;

printf(\ x y z: \ printf(\

if (x==y||y==z){printf(\ sum=fun(x,y,z);

printf(\}

【参考答案】:

(1)#define FU(m,n) (m)/(n) (2)return (value);

共 30 页

【解题技巧】带参数的宏定义,要注意宏替换部分有没有括号,一般情况下是缺少括号或者括号的位置不正确,如 #define F(m,n) (m/n)——>#define F(m,n) (m)/(n)

? 题型二:链表指针向后移动节点时出错

2、给定程序MODI1.C是建立一个带头结点的单向链表, 并用随机函数为各结点数据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的 for(i=1; i<=n; i++)

{ s=(NODE *)malloc(sizeof(NODE)); s->data=rand()%m; s->next=p->next; p->next=s; p=p->next; }

p->next=NULL; 最大值,并且作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。 #include #include typedef struct aa { int data;

struct aa *next; } NODE;

int fun ( NODE *h ) { int max=-1;NODE *p;

/***********found**********/ p=h ; while(p)

{ if(p->data>max )

max=p->data; /***********found**********/ p=h->next ; }

return max; }

outresult(int s, FILE *pf)

{ fprintf(pf,\ : %d\\n\NODE *creatlink(int n, int m) { NODE *h, *p, *s; int i;

h=p=(NODE *)malloc(sizeof(NODE));h->data=9999; 第 12 页 return h; }

outlink(NODE *h, FILE *pf) { NODE *p; p=h->next;

fprintf(pf,\ LIST :\\n\\n HEAD \ while(p)

{ fprintf(pf,\ fprintf(pf,\ } main()

{ NODE *head; int m; head=creatlink(12, 100); outlink(head , stdout); m=fun(head);

printf(\ RESULT :\\n\}

【参考答案】

(1)p=h->next;(2)p=p->next;

【解题技巧】在链表题中,一般会有多个结构体指针,要注意每个指针的指向,尤其是在指针间相互赋值时,指针的指向就会发生变化,这时就容易出现改错题,建议在做此类型的题目时在纸上画一个指针的指向图。指针在链表中的移动是常考题型,指针向后移动一个节点的固定形式是:p=p->nex,如上题中,应将p=h->next应该改为p=p->next。

共 30 页

联系合同范文客服:xxxxx#qq.com(#替换为@)