c参考答案.docx
《c参考答案.docx》由会员分享,可在线阅读,更多相关《c参考答案.docx(20页珍藏版)》请在冰豆网上搜索。
c参考答案
参考答案:
第1套上机考试答案解析:
1、程序填空题
【答案及难度指数】★★
(1)m>1
(2)m-1(3)1
【一起来审题】
(1)该程序功能是对阶乘的实现。
其中,阶乘的计算公式定义为:
公式分为参数m是1和大于1的两种情况,例如,1的阶乘1!
=1;5的阶乘5!
=5×4×3×2×1。
(2)从已给部分源程序的main主函数开始入手,主函数执行printf输出语句,该语句调用自定义的fun函数,并将数值8传递给fun函数的m参数。
其中fun函数就是对阶乘算法的实现。
(3)进入fun函数,根据前面的定义,它对阶乘算法的实现可以分为两种情况,一是当m>1时,应该用什么程序来实现阶乘的计算;二是当m=1时,函数直接返回1即可。
【解题思路】
第一空:
if(___1___)是要根据m的取值来判断使用何种阶乘的计算公式的。
这里根据第2句递归调用语句,可知该语句是用来计算当m>1时的阶乘。
因此第一空if语句里面的条件应该是满足m>1。
所以,第一空应填m>1。
第二空:
return(m*fun(___2___))很显然是采用递归函数来实现阶乘的计算,所以,第二空应填m-1。
第三空:
return___3___该语句是要实现当m=1时的阶乘计算。
所以,第三空应填1。
【主要考点】递归函数。
2、程序改错题
【答案及难度指数】★★
(1)Prime(intm)
(2)if(!
(m%j))
【一起来审题】
(1)整数n的素数因子为整除n的所有素数,但不含n本身。
素数是指能被1和本身整除的正整数(>1),所以判别n是否为素数,只要用2、3、…、n-1这些数逐个去除n,观察余数是否为0即可,只要有一次相除余数为0,n就不是素数,否则n为素数。
因此,求整数n的素数因子,要从求整数n的因子和判断该因子是否为素数的两方面来看。
(2)从已给定源程序的main主函数开始入手,核心部分是循环判断if((!
(n%i))&&(Prime(i))),"!
(n%i)"为判断i是否是n的因子,Prime自定义函数的功能是判断i是否为素数,&&与逻辑是指当两个判断条件都为真的时候,i即为n的素因子。
【解题思路】
(1)第一个标识下面的"Prime(intm);"在程序中显然是一个函数,因此应将后面的分号去掉。
(2)第二个标识下面的for语句最简单的应用形式为:
for(循环变量赋初值;循环条件;循环变量增值)语句。
显然if语句后面缺少括号,因此,if!
(m%j)改为if(!
(m%j))。
该题主要考查标点符号、运算符、基本定义。
【主要考点】if条件语句;函数定义。
3、程序设计题
【答案及难度指数】★★
intj,k=0,average=0;
for(j=0;javerage+=point[j];//统计总分数
average/=n;//求平均分
for(j=0;jif(point[j]>average)
//逐个判断每个分数是否大于平均分
{
high[k]=point[j];
//将高于平均分的人放入high数组
k++;//统计大于平均分的人数
}
returnk;
【一起来审题】
(1)该程序功能是返回高于平均分的人数。
它的解题思路可以分解为以下几步:
求总分→求平均分→逐个元素与平均分比较→统计高于平均分的人数。
(2)从已给部分源程序的main主函数开始入手,核心函数fun(point,9,high)中的参数由题目可知,point存放着m个人的成绩,high存放高于平均分的分数。
另外,根据point的定义,可知9为point数组中元素的个数,传给函数fun中的参数n。
【解题思路】
进入fun函数,根据前面的分析:
首先,定义变量average,通过循环,用average+=point[j]计算总分数,然后通过average/=n;语句来计算平均分。
其次,通过循环,让每个分数和平均分比较,高于平均分数的分数给high[](high[k]=point[j];)。
在进行以上循环的同时,定义了一个变量k,每当发现一个大于平均分的分数,k自动加1(k++;)。
最后,返回k值,即是数组point[]中高于平均分的元素个数。
【主要考点】数组操作;if条件语句;for循环语句。
第2套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)n%100!
=0
(2)n%400==0(3)flag
【一起来审题】
(1)该题中函数功能是判断一个年份是否为闰年。
其中,闰年的条件是年数可以被4整除,即为闰年;被100整除而不能被400整除的为平年;被100整除也可被400整除的为闰年。
(2)从已给部分源程序的main主函数开始入手,主函数中的"if(fun(year))"判断语句,调用函数fun对年数进行判断。
(3)进入fun函数,利用if对年数进行判断。
【解题思路】
第一空:
根据闰年的条件和已有的语句"if(n%4==0)",知道这里的条件应该是能被4整除但要排除被100整除的整数,所以第一空填"n%100!
=0"。
第二空:
被100整除也可被400整除的为闰年,所以第二空填"n%400==0"。
第三空:
主函数中"if(fun(year))"语句是对函数返回值的判断,所以fun函数应该将对n的判断的flag值返回,第三空填"flag"。
【主要考点】if条件语句。
2、程序改错题
【答案及难度指数】★★
(1)s+=1.0/i;
(2)returns;
【一起来审题】
该题中函数功能是求题干累加公式的值。
从已给定源程序的main主函数开始入手,通过"printf("\n\ntheresultis%lf\n",fun(n));"语句调用fun函数,求得公式值。
【解题思路】
(1)第一个标识下,在以i为循环参数的for循环中进行公式累加,每一项为1.0/i,所以"s+=1.0/k;"改为"s+=1.0/i;"。
(2)第二个标识下,首先根据题干,将"填空"删除,函数定义为"doublefun(intn)",它有double型的返回值,所以这里返回累加公式的计算结果,即"returns;"。
【主要考点】函数功能;函数返回。
3、程序设计题
【答案及难度指数】★★★
intj,k=0;
for(j=2;j<500;j++)//循环条件
if((j%7==0||j%11==0)&&j%77!
=0)
//判断是否符合题干要求
b[k++]=j;//将结果放入数组b
*m=k;//将累加器值赋值给m
【一起来审题】
(1)该程序的解题思路,可以分解为以下几步:
判断是否被7整除→判断或者是否被11整除→并且不被77整除→按要求返回计算结果。
(2)从已给部分源程序的main主函数开始入手,核心函数"fun(a,&m);",其中m返回这些数的个数,a传给函数中的参数,存放计算结果的数组b。
【解题思路】
进入fun函数,根据前面的分析:
首先,定义变量k,设置为累计器,计算符合条件的数的个数。
然后,通过循环,判断小于500的每一个整数是否符合题干中的要求。
其中的判断条件能否被7或者被11整除为j%7==0||j%11==0,不能被11和7同时整除为j%77!
=0,它们之间的并关系就用&&连接,最后结果即为(j%7==0||j%11==0)&&j%77!
=0。
最后,将符合条件的整数存入数组b中,同时对k进行自加,将k值赋给m,返回结果。
【主要考点】数组操作;函数传值;if条件语句;for循环语句。
第3套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)a
(2)a(3)b
【一起来审题】
该题中函数功能是求得三个数中间的数。
此类题的解题思路,基本等同于三个数求最大、最小的题型,只不过是选择条件有所不同。
从已给部分源程序的main主函数开始入手,"mid=fun(x,y,z);"语句调用fun函数,求得中间数值。
【解题思路】
第一空:
语句"(a>b)?
(b>c?
"表示a>b>c,根据题目要求,则中间值为b,若只是满足第一个"?
"前面的条件,而c>b,则选择执行"(a>c?
c:
___1___)",当a>c时取值c,所以a第二空:
语句"(a>c)?
"是对a、c的比较选择,第三空处的"(b>c)?
c"根据b、c的判断,题目已经给出了c,所以这里应该是a,这样第三空中对于b、c的判断选择缺少b,所以这里填"b",同样也可以根据第一空的逻辑关系进行分析,来填写第二空和第三空。
【主要考点】选择语句。
2、程序改错题
【答案及难度指数】★★
(1)doubler;
(2)while(fabs(n-m)>0.001)
【一起来审题】
(1)该题中函数功能是二分法求方程根。
其中,二分法的求根过程,是将含根区间平均分为两个小区间,然后判断哪个区间是含根区间。
在此基础上,将这里的小含根区间进一步划分为两个更小的区间,继续判断根所在区间。
继续细分下去,含根区间将划分地越来越小,区间的范围也越来越小。
经过多次细分后,就可以将此很小区间的中点近似为方程的根了。
(2)从已给定源程序的main主函数开始入手,通过"result=fun(m,n);"语句调用fun函数求得方程根,其中fun函数对quest函数进行调用,对根进行判断。
【解题思路】
(1)fun函数要求返回方程的一个根,由return语句来实现,而函数fun是定义为double型的,但第一个标识下面的r却被定义为int类型。
所以"intr;"改为"doubler;"。
(2)检查while循环的控制表达式"(fabs(n-m)<0.001)",知道开始的循环值为80,必然不会进入循环体,不符合逻辑,所以应该为:
"while(fabs(n-m)>0.001)"。
【主要考点】变量定义;逻辑关系。
3、程序设计题
【答案及难度指数】★★★
intj=1,i=0,k=0,*s=b;
for(j=0;j<=y;j++)
if(j%2!
=0)//判断j是否是奇数
{
s[i]=j;//将小于y的奇数存入数组s
i++;//累加小于y的奇数个数
}
for(j=0;j
if(y%s[j]==0)//判断y是否被s[j]整除
{
b[k]=s[j];//将符合条件的结果存入数组b
k++;//累加符合条件的结果个数
}
*m=k;
【一起来审题】
(1)该程序的解题思路可以分解为以下几步:
从0开始逐个求得小于y的奇数→按顺序将这些奇数存入数组→逐个判断该数组中的值是否能整除y→累加能整除y的数值个数→最后按要求传回结果。
由于采取的是按照小于y的所有整数按照j++逐个增加的顺序进行判断并依次进行存储的思路,所以最后求得的结果是符合要求的,是由小到大排列的。
(2)从已给部分源程序的main主函数开始入手,核心函数"fun(y,a,&m);",其中m返回这些数的个数,a传给函数中的参数存放计算结果的数组b。
【解题思路】
进入fun函数,根据
(1)的分析:
首先,通过小于y的循环条件,判断小于y的每一个整数是否是奇数。
其中的判断条件"if(j%2!
=0)",并且累计这些奇数个数"i++;"。
第4套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)m--
(2)t[j]=t[m](3)t[m]=s
【一起来审题】
(1)该程序功能实现字符串的逆置。
把字符串中字符逆置就是把字符串中的第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,直到所有的元素交换完成为止。
(2)从已给部分源程序的main主函数开始入手,主函数调用"fun(b);",通过键盘输入字符串b,作为参数传给函数voidfun(char*t)中的t。
(3)进入fun函数,要想实现逆置,首先要求得字符串的长度。
通过"m=strlen(t)-1;"求得m的值即为字符串的长度。
然后通过for循环对字符串进行置换。
【解题思路】
第一空:
for(j=0;j第二空:
"chars;"用来定义存放临时的字符,"s=t[j];"的目的是首先用s存放字符串t的第j个字符,这样将第m个字符存放在j的位置,就首先实现了将后面的第m个字符置换到前面的第j的位置,所以第二空填t[j]=t[m]。
第三空:
前面实现了后面的第m个字符置换到前面的第j个字符,同时将第j个字符的内容存放在临时的字符s,现在就将这个临时字符s中的内容存放在第m个字符位置,这样就完成了j位置的字符与m位置字符的置换,所以第三空填t[m]=s。
【主要考点】字符数组。
2、程序改错题
【答案及难度指数】★★
(1)voidfun(char*s,charc)
(2)if(*s=='\0')
(3)s[1]='\0';
【一起来审题】
该题中函数功能首先是查找子串再判断,最后是实现将符合条件的字符串进行连接。
从已给定源程序的main主函数开始入手,通过"fun(str,ch);"语句调用fun函数,实现题干的要求。
【解题思路】
(1)第一个标识下,"voidfun(chars,charc)"根据主函数中的定义,知道s为数组名,传的应该是数组地址,所以应改为"voidfun(char*s,charc)"。
(2)while循环中对c与s进行匹配检查,第二个标识下,是当不同时执行连接操作,那么判断s是否为结尾的表达式应该是"if(*s=='\0')"。
(3)第三个标识下,连接后的新串要添加结尾符,所以正确的表达是将"s[1]='0';"改为"s[1]='\0';"。
【主要考点】函数定义语法;数组操作。
3、程序设计题
【答案及难度指数】★★★
inti,j,s=0;
for(j=0;j{
s+=b[0][j];
s+=b[M-1][j];
}
for(i=1;i<=M-2;i++)//统计列元素
{
s+=b[i][0];
s+=b[i][N-1];
}
returns;
【一起来审题】
该程序功能是求出二维数组周边元素之和。
其中周边元素是指数组的最上和最下的两行,最左和最右的两列。
数组第一行元素的行下标为0,最后一行元素的行下标为M-1,第一列的列下标为0,最后一列的列下标为N-1。
【解题思路】
进入fun函数,根据前面的分析:
求周边元素的和,可以采用两个循环分别把行元素和列元素相加。
但要避免把周边元素重复相加。
【主要考点】二维数组;for循环语句。
第5套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)"%ld",&a
(2)a=-a(3)"%ld",a
【一起来审题】
该题中函数功能是取长整数的绝对值。
此类题的解题思路是判断键盘输入的长整数的正负,然后对其进行操作。
【解题思路】
第一空:
获得由键盘输入的长整数,根据C语言提供的标准输入函数scanf函数格式,第一空填""%ld",&a"。
第二空:
"if(a<0)"语句是判断输入的长整数是否为负数,如果为负数,则对其进行取绝对值操作,也就是第二空填"a=-a"。
第三空:
printf语句输出操作后的绝对值结果,根据C语言标准输出函数printf格式,所以第三空填""%ld",a"。
【主要考点】C语言基本语法。
2、程序改错题
【答案及难度指数】★★
(1)s=NULL;
(2)if(*r==*p)
【一起来审题】
该题中函数功能是求得字符串中某子串最后一次出现的地址。
从已给定源程序的main主函数开始入手,通过调用"p=fun(str,t);"语句求得p的地址,然后通过判断p,判断串str中是否存在子串t。
【解题思路】
(1)第一个标识下面:
语句"s=NuLL;"中的NuLL未定义。
NULL代表空值,但程序中写成了NuLL。
所以,改成"s=NULL;"。
(2)程序的主体是二重循环,其中外循环使指针str逐个指向字符串的字符,直到遇到串结束符退出循环,内循环检查指针p与r所指字符串是否匹配。
因为这里p、r是指针,如果使用判断表达式"if(r==p)",那么比较的是地址,而题目要求比较它们所指的字符。
所以,改为:
"if(*r==*p)"。
【主要考点】C语言标识符;变量使用。
3、程序设计题
【答案及难度指数】★★★
intk=0,i,j;
for(i=mm;i>1;i--)
{
for(j=2;j
if(i%j==0)//判断i是否是素数
break;
//若i能被j整除,则i为非素数
else
continue;//否则继续循环判断
if(j>=i)//若是素数,将其存入b
{
b[k]=i;
k++;//累加素数个数
}
}
returnk++;
【一起来审题】
该程序功能是求一定范围内的素数。
素数是只能被1和自身除尽的数。
判断i是不是素数最简单的方法就是用2~(i-1)去除i,只要能除尽就不是素数。
【解题思路】
进入fun函数,根据前面的分析:
(1)首先,判断i是否是素数,即是否能被2~(i-1)整除。
(2)若是素数,就将i存入数组b,并对计数器k加1。
(3)最后返回素数的个数k。
其中,对于素数的判断并不只局限于上面提到的方法,也可以采用其他的方法进行判断。
【主要考点】数组操作;if条件语句;for循环语句。
第6套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)j<=m
(2)||(3)1.0
【一起来审题】
(1)该程序功能是求小于等于m的所有被2或5整除的所有自然数的倒数之和。
从已给部分源程序的main主函数开始入手,主函数"f=fun(m);"通过键盘输入自然数m,作为参数传给函数doublefun(intm)中的m。
(2)进入fun函数,首先通过循环对小于m的自然数进行判断,求得所有被2或5整除的自然数,然后求得该自然数的倒数并对其求和。
【解题思路】
第一空:
for(j=1;___1___;j++),根据题目要求,对所有小于等于m的数值进行循环判断,条件应该是满足j<=m,因此第一空应填j<=m。
第二空:
判断是否能被2或5整除,其中的判断条件中的"或"用逻辑语句应为"||",因此第二空应填||。
第三空:
"toal+=___3___/j;"语句是对"满足被2或5整除的自然数"的倒数求和,函数的返回值为double型,所以j的倒数为1.0/j,因此第三空应填1.0。
【主要考点】逻辑语句。
2、程序改错题
【答案及难度指数】★★
(1)intfun(intn)
(2)if(n==1)
【一起来审题】
(1)该题中函数功能是按题目中给出的递归公式求函数值。
其中,递归是指函数直接或者间接调用函数本身的一种方法。
(2)从已给定源程序的main主函数开始入手,从键盘获得输入的参数n,然后通过"printf("Theresult:
%d\n\n",fun(n));"语句调用fun函数,计算公式的值。
【解题思路】
(1)定义函数fun时,形参n并没有指定参数类型,因此,"intfun(n)"改为"intfun(intn)"。
(2)根据题目要求,原题中的"if(n=1)"应该是用于判断n是否等于1,但是被错误表示成赋值表达式。
因此,"if(n=1)"应该改为"if(n==1)"。
【主要考点】函数定义;逻辑表达式。
3、程序设计题【答案及难度指数】★★★
chart;
inti,j;
for(i=1;i//对n个元素进行循环选择
for(j=i+1;jif(str[i]{
t=str[i];
str[i]=str[j];
str[j]=t;
}
【一起来审题】
该程序功能是对字符的排序。
字符的排序有多种方法,如冒泡排序、选择排序等。
本题答案中采用的是选择排序。
其中,选择排序法的降序排序,首先从数组中挑选一个最大的元素,把它和第一个元素交换,接着从剩下的n-1个元素中再跳出一个最大的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。
【解题思路】
进入fun函数,根据前面的分析:
选择排序法中的降序排序,首先从数组中挑选一个最大的元素,把它和第一个元素交换,接着从剩下的n-1个元素中再挑出一个最大的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。
【主要考点】数组操作;函数传值;if条件语句;for循环语句
第7套上机考试答案解析:
1、程序填空题
【答案及难度指数】★
(1)a
(2)a【一起来审题】
该题中函数功能是把从键盘输入的三个整数按从大到小的顺序输出。
本题中函数的实现过程是通过if语句分别对三个整数进行两两判断。
【解题思路】
第一空:
根据第一空下面的三条赋值语句,可以很清楚地知道第一个if条件语句中是对a与b进行比较。
题干要求对三个数按从大到小的顺序输出,if下面的交换关系表明,当a小于b时要对a与b的位置进行交换,所以第一空填"a
同理,第二空填"a【主要考点】if条件语句。
2、程序改错题
【答案及难度指数】★★
(1)for(k=2;k<=m;k++)
(2)c-=1.0/(k*k);
【一起来审题】
该程序功能是根据题目要求计算公式。
从已给定源程序的main主函数开始入手,"printf("\nTheresultis%1f\n",fun(para));"语句中的fun(para)将参数para传给函数doublefun(intm)中的m,实现公式的计算结果。
【解题思路】
(1)第一个标识下面,"for(k=2;k(2)第二个标识下面,因为c被定义为浮点型,k被定义为整型,所以"1/(k*k)"的计算结果为整型,即"c-=1/(k*k);"的返回值为整型,随着k的增加,计算结果一直为0,因此改为"c-=1.0/(k*k);"。
【主要考点】C语言基本语法;变量类型。
3、程序设计题
【答案及难度指数】★★★
longs=0,t;
inti=0,j,n=strlen(str),k,s1;
//求得字符串长度n
if(str[0]=='-')
i++;
for(j=i;j<=n-1;j++)
{
t=str[j]-'0';//把字符变成数值
s1=10;
for(k=j;kt*=s1;//把t中原来的数值增加10倍,即向左移动一位
s+=t;//把转换后的数值t加在个位
}
if(str[0]=='-')
//判断数字字符是否为负数
return-s;/