OOP 迭代一

写在前面

同学们,从本周开始,我们将逐步开发一个网上交易平台(Transaction Management System)。每两周,我们都会添加新的需求,来不断完善系统功能。例如,TMS-1 阶段需要大家完成账号注册和登录系统,而 TMS-2 阶段则需要在 TMS-1 的基础上实现商品上架和购买等功能。

在开始编写代码之前,建议大家先仔细阅读需求说明和文末的 HINTS,再开始编写代码,编写好的代码需要经过 patpat 评测。通过所有的测试点后,需将整个项目文件打包上传到云平台,即可完成本次实验。希望大家能够认真完成,不作弊不抄袭

patpat 的下载和使用说明请参考:patpat 使用指南


实验说明

一、实验目标

  1. 熟悉 Java 语法;了解 Java 项目的目录结构。
  2. 区分类变量与成员变量;区分类方法(静态方法)与成员函数。
  3. 学会适当封装,了解对象继承与多态的使用方式。

二、实验的重难点

  1. 逻辑处理。实验过程中需要判断不同情况,同学们需要处理好这部分的逻辑。
  2. 抽象。同学们需要将实验题目中涉及的实体、功能抽象为不同的类,不建议将大量的属性与功能塞到一个类中,不建议整个项目只有一个 Test 类。同时,建议将类型、功能相近的类归到一个(可以认为是一个文件夹)下。
  3. 成员方法、静态方法的使用场景。

三、关键技术

  • 输入与输出。
  • 列表、哈希表、集合等类的使用。

四、相关资料

五、DDL及其他说明

  • 实验持续 3+ 周,截止时间为 10 月 13 日 23:59,希望大家度过一个愉快的国庆假期。🥳
  • 注意输出是否有空格。一般情况下,如果没有特殊说明,每条输出均没有多余的空白符(如一条命令的开头没有空白符),同学们在复制粘贴时需要注意。

实验内容

一、题目背景

咔啡国因其得天独厚的咖啡资源而极度繁荣昌盛。随着商业的蓬勃发展,人们意识到开发一款高效且便捷的交易平台系统的重要性。这个交易平台系统将为咔啡国的从业者提供一个全面的市场,使得他们能够方便地买卖各种产品。通过这个系统,店家可以将自己的货品以公正的价格出售,顾客可以方便地购买到高品质的产品。这款交易平台系统的开发将进一步推动咔啡国商业的发展,而这个任务将由你来完成!

二、命令概览

本次迭代需要你完成如下命令:

命令符 说明
quit 关机
register 卡号 姓名 密码 确认密码 身份类型 用户注册
login 卡号 密码 用户登录
logout 用户登出
printInfo 打印用户个人信息
printInfo 卡号 打印其他用户信息

三、功能描述

1. 开关机

实现基本的命令读入和退出功能。

首先,你的任务是编写一个 Test 类,当程序启动时,进入main方法,等待用户输入,输入命令的基本格式为

1
命令 [参数1] [参数2] [参数3] ... [参数n]

其中

  • 用户的每一行输入都视为一条命令
  • 对于每一条命令,如果命令符未定义,那么请输出信息
1
Command '命令' not found

在所有的错误信息中,该条信息的优先级最高。

  • 对于每一条命令,失败时有且仅有一条错误信息输出
  • 参数的数目是不定的(n ≥ 0)
  • 命令和参数之间,参数和参数之间由一个或多个空白符分隔
  • 命令之前和最后一个参数之后可以没有空格,也可以有若干个空格
    以下命令在格式上是合法的:
1
command arg1 arg2    arg3     arg4

当终端输入 quit 时,系统退出(程序退出状态为0),并在终端输出如下内容

1
----- Good Bye! -----

quit 命令也需要检查参数数量是否合法!

2. 用户注册

2.1 格式说明

交易平台提供三类身份:管理员、店主以及顾客。在注册时,用户需要选择自己的身份。

xx 国的居民使用的身份证称为“Kakafee 卡”,注册交易平台账号时需要填写 Kakafee 卡号、姓名、密码、确认密码以及身份类型。

命令格式为

命令符 参数 1 参数 2 参数 3 参数 4 参数 5
register 卡号 姓名 密码 确认密码 申请身份类型

姓名

  1. 由英文字母(大小写均可)和下划线构成。

  2. 第一位不能为下划线。

  3. 长度在 4-16 字符之间。

Kakafee 卡号

  1. Kakafee 卡号一共 12 位,全国唯一。
  2. 前 4 位为区域代码,范围 [0001, 4500]。
  3. 中间 4 位为出生年份代码,范围 [1785, 1886]。
  4. 最后 4 位为识别码,范围 [1000, 3000]。

密码

  1. 长度为 8-16 位。
  2. 由英文字母(大小写均可)、数字和特殊字符(@_%$)三类构成,每类至少有一个字符。

确认密码

  • 两次输入的密码一致。
  • 只需要判断确认密码和密码是否一致,不需要再判断确认密码的合法性。

身份类型

  1. Administrator 管理员
  2. Merchant 商家
  3. Customer 顾客

2.2 命令反馈说明

2.2.1 注册成功

当所有条件都满足时,注册成功并在终端输出

1
Register success

2.2.2 参数格式不符合规定

register 命令中,共有 5 个参数。如果参数数量不等于 5 ,那么输出

1
Illegal argument count

如果参数数量合法,那么按照如下顺序检查信息

2.2.3 用户已登录

如果系统有用户在线时,无法注册,输出如下信息

1
Already logged in

2.2.4 卡号格式不合法

1
Illegal Kakafee number 

2.2.5 用户已注册

用户已经注册过,再次注册应在终端输出如下信息

1
Kakafee number exists

2.2.6 姓名格式不合法

1
Illegal name

2.2.7 密码格式不合法

1
Illegal password

2.2.8 确认密码与密码不一致

1
Passwords do not match 

2.2.9 身份类型不合法

1
Illegal identity

如果存在多种不合法情况,按上述顺序只输出最先发生的非法信息。

3. 用户登录

对于已注册的用户,登录平台时需要输入 Kakafee 卡号以及密码

3.1 格式说明

命令符 参数1 参数2
login Kakafee 卡号 密码

3.2 命令反馈说明

3.2.1 登录成功

1
Welcome to TMS

3.2.2 参数数量不合法

1
Illegal argument count

3.2.3 用户已登录

该系统只允许一个用户在线。

1
Already logged in

如果一个人重复登录,那么同样输出上述信息。

3.2.4 卡号格式不合法

1
Illegal Kakafee number 

3.2.5 用户未注册

1
Kakafee number not exists

3.2.6 密码错误

无论密码格式是否正确,只要与注册时的密码不一致,均输出

1
Wrong password

4.用户登出

4.1 格式说明

命令符 参数
logout

4.2 命令反馈说明

4.2.1 登出成功

当系统有在线用户时,输入该命令则(迫使在线用户)成功登出。

终端输出

1
Bye~

4.2.2 参数数量不合法

logout 命令后不带有参数,如果命令符后带有参数,仍输出

1
Illegal argument count

4.2.3 无用户在线

1
Please log in first

5. 打印信息

建议同学们重写 Object 类的 toString() 方法完成这项功能,当然也可以通过设计专门的格式化类来实现。

5.1 格式说明

命令符 可选参数
printInfo [Kakafee卡号]
  • 无参数表示打印用户的个人信息,有参数则表示打印他人信息。
  • 顾客和商家只可查看个人信息,管理员可查看任何人信息。

5.2 命令反馈说明

5.2.1 成功

输出信息应包括:姓名、卡号以及身份。

1
2
3
Name: username
Kakafee number: KakafeeNumber
Type: Administrator/Merchant/Customer

冒号为英文冒号,且冒号后有一个空格。

5.2.2 参数格式不符合规定

参数只能为空或者 1 个。

1
Illegal argument count

5.2.3 未登录

1
Please log in first

5.2.4 权限不足

商家或顾客调用带有参数的 printInfo 时,提示权限不足。

1
Permission denied

5.2.5 Kakafee 卡号不合法

1
Illegal Kakafee number

5.2.6 用户不存在

当 Kakafee 卡号对应的用户未注册时,提示 Kakafee 卡号不存在。

1
Kakafee number not exist 

四、HINTS

1. 命令优先级

首先,输入命令未定义时,输出命令不存在,替换下面的 cmd 为具体的命令名称。

1
Command 'cmd' not found

例如输入 logged out,由于命令 logged 未定义,所以输出

1
Command 'logged' not found

其次,当输入命令有定义但参数个数不合法时,输出

1
Illegal argument count

当命令有定义,参数个数正确时,才会进一步输出 Already logged inBye ~ 等成功或失败信息。

当一句命令存在多种非法情况,按上述顺序只输出最先发生的非法信息。

2. 实现思路

Info

这里的实现思路仅供参考,具体同学们可以自行发挥。🙂

2.1 实体类

对于用户,你可以设计一个 User 类(不限定类的名字,但一个好的名字是十分重要的),该类至少包括如下属性:

  • 卡号

  • 姓名

  • 密码

  • 身份类型(可以通过一个字段表示,也可以设计为三种身份继承自一个 User 基类)

建议将属性设置为私有属性(private),并为其编写相应的 getter/setter

2.2 工具类

对于一些具有一定通用性或者不依附实体对象的方法,例如检查卡号格式、检查密码格式、判断登录状态、判断注册状态、格式化输出实体类等,可以设计一些工具类,在其中实现这些方法,一般设计为静态方法即可。

2.3 全局变量管理

为了完成实验,同学们不免要设计一些全局变量。对于全局变量的管理,同学们可以设计一个类,相关的全局变量设置为 static;也可以设计一个类,而将全局变量设置为成员变量,之后通过创建一个对象来操作全局变量。

2.4 正则表达式

在判断姓名,密码是否合法时,建议大家用正则表达式来判断。例如,想要判断名字是否合法时,可以参考下列代码

1
2
3
4
5
6
7
public boolean judgeName(String name) {
String name_pattern = "[A-Za-z][A-Za-z_]{3,15}";
if (!name.matches(name_pattern)) {
return false;
}
return true;
}

正则表达式通常用于匹配字符串模式,不太适合处理范围验证,所以对于卡号的判断,可以分割字符串后再验证范围。正则表达式的更多用法,大家可以查看:正则表达式 - 教程

2.5 List、Map 等的使用

在开发时, 合理使用ListMap加快我们的开发效率。

对于List ,常用的方式如下

1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String[] args) {
// List<YourClass> list = new LinkedList<>();
List<TargetClass> list = new ArrayList<>(); // 一般来说,用ArrayList<>()

list.add(targetObject); // 在列表的尾部插入数据
list.remove(index); // 根据下标删除元素。注意,index >= 0 && index < list.size()
}
}

对于Map ,常用的方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
static class Person {
public final String id;
public String name;

public Person(String id, String name) {
this.id = id;
this.name = name;
}
}

public static void main(String[] args) {
// Map<key, value> map = new HashMap<>();
// Map<Key, value> map = new TreeMap<>();
Map<String, Person> map = new HashMap<>();
Person person = new Person("1234", "xiaoming");

map.put(person.id, person); // 向表中添加数据
map.containsKey(person.id); // 判断key是否存在
Person p = map.get(person.id); // 根据key获取value
map.remove(person.id); // 删除key对应的value
}
}

更多的使用方法同学们可以查阅相关资料,这里就不展开了。ListMap还涉及到“泛型”,感兴趣的同学可以提前了解了解。

五、测试样例

每次迭代有测试样例,测试样例也是 patpat 评测数据,大家可以参考样例修改自己的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
QUisnjfg 7856
Command 'QUisnjfg' not found
register 439917962023 buaaer A123a456@ A123a456@ Administrator
Register success
register 439917962000 dlam 123456 MG
Illegal argument count
register 439917962023 buaaer 234567 234567 Administrator
Kakafee number exists
login 439917962000 456789
Kakafee number not exists
login 439917962023 237895
Wrong password
login 439917962023 A123a456@
Welcome to TMS
printInfo
Name: buaaer
Kakafee number: 439917962023
Type: Administrator
logout
Bye~
printInfo
Please log in first
logout
Please log in first
quit
----- Good Bye! -----