杭电acm简单题之那些多发的“低级”错误

来源:互联网 发布:哪里找到淘宝达人 编辑:程序博客网 时间:2024/04/27 23:44

       因与同学打赌去水杭电acm题。作为一名大四的软件工程的学生,自以为水平不错,结果不做不知道,一做就各种毛病乍现。知错能改,以此记录。废话不多说进入正文。

      第一题:

计算两点间的距离

Problem Description
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
Sample Input
0 0 0 10 1 1 0
Sample Output
1.001.41
题目很简单,估计只要初中学过C的孩子们估计都能做。既然实数,那么float就好了啊。好的,于是风风火火一分钟代码完毕,一测试没问题啊,可是……提交发现 wrong Answer.Excuse me ,Why???
我内心是崩溃的!!也是之前没去这些网站上做过题,好吧,我确实错了。他们OJ的测试数据还是比较严谨的,虽然样例输出很简单,但仔细想想,一旦输入坐标在是精确度比较高的数据,那么必然通过不了。好吧,这下知道了乖乖改成double。perfect!通过。同理,在以后的题目或者项目中也要引起重视。
#include <stdio.h>#include <math.h>void main(){double x1,x2,y1,y2;while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF){printf("%.2lf\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));}}
第二题:

 第几天?

Problem Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/202006/3/12
Sample Output
2071
         我知道很多人一看这题就是满脸蔑视鄙夷,这么简单。。。。下面不是讲题目怎么做,相信只要是个程序入门者都会。可惜,水的我还是犯了一个不可原谅的错误。啊啊啊……围观下错误代码: 
#include <stdio.h>void main(){int y,m,d;int sum ;while(scanf("%d/%d/%d",&y,&m,&d)!=EOF){sum = 0;while(--m){switch(m){case 1:case 3:case 5:case 7:case 8:case 10:case 12:sum=sum+31;break;                case 4:case 6:case 9:case 11:sum=sum+30;break;case 2:y%4==0&&y%100!=0||y%400==0?sum+=29:sum+=28;break;}}printf("%d\n",sum=sum+d);}}

看完,你们或许会发现没错啊,是的要用VC++6.0编译通过是没问题的,可惜OJ不给过啊,而且是编译错误。提示是:0_0_20152130_18786.c(21) : error C2106: “+=”: 左操作数必须为左值

一脸懵圈的我,啥是左操作数必须为左值?好吧,求教了高人(http://www.th7.cn/Program/cp/201610/995049.shtml)。首先所谓 “左值/右值” 即赋值号左右两边的值。其实通俗来说就是左操作数作为常量值却被赋值,我们都知道这是不允许的。常见有数组名被赋值,还有人会写a++=b++,再者就是我这种情况,三目运算符返回也是一个常量值,在case 2:后面的那一句我是想分支判断后执行sum递增,但是这样写是先执行了三目运算再最后赋值的,返回的是sum的值啊,是不能又把sum+28值赋值给sum的值,于是“机智”失败,乖乖改过来:

sum+=(y%4==0&&y%100!=0||y%400==0?29:28);

好了,这次总算通过了。

第三题:

这题就简单讲一下,其实也是我的一个小疏忽,写下来以此为戒。

     成绩转换

Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
Sample Input
5667100123
Sample Output
EDAScore is error!
其实用条件判断就可以解决问题,这次我用的switch。好吧,貌似略高级,实际没必要。代码是这样的:
#include <stdio.h>void main(){int r;while(scanf("%d",&r)!=EOF){if(r>100||r<0){    printf("Score is error!\n");continue;}r = r/10;switch(r){case 9:                case 10:printf("A\n");break;case 8:printf("B\n");break;case 7:printf("C\n");break;case 6:printf("D\n");break;case 5:case 4:case 2:case 1:case 0:printf("E\n");break;}}}
细心的你发现问题没?OJ无情拒绝,Wrong Answer 。我不得不好好看看哪错了。是的,缺了一个case 3:,我。。。。还能说什么。这其实也是一个问题,在写switch的时候分支的控制一旦少写或者忘了break,都会出现事与愿违的错误。所以,这时就要比较仔细了。


0 0
原创粉丝点击