份全国计算机等级考试二级语言题库及详细解答_第1页
份全国计算机等级考试二级语言题库及详细解答_第2页
份全国计算机等级考试二级语言题库及详细解答_第3页
份全国计算机等级考试二级语言题库及详细解答_第4页
份全国计算机等级考试二级语言题库及详细解答_第5页
已阅读5页,还剩937页未读 继续免费阅读

下载本文档

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

文档简介

份全国计算机等级考试二级语言题库及详细解答资料仅供参考9月份全国计算机等级考试二级C语言试题题库(无纸化考试专用)(说明:无纸化考试选择题40分,程序题60分。学会这些题,保证二级高空飘过!!!)第一套给定程序的功能是:求二分之一圆面积,函数经过形参得到圆的半径,函数返回二分之一的圆面积(注:圆面积公式为:2,在程序中定义的变量名要与公式的变量相同)。例如,输入圆的半径值:19.527,输出为:s=598.949991。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在横线上填入所编写的若干表示式或语句。试题程序:#include<stdio.h>doublefun(doubler){ return3.14159*【1】/2.0;}voidmain(){ doublex; printf("Enterx:"); 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<stdlib.h>#include<conio.h>#include<stdio.h>#include<math.h>/*************found**************/f(doublex){if(x==0.0||x==2.0)return0.0;elseif(x<0.0)return(x-1)/(x-2);elsereturn(x+1)/(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=1+1/(1+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("\nPleaseenterN:");scanf("%d",&n);s=fun(n);printf("Theresultis:%f\n",s);/******************************/wf=fopen("out.dat","w");fprintf(wf,"%f",fun(11));fclose(wf);/*****************************/}【参考答案】floatfun(intn){inti,s1=0;/*定义整型变量s1,表示分母*/floats=0.0;/*定义单精度变量s,表示每一项*/for(i=1;i<=n;i++){s1=s1+i;/*求每一项的分母*/s=s+1.0/s1; /*求多项式的值*/}returns;}【考点分析】本题考查:计算给定表示式的值,根据题意判断表示式为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<stdlib.h>#include<stdio.h>#include<conio.h>voidmain(){ intn,m; longsum; 【1】; system("CLS"); printf("\nInputn,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<stdlib.h>#include<conio.h>#include<stdio.h>doublefun(intm){doublet=1.0;intI;for(I=2;I<=m;I++)/*************found**************/t+=1.0/k;/*************found**************/returnI;}voidmain(){intm;system("CLS");printf("\nPleaseenter1integernumber:");scanf("%d",&m);printf("\nTheresultis%1f\n",fun(m));}【参考答案】(1)错误:t+=1.0/k;正确:t+=1.0/I;(2)错误:returnI;正确:returnt;【考点分析】本题考查:for循环语句的循环条件,这类题目的一般解法是根据题意确定循环变量的取值范围;函数返回值,其一般形式为"return表示式;",该语句的功能是计算表示式的值,并返回给主调函数。【解题思路】(1)该题目考查分母成等差数列递增的一个数学公式,我们先看循环条件for(I=2;I<=m;I++),i从2开始递增到m,因此t的值应该是由1.0/i的值逐步循环叠加后的结果,而不是t+=1.0/k;。(2)returnI;考查对程序的解读能力,当循环结束后(由输入m的值决定),函数返回当前t的值。请编写一个函数voidfun(char*tt,intpp[]),统计在tt字符串中"a"到"z"26个字母各自出现的次数,并依次放在pp所指数组中。例如,当输入字符串abcdefghabcdeabc后,程序的输出结果应该是:333221110000000000000000000注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>voidfun(char*tt,intpp[]){}voidmain(){FILE*wf;charaa[1000];intbb[26],k;system("CLS");printf("\nPleaseenteracharstring:");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);/*****************************/}【参考答案】voidfun(char*tt,intpp[]){inti;for(i=0;i<26;i++)pp[i]=0;/*初始化pp数组各元素为0*/for(;*tt!='\0';tt++)if(*tt>='a'&&*tt<='z')pp[*tt-'a']++;/*将tt字符串中'a'到'z'26个字母各自出现的次数,依次放在pp数组中,任一个小写字母减去'a'后所得结果正好是它对应的下标*/}【考点分析】本题考查:统计小写字母在指定字符串中出现次数。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<stdio.h>#include<string.h>voidfun(char*str,charch){while(*str&&*str!=ch)str++;if(*str【!=】ch){str[0]=ch;【str[1]】=0;}}voidmain(){chars[81],c;system("CLS");printf("\nPleaseenterastring:");gets(s);printf("\nPleaseenterthecharactertosearch:");c=getchar();fun(【s,c】);printf("\nTheresultis%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<conio.h>#include<stdio.h>/*********found***********/voidfun(char*s,inta,intb){ while(*s) { /*********found***********/ if(*s>='A'&&*s<='Z') a++; /*********found***********/ if(*s>='a'&&*s<='z') b++; s++; }}main(){ chars[100]; intupper=0,lower=0; printf("\npleaseastring:"); gets(s); fun(s,&upper,&lower); printf("\nupper=%dlower=%d\n",upper,lower);}【参考答案】(1)错误:voidfun(char*s,inta,intb)正确:voidfun(char*s,int*a,int*b)(2)错误:a++; 正确:(*a)++;(3)错误:b++; 正确:(*b)++;【考点分析】本题考查:函数的参数传递和指针变量,理解指针变量作为函数的参数,函数的参数不但能够是整型、实型、字符型等数据,还能够是指针类型,它的作用是将一个变量的地址传送到另一个函数中。【解题思路】(1)根据题中程序能够看出,函数fun传递的是地址,那么,在函数中就应该出现指针,因此改为voidfun(char*s,int*a,int*b)。(2)和(3)很明显,这里是要累加数值,因为a、b是指针变量,因此是错误的。请编写函数fun,它的功能是:求出ss所指字符串中指定字符的个数,并返回此值。例如,若输入字符串,输入字符1,则输出3。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>#defineM81intfun(char*ss,charc){}voidmain(){FILE*wf;chara[M],ch;system("CLS");printf("\nPleaseenterastring:");gets(a);printf("\nPleaseenterachar:");ch=getchar();printf("\nThenumberofthecharis:%d\n",fun(a,ch));/******************************/wf=fopen("out.dat","w");fprintf(wf,"%d",fun("",'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的横线上填入所编写的若干表示式或语句。试题程序:#include<stdlib.h>#include<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"); printf("\nInputastring:\n"); gets(str); while(str[i]!='\0') { strlen++; i++; } fun(str,strlen); printf("\n***displaystring***\n"); puts(str);}【参考答案】(1)voidfun(chars[],intn)(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<stdio.h>#include<conio.h>longfun(longnum){/*************found**************/longk;do{ k*=num%10; /*************found**************/ num\=10;}while(num);return(k);}main(){intn;printf("\Pleaseenteranumber:");scanf("%ld",&n);printf("\n%ld\n",fun(n));}【参考答案】(1)错误:longk; 正确:longk=1;(2)错误:num\=10; 正确:num/=10;【考点分析】变量初始化,保存乘积的变量初始化为1。【解题思路】(1)k用来存放各位数字的积,初值应为1。(2)这里是一个符号错误,除号使用"/"来表示的。请编写一个函数fun,它的功能是:求出1到m(含m)之内能被7或11整除的所有整数放在数组a中,经过n返回这些数的个数。例如,若传给m的值为50,则程序输出:711142122283335424449注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>#defineM100voidfun(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+1)%20==0)/*每行输出20个数*/{printf("%4d",aa[k]);printf("\n");}elseprintf("%4d",aa[k]);printf("\n");/******************************/wf=fopen("out.dat","w");for(k=0;k<n;k++)fprintf(wf,"%4d",aa[k]);fclose(wf);/*****************************/}【参考答案】voidfun(intm,int*a,int*n){inti,j=0;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,该函数的功能是:判断某一个年份是否为闰年。例如,19不是闰年,是闰年。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的横线上填入所编写的若干表示式或语句。试题程序:#include<stdlib.h>#include<stdio.h>#include<conio.h>intfun(intn){ intflag=0; if(n%4==0) { if(【1】) flag=1; } if(【2】) flag=1; return【3】;}voidmain(){ intyear; system("CLS"); printf("Inputtheyear:"); scanf("%d",&year); if(fun(year)) printf("%disaleapyear.\n",year); else printf("%disnotaleapyear.\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<stdio.h>#include<conio.h>doublefun(intn){doubleresult=1.0;/*************found**************/ifn==0return1.0;while(n>1&&n<170)/*************found**************/result=n--;returnresult;}voidmain(){intn;printf("InputN:");scanf("%d",&n);printf("\n\n%d!=%lf\n",n,fun(n));}【参考答案】(1)错误:ifn==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<stdio.h>#include<conio.h>voidfun(inta,intb,long*c){}voidmain(){inta,b;longc;FILE*out;printf("Inputa,b:");scanf("%d%d",&a,&b);fun(a,b,&c);printf("Theresultis:%ld\n",c);/******************************/out=fopen("out.dat","w");fun(a+11,b+22,&c);fprintf(out,"%ld\n",c);fclose(out);/******************************/}【参考答案】voidfun(inta,intb,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<stdio.h>longfun(intn){ if(【1】) return(n*fun(【2】)); return【3】;}voidmain(){ printf("10!=%ld\n",fun(10));}【参考答案】(1)n>1或1<n(2)n-1(3)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<stdio.h>#include<conio.h>#include<stdlib.h>intfun(intk){intm=0,mc=0,j;while((k>=2)&&(mc<10)){/*************found**************/if((k%13=0)||(k%17=0)){m=m+k;mc++;}k--;/*************found**************/returnm;}voidmain(){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)缺少程序完整所需的"}",此类信息在做题时一定要注意,我们能够在做题前先运行一下程序,这样明显的错误一般都会有错误信息显示出来,比如丢失"}"的错误信息是"Compoundstatementmissing}infunctionfun",并在当前错误处停止光标,我们只要按回车键进行编辑就能够了。请编写函数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<conio.h>#include<stdio.h>#include<math.h>#include<stdlib.h>doublefun(intm){}voidmain(){FILE*wf;system("CLS");printf("%f\n",fun(20));/******************************/wf=fopen("out.dat","w");fprintf(wf,"%f",fun(20));fclose(wf);/*****************************/}【参考答案】doublefun(intm){inti;doubles=0.0;for(i=1;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>#include<conio.h>#include<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=1; intbb[100]; system("CLS"); printf("\nPleaseinputX="); 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<stdlib.h>#include<conio.h>#include<stdio.h>doublefun(intm){doubley=1.0;intI;/*************found**************/for(I=2;I<m;I++)/*************found**************/y-=1/(I*I);return(y);}voidmain(){intn=5;system("CLS");printf("\nTheresultis%1f\n",fun(n));}【参考答案】(1)错误:for(i=2;i<m;i++)正确:for(i=2;i<=m;i++)(2)错误:y-=1/(i*i);正确:y-=1.0/(i*i);【考点分析】本题考查:for循环语句的循环条件,这类题目的一般解法是根据题意确定循环变量的取值范围。变量数据类型的强制转换,是经过类型转换运算来实现的。一般形式为:"(类型说明符)(表示式)",其功能是把表示式的运算结果强制转换成类型说明符所表示的类型。【解题思路】该题是一道简单的计算题,循环条件for(i=2;i<m;i++)中忽略了i=m时的一种情况,因为题目中i是从2到m的一个计算公式。y-=1/(i*i);的错误很明显,是语法错误,由定义doubley=1.0可知,应该是y-=1.0/(i*i);,而非y-=1/(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("CLS");printf("s=%f\n",fun(1000));/******************************/wf=fopen("out.dat","w");fprintf(wf,"%f",fun(1000));fclose(wf);/*****************************/}【参考答案】doublefun(intn){doubles=0.0;inti;for(i=0;i<n;i++)/*从0n中找到既能被5整除同时又能被11整除的数,并将这些数求和*/if(i%5==0&&i%11==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=1.226323。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的横线上填入所编写的若干表示式或语句。试题程序:#include<stdio.h>doublefun(intn){ intI; doublesum=0.0; for(I=1;【1】;I++) if(I%3==0【2】I%7==0) sum+=【3】/I; returnsum;}voidmain(){ intn; doubles; printf("\nInputn:"); 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<conio.h>#include<stdio.h>doublefun(intx[]){/*************found**************/intsum=0.0;intc=0,I=0;while(x[I]!=0){if(x[I]>0){sum+=x[I];c++;}I++;}/*************found**************/sum=sum\c;returnsum;}voidmain(){intx[1000];inti=0;system("CLS");printf("\nPleaseentersomedata(endwith0):");do{ scanf("%d",&x[i]);}while(x[i++]!=0);printf("%f\n",fun(x));}【参考答案】(1)错误:intsum=0.0;正确:doublesum=0.0;(2)错误:sum\=c;正确:sum/=c;【考点分析】本题考查:变量的数据类型,区别int整型和double双精度型;除法运算符"/"。【解题思路】(1)定义变量错误。(2)C语言中的除法运算符是"/"。请编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数经过k传回。例如,输入17,则应输出46891012141516。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>voidfun(intm,int*k,intxx[]){}voidmain(){FILE*wf;intm,n,zz[100];system("CLS");printf("\nPleaseenteranintegernumberbetween10and100:");scanf("%d",&n);fun(n,&m,zz);printf("\n\nThereare%dnon-primenumberslessthan%d:",m,n);for(n=0;n<m;n++)printf("\n%4d",zz[n]);/******************************/wf=fopen("out.dat","w");fun(17,&m,zz);for(n=0;n<m;n++)fprintf(wf,"%4d",zz[n]);fclose(wf);/*****************************/}【参考答案】voidfun(intm,int*k,intxx[]){inti,j,n=0;for(i=4;i<m;i++)/*找出大于1小于整数m的非素数*/{for(j=2;j<i;j++)if(i%j==0)break;if(j<i)xx[n++]=i;}*k=n;/*返回非素数的个数*/}【考点分析】本题考查:素数的判断,是对整除算法和循环判断结构的考查。【解题思路】这道题是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决,请学习者以此题为例,搞清楚判断素数的方法。第九套请补充main函数,该函数的功能是:计算每个学生成绩的平均分,并把结果保存在数组bb中。例如,当score[N][M]={{83.5,82,86,65,67},{80,91.5,84,99,95},{90.5,95,86,95,97}}时,三个学生的平均分为76.7,89.9,92.7。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在main函数的横线上填入所编写的若干表示式或语句。试题程序:#include<stdio.h>#defineN3#defineM5voidmain(){ intI,j; staticfloatscore[N][M]={{83.5,82,86,65,67},{80,91.5,84,99,95},{90.5,95,86,95,97}}; floatbb[N]; system("CLS"); for(I=0;I<N;I++) 【1】; for(I=0;I<N;I++) { for(j=0;j<M;j++) 【2】; bb[I]/=M; } for(I=0;I<N;I++) printf("\nstudent%d\taverage=%5.1f",I+1,bb[I]);}【参考答案】(1)bb[i]=0(2)bb[i]+=score[i][j]考点分析本题考:数组的引用以及数组元素赋值。【解题思路】填空1:每个人的平均分都保存在数组bb[N]中,因此在使用前要对数组bb的各元素赋初值0。填空2:为了求出平均分,首先要求出每个学生的总分,并存于数组bb中。下列给定程序中,函数fun的功能是:判断一个整数m是否是素数,若是返回1,否则返回0。在main函数中,若fun()返回1则输出"YES",若fun()返回0则输出"NO!"。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<stdlib.h>#include<conio.h>#include<stdio.h>intfun(intm){intk=2;while(k<=m&&(m%k))/*************found**************/k++/*************found**************/if(m=k)return1;elsereturn0;}voidmain(){intn;system("CLS");printf("\nPleaseentern:");scanf("%d",&n);if(fun(n))printf("YES\n");elseprintf("NO!\n");}【参考答案】(1)错误:k++正确:k++;(2)错误:if(m=k)正确:if(m==k)【考点分析】本题考查:C程序的基本格式,每个语句后面要以";"结尾。if语句,其中多数考查条件表示式,注意赋值表示式与逻辑表示式的区别。【解题思路】函数fun的功能是判断m是否为素数:m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句中的逻辑表示式写成了赋值表示式。编写函数fun,它的功能是:根据以下公式求p的值,结果由函数值带回。m与n为两个正数且要求m>n。P=m!/(n!(m-n)!),例如,m=12,n=8时,运行结果为495.000000。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>floatfun(intm,intn){}voidmain(){FILE*wf;system("CLS");printf("p=%f\n",fun(12,8));/******************************/wf=fopen("out.dat","w");fprintf(wf,"%f",fun(12,8));fclose(wf);/*****************************/}【参考答案】floatfun(intm,intn){inti;doublep=1.0;for(i=1;i<=m;i++)p=p*i;/*求m!*/for(i=1;i<=n;i++)p=p/i;/*求m!/n!*/for(i=1;i<=m-n;i++)p=p/i;/*求m!/(n!(m-n)!)*/returnp;}【考点分析】本题考查:for循环语句,根据题意确定循环变量的取值范围。return语句,返回函数的值,注意返回变量的类型。【解题思路】本题中,欲求P的值,需要先求m、n和m-n的阶乘值,可用循环语句实现。注意:阶乘值应当是double类型,若定义x、y、z为整型变量,则p=x/(y*z)中的除法为整数除法。第十套请补充函数fun(char*s),该函数的功能是:把字符串中的内容逆置。例如,字符串中原有的字符串为abcde,则调用该函数后,串中的内容为edcba。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的横线上填入所编写的若干表示式或语句。试题程序:#include<string.h>#include<conio.h>#include<stdio.h>#defineN81voidfun(char*s){ inti,n=strlen(s)-1; chart; for(i=0;i<n;i++,【1】) { t=s[i]; 【2】; 【3】; }}main(){ chara[N]; system("CLS"); printf("Enterastring:"); gets(a); printf("Theoriginalstringis:"); puts(a); fun(a); printf("\n"); printf("Thestringaftermodified:"); puts(a);}【参考答案】(1)n--或--n或n-=1或n=n-1(2)s[i]=s[N]或*(s+i)=*(s+n)(3)s[N]=t或*(s+n)=t【考点分析】本题考查:变量交换算法,注意需借助第三个变量来完成。【解题思路】填空1:将字符串的内容逆置,实际上就是将第一个字符和最后一个字符交换,再将第二个字符与倒数第二个字符交换,依此类推,直到中间的字符为止,因此需要i加1的同时,n要减1。填空2和填空3:数据的交换程序。下列给定程序中,函数fun的功能是:按如下递归公式求函数值。例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<stdio.h>/*************found**************/intfun(n){intc;/*************found**************/if(n=1) c=10;else c=fun(n-1)+2;return(c);}voidmain(){intn;printf("Entern:");scanf("%d",&n);printf("Theresult:%d\n\n",fun(n));}【参考答案】(1)错误:intfun(n) 正确:intfun(intn)(2)错误:if(n=1) 正确:if(n==1)【考点分析】有参函数定义,其一般形式为:类型标识符函数名(形式参数列表){声明部分语句}在形参列表中给出的参数称为形式参数,它们能够是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参列的类型说明。【解题思路】(1)主函数中已经定义了变量n的类型,在子函数中也要定义。(2)if后面应该紧跟一个条件判断表示式,而n=1是赋值表示式,表示式的值永远为真,也就是说这个条件永远成立,没有递归执行。请编一个函数floatfun(doubleh),函数的功能是:对变量h中的值保留两位小数,并对第三位进行四舍五入(规定h中的值为正数)。例如,若h值为8.32433,则函数返回8.32;若h值为8.32533,则函数返回8.33。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<stdio.h>#include<conio.h>#include<stdlib.h>floatfun(floath){}voidmain(){FILE*wf;floata;system("CLS");printf("Entera:");scanf("%f",&a);printf("Theoriginaldatais:");printf("%f\n\n",a);printf("Theresult:%f\n",fun(a));/******************************/wf=fopen("out.dat","w");fprintf(wf,"%f",fun(8.32533));fclose(wf);/*****************************/}【参考答案】floatfun(floath){longt;t=(h*1000+5)/10;/*单精度数h乘以1000后再加5,相当于对h中的第三位小数进行四舍五入,除以10后将其赋给一个长整型数时,把第三位小数后的数全部截去*/return(float)t/100;/*除以100,保留2位小数*/}【考点分析】本题考查:四舍五入方法的考查;数据类型强制转换。【解题思路】注意:本题要求h的值真正发生了四舍五入,而不是为了输出,即不能用printf("%7.2f",h)直接得到结果。由于单精度数h乘以1000后再加5,此时相当于对h中的第三位小数进行四舍五入,在将其赋给一个长整型数时,把第三位小数后的数全部截去。在return中要将其中一个数转成浮点型数。第十一套请补充main函数,该函数的功能是:输出一个矩阵,要求非周边元素赋值0,周边元素赋值1。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在main函数的横线上填入所编写的若干表示式或语句。试题程序:#include<stdlib.h>#include<stdio.h>#defineN10voidmain(){ intbb[N][N]; intI,j,n; system("CLS"); printf("\nInputn:\n"); scanf("%d",&n); for(I=0;I<n;I++) for(j=0;j<n;j++) { if(【1】) bb[I][j]=1; else 【2】; } printf("\n***theresult***\n"); for(I=0;I<n;I++) { printf("\n\n"); for(j=0;j<n;j++) printf("%4d",bb[I][j]); }}【参考答案】(1)i==0||i==n-1||j==0||j==n-1(2)bb[i][j]=0【考点分析】本题考查:if条件语句,一般需根据题意确定条件表示式。数组元素下标及其赋值语句,经过二维数组的下标如何表示其周边元素和非周边元素。【解题思路】填空1:用二维数组表示矩阵时,周边元素是行下标为0或n-1,列下标为0或n-1的元素,判断时四个条件中只要有一个条件满足,那么该元素就是周边元素,因此用"||"运算符。填空2:题目要求将非周边元素赋值为0,因此b[i][j]=0。下列给定程序中,函数fun的功能是:用递归算法计算斐波拉契级数列中第n项的值。从第一项起,斐波拉契级数序列为1,1,2,3,5,8,13,21,…例如,若给n输入7,该项的斐波拉契级数值为13。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<stdio.h>longfun(intg){/*************found**************/switch(g);{case0:return0;/*************found**************/case1;case2:return1;}return(fun(g-1)+fun(g-2));}voidmain(){longfib;intn;printf("Inputn:");scanf("%d",&n);printf("n=%d\n",n);fib=fun(n);printf("fib=%d\n\n",fib);}【参考答案】(1)错误:switch(g);正确:去掉分号(2)错误:case1;case2:return1;正确:case1:case2:return1;【考点分析】switch语句,其一般形式为:switch(表示式){case常量表示式1:语句1;case常量表示式2:语句2;…case常量表示式n:语句n;default:语句n+1;}"其中,switch(表示式)后不带有";",同时case语句常量后应该是":"。【解题思路】C语言中,switch语句之后不能有分号,而且case语句常量后该用是冒号。请编写函数fun,函数的功能是:求出二维数组周边元素之和,作为函数值返回。二维数组中的值在主函数中赋予。例如,若二维数组中的值为13579299946999813570则函数值为61。注意:部分源程序给出如下。请勿改动main函数和其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>#defineM4#defineN5intfun(inta[M][N]){}voidmain(){FILE*wf;intaa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}};inti,j,y;system("CLS");printf("Theoriginaldatais:\n");for(i=0;

温馨提示

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

评论

0/150

提交评论