您现在的位置:学赛首页 > 计算机等级考试 > 心得技巧 > 正文
计算机等级考试上机注意事项[2]
http://www.educity.cn 作者:不详 来源:希赛社区 2007年4月12日 发表评论 进入社区

    表面看来,好象两个都对,
    请你在TC下运行一下下面的代码,看一下结果你就知道了是怎么回事了:
    main()
    {
    char nk='E',*nkp,wuyou='E';
    int wy;
    nkp=&nk;
    *nkp=*nkp*11%256;
    wy=wuyou*11%256;
    printf("%c %c %c %c\n",nk,*nkp,wuyou,wy);
    printf("%d %d %d %d\n",nk,*nkp,wuyou,wy);
    }
    看到结果了么?是不是很吃惊啊?
    ≈ ≈ E ≈
    -9 -9 69 247
    大家看到了,南开的结果是负数,连原来的变量nk都变成了负数,这显然错了。
    无忧的聪明一点,知道int比char大,定义了个int,对了。
    南开错误原因就是在TC2.0中char型变量只有一个字节,根本容纳不下'E'*11,
    所以产生了溢出,上次考这道题目没过的同学是不是有所启发呢?
    这里给出考试中心命题组的答案:
    void encryptChar(){
    int i,k,ch;
    for(i=0;i<maxline;i++)
    for(k=0;k<strlen(xx[i]);k++){
    ch=xx[i][k];
    ch=(ch*11)%256;
    if(!(ch<=32||ch>=130))xx[i][k]=ch;
    }
    }
    似乎一个例子不能说明什么,那就把上面的数字题目的答案给大家看看:
    考试中心命题组23题答案:
    int i;
    long val;
    float dec;
    for(i=0;i<N;i++){
    val=(long)xx[i];
    aver+=xx[i]-val;
    }
    aver/=(double)N;
    for(i=0;i<N;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的类型一定不要用整形。

    第三条:不要使用快捷键!
  很多人在使用TC的时候习惯于用F9,CTRL+F9或者其他的热键,首先F9只是编译了,并没有运行程序,考试一定要运行一下你的程序才会有输出文件,否则一定是0分。热键在考试的时候是很危险的,因为UCDOS的热键和TC的冲突,CTRL+F9变成了全角半角转换,如果不小心按了,会导致你的程序有中文字符,编译的时候出错,而且很难查找排除错误! 所以建议大家在考试的时候使用ALT+红色字母 来调出菜单进行编译调试等步骤,建议步骤为: 
    写完代码后用ALT+F,S存盘,然后ALT+C,M编译,然后ALT+R,R运行,这样就万无一失了。

[1]  [2]  [3]