计算机二级C语言上机真题(2)【附详解】
【真题1】 给定程序的功能是将大写字母转换为对应小写字母之后的第五个字母;
若小写字母为v~z,使小写字母的值减21。转换后的小写字母作为函数值返回。例
如,若形参是字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母
b。
#include < stdio.h >
#include < ctype.h >
char fun(char c)
{ if( c >='A' && c< ='Z')
c=c+32;
if(c>='a' && c<='u')
/**************found**************/
c=c+ __【1】__;
else if(c>='v' && c<='z')
c=c-21;
/**************found**************/
return __【2】__ ;
}
main()
{ char c1,c2;
printf("\nEnter a letter(A-Z):"); c1=getchar();
if(isupper(c1)) {
/**************found**************/
c2=fun(__【3】__);
printf("\n\nThe letter '%c' change to '%c'\n",
c1,c2);
}
else printf("\nEnter (A-Z)!\n");
}
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
先判断输入的字母是否是大写字母,若是大写字母,将其转化为相应的小写
字母,方法是该大写字母对应的ASCII码值加上32就是其小写字母的ASCII
码值,再判断该小写字母是否是a~u,若是转化为其后的第5 个字母。若该小
写字母是v~z,则将其ACSII码值减去21,转换后的小写字母作为函数值返
回。
题中第一个空填"5":C 语言中,字母从a~z 或A~Z 的ASCII码值是依次
递增的,所以将其转换为其后的第5 个字母应该是"c=c+5;"或相同作用的语
句。
题中第二个空填"c":通过return 语句将被调用函数中c 的值带回主调函数
中去。
题中第三个空填"c1":此句是调用fun()函数,括弧中是其实际参数。
答案:【1】5 【2】c 【3】c1 疑难解答 → http://www.51pass.org/rfkzgu
【真题2】 给定程序modi.c 中,函数fun 的功能是:求k!(k<13),所求阶乘的值
作为函数值返回。例如:若k=10,则应输出:3628800。 请改正程序中的错误,
使它能得出正确的结果。 注意:不要改动main函数,
#include < conio.h >
#include < stdio.h >
long fun(int k)
{
/************found************/
if k >0
return (k*fun(k-1));
/************found************/
else if (k=0)
return 1L;
}
main()
{ int k=10;
clrscr();
printf("%d!=%ld\n", k, fun(k));
}
解析: 本题的考核点是C语言的一些基本常识和if语句的使用。
C 语言提供了三种形式的if语句:
1.if(表达式) 语句
2.if(表达式) 语句1
else 语句2
3.if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3) 语句3
:
else if(表达式m) 语句m
else 语句n
所以,综上所述"if k>0 " 应改为"if (k>0)"或相同作用的语句。
C 语言中"="表示赋值,而"=="才表示"等于",由题意看出,"else if (k=0)
"应为"else if (k==0) "或相同作用的语句。
【真题3】 请编写函数fun,函数的功能是:在字符串中的所有数字字符前加一个$
字符。 例如,输入A1B23CD45,则输出为:A$1B$2$3CD$4$5。 注意:部分源
程序存在文件prog.c 中。 请勿改动主函数main和其他函数中的任何内容,仅在函
数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
void fun(char *s)
{……}
main()
{ char s[80];
printf("Enter a string:"); scanf("%s", s);
fun(s);
printf("The result:%s\n", s);
}
(2011年2月)
解析: 本题的考核点是在字符串中的数字之前加一$字符的算法。 提示思路:
通过一中间数组和一循环来实现。方法是:从字符串的首字符开始,判断字符
是否为数字,若是,将字符$和数字字符赋给中间数组,反之,将字符直接赋给
中间数组,直至字符串尾,最后将中间数组赋给原字符串。
void fun(char *s)
{ char p[80];
int i=0,j=0;
while (s[i]!='\0') /*假如s[i]不为字符串结束符,则继续循环*/
{ if ((s[i]>='0') && (s[i]<='9'))
{p[j]='$';p[j+1]=s[i];j=j+2;}
/*假如s[i]为数字字符,则将$置于p[j]中,数字字符置于p[j+1]
中*/
else {p[j]=s[i];j=j+1;}/*否则将s[i]置于p[j]中*/
i++;
}
p[j]='\0';
strcpy(s,p);/* 将p 数组中的字符复制到s 数组中*/
}
若小写字母为v~z,使小写字母的值减21。转换后的小写字母作为函数值返回。例
如,若形参是字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母
b。
#include < stdio.h >
#include < ctype.h >
char fun(char c)
{ if( c >='A' && c< ='Z')
c=c+32;
if(c>='a' && c<='u')
/**************found**************/
c=c+ __【1】__;
else if(c>='v' && c<='z')
c=c-21;
/**************found**************/
return __【2】__ ;
}
main()
{ char c1,c2;
printf("\nEnter a letter(A-Z):"); c1=getchar();
if(isupper(c1)) {
/**************found**************/
c2=fun(__【3】__);
printf("\n\nThe letter '%c' change to '%c'\n",
c1,c2);
}
else printf("\nEnter (A-Z)!\n");
}
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
先判断输入的字母是否是大写字母,若是大写字母,将其转化为相应的小写
字母,方法是该大写字母对应的ASCII码值加上32就是其小写字母的ASCII
码值,再判断该小写字母是否是a~u,若是转化为其后的第5 个字母。若该小
写字母是v~z,则将其ACSII码值减去21,转换后的小写字母作为函数值返
回。
题中第一个空填"5":C 语言中,字母从a~z 或A~Z 的ASCII码值是依次
递增的,所以将其转换为其后的第5 个字母应该是"c=c+5;"或相同作用的语
句。
题中第二个空填"c":通过return 语句将被调用函数中c 的值带回主调函数
中去。
题中第三个空填"c1":此句是调用fun()函数,括弧中是其实际参数。
答案:【1】5 【2】c 【3】c1 疑难解答 → http://www.51pass.org/rfkzgu
【真题2】 给定程序modi.c 中,函数fun 的功能是:求k!(k<13),所求阶乘的值
作为函数值返回。例如:若k=10,则应输出:3628800。 请改正程序中的错误,
使它能得出正确的结果。 注意:不要改动main函数,
#include < conio.h >
#include < stdio.h >
long fun(int k)
{
/************found************/
if k >0
return (k*fun(k-1));
/************found************/
else if (k=0)
return 1L;
}
main()
{ int k=10;
clrscr();
printf("%d!=%ld\n", k, fun(k));
}
解析: 本题的考核点是C语言的一些基本常识和if语句的使用。
C 语言提供了三种形式的if语句:
1.if(表达式) 语句
2.if(表达式) 语句1
else 语句2
3.if(表达式1) 语句1
else if(表达式2) 语句2
else if(表达式3) 语句3
:
else if(表达式m) 语句m
else 语句n
所以,综上所述"if k>0 " 应改为"if (k>0)"或相同作用的语句。
C 语言中"="表示赋值,而"=="才表示"等于",由题意看出,"else if (k=0)
"应为"else if (k==0) "或相同作用的语句。
【真题3】 请编写函数fun,函数的功能是:在字符串中的所有数字字符前加一个$
字符。 例如,输入A1B23CD45,则输出为:A$1B$2$3CD$4$5。 注意:部分源
程序存在文件prog.c 中。 请勿改动主函数main和其他函数中的任何内容,仅在函
数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
void fun(char *s)
{……}
main()
{ char s[80];
printf("Enter a string:"); scanf("%s", s);
fun(s);
printf("The result:%s\n", s);
}
(2011年2月)
解析: 本题的考核点是在字符串中的数字之前加一$字符的算法。 提示思路:
通过一中间数组和一循环来实现。方法是:从字符串的首字符开始,判断字符
是否为数字,若是,将字符$和数字字符赋给中间数组,反之,将字符直接赋给
中间数组,直至字符串尾,最后将中间数组赋给原字符串。
void fun(char *s)
{ char p[80];
int i=0,j=0;
while (s[i]!='\0') /*假如s[i]不为字符串结束符,则继续循环*/
{ if ((s[i]>='0') && (s[i]<='9'))
{p[j]='$';p[j+1]=s[i];j=j+2;}
/*假如s[i]为数字字符,则将$置于p[j]中,数字字符置于p[j+1]
中*/
else {p[j]=s[i];j=j+1;}/*否则将s[i]置于p[j]中*/
i++;
}
p[j]='\0';
strcpy(s,p);/* 将p 数组中的字符复制到s 数组中*/
}