计算机二级C语言上机真题(4)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:应用递归算法求某数a 的平方
根。求平方根的迭代公式如下:x1=(x0+a/x0)/2) 。例如,2 的平方根为
1.414214。
#include < math.h >
#include < stdio.h >
__【1】__ fun(double a, double x0)
{ double x1, y;
__【2】__;
if(fabs(x1-x0)>=0.00001)
__【3】__;
else y=x1;
return y;
}
main()
{ double x;
printf("Enter x:"); scanf("%lf",&x);
printf("The square root of %lf is %1f\n", x,
fun(x,1.0));
}
(2011年2月)
解析: 填空1:这里要问的是函数的类型,由主函数main()对函数的调用可以
得到函数的类型是double型的,当然也可以由函数的返回值语句得到。
填空2:我们看到在下一条语句中已经开始对变量x1 的值进行比较了,所以这
里要对x1 进行赋值,由题意可知x1=(x0+a/x0)/2.0。
填空3:用C 语言求平方根的方法一般有两种经典的算法,它们分别是迭代法
和递归法,本题要求用递归法。该程序采用了if语句,程序的含义是当迭代结
果差小于误差时进行循环。
答案:【1】double 【2】x1=(x0+a/x0)/2.0 【3】y=fun(a,x1)
【真题2】 给定程序modi.c 中,函数fun 的功能是:判断字符ch 是否与str 字符
串中的某个字符相同;若相同,什么也不做,若不同,则将其插在串的最后。 请改
正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数,
#include < conio.h >
#include < stdio.h >
#include < string.h >
/************found************/
void fun(char str,char ch)
{ while (*str && *str!=ch) str++;
/************found************/
if (*str==ch)
{ str[0]=ch;
/************found************/
str[1]='0';
}
}
main()
{ char s[81], c;
clrscr();
printf("\nPlease enter a string:\n"); gets(s);
printf("\n Please enter the character to search:");
c=getchar();
fun(s,c);
printf("\nThe result is %s\n",s);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数形式参数的用法以及一些简单算法的
掌握情况。
从主函数中可以看出,str 是一个字符串,因此在fun 函数的参数表中应将str
改为字符指针或字符数组,即把"void fun(char str, char ch )"语句改为
"void fun(char *str, char ch )"或相同作用的语句。
从题义得知,若字符ch 与字符串str 中的某个字符相同,什么也不做;若不
同,则插在str 的最后。因此fun函数中先设置了一个循环从字符串str 中寻找
字符ch,如果找到则中断循环并保留字符ch的地址,否则一直循环到串尾。
因此通过判断*str 的内容即可判断是否已找到字符ch,而原程序中的"if (*str
== ch )"语句与题义相反,应改为" if (*str != ch )"或相同作用的语句。
如果没有找到字符ch,则在while循环后str 指针指向字符串结束符0x00,
此时应将字符ch 写入这里并在下一地址写入一个字符串结束符0x00,所以原
程序中的"str[1] = '0';"语句是没有意义的,应改为"str[1] = '\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];
printf("Enter a string:\n"); gets(s);
fun(s);
printf("The string after deleted:\n"); puts(s);
}
(2011年2月)
解析: 本题的考核点是在字符串中删除字符的算法。 解题思路:从原字符串中
的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组
覆盖原串。
void fun(char *a)
{ char b[81];
int i=0, j=0;
/*查找出字符串数组a 中第一个不为“*”的字符,并用j 返回其下标*/
while ((a[j]!='\0') && (a[j]=='*')) j++;
/*将字符串a 中第一个不为“*”开始的所有字符全部复制到字符串b 中*/
while (a[j]!='\0')
{b[i]=a[j]; j++; i++;}
b[i]='\0';
i=0; j=0;
/*将字符串b 中的所有字符复制到a 字符串中覆盖原串*/
while (b[i]!='\0')
{a[j]=b[i]; i++; j++;}
a[j]='\0';
}
根。求平方根的迭代公式如下:x1=(x0+a/x0)/2) 。例如,2 的平方根为
1.414214。
#include < math.h >
#include < stdio.h >
__【1】__ fun(double a, double x0)
{ double x1, y;
__【2】__;
if(fabs(x1-x0)>=0.00001)
__【3】__;
else y=x1;
return y;
}
main()
{ double x;
printf("Enter x:"); scanf("%lf",&x);
printf("The square root of %lf is %1f\n", x,
fun(x,1.0));
}
(2011年2月)
解析: 填空1:这里要问的是函数的类型,由主函数main()对函数的调用可以
得到函数的类型是double型的,当然也可以由函数的返回值语句得到。
填空2:我们看到在下一条语句中已经开始对变量x1 的值进行比较了,所以这
里要对x1 进行赋值,由题意可知x1=(x0+a/x0)/2.0。
填空3:用C 语言求平方根的方法一般有两种经典的算法,它们分别是迭代法
和递归法,本题要求用递归法。该程序采用了if语句,程序的含义是当迭代结
果差小于误差时进行循环。
答案:【1】double 【2】x1=(x0+a/x0)/2.0 【3】y=fun(a,x1)
【真题2】 给定程序modi.c 中,函数fun 的功能是:判断字符ch 是否与str 字符
串中的某个字符相同;若相同,什么也不做,若不同,则将其插在串的最后。 请改
正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数,
#include < conio.h >
#include < stdio.h >
#include < string.h >
/************found************/
void fun(char str,char ch)
{ while (*str && *str!=ch) str++;
/************found************/
if (*str==ch)
{ str[0]=ch;
/************found************/
str[1]='0';
}
}
main()
{ char s[81], c;
clrscr();
printf("\nPlease enter a string:\n"); gets(s);
printf("\n Please enter the character to search:");
c=getchar();
fun(s,c);
printf("\nThe result is %s\n",s);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中函数形式参数的用法以及一些简单算法的
掌握情况。
从主函数中可以看出,str 是一个字符串,因此在fun 函数的参数表中应将str
改为字符指针或字符数组,即把"void fun(char str, char ch )"语句改为
"void fun(char *str, char ch )"或相同作用的语句。
从题义得知,若字符ch 与字符串str 中的某个字符相同,什么也不做;若不
同,则插在str 的最后。因此fun函数中先设置了一个循环从字符串str 中寻找
字符ch,如果找到则中断循环并保留字符ch的地址,否则一直循环到串尾。
因此通过判断*str 的内容即可判断是否已找到字符ch,而原程序中的"if (*str
== ch )"语句与题义相反,应改为" if (*str != ch )"或相同作用的语句。
如果没有找到字符ch,则在while循环后str 指针指向字符串结束符0x00,
此时应将字符ch 写入这里并在下一地址写入一个字符串结束符0x00,所以原
程序中的"str[1] = '0';"语句是没有意义的,应改为"str[1] = '\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];
printf("Enter a string:\n"); gets(s);
fun(s);
printf("The string after deleted:\n"); puts(s);
}
(2011年2月)
解析: 本题的考核点是在字符串中删除字符的算法。 解题思路:从原字符串中
的第一个非*开始的所有字符拷贝到另一字符串数组中,最后将这个字符串数组
覆盖原串。
void fun(char *a)
{ char b[81];
int i=0, j=0;
/*查找出字符串数组a 中第一个不为“*”的字符,并用j 返回其下标*/
while ((a[j]!='\0') && (a[j]=='*')) j++;
/*将字符串a 中第一个不为“*”开始的所有字符全部复制到字符串b 中*/
while (a[j]!='\0')
{b[i]=a[j]; j++; i++;}
b[i]='\0';
i=0; j=0;
/*将字符串b 中的所有字符复制到a 字符串中覆盖原串*/
while (b[i]!='\0')
{a[j]=b[i]; i++; j++;}
a[j]='\0';
}