太过分了!这个一定要发出来好好玩玩!

P1046 [NOIP2005 普及组] 陶陶摘苹果

UD_Lying @ 2018-11-24 23:34:27

这个是来讨论C/C++写这道题出的一个小事故的

首先这里贴的是最后通过的,大佬请直接看错误的地方

#include<iostream>
#define apple_number 10
#define chair_high 30
inline int touch_max(int human_high)
{
    return human_high+chair_high;
}

int main()
{
    int human_high;
    int apple_high[apple_number];
    int i=0;
    int ability_touch_number=0;
    while(i<apple_number)
    {
        std::cin>>apple_high[i];
        i++;
    }
    std::cin>>human_high;
    for(i=0;i<apple_number;i++)
    {
        if(touch_max(human_high)>=apple_high[i])
        {
            ability_touch_number++;
        }
        if(apple_high[i]>200||apple_high[i]<100||human_high>120||human_high<100)
        {
            std::cout<<"fuck you,bitch"<<std::endl;
            return -1;
        }
    }
    std::cout<<ability_touch_number<<std::endl; 
    return 0;
}

这是之前出错的

#include<iostream>
#define apple_number 9
#define chair_high 30
inline int touch_max(int human_high)
{
    return human_high+chair_high;
}

int main()
{
    int human_high;
    int apple_high[apple_number];
    int i=0;
    int ability_touch_number;
    while(std::cin>>apple_high[i],i<apple_number)
    {
        i++;
    }
    std::cin>>human_high;
    for(i=0;i<apple_number;i++)
    {
        if(touch_max(human_high)>=apple_high[i])
        {
            ability_touch_number++;
        }
        if(apple_high[i]>200||apple_high[i]<100||human_high>120||human_high<100)
        {
            std::cout<<"fuck you,bitch"<<std::endl;
            return -1;
        }
    }
    std::cout<<ability_touch_number<<std::endl; 
    return 0;
}

这种代码居然还能得分80分!真是太过分了!

我 _一开始定义的applenumber是10 ,可是发现输入11个数字(包含身高)后并没有输出结果,需要再次输入一个,也就是一共12个数字。

之后才 _把applenumber改为9 ,发现居然可以将题目下面给的输入通过! 之后居然还得分80分,真的被骚到了。

之后检查代码发现了两个大问题:

首先,就是我的while()内写了一个逗号运算符

由于当时写这一段的时候脑抽了,没考虑到顺序,只想到了这个意思,就这么随手写上去了。 于是while被我写成了

while(std::cin>>apple_high[i],i<apple_number)

也就是在判断条件之前就赋值了,这样会在i已经等于apple_number的时候,还会进行一次赋值。 当然,这是不可能赋值到数组占用的房间里面的!

这样按理说应该是不会通过测试的啊!

那么就是第二个问题了 变量初始化!

我这么可爱的家伙怎么可能会犯这样的错呢! 也正是这个错误,把我一开始修改的思路搞乱了。 这个ability_touch_number没有初始化值! 经过可爱的冷静思索发现:

它的初值是1!

它的初值是1!

它的初值是1!

然后就这么把错误答案+1变成了正确答案! 真是bug+bug=debug啊!

当然,修改的方法不只这么一种,写这个的目的也是希望大家注意一下出错的问题,大佬们就当一个笑话来看吧!


by sahmaykf @ 2018-11-24 23:37:52

第一感觉 为什么变量名要这么长


by UD_Lying @ 2018-11-24 23:47:40

@sahmaykf 个人的变量命名习惯吧,这样看得懂一些。对于长一点的程序,一般还要加上它的类型来避免BUG,比如

int INT32_AppleNumber;

by 时崎·狂狂帝 @ 2018-11-25 00:38:40

那到时候您写工程手敲烂了,手滑了,写疯了,改封了,一切由您自己全权负责哦

您应该知道,长度越长,写错的可能性越大吧?

假如 INT32_Sea 打成了 INT32_See,我想在那么长的代码里不容易发现吧?


by nofall @ 2018-11-25 00:53:09

+1


by UD_Lying @ 2018-11-25 02:03:11

@时崎·狂狂帝 C/C++的话丝毫不畏惧呢,规则规定了变量和函数必须事先声明定义才可以使用。编译器就可以代替程序员去检查这种错误呢。这种命名法则也是很多非常厉害的程序员教我的呢...


by 时崎·狂狂帝 @ 2018-11-25 07:06:46

@UD_Lying 对啊,可问题是你两个都定义了,还有不同意义?小心参数调死人。。。


by Priori_Incantatem @ 2018-11-25 08:25:33

fuck you,bitch

应该全大写吧


by UD_Lying @ 2018-11-25 09:33:42

@BrianPan 你是想骂人更爽一些吗。。。


by UD_Lying @ 2018-11-25 09:35:54

@BrianPan 这个我只是作为超出范围后的报错信息使用的


by sahmaykf @ 2018-11-25 10:39:38

@UD_Lying 也是 不同人看的感觉不一样 随个人喜欢


| 下一页