计算机二级C语言上机真题(71)【附详解】
【真题1】 给定程序的功能是:读入一个整数k(2≤k≤10000),打印它的所有质
因子(即所有为素数的因子)。
例如,若输入整数:3410,则应输出:2、5、11、31。
#include < stdio.h >IsPrime ( int n )
{ int i, m;
m = 1;
for ( i = 2; i < n; i++ )
/************found************/
if (!( n ___1___ i )) {
/************found************/
m = 0; ___2___ ;
}
return ( m );
}
main( )
{ int j, k;
printf( "\nPlease enter an integer number between 2 and 10000: " );
/************found************/
scanf( "%d", ___3___ );
printf( "\n\nThe prime factor(s) of %d is( are ):", k );
for( j = 2; j < = k; j++ )
if( ( !( k%j ) )&&( IsPrime( j ) ) ) printf( "\n %4d", j );
printf("\n");
}
(2011年2月)
解析: 本题的考核点是C语言中算术运算符的用法以及输入输出语句和break
语句的使用。
题中第一个空填"%":"%"为模运算符,或称求余运算符,%两侧均应为整型
数据。只有当"n%i==0"时,循环才继续执行。
题中第二个空填"break":break语句用来从循环体内跳出循环体,即提前结束
循环,接着执行循环下面的语句。
题中第三个空填"&k":scanf函数为格式输入函数,其一般形式为:
scanf(格式控制,地址表列)
"格式控制"是用双引号括起来的字符串,也称"转换控制字符串"。
"地址表列"是由若干个地址组成的表列,可以是变量的地址,或字符串的首地
址。
答案:【1】% 【2】break 【3】&k
【真题2】 文件modi.c 中程序的功能是:判断两个整数m 和n 是否互质(即是否
有公共的因子)(m≠1,n≠1)。 方法是: 用2 到t(t 取m 和n 中较小的那个
数)之间的数分别去除m 和n,若m 和n 能同时被某个数除尽,则m 和n 不互
质;否则它们互质。
例如,若输入187 和85,则应输出No(表示它们不互质,它们有公因子17)。若
输入89 和187,则应输出Yes(表示它们互质)。
请改正程序中的错误,使它能计算出正确的结果。
注意:
#include < conio.h >#include < stdio.h >int IsThat( int m, int n )
{ int k, t, mk=1;
t=m;
if (m >n) t=n;
/************found**********/
for( k=1; k< =t; k++ )
if( m%k==0 && n%k==0 ){ mk=0; break; }
return( mk );
}
main( )
{ int m, n;
clrscr();
printf( "\nPlease enter 2 numbers:\n" );
/************found**********/
scanf( "&d &d", &m, &n );
if( IsThat( m, n ) )
printf( "Yes\n" );
else
printf( "No\n" );
}
(2011年2月)
解析: 本题的考核点是C语言中for循环语句及scanf函数的使用。
题目要求判断从2 到t之间的数值是否互质,所以IsThat函数的for 循环从1
到t判断m 和n是否互质与题义不符,应该改为"for(k=2;k< =t;k++)"或相
同作用的语句。
scanf函数的格式字符串的前缀是%,而不是&,所以应该把原程序中的
"scanf( "&d &d", &m, &n );"语句改为"scanf( "%d %d", &m, &n );"或相
同作用的语句。
【真题3】 请编写一个函数void fun(char a[],int k,int n),其功能是:删除字符
串规定下标开始的n 个字符。其中,a 指向字符串,k 中存放指定的下标。
例如,字符串内容为:Hellollo World!,k 中的值为:5,n 中的值为:3,则调用
该函数的结果为:Hello World!。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(char *a,int k,int n)
{……}
main()
{ char s[N]="Hellollo World!";
int k,n;
printf("\nThe original string:%s\n",s);
printf("Enter index ———————— k: "),scanf("%d",&k);
printf("Enter number to delete —— n: ");scanf("%d",&n);
fun(s,k,n);
printf("\nThe string after deleted: %s\n",s);
}
(2011年2月)
解析: 本题的考核点是删除字符串规定下标开始的n 个字符算法。
提示思路:从指定下标加上n后开始的元素依次放在指定下标开始的位置,来
达到删除的目的。
void fun(char *a,int k,int n)
{int i;i=k;
while (a[i-1]!='\0')/*判断指定要删除的字符是否存在或其后的全部字符是否
已全部前移*/
{ a[i]=a[i+n];
i=i+1;
}
}
因子(即所有为素数的因子)。
例如,若输入整数:3410,则应输出:2、5、11、31。
#include < stdio.h >IsPrime ( int n )
{ int i, m;
m = 1;
for ( i = 2; i < n; i++ )
/************found************/
if (!( n ___1___ i )) {
/************found************/
m = 0; ___2___ ;
}
return ( m );
}
main( )
{ int j, k;
printf( "\nPlease enter an integer number between 2 and 10000: " );
/************found************/
scanf( "%d", ___3___ );
printf( "\n\nThe prime factor(s) of %d is( are ):", k );
for( j = 2; j < = k; j++ )
if( ( !( k%j ) )&&( IsPrime( j ) ) ) printf( "\n %4d", j );
printf("\n");
}
(2011年2月)
解析: 本题的考核点是C语言中算术运算符的用法以及输入输出语句和break
语句的使用。
题中第一个空填"%":"%"为模运算符,或称求余运算符,%两侧均应为整型
数据。只有当"n%i==0"时,循环才继续执行。
题中第二个空填"break":break语句用来从循环体内跳出循环体,即提前结束
循环,接着执行循环下面的语句。
题中第三个空填"&k":scanf函数为格式输入函数,其一般形式为:
scanf(格式控制,地址表列)
"格式控制"是用双引号括起来的字符串,也称"转换控制字符串"。
"地址表列"是由若干个地址组成的表列,可以是变量的地址,或字符串的首地
址。
答案:【1】% 【2】break 【3】&k
【真题2】 文件modi.c 中程序的功能是:判断两个整数m 和n 是否互质(即是否
有公共的因子)(m≠1,n≠1)。 方法是: 用2 到t(t 取m 和n 中较小的那个
数)之间的数分别去除m 和n,若m 和n 能同时被某个数除尽,则m 和n 不互
质;否则它们互质。
例如,若输入187 和85,则应输出No(表示它们不互质,它们有公因子17)。若
输入89 和187,则应输出Yes(表示它们互质)。
请改正程序中的错误,使它能计算出正确的结果。
注意:
#include < conio.h >#include < stdio.h >int IsThat( int m, int n )
{ int k, t, mk=1;
t=m;
if (m >n) t=n;
/************found**********/
for( k=1; k< =t; k++ )
if( m%k==0 && n%k==0 ){ mk=0; break; }
return( mk );
}
main( )
{ int m, n;
clrscr();
printf( "\nPlease enter 2 numbers:\n" );
/************found**********/
scanf( "&d &d", &m, &n );
if( IsThat( m, n ) )
printf( "Yes\n" );
else
printf( "No\n" );
}
(2011年2月)
解析: 本题的考核点是C语言中for循环语句及scanf函数的使用。
题目要求判断从2 到t之间的数值是否互质,所以IsThat函数的for 循环从1
到t判断m 和n是否互质与题义不符,应该改为"for(k=2;k< =t;k++)"或相
同作用的语句。
scanf函数的格式字符串的前缀是%,而不是&,所以应该把原程序中的
"scanf( "&d &d", &m, &n );"语句改为"scanf( "%d %d", &m, &n );"或相
同作用的语句。
【真题3】 请编写一个函数void fun(char a[],int k,int n),其功能是:删除字符
串规定下标开始的n 个字符。其中,a 指向字符串,k 中存放指定的下标。
例如,字符串内容为:Hellollo World!,k 中的值为:5,n 中的值为:3,则调用
该函数的结果为:Hello World!。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define N 80
void fun(char *a,int k,int n)
{……}
main()
{ char s[N]="Hellollo World!";
int k,n;
printf("\nThe original string:%s\n",s);
printf("Enter index ———————— k: "),scanf("%d",&k);
printf("Enter number to delete —— n: ");scanf("%d",&n);
fun(s,k,n);
printf("\nThe string after deleted: %s\n",s);
}
(2011年2月)
解析: 本题的考核点是删除字符串规定下标开始的n 个字符算法。
提示思路:从指定下标加上n后开始的元素依次放在指定下标开始的位置,来
达到删除的目的。
void fun(char *a,int k,int n)
{int i;i=k;
while (a[i-1]!='\0')/*判断指定要删除的字符是否存在或其后的全部字符是否
已全部前移*/
{ a[i]=a[i+n];
i=i+1;
}
}