计算机二级C语言上机真题(21)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:从N 个字符串中找出最长的那
个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数
组中。
试题程序:
#include < string.h >#include < stdio.h >#define N 5
#define M 81
__1__fun(char (*sq)[M])
{int i; char *sp;
___2___;
for(i=0;i< N;i++)
if(strlen(sp)< strlen(__3__))
sp=sq[i];
return sp;
}
main()
{char str[N][M], *longest; int i;
printf("Enter %d lines:\n ",N);
for(i=0;i< N;i++) gets(str[i]);
printf("\nThe %d string :\n ",N);
for(i=0;i< N;i++) puts(str[i]);
longest=fun(str);
printf("\nThe longest string :\n "); puts(longest);
}
(2011年2月)
解析: 填空1:从C 语言的学习中我们知道,这里应该是对子函数返回值类型
的定义,由下面返回的指针型变量sp可以知道,应该定义成char *,注意中
间的空格。
填空2:根据题目的意思,此处应该是先假设指针数组的第1 个元素所指的字
符串最长,之后对字符串指针数组进行遍历,即给sp赋初值。
填空3:由算法可以看出,这里应该是把二维数组的每一行作为一个字符串的首
地址进行长度比较,所以若遇字符串长度大于待定最长字符串,则令该字符串
为待定最长字符串,如此循环直至指针数组末尾,即可得到最长字符串的地
址。
答案:【1】char * 【2】sp=sq[0] 【3】sq[i]
【真题2】 下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字母,
形成新的字符串,并取代原字符串。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < conio.h >void fun(char *s)
{int i,j;
for(i=0,j=0; s[i]!= '\0'; i++)
/**********************found***********************/
if((s[i] >= 'A'&&s[i]< = 'Z')&&(s[i] >= 'a'&&s[i]< = 'z'))
s[j++]=s[i];
/**********************found***********************/
s[j]= "\0";
}
main()
{
char item[80];
clrscr();
printf("\nEnter a string: ");
gets(item);
printf("\n\nThe string is:\%s\n",item);
fun(item);
printf("\n\nThe string of changing is :\%s\n",item);
}
(2011年2月)
解析: (1)错误:if((s[i] >= 'A'&&s[i]< = 'Z')&&(s[i] >= 'a'&&s[i]<
= 'z'))
正确:if((s[i] >= 'A'&&s[i]< = 'Z')||(s[i] >= 'a'&&s[i]< = 'z'))
(2)错误:s[j]= "\0";
正确:s[j]='\0';
错误1:字母包括小写字母和大写字母,这里是"或"的关系,所以用"||"运算
符。
错误2:字符串的结束标志符为字符,而不是字符串。
【真题3】 请编写函数fun,其功能是:计算并输出下列多项式的值:
1 1 1 1 1
S=(1 - ─) + (─ - ─) +…+ (── - ──)
2 3 4 2n-1 2n
例如,在主函数中从键盘给n 输入8 后,输出为:s=0.662872。
注意:要求n 的值大于1 但不大于100。
部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >double fun(int n)
{……}
main()
{ int n; double s;
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
}
(2011年2月)
解析: 本题的考核点是求模运算和基本c 语句的使用。
提示思路:该题考查的是数学上的一个数列,其通式为:1/(2*n-1)-
1/(2*n)。在给出的参考程序中,由于函数要求的返回值为双精度型,所以将
sum 定义为双精度型,其初值为0.0,再判断输入的n 是否符合条件,如果条
件为真,则执行for 循环,分别计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多
项式的值,同时累加到变量sum 中,并将该结果返回。
double fun(int n)
{ int i;
double sum=0.0; /*定义sum 为双精度型变量,并给其赋初值为0.0*/
if (n >1&&n< =100)
{for(i=1;i< =n;i++)
sum+=1.0/(2*i-1)-1.0/(2*i); /*计算出1.0/(2*i-1)-1.0/(2*i)相应的每
一个多项式的值,同时累加到变量sum 中*/
}
return sum; /*返回计算结果*/
}
个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数
组中。
试题程序:
#include < string.h >#include < stdio.h >#define N 5
#define M 81
__1__fun(char (*sq)[M])
{int i; char *sp;
___2___;
for(i=0;i< N;i++)
if(strlen(sp)< strlen(__3__))
sp=sq[i];
return sp;
}
main()
{char str[N][M], *longest; int i;
printf("Enter %d lines:\n ",N);
for(i=0;i< N;i++) gets(str[i]);
printf("\nThe %d string :\n ",N);
for(i=0;i< N;i++) puts(str[i]);
longest=fun(str);
printf("\nThe longest string :\n "); puts(longest);
}
(2011年2月)
解析: 填空1:从C 语言的学习中我们知道,这里应该是对子函数返回值类型
的定义,由下面返回的指针型变量sp可以知道,应该定义成char *,注意中
间的空格。
填空2:根据题目的意思,此处应该是先假设指针数组的第1 个元素所指的字
符串最长,之后对字符串指针数组进行遍历,即给sp赋初值。
填空3:由算法可以看出,这里应该是把二维数组的每一行作为一个字符串的首
地址进行长度比较,所以若遇字符串长度大于待定最长字符串,则令该字符串
为待定最长字符串,如此循环直至指针数组末尾,即可得到最长字符串的地
址。
答案:【1】char * 【2】sp=sq[0] 【3】sq[i]
【真题2】 下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字母,
形成新的字符串,并取代原字符串。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include < stdio.h >#include < conio.h >void fun(char *s)
{int i,j;
for(i=0,j=0; s[i]!= '\0'; i++)
/**********************found***********************/
if((s[i] >= 'A'&&s[i]< = 'Z')&&(s[i] >= 'a'&&s[i]< = 'z'))
s[j++]=s[i];
/**********************found***********************/
s[j]= "\0";
}
main()
{
char item[80];
clrscr();
printf("\nEnter a string: ");
gets(item);
printf("\n\nThe string is:\%s\n",item);
fun(item);
printf("\n\nThe string of changing is :\%s\n",item);
}
(2011年2月)
解析: (1)错误:if((s[i] >= 'A'&&s[i]< = 'Z')&&(s[i] >= 'a'&&s[i]<
= 'z'))
正确:if((s[i] >= 'A'&&s[i]< = 'Z')||(s[i] >= 'a'&&s[i]< = 'z'))
(2)错误:s[j]= "\0";
正确:s[j]='\0';
错误1:字母包括小写字母和大写字母,这里是"或"的关系,所以用"||"运算
符。
错误2:字符串的结束标志符为字符,而不是字符串。
【真题3】 请编写函数fun,其功能是:计算并输出下列多项式的值:
1 1 1 1 1
S=(1 - ─) + (─ - ─) +…+ (── - ──)
2 3 4 2n-1 2n
例如,在主函数中从键盘给n 输入8 后,输出为:s=0.662872。
注意:要求n 的值大于1 但不大于100。
部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >double fun(int n)
{……}
main()
{ int n; double s;
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
}
(2011年2月)
解析: 本题的考核点是求模运算和基本c 语句的使用。
提示思路:该题考查的是数学上的一个数列,其通式为:1/(2*n-1)-
1/(2*n)。在给出的参考程序中,由于函数要求的返回值为双精度型,所以将
sum 定义为双精度型,其初值为0.0,再判断输入的n 是否符合条件,如果条
件为真,则执行for 循环,分别计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多
项式的值,同时累加到变量sum 中,并将该结果返回。
double fun(int n)
{ int i;
double sum=0.0; /*定义sum 为双精度型变量,并给其赋初值为0.0*/
if (n >1&&n< =100)
{for(i=1;i< =n;i++)
sum+=1.0/(2*i-1)-1.0/(2*i); /*计算出1.0/(2*i-1)-1.0/(2*i)相应的每
一个多项式的值,同时累加到变量sum 中*/
}
return sum; /*返回计算结果*/
}