二级C语言上机100题带解析_第1页
二级C语言上机100题带解析_第2页
二级C语言上机100题带解析_第3页
二级C语言上机100题带解析_第4页
二级C语言上机100题带解析_第5页
已阅读5页,还剩382页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一套

给定程序的功能是:求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分

之一的圆面积(注:圆面积公式为⑵在程序中定义的变量名要与公式的变量相同)。

例如,输入圆的半径值:19.527,输出为:s=598.9499910

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

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

语句。

试题程序:

ttinclude<stdio.h>

doublefun(doubler)

(

return3.14159*[1]/2.0;

}

voidmain()

{

doublex;

printf("Enterx:");

scanf[2]);

printf("s=%lf\n”,fun([3]));

)

【参考答案】(Dr*r(2)&x(3)x

【考点分析】本题考查:圆面积计算公式*r*r;scanf()函数的形式,其一般形式为"scanf("

格式控制字符串”,地址表列);",注意地址是由地址运算符后跟变量名组成的;printf()

函数的形式,其一般形式为"printf("格式控制字符串",输出表列);";函数实参调用,函数作

为另一个函数调用的实际参数出现。

【解题思路】

填空1:计算圆的面积,公式为:*r。

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

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

下列给定程序中,函数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<stdlib.h>

#include<conio.h>

#include<stdio.h>

#include<math.h>

/*************found**************/

f(doublex)

{

if(x==0.01|x==2.0)

return0.0;

elseif(x<0.0)

return(x-1)/(x-2);

else

return(x+l)/(x-2);

}

doublefun(intn)

(

inti;doubles=0.0,y;

for(i=-n;i<=n;i++)

{y=f(1.0*i);s+=y;}

/*************found**************/

returns

)

voidmain()

{system(〃CLS〃);

printf(〃%f\n〃,fun(5));

)

【参考答案】

(1)错误:f(doublex)正确:doublef(doublex)

(2)错误:returns正确:returns;

【考点分析】本题考查:函数的定义,其一般形式为〃类型标识符函数名(形式参数表列)〃,

其中类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。

【解题思路】

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

本题的错误在于未定义函数f(doublex)的返回值类型。C语言规定,在未显式声明的情况下,

函数返回值默认为int型。

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

参传入。

S=l+l/(l+2)+1/(1+2+3)+…+1/(1+2+3+…+n)

例如,若n的值为11时,函数的值为1.833333。

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

#include<string.h>

^include<stdlib.h>

floatfun(intn)

}

voidmain()

(

FILE*wf;

intn;

floats;

system(〃CLS〃);

printf(^XnPleaseenterN:");

scanf(〃%d〃,&n);

s=fun(n);

printf("Theresultis:%f\n〃,s);

wf=fopen(,,out.dat〃,〃w〃);

fprintf(wf,〃%f〃,fun(ll));

fclose(wf);

)

【参考答案】

floatfun(intn)

(

inti,sl=0;/*定义整型变量si,表示分母*/

floats=0.0;/*定义单精度变量s,表示每一项*/

for(i=l;i<=n;i++){

sl=sl+i;/*求每一项的分母*/

s=s+l.O/sl;/*求多项式的值*/

}

returns;

}

【考点分析】

本题考查:计算给定表达式的值,根据题意判断表达式为1到n累加倒数之和。变量数据类型

及强制转换操作。for循环语句,一般情况需要确定循环变量的取值范围。使用return语句

完成函数值的返回。

【解题思路】

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

先根据题目要求定义变量(注意该变量的数据类型),然后对其进行初始化操作,因为该变量

用作累加器,所以初始值应为0(或0.0,根据变量数据类型来确定),再通过for循环语句来完

成累加过程。

本题中si用来表示式中每一项的分母,它可以由前一项的分母加项数得到。注意:由于si

定义成一个整型,所以在s=s+l.0/sl中不能把1.0写成1。

【解题宝典】

此类计算表达式值的程序,首先需要根据题意分析表达式的规律,得出通项,然后再完成程序

语句。

第二套

请补充main函数,该函数的功能是:计算两个自然数n和m(m<10000)之间所有数的和

(n和m从键盘输入)。

例如,当n=l,m=100时,sum=5050;当n=100,m=1000时,sum=495550o

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

请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若

干表达式或语句。

试题程序:

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

voidmain()

intn,m;

longsum;

[1];

system("CLS");

printf(,z\nlnputn,m'n");

scanf(/z%d,%d",&n,&m);

while(n<=m)

(

[2];

n++;

)

printf(,zsum=%[3]\n",sum);

)

【参考答案】(1)sum=O(2)sum+=n(3)Id

【考点分析】本题考查:变量初始化,需要注意该变量是累加器还是累乘器:printf()函数,

其一般形式为"printf(〃格式控制符”,输出表列),其中,格式控制符用于指定输出格式,可

由格式字符串和非格式字符串两种组成,格式字符串是以%开头的字符串,在外后面跟有各种

格式字符,以说明输出数据的类型、形式、长度、小数位数等,如%Id”表示按十进制长整型

输出,非格式字符串在输出时原样照印,在显示中起提示作用。

【解题思路】

填空1:变量sum进行了类型声明,但没有进行初始化,而后面的程序用sum来存放最后的结

果,所以要在使用前将sum初始化为0。

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

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

下列给定程序中,fun函数的功能是:根据形参m,计算下列公式的值:

t=l+l/2+l/3+l/4+—+l/m

例如,若输入5,则应输出2.283333,

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

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

试题程序:

^include<stdlib.h>

ttinclude<conio.h>

ttinclude<stdio.h>

doublefun(intm)

(

doublet=l.0;

intI;

for(1=2;K=m;I++)

/*************found**************/

t+=l.0/k;

/*************found**************/

returnI;

}

voidmain()

{intm;

system("CLS");

printf("\nPleaseenter1integernumber:");

scanf("%d",&m);

printf(,z\nTheresultis%lf\n”,fun(m));

}

【参考答案】

(1)错误:t+=l.0/k;正确:t+=1.0/I;

(2)错误:returnI;正确:returnt;

【考点分析】

本题考查:for循环语句的循环条件,这类题目的一般解法是根据题意确定循环变量的取值

范围;函数返回值,其一般形式为"return表达式二该语句的功能是计算表达式的值,并返

回给主调函数。

【解题思路】

⑴该题目考查分母成等差数列递增的一个数学公式,我们先看循环条件

for(1=2;1cm;I++),i从2开始递增到m,所以t的值应该是由1.0/i的值逐步循环叠加后的

结果,而不是t+=L0/k;。

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

的值。

请编写一个函数voidfun(char*tt,intpp口),统计在tt字符串中"a"到"z"26个字

母各自出现的次数,并依次放在pp所指数组中。

例如,当输入字符串abcdefghabcdeabc后,程序的输出结果应该是:333221110

000000000000000000

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

ttinclude<conio.h>

^include<stdio.h>

ttinclude<stdlib.h>

voidfun(char*tt,intpp[])

)

voidmain()

{

FILE*wf;

charaa[1000];

intbb[26],k;

system(,,CLS,/);

printf(,z\nPleaseenteracharstring:〃);

scanf(〃%s〃,aa);

fun(aa,bb);

for(k=0;k<26;k++)

printf(z,%dz,,bb[k]);

printf(,z\n〃);

wf=fopen(,zout.dat〃,〃w〃);

fun(//abcdefgabcdeabc,,,bb);

for(k=0;k<26;k++)

fprintf(wf,,z%d”,bb[k]);

fclose(wf);

)

【参考答案】

voidfun(char*tt,intpp[])

(

inti;

for(i=0;i<26;i++)

Pp[i]=0;

while(*tt)

(

switch(*tt)

(

case匕':pp[0]++;break;

case廿:pp[l]++;break;

case:pp[2]++;break;

casedpp[3]++;break;

case<e,pp[4]++;break;

casefpp[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'1'pp[l1]++;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[l]

中,‘c'的个数存于pp[2]中,…,依此类推,而‘a'-a'的值正好为0,'b'-'a'的值为

'a'的值为2,…,依此类推。任一个小写字母减去'a'后所得结果正好是它对应的下标,所以

就有了pp[*tt-'a']++,但*tt必须是小写字母,即if()不应省略。。

第三套

给定程序的功能是:判断字符ch是否与串str中的某个字符相同,若相同什么也不做,

若不同则插在串的最后。

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

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

语句。

试题程序:

ttinclude<stdio.h>

ttinclude<string.h>

voidfun(char*str,charch)

(

while(*str&&*str!=ch)str++;

if(*str[1]ch)

{str[0]=ch;

[2]=0;

)

}

voidmain()

{chars[81],c;

system(Z,CLS,/);

printf('\nPleaseenterastring:");

gets(s);

printf(z/\nPleaseenterthecharactertosearch:");

c=getchar();

fun([3]);

printf(w\nTheresultis%s\n”,s);

)

【参考答案】⑴!=(2)str⑴或*(str+l)(3)s,c

【考点分析】本题考查:if语句,一般掌握条件表达式的判定。函数的调用,其一般形式为"

函数名(实际参数表)”。

【解题思路】

填空1:根据题意"若相同什么也不做”,则应填入!=。

填空2:若不同则插在串的最后,那么0就在字符串的倒数第二了。

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

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

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

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

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

试题程序:

#include<conio.h>

#include<stdio.h>

/*********fourid***********/

voidfun(char*s,inta,intb)

|

while(*s)

(

/*********fourid***********/

if(*s>='A'&&*s<='Z')

a++;

/*********found***********/

if(*s>='a'&&*s<='z')

b++;

s++;

)

}

main()

(

chars[100];

intupper=0,lower=0;

printf(,z\npleaseastring:〃);

gets(s);

fun(s,&upper,felower);

printf(,z\nupper=%dlower=%d\n,/,upper,lower);

)

【参考答案】

(1)错误:voidfun(char*s,inta,intb)

正确:voidfun(char*s,int*a,int*b)

⑵错误:a++;正确:(*a)++;

⑶错误:b++;正确:(*b)++;

【考点分析】

本题考查:函数的参数传递和指针变量,理解指针变量作为函数的参数,函数的参数不仅可以

是整型、实型、字符型等数据,还可以是指针类型,它的作用是将一个变量的地址传送到另一

个函数中。

【解题思路】

(1)根据题中程序可以看出,函数fun传递的是地址,那么,在函数中就应该出现指针,所以改

为voidfun(char*s,intint*b)。

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

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

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

ttinclude<conio.h>

#include<stdio.h>

#include<stdlib.h>

#defineM81

intfun(char*ss,charc)

(

)

voidmain()

(

FILE*wf;

chara[M],ch;

system(〃CLS〃);

printf(,z\nPleaseenterastring:〃);

gets(a);

printf(,z\nPleaseenterachar:〃);

ch=getchar();

printf(,z\nThenumberofthecharis:%d\n,z,fun(a,ch));

wf=fopen(,zout.dat〃,〃w");

fprintf(wf,〃%d〃,fun(“123412132〃,'1'));

fclose(wf);

【参考答案】

intfun(char*ss,charc)

inti=0;

for(;*ss!='\0':ss++)

if(*ss==c)

i++;

/*求出ss所指字符串中指定字符的个数*/

returni;

}

【考点分析】

本题考查:字符串结束标识'\0';for循环语句,如何遍历字符串;通过if条件语句,判断

是否相同。

【解题思路】

从字符串SS中找出子字符串的方法是:从第1个字符开始,对字符串进行遍历;若SS串的当

前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字

符串的结尾,则跳出循环;若SS串的字符和C串的字符不对应相同,则继续对SS串的下一个

字符进行处理。本程序是采用逐一比较的方式找出出现的次数。循环的作用是在串中从左到

右逐一走动,if()的作用是进行判断是否相同,若与C相同,则表示又出现一次。

第四套

请补充函数fun,该函数的功能是:把ASCII码为偶数的字符从字符串str中删除,结果

仍然保存在字符串str中,字符串str从键盘输入,其长度作为参数传入函数fun。

例如,输入"abcdef",输出"ace”。

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若

干表达式或语句。

试题程序:

ttinclude<stdlib.h>

ttinclude<stdio.h>

#defineN80

[1]

{

inti,j;

[2];

for(i=0;i<n;i++)

if(s[i]%2!=0)

s[j++]=s[i];

)

[3];

}

voidmain()

{

inti=0,strlen=0;

charstr[N];

system("CLS");

printfC\nlnputastring:\nz,);

gets(str);

while(str[i]!='\0")

(

strlen++;

i++;

)

fun(str,strlen);

printf("\n***displaystring***\n");

puts(str);

)

【参考答案】

(1)voidfun(chars[],intn)

(2)j=0

⑶s[j]=,\(r

【考点分析】

本题考查:函数定义,需要确定类型标识符、函数名和形式参数。变量初始化,变量声明后,

要进行初始化赋值,我们对变量进行初始化时,必须确定好变量的作用。字符串结束标识

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

【解题思路】

填空1:由main函数调用函数fun的格式可以知道,函数fun没有返回值,第一个参数是字符

数组,第二个参数是整型变量。

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

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

串的结束。

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

252,则输出应该是20o若输入202,则输出应该是0。

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

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

试题程序:

#include<stdio.h>

#include<conio.h>

longfun(longnum)

(

/*************found**************/

longk;

do

(

k*=num%10;

/*************found**************/

num\=10;

}while(num);

return(k);

}

main()

(

intn;

printf(^XPleaseenteranumber:〃);

scanf(,z%ld,z,&n);

printf("\n%ld\n〃,fun(n));

)

【参考答案】

(1)错误:longk;正确:longk=l;

(2)错误:num\=10;正确:num/=10;

【考点分析】

变量初始化,保存乘积的变量初始化为1。

【解题思路】

(l)k用来存放各位数字的积,初值应为lo

(2)这里是一个符号错误,除号使用〃/〃来表示的。

请编写一个函数fun,它的功能是:求出1到m(含m)之内能被7或11整除的所有整数

放在数组a中,通过n返回这些数的个数。

例如,若传给m的值为50,则程序输出:

711142122283335424449

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

#defineM100

voidfun(intm,int*a,int*n)

(

}

voidmain()

(

FILE*wf;

intaa[M],n,k;

system(〃CLS〃);

fun(50,aa,&n);

for(k=0;k<n;k++)

if((k+l)%20=0)/*每行输出20个数*/

{printf(〃%4d〃,aa[k]);

printf(〃\n〃);

)

else

printf("%4d”,aa[k]);

printfC\nO;

wf=fopen(,zout.dat〃,〃w〃);

for(k=0;k<n;k++)

fprintf(wf,zr%4d,z,aa[k]);

fclose(wf);

}

【参考答案】

voidfun(intm,int*a,int*n)

inti,j=0;

for(i=l;i<=m;i++)

if(i%7==0||i%ll==O)

/*求出1到m(含m)之内能被7或11整除的所有整数放在数组a中*/

a[j++]=i;

*n=j;/*返回这些数的个数*/

}

【考点分析】

本题考查:整除的判断方法,用%对除数求余,若余数为0,表示能被整除。if语句条件表达式,

注意"逻辑与"和"逻辑或"的区别。for循环语句,注意循环变量的取值范围。一维数组的定

义与引用。

【解题思路】

本题要找出能被7或11整除的所有整数,注意数学中的"或''和C语言中的"或”的区别,在此

处,if条件语句中用"II”运算符,若要找能同时被7和11整除的所有整数,则在if()中,应

用"&&”运算符。

第五套

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

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若

干表达式或语句。

试题程序:

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

intfun(intn)

(

intflag=0;

if(n%4==0)

(

if([1])

flag=l;

)

if([2])

flag=l;

return[3];

}

voidmain()

intyear;

system("CLS");

printfClnputtheyear:z/);

scanf&year);

if(fun(year))

printf("%disaleapyear.\n",year);

else

printf(,z%disnotaleapyear.\n/z,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为。时,不是闰年。

下列给定程序中函数fun的功能是:计算n!。例如,给n输入5,则输出120.000000。

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

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

试题程序:

ttinclude<stdio.h>

ttinclude<conio.h>

doublefun(intn)

{doubleresult=1.0;

/*************found**************/

ifn==0

return1.0;

while(n>l&&n<170)

/*************found**************/

result=n--;

returnresult;

}

voidmain()

(

intn;

printf(""InputN:〃);

scanf(〃%d〃,&n);

printf(,,\n\n%d!=%lf\n,z,n,fun(n));

)

【参考答案】

(1)错误:ifn==0正确:if(n=0)

(2)错误:result=n--;正确:result*=n--;

【考点分析】

本题考查:if语句,一般情况下,需要根据题目要求确定条件表达式的内容,同时需要注意其

格式。计算阶乘的方法,n!=n*(n-l)!。

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

并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次

放在c数的个位和百位上。

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

#include<stdio.h>

#include<conio.h>

voidfun(inta,intb,long*c)

(

}

voidmain()

(

inta,b;

longc;

FILE*out;

printf(/zInputa,b:");

scanf("%d%d”,&a,&b):

fun(a,b,&c);

printfCTheresultis:%ld'n”,c);

out=fopen("out.dat","w");

fun(a+ll,b+22,&c);

fprintf(out,c);

fclose(out);

}

【参考答案】

voidfun(inta,intb,long*c)

{

*c=(a%l0)*1000+(b%l0)*100+(a/10)*10+b/l0;

)

【考点分析】

本题考查:如何取出数值n的各个位,主要是考查'和'/'的交换使用。两个整型数相除,'/'

用来求得数的整数部分,’留用来求余数。

【解题思路】

本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。

由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它

们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百

位数、十位数和个位数。注意:使用c时要进行指针运算。

第六套

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若

干表达式或语句。

试题程序:

#include<stdio.h>

longfun(intn)

if([1])

return(n*fun([2]));

return[3];

}

voidmain()

(

printf(z,10!=%ld\n/,,fun(10));

}

【参考答案】

(l)n>l或l<n(2)n-1(3)1

【考点分析】

本题考查:if语句条件表达式,这类题目一般解法是根据题意确定表达式的值,如果表达式

的值为真,则执行下面的语句;如果值为假,则不执行该语句。递归算法的掌握,递归是指函数

/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。

【解题思路】

填空1:求阶乘时,采用递归的算法,n>l和n==l这两种情况的处理方法不同,需要分开考虑。

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

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

下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17

整除的自然数之和。k的值由主函数传入,若k的值为500,则函数的值为4622。

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

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

试题程序:

ftinclude<stdio.h>

tiinclude<conio.h>

#include<stdlib.h>

intfun(intk)

{intm=0,mc=0,j;

while((k>=2)&&(mc<l0))

(

/*************found**************/

if((k%13=0)||(k%17=0))

{m=m+k;mc++;}

k-;

/*************found**************/

returnm;

}

voidmain()

{system("CLS");

printf(z,%d\n”,fun(500));

}

【参考答案】

(1)错误:if((k%13=0)|I(k%17=0))

正确:if((k%13==0)||(k%17==0))

(2)错误:缺少大括号正确:力口}

【考点分析】

本题考查:if语句,这类题目的一般解法是根据题意确定if语句的条件表达式,区别逻辑表

达式和算术表达式。同时注意c语言书写程序应遵守的规则。

【解题思路】

(Dx能被y整除的表示方法是x%y==0,而并非像题目中所表示的x%y=0。所

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

(2)缺少程序完整所需的”}此类信息在做题时一定要注意,我们可以在做题前先运行一下

程序,这样明显的错误一般都会有错误信息显示出来,比如丢失"}"的错误信息是"Compound

statementmissing}infunctionfun”,并在当前错误处停止光标,我们只要按回车键进行

编辑就可以了。

请编写函数fun,它的功能是计算:

s=(In(1)+ln(2)+ln(3)+-+ln(m))0.5

在C语言中可调用log(n)函数求ln(n)„

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

ttinclude<conio.h>

ttinclude<stdio.h>

ttinclude<math.h>

^include<stdlib.h>

doublefun(intm)

(

}

voidmain()

FILE*wf;

system("CLS");

printf(z,%f\n",fun(20));

wf=fopen("out.dat","w");

fprintf(wf,"%f”,fun(20));

fclose(wf);

)

【参考答案】

doublefun(intm)

(

inti;

doubles=0.0;

for(i=l;i<=m;i++)

s=s+log(i);

returnsqrt(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时,依次输出:201042。

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若

干表达式或语句。

试题程序:

#include<stdlib.h>

Sinclude<conio.h>

Sinclude<stdio.h>

voidfun(intk,intbb[])

(

intI;

intj=0;

for([1];I<=k;I++)

(

if([2])

bb[j++]=I;

)

printf("\n\n〃);

for(I=[3];I>=0;I—)

printf("%d",bb[I]);

}

voidmain()

{

intk=l;

intbb[100];

system(ZZCLS/Z);

printf(z,\nPleaseinputX=");

scanf&k);

fun(k,bb);

j

【参考答案】(l)i=i(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函数,不得增行或删行,也不得更改程序的结构。

试题程序:

ttinclude<stdlib.h>

ttinclude<conio.h>

ftinclude<stdio.h>

doublefun(intm)

{doubley=l.0;

intI;

/*************found**************/

for(I=2;Km;I++)

/*************found**************/

y-=l/(I*I);

return(y);

}

voidmain()

{intn=5;

system("CL$");

printf('\nTheresultis%lf\nz,,fun(n));

}

【参考答案】

⑴错误:for(i=2;i<m;i++)

正确:for(i=2;i<=m;i++)

⑵错误:y-=l/(i*i);

正确:y-=L0/(i*i);

【考点分析】

本题考查:for循环语句的循环条件,这类题目的一般解法是根据题意确定循环变量的取值

范围。变量数据类型的强制转换,是通过类型转换运算来实现的。一般形式为:"(类型说明符)

(表达式)”,其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。

【解题思路】

该题是一道简单的计算题,循环条件for(i=2;i<m;i++)中忽略了i=m时的一种情况,因为题

目中i是从2至I]m的一个计算公式。y-=l/(i*i);的错误很明显,是语法错误,由定义double

y=l.0可知,应该是y-=l.0/(i*i);,而非y-=l/(i*i);。

例如:

(float)a把a转换为实型

(int)(x+y)把x+y的结果转换为整型

编写函数fun,它的功能是:求n以内(不包括n)同时能被5与11整除的所有自然数之

和的平方根s,并作为函数值返回。

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

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的

若干语句。

试题程序:

#include<conio.h>

#include<math.h>

#include<stdio.h>

#include<stdlib.h>

doublefun(intn)

)

voidmain()

(

FILE*wf;

system(Z,CLSZ,);

printf("s=%f\n”,fun(1000));

wf=fopen(,zout.dat〃,〃w〃);

fprintf(wf,fun(1000));

fclose(wf);

}

【参考答案】

doublefun(intn)

{doubles=0.0;

inti;

for(i=0;i<n;i++)

/*从0n中找到既能被5整除同时又能被11整除的数,并将这些数求和*/

if(i%5=0&&i%ll==0)

s=s+i;

s=sqrt(s);/*对s求平方根*/

returns:

}

【考点分析】

本题考查:整除判定后求和、再对求和结果求平方根运算;变量数据类型,求和时变量如何初

始化;整除的方法;if条件语句及“逻辑与"运算;sqrt()平方根函数的应用。

【解题思路】

本题的解题思路是逐个取得从0到n之间的数,对每次取得的数进行条件判断,条件是既能被

5整除又能被11整除,注意这两个条件要求同时成立,因此用到了"&&”运算符。若满足条件,

该数就被累加到s中去,求出所有符合条件的数后,用sqrt()函数(包含于头文件<math.h>

中)对s求平方根。

第八套

请补充函数fun,它的功能是:计算并输出n(包括n)以内所有能被3或7整除的自然数

的倒数之和。

例如,在主函数中从键盘给n输入30后,输出为:s=l.226323。

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若

干表达式或语句。

试题程序:

#include<stdio.h>

doublefun(intn)

(

intI;

doublesum=O.0;

for(1=1;[1];I++)

if(I%3==0[2]I%7=0)

sum+=[3]/I;

returnsum;

}

voidmain()

(

intn;

doubles;

printfCXnlnputn:〃);

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整除,所以使

用逻辑或运算符"II"。

填空3:需要注意,如果7”运算符两边都是整型数,则结果也是整型数。因为i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论