杭电acm简单题之那些多发的“低级”错误
来源:互联网 发布:哪里找到淘宝达人 编辑:程序博客网 时间:2024/04/27 23:44
因与同学打赌去水杭电acm题。作为一名大四的软件工程的学生,自以为水平不错,结果不做不知道,一做就各种毛病乍现。知错能改,以此记录。废话不多说进入正文。
第一题:
计算两点间的距离
Problem Description输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。Input输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。Output对于每组输入数据,输出一行,结果保留两位小数。Sample Input0 0 0 10 1 1 0Sample Output1.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 Input1985/1/202006/3/12Sample Output2071
我知道很多人一看这题就是满脸蔑视鄙夷,这么简单。。。。下面不是讲题目怎么做,相信只要是个程序入门者都会。可惜,水的我还是犯了一个不可原谅的错误。啊啊啊……围观下错误代码:
#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 Input5667100123Sample OutputEDAScore 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
- 杭电acm简单题之那些多发的“低级”错误
- 那些与size_t相关的低级错误
- 那些年,我犯的低级错误
- 杭电 ACM 1035 简单模拟题
- 那些,java编程路上犯的低级错误(一)
- 那些我曾经犯过的低级编程错误
- android 之低级错误
- 杭电 HDU ACM 1283 最简单的计算机
- 比较低级的错误
- 丢人的低级错误
- 一个低级的错误
- 很低级的错误
- 很低级的错误
- 低级的错误记录
- 低级的错误
- hibernate的低级错误
- 杭电acm 数学类型的题
- 杭电acm 折线分割平面(简单题)
- 增强现实的未来
- 【面试题】登录
- JDK安装
- 编写自己的注解处理器小栗子
- C语言实现多态?
- 杭电acm简单题之那些多发的“低级”错误
- 关于CoordinatorLayout与Behavior的一点分析
- Android callback 回调方法复习
- 迷茫<第一篇:初到北京>
- 离散数学随记
- Swift开发:创建XML文件,包含节点,属性值
- Spring简介
- 在一个jsp页面使用include动态包含servlet
- 就已学到的集合框架总结