计算机二级C语言上机真题(77)【附详解】
【真题1】 某学生的记录由学号、8 门课成绩和平均分组成,学号和8 门课的成绩
已在主函数中给出。函数fun()的功能是:求出该学生的平均分放在记录的ave 成员
中。请自己定义正确的形参。
例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平
均分应当是78.875。
试题程序:
#include < stdio.h >#define N 8
typedef struct
{ char num[10];
double s[N];
double ave;
} STRUC;
void fun(STRUC *P)
{
int i;
p- >ave=__1__;
for(i=0;i< N;i++)
p- >ave=p- >ave+p- >s[i];
p- >ave=__2__;
}
main()
{ FILE *wf;
STRUC s={ "GA005 ",85.5,76,69.5,85,91,72,64.5,87.5};
int i;
fun(__3__);
printf("The %s's student data:\n", s.num);
for(i=0;i< N;i++)
printf("%4.1f\n",s.s[i]);
printf("\nave=%7.3f\n", s.ave);
wf=fopen("out.dat","w");
fprintf(wf,"ave=%7.3f", s.ave);
fclose(wf);
}
(2011年2月)
答案:[1]0.0 [2] (p- >ave)/N [3]&s
【真题2】 给定程序modi.c 中函数fun的功能是: 求整数x 的y 次方的低3 位
值。例如,整数5 的6 次方为15625,此值的低3 位值为625。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >long fun(int x,int y,long *p )
{ int i;
long t=1;
/**************found**************/
for(i=1; i< y; i++)
t=t*x;
*p=t;
/**************found**************/
t=t/1000;
return t;
}
main()
{ long t,r; int x,y;
printf("\nInput x and y: "); scanf("%ld%ld",&x,&y);
t=fun(x,y,&r);
printf("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t );
}
(2011年2月)
解析: 本题的考核点是数组的使用。
解题思路:通过循环使y个x相乘可计算x的y次的值,然后通过对1000 取
余可得低3 位的值。本题需要注意的是除法运算与模运算:'/'为除法运算符,
两个整数相除结果为整数;'%'为模运算符,或称求余运算符,要求%两侧均为
整型数据。
程序中的第一个错误:根据for循环的定义,当i=y时,不执行,本题要求y
个x 相乘,应当计算,所以'for(i=1; i< y; i++)'应改为'for(i=1;i<
=y;i++)';
程序中的第二个错误:题目要求取低3位的值,而't=t/1000;'则是取的除低3
位以外的值,应当为对t取余,所以应当改为't=t%1000;'。
【真题3】 函数char * MyDelete( char * str, char c )的功能是:在字符串str
中删除变量c 中的字符,有几个删几个,并返回所删字符的个数。
例如,若输入字符串"ab abc bcdef "和 字符'b',则应输出字符串"a ac cdef "和 3
(表示删了3 个字符' b')。
注意:此程序存贮在prog.c中。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
MyDelete 中的横线处填入适当内容并删除横线。
#include < conio.h >#include < stdio.h >int MyDelete( char* str, char c )
{ int i, j=0, k=0;
for( i = 0; str[i]; i++ )
if( str[i] != c )
{ str[ j ]= str[i]; ___(1)___; }
else
k++;
str[j]=___(2)___ ;
return( ___(3)___ );
}
main()
{ char string[81], x;
clrscr();
printf("\nPlease enter a string:\n");
gets(string);
printf("\nPlease enter a character: ");
scanf("%c", &x );
printf( "\n\nAfter deleting %d '%c'(s), the string
becomes:\n%s\n",MyDelete(string, x), x, string);
compute() ;
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(int num)
{ FILE *fp;
fp = fopen("dat32.dat", "w");
fprintf(fp, "%d", num);
fclose(fp);
}
compute()
{ char string[81], c;
FILE *fp ;
fp=fopen("c9670303.in","r");
fgets(string, 80, fp);
fscanf(fp, "%c", &c );
fclose(fp);
WriteData(MyDelete(string, c));
}
(2011年2月)
解析: 本题的考核点是c 语言中的循环语句和条件判断语句的使用。
解题思路:从MyDelete函数的基本流程可以看出,函数通过一个for 循环扫
描整个字符串,并定义了两个偏移量变量i和j,其中一个变量保存实际偏移
量,另一个保存去掉字符变量c后的相对偏移量。如果实际偏移量所指的字符
不是c 时,就将这个字符移到相对偏移量处,然后将相对偏移量后移一位;如
果实际偏移量所指的字符是c 时,就滤掉这个字符,将统计删除字符数的计数
器加一。当删除结束后,应该在新字符串的末尾写入一个串结束符,所以(2)处
应填入0 或0x00或'\0'。函数最后返回计数器的值。
int MyDelete( char* str, char c )
{ int i, j=0, k=0;
for( i = 0; str[i]; i++ )
if( str[i] != c )
{ str[ j ]= str[i]; j++; }
else
k++;
str[j]= 0;
return( k );
}
答案:(1). j++ (2). 0,'\0' (3). k
已在主函数中给出。函数fun()的功能是:求出该学生的平均分放在记录的ave 成员
中。请自己定义正确的形参。
例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平
均分应当是78.875。
试题程序:
#include < stdio.h >#define N 8
typedef struct
{ char num[10];
double s[N];
double ave;
} STRUC;
void fun(STRUC *P)
{
int i;
p- >ave=__1__;
for(i=0;i< N;i++)
p- >ave=p- >ave+p- >s[i];
p- >ave=__2__;
}
main()
{ FILE *wf;
STRUC s={ "GA005 ",85.5,76,69.5,85,91,72,64.5,87.5};
int i;
fun(__3__);
printf("The %s's student data:\n", s.num);
for(i=0;i< N;i++)
printf("%4.1f\n",s.s[i]);
printf("\nave=%7.3f\n", s.ave);
wf=fopen("out.dat","w");
fprintf(wf,"ave=%7.3f", s.ave);
fclose(wf);
}
(2011年2月)
答案:[1]0.0 [2] (p- >ave)/N [3]&s
【真题2】 给定程序modi.c 中函数fun的功能是: 求整数x 的y 次方的低3 位
值。例如,整数5 的6 次方为15625,此值的低3 位值为625。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >long fun(int x,int y,long *p )
{ int i;
long t=1;
/**************found**************/
for(i=1; i< y; i++)
t=t*x;
*p=t;
/**************found**************/
t=t/1000;
return t;
}
main()
{ long t,r; int x,y;
printf("\nInput x and y: "); scanf("%ld%ld",&x,&y);
t=fun(x,y,&r);
printf("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t );
}
(2011年2月)
解析: 本题的考核点是数组的使用。
解题思路:通过循环使y个x相乘可计算x的y次的值,然后通过对1000 取
余可得低3 位的值。本题需要注意的是除法运算与模运算:'/'为除法运算符,
两个整数相除结果为整数;'%'为模运算符,或称求余运算符,要求%两侧均为
整型数据。
程序中的第一个错误:根据for循环的定义,当i=y时,不执行,本题要求y
个x 相乘,应当计算,所以'for(i=1; i< y; i++)'应改为'for(i=1;i<
=y;i++)';
程序中的第二个错误:题目要求取低3位的值,而't=t/1000;'则是取的除低3
位以外的值,应当为对t取余,所以应当改为't=t%1000;'。
【真题3】 函数char * MyDelete( char * str, char c )的功能是:在字符串str
中删除变量c 中的字符,有几个删几个,并返回所删字符的个数。
例如,若输入字符串"ab abc bcdef "和 字符'b',则应输出字符串"a ac cdef "和 3
(表示删了3 个字符' b')。
注意:此程序存贮在prog.c中。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
MyDelete 中的横线处填入适当内容并删除横线。
#include < conio.h >#include < stdio.h >int MyDelete( char* str, char c )
{ int i, j=0, k=0;
for( i = 0; str[i]; i++ )
if( str[i] != c )
{ str[ j ]= str[i]; ___(1)___; }
else
k++;
str[j]=___(2)___ ;
return( ___(3)___ );
}
main()
{ char string[81], x;
clrscr();
printf("\nPlease enter a string:\n");
gets(string);
printf("\nPlease enter a character: ");
scanf("%c", &x );
printf( "\n\nAfter deleting %d '%c'(s), the string
becomes:\n%s\n",MyDelete(string, x), x, string);
compute() ;
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(int num)
{ FILE *fp;
fp = fopen("dat32.dat", "w");
fprintf(fp, "%d", num);
fclose(fp);
}
compute()
{ char string[81], c;
FILE *fp ;
fp=fopen("c9670303.in","r");
fgets(string, 80, fp);
fscanf(fp, "%c", &c );
fclose(fp);
WriteData(MyDelete(string, c));
}
(2011年2月)
解析: 本题的考核点是c 语言中的循环语句和条件判断语句的使用。
解题思路:从MyDelete函数的基本流程可以看出,函数通过一个for 循环扫
描整个字符串,并定义了两个偏移量变量i和j,其中一个变量保存实际偏移
量,另一个保存去掉字符变量c后的相对偏移量。如果实际偏移量所指的字符
不是c 时,就将这个字符移到相对偏移量处,然后将相对偏移量后移一位;如
果实际偏移量所指的字符是c 时,就滤掉这个字符,将统计删除字符数的计数
器加一。当删除结束后,应该在新字符串的末尾写入一个串结束符,所以(2)处
应填入0 或0x00或'\0'。函数最后返回计数器的值。
int MyDelete( char* str, char c )
{ int i, j=0, k=0;
for( i = 0; str[i]; i++ )
if( str[i] != c )
{ str[ j ]= str[i]; j++; }
else
k++;
str[j]= 0;
return( k );
}
答案:(1). j++ (2). 0,'\0' (3). k