📢完整的题目要求和源代码请按下面指示前往我的Github仓库~

BUAA-2023-OOpre

题目信息

第一次作业指导书

训练目标

  • 学习 Java 的基本语法并完成给定代码的错误修改

任务:基于给定 Java 代码完成错误的修改

作业要求

课程组在本次作业对应的git仓库中提供了一份有错误的代码,你需要对代码进行修改,使程序能够正确的完成上面的场景逻辑。完成代码的修改后,你需要将代码提交到hw1的评测窗口,并且通过所有测试点

代码场景描述

该代码模拟一个孩子从水果店购买水果和吃水果的场景。

题目中涉及的水果种类有且仅有苹果(apple)和香蕉(banana)。初始时刻,孩子持有 20 元且没有任何水果,水果店有 5 个苹果和 5 个香蕉,其中每个苹果 3 元,每个香蕉 2 元。

在水果店购买水果可以增加孩子手中的对应的水果数目。对于一种水果,只有孩子的钱足够购买它,并且店内这种水果的数量大于 0 时才可以成功购买这种水果,否则购买失败。

吃水果会减少孩子手中水果数目,只有孩子手中某种水果的数目大于 0 孩子才可以食用这种水果,否则食用失败

输入输出格式

  • 在第一行输入一个 整数 n (1<n<50)
  • 接下来 n 行每行输入一个命令,格式为 eat/buy+ 空格 + 水果名称,代表孩子尝试食用/购买对应水果。
  • 保证水果名称仅仅有 banana 和 apple。

输出的内容在我们所给的代码中是正确完成的,同学们不修改 System.out 相关的内容即可。正确实现后的代码会在每一个接受一个命令后输出执行成功或者失败。若成功则输出 ok ,失败则输出 failed

样例

1
2
3
4
5
4
buy apple
eat apple
eat apple
eat banana

期望输出

1
2
3
4
buy apple ok!
eat apple ok!
eat apple failed!
eat banana failed!
1
2
3
4
5
6
5
eat banana
eat apple
buy banana
eat apple
eat banana

期望输出

1
2
3
4
5
eat banana failed!
eat apple failed!
buy banana ok!
eat apple failed!
eat banana ok!
1
2
3
4
5
6
7
6
buy apple
buy apple
buy apple
buy apple
buy apple
buy apple

期望输出

1
2
3
4
5
6
buy apple ok!
buy apple ok!
buy apple ok!
buy apple ok!
buy apple ok!
buy apple failed!

解析说明

关于第一次作业的解析与说明

本文对作业要求的源代码修改进行总结并展示自己的理解

源代码语法错误点

Main类

  • Line 9
    1
    for (i = 0; i < opCount; ++i)

    该行代码中的i未定义

Seller(Store)类

  • Line 16
    1
    child.money -= APPLE_PRICE;

    Child类的money属性是private的,无法直接访问,应该调用public方法subMoney

    Child类

1
public void Child(int money)

这是一个构造器,没有返回类型,应该去掉void关键字

1
public static void addOneFruit(String goal)

该方法在Seller(Store) 类中通过对象被调用,不应该有static修饰

1
public boolean buyFromStore(String goal, Store store)

方法体中没有返回语句,也无需返回值,返回类型改为void

源代码风格改进点

Main类

Magic Number问题

1
Store store = new Store(5, 5);

向该类构造器传入数字字面量(Magic Number) 5,不利于快速理解代码含义,建议改为appleCount, bananaCount

1
Child child = new Child(20);

20建议改为initMoney

1
2
child.eatOneFruit(instr.substring(4));
child.buyFromStore(instr.substring(4), store);

4表示对输入指令字符串的起始位置,建议改为beginIndex

Seller(Store)类

类名问题

源代码中类文件名是Seller.java,但是类名是Store,建议保持一致,这里将类名改为Seller