2016年计算机等级考试机试小技巧须知(二)
求学快递网计算机等级考试专题重点推荐:2016年计算机等级考试报考时间 、计算机等级考试证书领取时间、2016年计算机等级考试报考指南、2016年计算机等级考试大纲、2016年计算机等级考试政策、2016年计算机等级考试报考条件、2016年计算机等级考试科目等最新新闻资讯。
第二条:一定要考虑除零、溢出、类型转换、精度等细节问题!
虽然我们在平时学C语言的时候老师都提醒过,可是真正到了编程序的时候,却没有几个人会考虑。这些细节问题似乎并不直接影响题目的输出结果,然而,因为溢出和类型转换错误而造成考试得不到满分的可是大有人在啊! 我们看下面一道最害人的题目!,很多朋友考了这道题目都没有过。
下面来看看你为什么是0分!
考试中心命题组64题:
请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,
仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。
替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),
如果原字符小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。
这道题目所有的人都做过,但几乎就没有人做对,包括南开无忧在内!
原因就在于这一句!
无忧:int f; f=(xx[i][k]*11)%6;
南开:char *pf; *pf=*pf*11%6;
表面看来,好象两个都对,
请你在TC下运行一下下面的代码,看一下结果你就知道了是怎么回事了:
main()
{
char nk="E",*nkp,wuyou="E";
int wy;
nkp=&nk;
*nkp=*nkp*11%6;
wy=wuyou*11%6;
printf("%c %c %c %cn",nk,*nkp,wuyou,wy);
printf("%d %d %d %dn",nk,*nkp,wuyou,wy);
}
看到结果了么?是不是很吃惊啊?
-9 -9 69 247
大家看到了,南开的结果是负数,连原来的变量nk都变成了负数,这显然错了。
无忧的聪明一点,知道int比char大,定义了个int,对了。
南开错误原因就是在TC2.0中char型变量只有一个字节,根本容纳不下"E"*11,
所以产生了溢出,上次考这道题目没过的同学是不是有所启发呢?
这里给出考试中心命题组的答案:
void encryptChar(){
int i,k,ch;
for(i=0;i for(k=0;k ch=xx[i][k];
ch=(ch*11)%6;
if(!(ch<=32||ch>=130))xx[i][k]=ch;
}
}
似乎一个例子不能说明什么,那就把上面的数字题目的答案给大家看看:
考试中心命题组23题答案:
int i;
long val;
float dec;
for(i=0;i val=(long)xx[i];
aver+=xx[i]-val;
}
aver/=(double)N;
for(i=0;i val=(long)xx[i];
dec=xx[i]-val;
if(dec>aver){
sumint+=val;
sumdec+=(xx[i]-val);
}
}
看到了吧,首先,val的定义,不是我们习惯的int,而是能容纳更大数的 long ,
这样在求和的时候就不会溢出,无忧和南开的答案没有吧
再看,算aver平均值的细节,不是我们平常习惯的aver/=N,更不是无忧的1.0* sum/N,
而是aver/=(double)N,所以大家在考试的时候要时刻注意你的变量类型,特别是在一些求平均值的题目中,千万要注意,用sum/n的时候,sum的类型一定不要用整形。
关注求学快递网计算机等级考试专题,帮你了解最新的计算机等级考试资讯和2016年计算机等级考试成绩查询,让你轻松备考计算机等级考试!
求学快递网计算机等级考试专题的小编们根据网民搜索喜爱,第一时间公布2016年计算机一级考试报名网址、2016年计算机二级考试模拟试题、2016年计算机三级考试历年真题、2016年计算机四级考试复习资料供广大求学爱好者学习使用,欢迎继续关注求学快递网计算机等级考试专题,并给我们提供宝贵的意见!