计算机二级C语言上机真题(18)【附详解】
【真题1】 18 请补充函数fun(),该函数的功能是:把字符下标为非素数的字符从
字符串str 中删除,把字符下标为素数的字符重新保存在字符串str中。字符串str
从键盘输入,其长度作为参数传入函数fun()。 例如,输入“abcdefghijkl”,输出
“cdfhl”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何
内容,仅在函数fun 的横线上填入所编写的若干表达式或语句。 试题程序:
#include < stdio.h >
#define N 80
void fun(char s[],int n)
{
int i, j, k, flag;
【1】;
for(i=0; i< n; i++)
{
if(i >1)
s[k++]=s[i];
flag=1;
for(【2】; j< i&&flag; j++)
if(i%j==0)
{
flag=0;
【3】;
}
}
s[k]='\0';
}
main()
{
int i=0,strlen=0;
char str[N];
clrscr();
printf("\n Input a string:\n");
gets(str);
while(str[i]!='\0')
{
strlen++;
i++;
}
fun(str, strlen);
printf("\n*** display string ***\n");
puts(str);
}
(2011年2月)
解析: 填空1:变量k声明时没有初始化,所以要在使用前初始化为0。填空
2:如果一个数能被除了1 和其自身之外的数整除,即余数为0,则这个数不是
素数。所以除数j从2 开始取数。填空3:如果当前字符的下标为非素数,则应
将此字符删除,所以变量k减1,使下一个字符覆盖它,达到删除的目的。
答案:【1】k=0 【2】j=2 【3】k--
【真题2】 给定程序modi.c 中,函数fun 的功能是:将一个由八进制数字组成的
字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5 位8
进制数字。 例如,若输入77777,则输出将是32767。 请改正程序中的错误,使
它能得出正确结果。 注意:不要改动main 函数,
#include < stdio.h >
int fun(char *p)
{int n;
/************found************/
n=*p-'o';
p++;
while (*p!=0)
{
/************found************/
n=n*7+*p-'o';
p++;
}
return n;
}
main()
{char s[6];int i;int n;
printf("Enter a string(0catal digits): ");gets(s);
if(strlen(s) >5){printf("Error:String too
longer !\n\n");exit(0);}
for (i=0;s[i];i++)
if(s[i]< '0'||s[i] >'7')
{printf("Error:%c not is ocatal
digits!\n\n",s[i]);exit(0);}
printf("The original string:");puts(s);
n=fun(s);
printf("\n%s is convered to integer number:
%d\n\n",s,n);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
八进制转换成十进制的方法是:例如
77777=7*8^4+7*8^3+7*8^2+7*8^1+7*8^0
本题中的第一个错误:题中要求将一个由八进制数字字符组成的字符串转换为
等值的十进制数,思路应是:先将字符串中相应的字符减去字符0的ASCII
值,得出该字符的八进制数,然后乘以8 的次幂之和,即可求得该数的十进制
数,所以程序中语句"n=*p-'o';"应改为"n=*p-'0';";
本题中的第二个错误与第一个错误相似,另外,八进制转换成十进制应乘以8
的次幂,所以应将程序中语句"n=n*7+*p-'o';"改为"n=n*8+*p-'0';"。
解决问题的方法是多种多样的,同一个问题的答案不止一个。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
将字符串中前面所有连续的*号全部移动到字符串的尾部。 例如,字符串中的内容
为:*******A*BC*DEF*G****,移动后,字符串中的内容应当是:
A*BC*DEF*G***********。在编写函数时,不得使用C 语言提供的字符串函
数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中
的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char *a)
{……}
main()
{ char s[81],*p;
printf("Enter a string:\n");gets(s);
fun(s);
printf("The string after moveing:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是移动字符串中字符的算法。
解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的
所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最
后将新串覆盖原串。
本评析仅供参考。
void fun(char *a)
{ char b[81];
int i=0,j=0,s=0,k;
while (a[i]=='*') /*统计原串串首连续*的个数*/
{i++;s++;}
while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/
{b[j]=a[i];j++;i++;}
for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b后*/
{b[j]='*';j++;}
b[j]='\0';
i=0;j=0;
while (b[j]) /*将字符串b中的所有字符复制到a字符串中覆盖原串*/
{a[i]=b[j];i++;j++;}
}
字符串str 中删除,把字符下标为素数的字符重新保存在字符串str中。字符串str
从键盘输入,其长度作为参数传入函数fun()。 例如,输入“abcdefghijkl”,输出
“cdfhl”。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何
内容,仅在函数fun 的横线上填入所编写的若干表达式或语句。 试题程序:
#include < stdio.h >
#define N 80
void fun(char s[],int n)
{
int i, j, k, flag;
【1】;
for(i=0; i< n; i++)
{
if(i >1)
s[k++]=s[i];
flag=1;
for(【2】; j< i&&flag; j++)
if(i%j==0)
{
flag=0;
【3】;
}
}
s[k]='\0';
}
main()
{
int i=0,strlen=0;
char str[N];
clrscr();
printf("\n Input a string:\n");
gets(str);
while(str[i]!='\0')
{
strlen++;
i++;
}
fun(str, strlen);
printf("\n*** display string ***\n");
puts(str);
}
(2011年2月)
解析: 填空1:变量k声明时没有初始化,所以要在使用前初始化为0。填空
2:如果一个数能被除了1 和其自身之外的数整除,即余数为0,则这个数不是
素数。所以除数j从2 开始取数。填空3:如果当前字符的下标为非素数,则应
将此字符删除,所以变量k减1,使下一个字符覆盖它,达到删除的目的。
答案:【1】k=0 【2】j=2 【3】k--
【真题2】 给定程序modi.c 中,函数fun 的功能是:将一个由八进制数字组成的
字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5 位8
进制数字。 例如,若输入77777,则输出将是32767。 请改正程序中的错误,使
它能得出正确结果。 注意:不要改动main 函数,
#include < stdio.h >
int fun(char *p)
{int n;
/************found************/
n=*p-'o';
p++;
while (*p!=0)
{
/************found************/
n=n*7+*p-'o';
p++;
}
return n;
}
main()
{char s[6];int i;int n;
printf("Enter a string(0catal digits): ");gets(s);
if(strlen(s) >5){printf("Error:String too
longer !\n\n");exit(0);}
for (i=0;s[i];i++)
if(s[i]< '0'||s[i] >'7')
{printf("Error:%c not is ocatal
digits!\n\n",s[i]);exit(0);}
printf("The original string:");puts(s);
n=fun(s);
printf("\n%s is convered to integer number:
%d\n\n",s,n);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
八进制转换成十进制的方法是:例如
77777=7*8^4+7*8^3+7*8^2+7*8^1+7*8^0
本题中的第一个错误:题中要求将一个由八进制数字字符组成的字符串转换为
等值的十进制数,思路应是:先将字符串中相应的字符减去字符0的ASCII
值,得出该字符的八进制数,然后乘以8 的次幂之和,即可求得该数的十进制
数,所以程序中语句"n=*p-'o';"应改为"n=*p-'0';";
本题中的第二个错误与第一个错误相似,另外,八进制转换成十进制应乘以8
的次幂,所以应将程序中语句"n=n*7+*p-'o';"改为"n=n*8+*p-'0';"。
解决问题的方法是多种多样的,同一个问题的答案不止一个。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
将字符串中前面所有连续的*号全部移动到字符串的尾部。 例如,字符串中的内容
为:*******A*BC*DEF*G****,移动后,字符串中的内容应当是:
A*BC*DEF*G***********。在编写函数时,不得使用C 语言提供的字符串函
数。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中
的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char *a)
{……}
main()
{ char s[81],*p;
printf("Enter a string:\n");gets(s);
fun(s);
printf("The string after moveing:\n");puts(s);
}
(2011年2月)
解析: 本题的考核点是移动字符串中字符的算法。
解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的
所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最
后将新串覆盖原串。
本评析仅供参考。
void fun(char *a)
{ char b[81];
int i=0,j=0,s=0,k;
while (a[i]=='*') /*统计原串串首连续*的个数*/
{i++;s++;}
while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/
{b[j]=a[i];j++;i++;}
for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b后*/
{b[j]='*';j++;}
b[j]='\0';
i=0;j=0;
while (b[j]) /*将字符串b中的所有字符复制到a字符串中覆盖原串*/
{a[i]=b[j];i++;j++;}
}