计算机二级考试C语言例题(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机⼆级考试C语⾔例题(1)
第⼀套
给定程序的功能是:求⼆分之⼀的圆⾯积,函数通过形参得到圆的半径,函数返回⼆分之⼀的圆⾯积(注:圆⾯积公式为:2,在程序中定义的变量名要与公式的变量相同)。

例如,输⼊圆的半径值:19.527,输出为:s=598.949991。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
double fun( double r)
{
return 3.14159*【1】/2.0;
}
void main()
{
double x;
printf("Enter x: ");
scanf("%lf",【2】);
printf("s=%lf\n",fun(【3】));
}
【参考答案】 (1)r*r (2)&x (3)x
【考点分析】本题考查:圆⾯积计算公式*r*r;scanf( )函数的形式,其⼀般形式为"scanf("格式控制字符串",地址表列);",注意地址是由地址运算符"&"后跟变量名组成的;printf( )函数的形式,其⼀般形式为"printf("
格式控制字符串",输出表列);";函数实参调⽤,函数作
为另⼀个函数调⽤的实际参数出现。

【解题思路】
填空1:计算圆的⾯积,公式为:*r。

填空2:scanf( )函数⼀般形式为scanf(格式控制,地址
表列),因此填⼊&x。

填空3:函数的实际参数是圆的半径x。

下列给定程序中,函数fun的功能是:计算
S=f(-n)+f(-n+1)+…+f(0)+f(1)+f(2)+…f(n)的值。

例如,当n为5时,函数值应为10.407143。

f(x)函数定义
如下:
f(x)=
请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改程序的结构。

试题程序:
#include
#include
#include
#include
/*************found**************/
f(double x)
{
if(x==0.0||x==2.0)
return 0.0;
else if(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
double fun(int n)
{
int i; double s=0.0,y;
for(i=-n; i<=n;i++)
{ y=f(1.0*i); s+=y;}
/*************found**************/
return s
}
void main()
{ system("CLS");
printf("%f\n", fun(5));
}
【参考答案】
(1) 错误:f(double x) 正确:double f(double x)
(2) 错误:return s 正确:return s;
【考点分析】本题考查:函数的定义,其⼀般形式为"类型标识符函数名(形式参数表列)",其中类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的
类型。

【解题思路】
该程序的流程是,fun( )程序对f(n)项循环累加,并且采
⽤条件选择语句计算函数f(x)的值。

本题的错误在于未定义函数f(double x)的返回值类型。

C语⾔规定,在未显式声明的情况下,函数返回值默认为int型。

编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传⼊。

S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
例如,若n的值为11时,函数的值为1.833333。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
#include
float fun(int n)
{
}
void main()
{
FILE *wf;
int n;
float s;
system("CLS");
printf("\nPlease enter N: ");
scanf("%d",&n);
s=fun(n);
printf("The result is:%f\n " , s);
/******************************/
wf=fopen("out.dat","w");
fprintf (wf,"%f",fun(11));
fclose(wf);
/*****************************/
}
【参考答案】
float fun(int n)
{
int i,s1=0; /*定义整型变量s1,表⽰分母*/
float s=0.0; /*定义单精度变量s,表⽰每⼀项*/ for(i=1;i<=n;i++) {
s1=s1+i; /*求每⼀项的分母*/
s=s+1.0/s1; /*求多项式的值*/
}
return s;
}
【考点分析】
本题考查:计算给定表达式的值,根据题意判断表达式为1到n累加倒数之和。

变量数据类型及强制转换操作。

for 循环语句,⼀般情况需要确定循环变量的取值范围。

使⽤return语句完成函数值的返回。

【解题思路】本题可以通过for循环语句来实现第1项到第n项的变
化,然后计算各项的累加和。

⽅法是先根据题⽬要求定义
变量(注意该变量的数据类型),然后对其进⾏初始化操
作,因为该变量⽤作累加器,所以初始值应为0(或0.0,根
据变量数据类型来确定),再通过for循环语句来完成累
加过程。

本题中s1⽤来表⽰式中每⼀项的分母,它可以由前⼀项
的分母加项数得到。

注意:由于s1定义成⼀个整型,所以
在s=s+1.0/s1中不能把1.0写成1。

【解题宝典】
此类计算表达式值的程序,⾸先需要根据题意分析表达
式的规律,得出通项,然后再完成程序语句。

第⼆套
请补充main函数,该函数的功能是:计算两个⾃然数n和
m(m<10000)之间所有数的和(n和m从键盘输⼊)。

例如,当n=1,m=100时,sum=5050;当n=100,m=1000
时,sum=495550。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在main
函数的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
#include
#include
void main()
{
int n,m;
long sum;
【1】;
system("CLS");
printf("\nInput n,m\n");
scanf("%d,%d",&n,&m);
while(n<=m)
{
【2】;
n++;
}
printf("sum=%【3】\n",sum);
}
【参考答案】 (1) sum=0 (2) sum+=n (3) ld
【考点分析】本题考查:变量初始化,需要注意该变量是累加器还是累乘器:printf( )函数,其⼀般形式为
"printf("格式控制符",输出表列)"。

其中,格式控制符
⽤于指定输出格式,可由格式字符串和⾮格式字符串两种组成,格式字符串是以%开头的字符串,在%后⾯跟有各种格式字符,以说明输出数据的类型、形式、长度、⼩数位数等,如"%ld"表⽰按⼗进制长整型输出,⾮格式字符
串在输出时原样照印,在显⽰中起提⽰作⽤。

【解题思路】
填空1:变量sum进⾏了类型声明,但没有进⾏初始化,⽽后⾯的程序⽤sum来存放最后的结果,所以要在使⽤前将sum初始化为0。

填空2:通过while循环将⾃然数n和m之间的数进⾏累加,结果存于sum中。

填空3:由于sum为长整型,所以标准输出函数printf( )
中的格式控制符为"%ld"。

下列给定程序中,fun函数的功能是:根据形参m,计算下
列公式的值:
t=1+1/2+1/3+1/4+…+1/m
例如,若输⼊5,则应输出2.283333。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改
程序的结构。

试题程序:
#include
#include
#include
double fun(int m)
{
double t=1.0;
int I;
for(I=2;I<=m;I++)
/*************found**************/
t+=1.0/k;
/*************found**************/
return I;
}
void main()
{int m;
system("CLS");
printf("\nPlease enter 1integer number: ");
scanf("%d",&m);
printf("\nThe result is %1f\n", fun(m));
}
【参考答案】
(1)错误:t+=1.0/k; 正确:t+=1.0/I;
(2)错误:return I; 正确:return t;
【考点分析】
本题考查:for循环语句的循环条件,这类题⽬的⼀般解法是根据题意确定循环变量的取值范围;函数返回值,其⼀般形式为"return 表达式;",该语句的功能是计算表达式的值,并返回给主调函数。

【解题思路】
(1)该题⽬考查分母成等差数列递增的⼀个数学公式,我们先看循环条件for(I=2;I<=m;I++),i从2开始递增到m,所以t的值应该是由
1.0/i的值逐步循环叠加后的结果,⽽不是t+=1.0/k;。

(2)return I;考查对程序的解读能⼒,当循环结束后(由输⼊m的值决定),函数返回当前t的值。

请编写⼀个函数 void fun(char *tt,int pp[]),统计在tt字符串中"a"到"z"26个字母各⾃出现的次数,并依次放在pp所指数组中。

例如,当输⼊字符串abcdefghabcdeabc后,程序的输出结果应该是:3 3 3 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数
fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
void fun(char *tt,int pp[] )
{
}
void main( )
{
FILE *wf;
char aa[1000];
int bb[26], k;
system("CLS");
printf("\nPlease enter a char string : ") ;
scanf("%s",aa);
fun(aa,bb);
for (k=0 ;k<26 ; k++)
printf("%d ",bb[k]) ;
printf("\n ");
/******************************/
wf=fopen("out.dat","w");
fun ("abcdefgabcdeabc",bb) ;
for (k=0 ;k<26 ; k++)
fprintf(wf,"%d ",bb[k]) ;
fclose(wf);
/*****************************/
}
【参考答案】
void fun(char *tt, int pp[]) {
int i;
for (i=0;i<26;i++)
pp[i]=0;
while (*tt)
{
switch (*tt)
{
case ‘a’: pp[0]++;break; case ‘b’: pp[1]++;break; case ‘c’: pp[2]++;break; case ‘d’: pp[3]++;break; case ‘e’: pp[4]++;break; case ‘f’: pp[5]++;break; case ‘g’: pp[6]++;break; case ‘h’: pp[7]++;break; case ‘i’: pp[8]++;break; case ‘j’: pp[9]++;break; case ‘k’: pp[10]++;break; case ‘l’: pp[11]++;break; case ‘m’: pp[12]++;break; case ‘n’: pp[12]++;break; case ‘o’: pp[14]++;break; case ‘p’: pp[15]++;break; case ‘q’: pp[16]++;break; case ‘r’: pp[17]++;break; case ‘s’: pp[18]++;break; case ‘t’: pp[19]++;break; case ‘u’: pp[20]++;break; case ‘v’: pp[21]++;break; case ‘w’: pp[22]++;break; case ‘x’: pp[23]++;break; case ‘y’: pp[24]++;break; case ‘z’: pp[25]++;break;
}
tt++;
}
}
【考点分析】
本题考查:统计⼩写字母在指定字符串中出现次数。

for
循环语句,需要注意循环变量的取值范围。

if条件语句要
注意条件表达式的判定。

【解题思路】
第1个循环的作⽤是初始化数组pp,未经赋值变量的量为
⼀个不确定数字。

由于它要将'a'到'z'26个字母的个数
依次放到数组pp中,即'a'的个数存于pp[0]中,'b'的个数存于pp[1]中,'c'的个数存于pp[2]中,…,依此类推,⽽'a'-'a'的值正好为0,'b'-
'a'的值为1,'c'- 'a' 的值为2,…,依此类推。

任⼀个⼩写字母减去'a'后所得结果正好是它对应的下标,所以就有了pp[*tt-'a']++,但*tt必须是⼩写字母,即if( )不应省略。

第三套
给定程序的功能是:判断字符ch是否与串str中的某个字符相同,若相同什么也不做,若不同则插在串的最后。

注意:部分源程序给出如下。

请勿改动函数main和其他函数中的任何内容,仅在横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
#include
void fun (char *str,char ch)
{
while (*str &&*str !=ch) str++;
if(*str【1】ch)
{ str[0]=ch;
【2】=0;
}
}
void main()
{char s[81],c;
system("CLS"); printf("\nPlease enter a string : ");
gets(s);
printf("\n Please enter the character to search :
");
c=getchar();
fun(【3】);
printf("\nThe result is %s\n",s);
}
【参考答案】 (1) != (2) str[1]或*(str+1) (3) s,c
【考点分析】本题考查:if语句,⼀般掌握条件表达式的判定。

函数的调⽤,其⼀般形式为"函数名(实际参数表)"。

【解题思路】
填空1:根据题意"若相同什么也不做",则应填⼊
!=
填空2:若不同则插在串的最后,那么0就在字符串的倒数第⼆了。

填空3:函数传递的参数为输⼊的两个字符串,则填⼊s,c。

下列给定程序中,函数fun的功能是:分别统计字符串中⼤写字母和⼩写字母的个数。

例如,给字符串s输
⼊:AaaaBBb123CCccccd,则应输出结
果:upper=5,lower=9。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改程序的结构。

试题程序:
#include
#include
/*********found***********/
void fun(char *s,int a,int b)
{
while(*s)
{
/*********found***********/
if(*s>='A' && *s<='Z')
a++;
/*********found***********/
if(*s>='a' && *s<='z')
b++;
s++;
}
}
main()
{
char s[100];
int upper=0,lower=0;
printf("\nplease a string :");
gets(s);
fun(s,&upper,&lower);
printf("\n upper=%d
lower=%d\n",upper,lower);
}
【参考答案】
(1) 错误:void fun(char *s, int a, int b)
正确:void fun(char *s, int *a, int *b)
(2)错误:a++; 正确:(*a)++;
(3)错误:b++; 正确:(*b)++;
【考点分析】
本题考查:函数的参数传递和指针变量,理解指针变量作为函数的参数,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型,它的作⽤是将⼀个变量的地址传送到另⼀个函数中。

【解题思路】
(1)根据题中程序可以看出,函数fun传递的是地址,那么,在函数中就应该出现指针,所以改为void fun (char
*s ,int *a, int *b)。

(2)和(3)很明显,这⾥是要累加数值,因为a、b是指针变量,所以是错误的。

请编写函数fun,它的功能是:求出ss所指字符串中指定
字符的个数,并返回此值。

例如,若输⼊字符串123412132,输⼊字符1,则输出3。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
#define M 81
int fun(char *ss, char c)
{
}
void main()
{
FILE *wf;
char a[M], ch;
system("CLS");
printf("\nPlease enter a string: ");
gets(a);
printf("\nPlease enter a char: ");
ch=getchar();
printf("\nThe number of the char is: %d\n", fun(a,ch)); /******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("123412132",'1'));
fclose(wf);
/*****************************/
}
【参考答案】
int fun(char *ss, char c)
{
int i=0; for(;*ss!='\0';ss++)
if(*ss==c)
i++;
/*求出ss所指字符串中指定字符的个数*/
return i;
}
【考点分析】
本题考查:字符串结束标识'\0';for循环语句,如何遍历
字符串;通过if条件语句,判断是否相同。

【解题思路】
从字符串ss中找出⼦字符串的⽅法是:从第1个字符开始,对字符串进⾏遍历;若ss串的当前字符等于t串的第
1个字符,两字符串的指针⾃动加1,继续⽐较下⼀个字符;若⽐较⾄字符串的结尾,则跳出循环;若ss串的字符和c 串的字符不对应相同,则继续对ss串的下⼀个字符进⾏处理。

本程序是采⽤逐⼀⽐较的⽅式找出出现的次数。

循环的作⽤是在串中从左到右逐⼀⾛动,if( )的作⽤是
进⾏判断是否相同,若与c相同,则表⽰⼜出现⼀次。

第四套
请补充函数fun,该函数的功能是:把ASCII码为偶数的字符从字符串str中删除,结果仍然保存在字符串str中,
字符串str从键盘输⼊,其长度作为参数传⼊函数fun。

例如,输⼊"abcdef",输出"ace"。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
#include
#define N 80
【1】
{
int i, j;
【2】;
for (i=0;i
{
if(s[i]%2!=0)
s[j++]=s[i];
}
【3】;
}
void main()
{
int i=0, strlen=0;
char str[N];
system("CLS");
printf("\nInput a string:\n");
gets(str);
while(str[i]!='\0')
{
strlen++;
i++;
}
fun(str, strlen);
printf("\n*** display string ***\n");
puts (str);
}
【参考答案】
(1) void fun(char s[],int n)
(2) j=0
(3) s[j]='\0'
【考点分析】
本题考查:函数定义,需要确定类型标识符、函数名和形式参数。

变量初始化,变量声明后,要进⾏初始化赋值,我们对变量进⾏初始化时,必须确定好变量的作⽤。

字符串结束标识'\0',⽤来结束字符串,是经常考查的知识点。

【解题思路】
填空1:由main函数调⽤函数fun的格式可以知道,函数fun没有返回值,第⼀个参数是字符数组,第⼆个参数是
整型变量。

填空2:变量j声明时,没有初始化,所以在使⽤j之前要
将它初始化为0。

填空3:当把所有ASCII码为偶数的字符都存⼊字符串s
中后,要在最后加上'\0',表⽰字符串的结束。

下列给定程序中函数fun的功能是:计算正整数num各位上的数字之积。

例如,若输⼊252,则输出应该是20。

若输⼊202,则输出应该是0。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改程序的结构。

试题程序:
#include
#include
long fun(long num)
{
/*************found**************/
long k;
do
{
k *=num%10;
/*************found**************/
num \=10;
}while(num);
return(k);
}
main()
{
int n;
printf("\Please enter a number: ");
scanf("%ld",&n);
printf("\n%ld\n",fun(n));
}
【参考答案】
(1)错误:long k; 正确:long k=1; (2)错误:num\=10;正确:num/ =10;【考点分析】
变量初始化,保存乘积的变量初始化为1。

【解题思路】
(1)k⽤来存放各位数字的积,初值应为1。

(2)这⾥是⼀个符号错误,除号使⽤"/"来表⽰的。

请编写⼀个函数fun,它的功能是:求出1到m(含m)之内
能被7或11整除的所有整数放在数组a中,通过n返回
这些数的个数。

例如,若传给m的值为50,则程序输出:
7 11 14 21 22 28 33 35 42 44 49
注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
#define M 100
void fun(int m, int *a, int *n)
{
}
void main()
{
FILE *wf;
int aa[M],n,k;
system("CLS");
fun(50,aa,&n);
for(k=0;k
if((k+1)%20==0) /*每⾏输出20个数*/
{printf("%4d",aa[k]);
printf("\n");
}
else
printf("%4d",aa[k]);
printf("\n");
/******************************/
wf=fopen("out.dat","w");
for(k=0;k
fprintf(wf,"%4d",aa[k]);
fclose(wf);
/*****************************/
}
【参考答案】
void fun(int m, int *a, int *n)
{
for(i=1;i<=m;i++)
if(i%7==0||i%11==0)
/*求出1到m(含m)之内能被7或11整除的所有整数放
在数组a中*/
a[j++]=i;
*n=j; /*返回这些数的个数*/
}
【考点分析】
本题考查:整除的判断⽅法,⽤%对除数求余,若余数为0,表⽰能被整除。

if语句条件表达式,注意"逻辑与"和"逻辑或"的区别。

for循环语句,注意循环变量的取值范围。

⼀维数组的定义与引⽤。

【解题思路】
本题要找出能被7或11整除的所有整数,注意数学中的"或"和C语⾔中的"或"的区别,在此处,if条件语句中⽤"||"运算符,若要找能同时被7和11整除的所有整数,则
在if( )中,应⽤"&&"运算符。

第五套
请补充函数fun,该函数的功能是:判断某⼀个年份是否为闰年。

例如,1900年不是闰年,2004是闰年。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
#include
#include
int fun(int n)
{
int flag=0;
if(n%4==0)
{
if (【1】)
}
if (【2】)
flag=1;
return【3】;
}
void main()
{
int year;
system("CLS");
printf("Input the year:");
scanf("%d",&year);
if (fun(year))
printf("%d is a leap year. \n",year);
else
printf("%d is not a leap year.\n",year);
}
【参考答案】
(1) n%100!=0或n%100
(2) n%400==0 (3) flag
【考点分析】本题考查:判断闰年的算法,年份能被4整除但不能被100整除,或者年份能被400整除。

return语句,负责将函数
值返回给主调函数。

⼀般情况下,flag在C语⾔中作为⼀
种标志来使⽤,本书中有多个题⽬都使⽤了flag标志。

【解题思路】
填空1:判断闰年的⽅法是,年份能被4整除但不能被100
整除,或者年份能被400整除。

n不能被100整除,即对
100取余⾮零。

填空2:能被400整除的年份也是闰年,n能被400整除,
即对400取余为零。

填空3:flag标记年份n是否为闰年,当flag为1时,是
闰年,当flag为0时,不是闰年。

下列给定程序中函数fun的功能是:计算n!。

例如,给n
输⼊5,则输出120.000000。

请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改
程序的结构。

试题程序:
#include
#include
double fun(int n)
{ double result =1.0;
/*************found**************/
if n==0
return 1.0;
while(n>1&&n<170)
/*************found**************/
result=n--;
return result;
}
void main()
{
int n;
printf("Input N:");
scanf("%d",&n);
printf("\n\n%d!=%lf\n",n,fun(n));
}
【参考答案】
(1)错误:if n==0 正确:if(n==0)
(2)错误:result =n--; 正确:result *=n--;
【考点分析】
本题考查:if语句,⼀般情况下,需要根据题⽬要求确定
条件表达式的内容,同时需要注意其格式。

计算阶乘的⽅法,n!=n*(n-1)!。

请编写函数fun,其功能是:将两个两位数的正整数a、b
合并成⼀个整数放在c中。

合并的⽅式是:将a数的⼗位和个位数依次放在c数的⼗位和千位上,b数的⼗位和个位数依次放在c数的个位和百位上。

例如,当a=45,b=12,调⽤该函数后,c=5241。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数
fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
void fun(int a ,int b,long *c)
{
}
void main()
{
int a,b;
long c;
FILE *out;
printf("Input a ,b: ");
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is :%ld\n",c);
/******************************/
out=fopen("out.dat","w");
fun(a+11,b+22,&c);
fprintf(out,"%ld\n",c);
fclose(out);
/******************************/
}
【参考答案】
void fun(int a,int b,long *c)
{
*c=(a%10)*1000+(b%10)*100+(a/10)*10+b/10; }
【考点分析】
本题考查:如何取出数值n的各个位,主要是考查'%'和'/'的交换使⽤。

两个整型数相除,'/'⽤来求得数的整数部分,'%'⽤来求余数。

【解题思路】
本题中主要的问题是怎么取出a和b的个位数和⼗位数,取出后怎么表⽰成c中相应的位数。

由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的⼗位数,分别⽤10对它们求余可得到它们的个位数。

得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、⼗位数和个位数。

注意:使⽤c时要进⾏指针运算。

第六套
请补充函数fun,函数fun的功能是求n的阶乘。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
long fun(int n)
{
if (【1】)
return(n*fun(【2】));
return【3】;
} void main()
{
printf("10!=%ld\n",fun(10));
}
【参考答案】
(1)n>1或1
【考点分析】
本题考查:if语句条件表达式,这类题⽬⼀般解法是根据
题意确定表达式的值,如果表达式的值为真,则执⾏下⾯
的语句;如果值为假,则不执⾏该语句。

递归算法的掌握,
递归是指函数/过程/⼦程序在运⾏过程序中直接或间接
调⽤⾃⾝⽽产⽣的重⼊现象。

【解题思路】
填空1:求阶乘时,采⽤递归的算法,n>1和n==1这两种情
况的处理⽅法不同,需要分开考虑。

填空2:阶乘的算法是,当n>1时,n!=n*(n-1)!,即
fun(n)=n*fun(n-1)。

填空3:n==1是递归的终⽌条件,返回值为1。

下列给定的程序中,函数fun的功能是:计算并输出k以
内最⼤的10个能被13或17整除的⾃然数之和。

k的值
由主函数传⼊,若k的值为500,则函数的值为4622。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改
程序的结构。

试题程序:
#include
#include
#include
int fun(int k)
{ int m=0,mc=0, j;
while((k>=2)&&(mc<10))
{
/*************found**************/
if((k%13=0)||(k%17=0))
{ m=m+k;mc++;}
k--;
/*************found**************/
return m;
}
void main()
{system("CLS");
printf("%d\n ",fun(500));
}
【参考答案】
(1 )错误:if((k%13=0)||(k%17=0))
正确:if((k%13==0)||(k%17==0))
(2 )错误:缺少⼤括号正确:加 }
【考点分析】
本题考查:if语句,这类题⽬的⼀般解法是根据题意确定if语句的条件表达式,区别逻辑表达式和算术表达式。

同时注意c语⾔书写程序应遵守的规则。

【解题思路】
(1)x能被y整除的表⽰⽅法是x%y==0,⽽并⾮像题⽬中所表⽰的x%y=0。

所以,if((k%13=0)||(k%17=0))修改后的结果应该是答案所⽰信息。

(2)缺少程序完整所需的"}",此类信息在做题时⼀定要
注意,我们可以在做题前先运⾏⼀下程序,这样明显的错误⼀般都会有错误信息显⽰出来,⽐如丢失"}"的错误信息是"Compound statement missing } in function fun",并在当前错误处停⽌光标,我们只要按回车键进⾏编辑就可以了。

请编写函数fun,它的功能是计算:
s=(ln(1)+ln(2)+ln(3)+…+ln(m))
0.5
在C语⾔中可调⽤log(n)函数求ln(n)。

例如,若m的值为20,则fun函数值为6.506583。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
#include
double fun(int m)
{
}
void main()
{
FILE *wf;
system("CLS");
printf("%f\n ",fun(20));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(20));
fclose(wf);
/*****************************/
}
【参考答案】
double fun(int m)
{
int i;
double s=0.0;
for(i=1;i<=m;i++)
s=s+log(i);
return sqrt(s);
/*计算s=ln(1)+ln(2)+ln(3)+…+ln(m)*/
/*对s求平⽅根并返回*/
}
【考点分析】
计算表达式的值,⼀般都要定义⼀个变量sum作为累加(乘器),加法运算时赋初值为0,乘法运算时,赋初值为1,然后利⽤循环语句,使sum进⾏累加或累乘。

【解题思路】
题⽬要求计算从1到m的对数的和,可⽤从1到m的循环,
每次循环都累加求和。

该题需要注意之处是,log( )函数
的形式参数应当为double型变量,⽽⽤于循环的基数变
量为整数,需要进⾏强制转换,在返回的时候求出平⽅
根。

第七套
请补充函数fun,该函数的功能是:整除x且是偶数的数,
把这些数保存在数组bb中,并按从⼤到⼩的顺序输出。

例如当x=20时,依次输出:20 10 4 2。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数
fun的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
#include
#include
void fun(int k,int bb[])
{
int I;
int j=0;
for(【1】;I<=k;I++)
{
if(【2】)
bb[j++]=I;
}
printf("\n\n");
for(I=【3】;I>=0;I--)
printf("%d ",bb[I]);
}
void main()
{
int k=1;
int bb[100];
system("CLS");
printf("\nPlease input X=");
scanf("%d",&k);
fun(k,bb);
}
【参考答案】(1)i=1 (2)k%i==0&&i%2==0 (3)--j或j-1【考点分析】本题考查:for循环语句的循环初值,根据
题意确定循环变量取值范围。

if语句的条件表达式,根据题意确定条件表达式,本题的条件表达式应该既满⾜整除⼜满⾜偶数的条件。

【解题思路】
填空1:为了求出能整除k,且是偶数的数,寻找范围是从1到k。

填空2:如果i能整除k,则k对i求余为0,如果i为偶数,
则i对2求余为0,由于这两个条件要同时满⾜,所以要使⽤"与"运算符"&&"。

填空3:由于数组bb[]中的数是按从⼩到⼤的顺序排列的,⽽题⽬要求按从⼤到⼩输出,所以从数组的最后⼀个元素开始,依次输出。

因为在for循环中,变量j多加了⼀次,所以这⾥要将j减1,得到数组最后⼀个元素的下标。

下列给定程序中,函数fun()的功能是:根据整型形参m的值,计算如下公式的值:
请改正函数fun()中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增⾏或删⾏,也不得更改程序的结构。

试题程序:
#include
#include
#include
double fun(int m)
{double y=1.0;
int I;
/*************found**************/
for(I=2;I
/*************found**************/
y-=1/(I*I);
return(y);
}
void main()
{int n=5;
system("CLS");
printf("\nThe result is %1f\n", fun(n));
}
【参考答案】
(1)错误:for(i=2;i
正确:for(i=2;i<=m;i++)
(2)错误:y-=1/(i*i);
正确:y-=1.0/(i*i);
【考点分析】
本题考查:for循环语句的循环条件,这类题⽬的⼀般解法是根据题意确定循环变量的取值范围。

变量数据类型的强制转换,是通过类型转换运算来实现的。

⼀般形式为:"(类型说明符) (表达式)",其功能是把表达式的运算结果强制转换成类型说明符所表⽰的类型。

【解题思路】
该题是⼀道简单的计算题,循环条件for(i=2;i
例如:
(float) a 把a转换为实型
(int)(x+y) 把x+y的结果转换为整型
编写函数fun,它的功能是:求n以内(不包括n)同时能被5与11整除的所有⾃然数之和的平⽅根s,并作为函数值返回。

例如,n为1000时,函数值应为s=96.979379。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填⼊所编写的若⼲语句。

试题程序:
#include
#include
#include
#include
double fun(int n)
{
}
void main()
{
FILE *wf;
system("CLS");
printf("s=%f\n", fun(1000));
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(1000));
fclose(wf);
/*****************************/
}
【参考答案】
double fun(int n)
{double s=0.0;
int i;
for(i=0;i
/*从0 n中找到既能被5整除同时⼜能被11整除的数,
并将这些数求和*/
if(i%5==0&&i%11==0)
s=s+i;
s=sqrt(s); /*对s求平⽅根*/
return s;
}
【考点分析】
本题考查:整除判定后求和、再对求和结果求平⽅根运算;变量数据类型,求和时变量如何初始化;整除的⽅法;if
条件语句及"逻辑与"运算;sqrt( )平⽅根函数的应⽤。

【解题思路】
本题的解题思路是逐个取得从0到n之间的数,对每次取
得的数进⾏条件判断,条件是既能被5整除⼜能被11整除,注意这两个条件要求同时成⽴,因此⽤到了"&&"运算符。

若满⾜条件,该数就被累加到s中去,求出所有符合
条件的数后,⽤sqrt( )函数(包含于头⽂件中)
对s求平⽅根。

第⼋套
请补充函数fun,它的功能是:计算并输出n(包括n)以内所有能被3或7整除的⾃然数的倒数之和。

例如,在主函数中从键盘给n输⼊30后,输出
为:s=1.226323。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填⼊所编写的若⼲表达式或语句。

试题程序:
#include
double fun(int n)
{
int I;
double sum=0.0;
for(I=1;【1】;I++)
if(I%3==0【2】I%7==0)
sum+=【3】/I;
return sum;
}
void main()
{
int n;
double s;
printf("\nInput n:");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n",s);
}
【参考答案】
(1)i<=n (2)|| (3)1.0或(double)1
【考点分析】
本题考查:for循环语句的循环条件,这类题⽬的⼀般解法是根据题意确定循环变量的取值范围。

if语句的条件
表达式,这类题⽬的⼀般解法是确定条件表达式的内容。

变量数据类型的强制转换,由强制转换运算符完成该转
换操作。

【解题思路】
填空1:本题要求找出n(包括n)以内满⾜条件的⾃然数,所以,i 的取值范围是从1到n 。

填空2:i 能被3整除,也就是指,i 除以3的余数为0。

题中的条件是能被3或7整除,所以使⽤逻辑或运算符
"||"。

填空3:需要注意,如果"/"运算符两边都是整型数,则结果也是整型数。

因为i 为整型数,如果将i 的倒数写为1/i,则结果为0,所以在求倒数时,要使⽤1.0,⽽不是1,或者将变量i 强制类型转化为double 型。

在主函数中从键盘输⼊若⼲个数放⼊数组中,⽤0结束输⼊并放在最后⼀个元素中。

下列给定程序中,函数fun 的功能是:计算数组元素中值为正数的平均值(不包括0)。

例如,数组中元素的值依次为39,-47,21,2,-8,15,0,则程序的运⾏结果为19.250000。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增⾏或删⾏,也不得更改程序的结构。

试题程序:
#include #include double fun(int x[]) {
/*************found**************/ int sum=0.0;
int c=0, I=0; while(x[I]!=0) {
if(x[I]>0) { sum+=x[I]; c++; } I++; }
/*************found**************/ sum=sum\c; return sum; }
void main() {
int x[1000]; int i=0; system("CLS");
printf("\nPlease enter some data(end with 0) :"); do {
scanf("%d",&x[i]);
}while(x[i++]!=0); printf("%f\n",fun(x)); }
【参考答案】
(1)错误:int sum=0.0; 正确:double sum=0.0; (2)错误:sum\=c;正确: sum/=c; 【考点分析】
本题考查:变量的数据类型,区别int 整型和double 双精度型;除法运算符"/"。

【解题思路】
(1)定义变量错误。

(2)C 语⾔中的除法运算符是"/"。

请编写函数fun,其功能是:将所有⼤于1⼩于整数m 的⾮素数存⼊xx 所指数组中,⾮素数的个数通过k 传回。

例如,输⼊17,则应输出4 6 8 9 10 12 14 15 16。

注意:部分源程序给出如下。

请勿改动main 函数和其他函数中的任何内容,仅在函数fun 的花括号中填⼊所编写的若⼲语句。

试题程序: #include #include #include
void fun(int m, int *k, int xx[]) { }
void main() {
FILE *wf;
int m, n, zz[100];
system("CLS");。

相关文档
最新文档