我已经编程了大约4个月了,我正在寻找一些方法来改进我的代码。目前,我正在使用一本书"JAVA -问题解决和编程入门“来学习编程。我想我了解循环和if语句的基本知识。
在这本书中的几个项目之后,我觉得我只是在使用我所知道的东西,而不是尝试使用新的东西来改进我的代码。我希望你们能批评我的代码并帮助我改进。
我的问题是..。

假设我们可以从自动售货机上买一块巧克力,每块1美元。每个巧克力棒都有一张优惠券。我们可以从机器上兑换六张巧克力棒的优惠券。这意味着,一旦你开始从机器上购买巧克力棒,你总是有一些优惠券。我们想知道有多少巧克力棒可以吃,如果我们从N美元开始,并总是赎回优惠券,如果我们有足够的额外的巧克力棒。例如,用6美元,我们可以消费7块巧克力棒后,购买6条,给我们6张优惠券,然后把6张优惠券换成一条。这会给我们带来一张额外的优惠券。只要11美元,我们就可以吃掉13块巧克力棒,还剩下一张优惠券。只要12美元,我们就可以吃掉14块巧克力,剩下两张优惠券了。编写一个程序,输入N的值,输出我们可以吃多少巧克力条,以及我们会剩下多少优惠券。使用一个循环,只要有足够的足够至少得到一个巧克力棒,就可以继续赎回优惠券。
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.");
}
}发布于 2018-09-14 04:53:07
chap4num9不是一个合适的Java类名。Java类名以大写字母开头,每个单词以大写字母开头。应该是Chap4Num9。
总是关闭Closeable资源,比如Scanner。更喜欢使用try-finally块来做到这一点。
userMoney应该是最终的。这减少了读者对代码的认知负担,因为他们知道在设置代码后值不会改变。
没有chocoBars。有chocolateBars。不要使用缩写或速记。这是很难阅读,也没有保证读者会知道你想要描述什么。
userCoupon可能只是coupons。它更容易阅读,应该是复数的,因为可能有不止一个。同样,userMoney和money。
不要分配chocolateBars,然后立即重新分配它。只要把它设置成它应该是的值。
虽然你不需要货币变量,但它确实使你更容易理解金钱=#巧克力条。如果您真的愿意,可以通过执行类似于int chocolateBars = userInput.nextInt(); int coupons = chocolateBars;的操作来删除它。
进行计算以减少循环迭代的次数是一种过早的优化,使代码更难阅读。编写易于阅读的代码,直到您遇到实际的性能问题,并且知道瓶颈所在。然后进行测试,以确保您的优化确实解决了问题。
您的代码中有两个bug。(0)在if块之后,您的优惠券数量不正确。如果钱< 6,优惠券是0。如果money >= 6,则优化计算的值是错误的。(1)如果你有N张优惠券,而你花了6英镑就能得到一张巧克力棒和一张优惠券,那么你应该有N5优惠券,而不是N6优惠券。因此,用8元钱,你应该得到9条和3张优惠券。
如果您要应用我的所有建议,您的代码可能如下所示:
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.");
}
}
}发布于 2018-09-14 08:09:33
除了埃里克·斯坦的精彩言论:
1)您应该始终将“魔术数字”(在这种情况下是免费条所需的优惠券数量)存储在一个常量中。特别是当您在多个地方(可能在多个文件中)使用相同的数字,并且需要更改该数字时,如果您错过了这些数字中的任何一个,情况就会非常糟糕。
private final int NUMBER_OF_COUPONS_FOR_ADDITIONAL_BAR = 6;2)这里没有必要使用循环来计算这里的值。利用整数除法和模运算,可以直接计算它们。为了找到公式,我用铅笔和纸,任何写下的结果,金额为1至16,并使用它来识别模式。有更多练习的人很可能直接从课文中判断出他们。
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.");(编辑:刚刚实现了任务明确要求一个循环,哦,好吧)
https://codereview.stackexchange.com/questions/203684
复制相似问题