计算机二级C语言上机真题(23)【附详解】
【真题1】 给定程序功能是用冒泡法对6个字符串进行排序。
#include < stdio.h >#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
for (j = i + 1; j < 6; j++) {
/**************found**************/
if(strcmp(*(pstr+i),___1___) >0)
{
p = *(pstr + i) ;
/**************found**************/
pstr[i] = ___2___ ;
/**************found**************/
*(pstr + j) = ___3___ ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][MAXLINE] ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是正确填空的重要前
提。
程序中的重要思想如下:
1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串;
2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串;
3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun()
中对6 个字符串进行操作,只能通过pstr[]中的6个指针。
题中第一个空填"*(pstr+j)":观察源程序可以发现,在程序中使用strcmp()
函数是为了判断字符串str[i]与str[i+1]两者的大小,在fun()函数中只能通过
指针来表达各个字符串,所以应当填"*(pstr+j)"。
题中第二个空填"pstr[j]":对两个字符进行比较后,若pstr[i]中的字符比
pstr[j]中的字符大,则将pstr[j]中的字符赋给pstr[i]。
题中第三个空填"p":对两个字符进行比较后,若pstr[i]中的字符比pstr[j]中
的字符大,则将pstr[j]和pstr[i]的内容进行交换。
答案:【1】*(pstr+j) 【2】pstr[j] 【3】p
【真题2】 下列给定程序中函数fun()的功能是:在字符串的最前端加入n 个*号,
形成新串,并且覆盖原串。
注意:字符串的长度最长允许79。
请改正函数fun()中的错误,使它能得出正确的结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < string.h >#include < conio.h
>/**********************found***********************/
void fun(char s[],int n)
{
char a[80],*p;
int i;
/**********************found***********************/
s=p;
for(i=0;i< n;i++) a[i]= '*';
do
{a[i]=*p;
/**********************found***********************/
i++;
}while(*p);
a[i]=0;
strcpy(s,a);
}
main()
{int n;char s[80];
clrscr();
printf("\nEnter a string: ");gets(s);
printf("\nThe string\%s\n",s);
printf("\nEnter n (number of*):"); scanf("%d",&n);
fun(s,n);
printf("\nThe string after inster:\%s\n",s);
}
(2011年2月)
解析: (1)错误:void fun(char s[],int n) 正确:void fun(char *s,int n)
(2)错误:s=p; 正确:p=s;
(3)错误:i++; 正确:i++;p++;
(4)错误:a[i]=0; 正确:a[i]= '\0';
在本题中,s是数组名,代表数组首地址,在编译时对s 数组分配了一段内存单
元,因此在程序运行期间s 是一个常量,不能再被赋值。因此s=p是错误的,
如果把"char s[];"改成"char *s;",则程序正确。此时s 是指向字符数组的指
针变量,p=s 是合法的,它将字符串的首地址赋给指针变量p,然后在printf
函数语句中输出字符串s。因此,应当弄清楚字符数组与字符指针变量用法的区
别。
【真题3】 请编写一个函数fun,它的功能是:根据以下公式求π 的值(要求满足精
度0.0005, 即某项小于0.0005 时停止迭代):
π 1 1×2 1×2×3 1×2×3×4 1×2×…×n
─ = 1 + ─ + ── + ──── + ───── + …… + ────────
2 3 3×5 3×5×7 3×5×7×9 3×5×…×(2n+1)
程序运行后,如果输入精度0.0005,则程序输出为3.14…。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun ( double eps)
{……}
main( )
{ double x;
printf("Input eps:") ;
scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
}
(2011年2月)
解析: 本题的考核点是求π 的值的算法及循环语句的使用。
解题思路:通过循环语句判断公式中某项是否在精度范围之内,以控制迭代。
#include < stdio.h >
#include < math.h >
double fun ( double eps)
{ int n=0;
double down=1,up=1;
double one ,pi=0;
one = (double)up/(double)down;
while(one >=eps) { /*通过循环语句判断公式中某项是否在精度范围之内*/
pi+=one;
n++;
up=up*n;
down=down*(2*n+1);
one=(double)up/(double)down;
}
return pi*2;
}
#include < stdio.h >#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
for (j = i + 1; j < 6; j++) {
/**************found**************/
if(strcmp(*(pstr+i),___1___) >0)
{
p = *(pstr + i) ;
/**************found**************/
pstr[i] = ___2___ ;
/**************found**************/
*(pstr + j) = ___3___ ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][MAXLINE] ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是正确填空的重要前
提。
程序中的重要思想如下:
1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串;
2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串;
3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun()
中对6 个字符串进行操作,只能通过pstr[]中的6个指针。
题中第一个空填"*(pstr+j)":观察源程序可以发现,在程序中使用strcmp()
函数是为了判断字符串str[i]与str[i+1]两者的大小,在fun()函数中只能通过
指针来表达各个字符串,所以应当填"*(pstr+j)"。
题中第二个空填"pstr[j]":对两个字符进行比较后,若pstr[i]中的字符比
pstr[j]中的字符大,则将pstr[j]中的字符赋给pstr[i]。
题中第三个空填"p":对两个字符进行比较后,若pstr[i]中的字符比pstr[j]中
的字符大,则将pstr[j]和pstr[i]的内容进行交换。
答案:【1】*(pstr+j) 【2】pstr[j] 【3】p
【真题2】 下列给定程序中函数fun()的功能是:在字符串的最前端加入n 个*号,
形成新串,并且覆盖原串。
注意:字符串的长度最长允许79。
请改正函数fun()中的错误,使它能得出正确的结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < string.h >#include < conio.h
>/**********************found***********************/
void fun(char s[],int n)
{
char a[80],*p;
int i;
/**********************found***********************/
s=p;
for(i=0;i< n;i++) a[i]= '*';
do
{a[i]=*p;
/**********************found***********************/
i++;
}while(*p);
a[i]=0;
strcpy(s,a);
}
main()
{int n;char s[80];
clrscr();
printf("\nEnter a string: ");gets(s);
printf("\nThe string\%s\n",s);
printf("\nEnter n (number of*):"); scanf("%d",&n);
fun(s,n);
printf("\nThe string after inster:\%s\n",s);
}
(2011年2月)
解析: (1)错误:void fun(char s[],int n) 正确:void fun(char *s,int n)
(2)错误:s=p; 正确:p=s;
(3)错误:i++; 正确:i++;p++;
(4)错误:a[i]=0; 正确:a[i]= '\0';
在本题中,s是数组名,代表数组首地址,在编译时对s 数组分配了一段内存单
元,因此在程序运行期间s 是一个常量,不能再被赋值。因此s=p是错误的,
如果把"char s[];"改成"char *s;",则程序正确。此时s 是指向字符数组的指
针变量,p=s 是合法的,它将字符串的首地址赋给指针变量p,然后在printf
函数语句中输出字符串s。因此,应当弄清楚字符数组与字符指针变量用法的区
别。
【真题3】 请编写一个函数fun,它的功能是:根据以下公式求π 的值(要求满足精
度0.0005, 即某项小于0.0005 时停止迭代):
π 1 1×2 1×2×3 1×2×3×4 1×2×…×n
─ = 1 + ─ + ── + ──── + ───── + …… + ────────
2 3 3×5 3×5×7 3×5×7×9 3×5×…×(2n+1)
程序运行后,如果输入精度0.0005,则程序输出为3.14…。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#include < math.h >double fun ( double eps)
{……}
main( )
{ double x;
printf("Input eps:") ;
scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
}
(2011年2月)
解析: 本题的考核点是求π 的值的算法及循环语句的使用。
解题思路:通过循环语句判断公式中某项是否在精度范围之内,以控制迭代。
#include < stdio.h >
#include < math.h >
double fun ( double eps)
{ int n=0;
double down=1,up=1;
double one ,pi=0;
one = (double)up/(double)down;
while(one >=eps) { /*通过循环语句判断公式中某项是否在精度范围之内*/
pi+=one;
n++;
up=up*n;
down=down*(2*n+1);
one=(double)up/(double)down;
}
return pi*2;
}