当前位置:首页 > 全国计算机等级考试二级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
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
/************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
/**********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
/************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
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 页
共分享92篇相关文档