首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算总杆数

计算总杆数
EN

Code Review用户
提问于 2018-09-13 14:57:34
回答 2查看 1.7K关注 0票数 -1

我已经编程了大约4个月了,我正在寻找一些方法来改进我的代码。目前,我正在使用一本书"JAVA -问题解决和编程入门“来学习编程。我想我了解循环和if语句的基本知识。

在这本书中的几个项目之后,我觉得我只是在使用我所知道的东西,而不是尝试使用新的东西来改进我的代码。我希望你们能批评我的代码并帮助我改进。

我的问题是..。

  1. 结构如何?
  2. 我还能用什么其他方法来改进这个程序呢?
  3. 你想告诉我的任何其他批评和建议。

假设我们可以从自动售货机上买一块巧克力,每块1美元。每个巧克力棒都有一张优惠券。我们可以从机器上兑换六张巧克力棒的优惠券。这意味着,一旦你开始从机器上购买巧克力棒,你总是有一些优惠券。我们想知道有多少巧克力棒可以吃,如果我们从N美元开始,并总是赎回优惠券,如果我们有足够的额外的巧克力棒。例如,用6美元,我们可以消费7块巧克力棒后,购买6条,给我们6张优惠券,然后把6张优惠券换成一条。这会给我们带来一张额外的优惠券。只要11美元,我们就可以吃掉13块巧克力棒,还剩下一张优惠券。只要12美元,我们就可以吃掉14块巧克力,剩下两张优惠券了。编写一个程序,输入N的值,输出我们可以吃多少巧克力条,以及我们会剩下多少优惠券。使用一个循环,只要有足够的足够至少得到一个巧克力棒,就可以继续赎回优惠券。

代码语言:javascript
复制
import java.util.Scanner;

public class chap4num9 {

    public static void main(String[] args) {
        Scanner userInput = new Scanner(System.in);

        System.out.println("How much money do you have?");
        int userMoney = userInput.nextInt();

        int chocoBars = 0;
        int userCoupon = 0;     

        chocoBars =+ userMoney;

        if (userMoney >= 6) {
            chocoBars = chocoBars + (userMoney / 6);
            userCoupon = userMoney / 6;
        }

        while (userCoupon >= 6) {
            chocoBars = chocoBars + 1;
            userCoupon = userCoupon - 6;
        }

        System.out.println("You will have total of " + chocoBars + " bars and " + userCoupon + " coupons left.");

    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2018-09-14 04:53:07

chap4num9不是一个合适的Java类名。Java类名以大写字母开头,每个单词以大写字母开头。应该是Chap4Num9

总是关闭Closeable资源,比如Scanner。更喜欢使用try-finally块来做到这一点。

userMoney应该是最终的。这减少了读者对代码的认知负担,因为他们知道在设置代码后值不会改变。

没有chocoBars。有chocolateBars。不要使用缩写或速记。这是很难阅读,也没有保证读者会知道你想要描述什么。

userCoupon可能只是coupons。它更容易阅读,应该是复数的,因为可能有不止一个。同样,userMoneymoney

不要分配chocolateBars,然后立即重新分配它。只要把它设置成它应该是的值。

虽然你不需要货币变量,但它确实使你更容易理解金钱=#巧克力条。如果您真的愿意,可以通过执行类似于int chocolateBars = userInput.nextInt(); int coupons = chocolateBars;的操作来删除它。

进行计算以减少循环迭代的次数是一种过早的优化,使代码更难阅读。编写易于阅读的代码,直到您遇到实际的性能问题,并且知道瓶颈所在。然后进行测试,以确保您的优化确实解决了问题。

您的代码中有两个bug。(0)在if块之后,您的优惠券数量不正确。如果钱< 6,优惠券是0。如果money >= 6,则优化计算的值是错误的。(1)如果你有N张优惠券,而你花了6英镑就能得到一张巧克力棒和一张优惠券,那么你应该有N5优惠券,而不是N6优惠券。因此,用8元钱,你应该得到9条和3张优惠券。

如果您要应用我的所有建议,您的代码可能如下所示:

代码语言:javascript
复制
import java.util.Scanner;

public class Chap24Num9 {

    public static void main(final String[] args) {
        try (final Scanner userInput = new Scanner(System.in)) {
            System.out.println("How much money do you have?");
            final int money = userInput.nextInt();

            int chocolateBars = money;
            int coupons = money;

            while (coupons >= 6) {
                coupons = coupons - 6;
                chocolateBars = chocolateBars +1;
                coupons = coupons + 1;
            }

            System.out.println("You will have total of " + chocolateBars + " bars and " + coupons + " coupons left.");

        }
    }
}
票数 1
EN

Code Review用户

发布于 2018-09-14 08:09:33

除了埃里克·斯坦的精彩言论:

1)您应该始终将“魔术数字”(在这种情况下是免费条所需的优惠券数量)存储在一个常量中。特别是当您在多个地方(可能在多个文件中)使用相同的数字,并且需要更改该数字时,如果您错过了这些数字中的任何一个,情况就会非常糟糕。

代码语言:javascript
复制
private final int NUMBER_OF_COUPONS_FOR_ADDITIONAL_BAR = 6;

2)这里没有必要使用循环来计算这里的值。利用整数除法和模运算,可以直接计算它们。为了找到公式,我用铅笔和纸,任何写下的结果,金额为1至16,并使用它来识别模式。有更多练习的人很可能直接从课文中判断出他们。

代码语言:javascript
复制
final int money = userInput.nextInt();

int chocolateBars = money + (money - 1) / (NUMBER_OF_COUPONS_FOR_ADDITIONAL_BAR - 1);
int coupons = (money - 1) % (NUMBER_OF_COUPONS_FOR_ADDITIONAL_BAR - 1) + 1;

System.out.println("You will have total of " + chocolateBars + " bars and " + coupons + " coupons left.");

(编辑:刚刚实现了任务明确要求一个循环,哦,好吧)

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/203684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档