计算机二级C语言上机真题(35)【附详解】
【真题1】 str为一个字符序列。请补充函数fun(),该函数的功能是:查找str 中
值为x 的元素,返回该字符序列中值为x的元素个数,并把这些值为x 的元素下标
依次保存在数组bb 中。例如,在“abcdefahij”中查找‘a’,结果为:2 个‘a’,下标依
次为0、6。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include< stdio.h >#include< conio.h >#define N 20
int bb[N];
int fun(char *str,char ch)
{ int i=0, n=0;
char t=ch;
char *p=str;
while(*p)
{
if (【1】)
【2】;
p++;
i++;
}
return 【3】;
}
main()
{ char str[N];
char ch;
int i,n;
clrscr();
printf("***Input the original string
***\n");
gets(str);
printf("***The Original ***\n");
puts(str);
printf("***Input character ***\n");
scanf("%c",&ch);
n=fun(str,ch);
printf("\nThe numbr of character is:
%d\n",n);
printf("***The suffix of character
***\n");
for(i=0;i< n;i++)
printf("%d ",bb[i]);
}
(2011年2月)
解析: 填空1:通过指针p的移动来依次访问字符串的各个字符,如果指针p
所指的字符等于待查找的字符,即表示找到了满足条件的字符。填空2:将找到
的字符在字符数组中的下标值保存在数组bb中。填空3:变量n 记录在字符串
中找到待查找字符的个数。由main 函数的调用可知函数fun()的返回值为n。
答案:【1】*p==t 【2】bb[n++]=i 【3】n
【真题2】 文件modi.c 中程序的功能是:读入一个整数m,计算如下公式的值。
t = 1 - 1/2 - 1/3 - …… - 1/m
例如,若输入5,则应输出 -0.283333。
请改正程序中的错误,使它能计算出正确的结果。
注意:
#include < conio.h >#include < stdio.h >double MyLim( int m )
{ double t = 1.0;
int i;
/************found**********/
for( i = 2; i < = m; i++ )
t = 1.0 -1.0/t;
return( t );
}
main()
{ int m ;
clrscr();
printf( "\nPlease enter 1 integer numbers:\n" );
/************found**********/
scanf( "%d" &m )
printf( "\n\nThe result is %lf\n", MyLim( m ) );
}
(2011年2月)
解析: 本题的考核点是C语言中循环语句的使用。
对于复杂的计算公式,我们应先找出其中的规律,将其简化,然后用循环、条
件判断等将其归纳为一种算法,进而编出程序解决问题。
t = 1 - 1/2 - 1/3 - ... - 1/m,可以简化为:
m
t = 1 - Σ1/i
i=2
所以在for 循环中,如果t的初始值为1.0,则上式即可表示为:t = t - 1.0/i
( i 从2 循环到m)。所以应该把原程序中的" t = 1.0 -1.0/t;"改为"t=t-
1.0/i;"或相同作用的语句。
另外,原程序中main 函数中的"scanf( "%d" &m )"语句也是错误的,应该改
为"scanf( "%d" ,&m );"。
【真题3】 请编一个函数double Acc(int k, double dd[]), 它的功能是:求出数
组dd 中前k 个数的小数部分的和, 并返回此值。
例如:输入4 和101.91、213.87、345.79、420.83,则输出3.4。
注意:此程序保存在prog.c中。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
Acc 的花括号中填入你编写的若干语句。
#include < conio.h >#include < stdio.h >#define M 20
double Acc( int k, double dd[] )
{……}
main()
{ int i, m;
double x, tt[M];
clrscr();
printf("\nPlease enter number of numbers: ");
scanf("%d", &m );
printf("\nPlease enter %d decimal numbers:\n",m);
for( i = 0; i < m; i++ )
{ scanf("%lf", &x ); tt[i] = x ; }
printf( "\nThe sum of their decimal part is: %lf\n", Acc(m, tt));
compute() ;
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(double sum)
{ FILE *fp;
fp = fopen("dat12.dat", "w") ;
fprintf(fp, "%lf", sum);
fclose(fp);
}
compute()
{ int i, m;
double x, tt[M];
FILE *fp;
fp = fopen("c9670103.in", "r");
fscanf(fp, "%d", &m );
for( i = 0; i < m; i++ )
{ fscanf(fp, "%lf", &x ); tt[i] = x ; }
fclose(fp);
WriteData(Acc(m, tt));
}
(2011年2月)
解析: 本题的考核点是C语言中的数据类型转换。
提示思路:根据C 语言的类型转换规则,如果把一个A类型的数据赋给一个B
类型的数据时,C 语言将先把A类型的数据转换为B类型,然后再赋值。其实
C 编译器对各类型的数据并没有十分严格的区分,最大的区别只是所占的位数不
同。当把一个浮点型的数据赋给整型变量时,C编译器将会强制去掉浮点型数据
的小数部分,此时所得到的整型数据就是浮点数据的整数部分。用浮点数据减
去整型数据所得出的结果即为该浮点数据的小数部分,将这个结果累加起来就
得出要返回的值。
double Acc( int k, double dd[] )
{int i;
int int_data;
double flt_data, result = 0;
for (i = 0;i < k; i ++)
{ int_data = dd[i]; /*求数组dd[]的整数部分*/
flt_data = dd[i] - int_data; /*求数组dd[]的小数部分*/
result += flt_data; /*通过for 循环求出数组dd中前k 个数的小数部分的和
result*/
}
return result; /*返回数组dd中前k个数的小数部分之和result*/
}
值为x 的元素,返回该字符序列中值为x的元素个数,并把这些值为x 的元素下标
依次保存在数组bb 中。例如,在“abcdefahij”中查找‘a’,结果为:2 个‘a’,下标依
次为0、6。
注意:部分源程序给出如下。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编
写的若干表达式或语句。
试题程序:
#include< stdio.h >#include< conio.h >#define N 20
int bb[N];
int fun(char *str,char ch)
{ int i=0, n=0;
char t=ch;
char *p=str;
while(*p)
{
if (【1】)
【2】;
p++;
i++;
}
return 【3】;
}
main()
{ char str[N];
char ch;
int i,n;
clrscr();
printf("***Input the original string
***\n");
gets(str);
printf("***The Original ***\n");
puts(str);
printf("***Input character ***\n");
scanf("%c",&ch);
n=fun(str,ch);
printf("\nThe numbr of character is:
%d\n",n);
printf("***The suffix of character
***\n");
for(i=0;i< n;i++)
printf("%d ",bb[i]);
}
(2011年2月)
解析: 填空1:通过指针p的移动来依次访问字符串的各个字符,如果指针p
所指的字符等于待查找的字符,即表示找到了满足条件的字符。填空2:将找到
的字符在字符数组中的下标值保存在数组bb中。填空3:变量n 记录在字符串
中找到待查找字符的个数。由main 函数的调用可知函数fun()的返回值为n。
答案:【1】*p==t 【2】bb[n++]=i 【3】n
【真题2】 文件modi.c 中程序的功能是:读入一个整数m,计算如下公式的值。
t = 1 - 1/2 - 1/3 - …… - 1/m
例如,若输入5,则应输出 -0.283333。
请改正程序中的错误,使它能计算出正确的结果。
注意:
#include < conio.h >#include < stdio.h >double MyLim( int m )
{ double t = 1.0;
int i;
/************found**********/
for( i = 2; i < = m; i++ )
t = 1.0 -1.0/t;
return( t );
}
main()
{ int m ;
clrscr();
printf( "\nPlease enter 1 integer numbers:\n" );
/************found**********/
scanf( "%d" &m )
printf( "\n\nThe result is %lf\n", MyLim( m ) );
}
(2011年2月)
解析: 本题的考核点是C语言中循环语句的使用。
对于复杂的计算公式,我们应先找出其中的规律,将其简化,然后用循环、条
件判断等将其归纳为一种算法,进而编出程序解决问题。
t = 1 - 1/2 - 1/3 - ... - 1/m,可以简化为:
m
t = 1 - Σ1/i
i=2
所以在for 循环中,如果t的初始值为1.0,则上式即可表示为:t = t - 1.0/i
( i 从2 循环到m)。所以应该把原程序中的" t = 1.0 -1.0/t;"改为"t=t-
1.0/i;"或相同作用的语句。
另外,原程序中main 函数中的"scanf( "%d" &m )"语句也是错误的,应该改
为"scanf( "%d" ,&m );"。
【真题3】 请编一个函数double Acc(int k, double dd[]), 它的功能是:求出数
组dd 中前k 个数的小数部分的和, 并返回此值。
例如:输入4 和101.91、213.87、345.79、420.83,则输出3.4。
注意:此程序保存在prog.c中。
请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数
Acc 的花括号中填入你编写的若干语句。
#include < conio.h >#include < stdio.h >#define M 20
double Acc( int k, double dd[] )
{……}
main()
{ int i, m;
double x, tt[M];
clrscr();
printf("\nPlease enter number of numbers: ");
scanf("%d", &m );
printf("\nPlease enter %d decimal numbers:\n",m);
for( i = 0; i < m; i++ )
{ scanf("%lf", &x ); tt[i] = x ; }
printf( "\nThe sum of their decimal part is: %lf\n", Acc(m, tt));
compute() ;
}
/* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */
WriteData(double sum)
{ FILE *fp;
fp = fopen("dat12.dat", "w") ;
fprintf(fp, "%lf", sum);
fclose(fp);
}
compute()
{ int i, m;
double x, tt[M];
FILE *fp;
fp = fopen("c9670103.in", "r");
fscanf(fp, "%d", &m );
for( i = 0; i < m; i++ )
{ fscanf(fp, "%lf", &x ); tt[i] = x ; }
fclose(fp);
WriteData(Acc(m, tt));
}
(2011年2月)
解析: 本题的考核点是C语言中的数据类型转换。
提示思路:根据C 语言的类型转换规则,如果把一个A类型的数据赋给一个B
类型的数据时,C 语言将先把A类型的数据转换为B类型,然后再赋值。其实
C 编译器对各类型的数据并没有十分严格的区分,最大的区别只是所占的位数不
同。当把一个浮点型的数据赋给整型变量时,C编译器将会强制去掉浮点型数据
的小数部分,此时所得到的整型数据就是浮点数据的整数部分。用浮点数据减
去整型数据所得出的结果即为该浮点数据的小数部分,将这个结果累加起来就
得出要返回的值。
double Acc( int k, double dd[] )
{int i;
int int_data;
double flt_data, result = 0;
for (i = 0;i < k; i ++)
{ int_data = dd[i]; /*求数组dd[]的整数部分*/
flt_data = dd[i] - int_data; /*求数组dd[]的小数部分*/
result += flt_data; /*通过for 循环求出数组dd中前k 个数的小数部分的和
result*/
}
return result; /*返回数组dd中前k个数的小数部分之和result*/
}