My Scs 1

MySCS -1 #

同学们,从这周开始,我们会迭代完成一个MySCS,即从零开发的软件学院云平台(青春版)。

我们每两周会增加一次新的需求,如,MySCS-1需要大家完成账号注册和登录系统,MySCS-2需要大家在1的基础上添加课程系统或其它系统等。

编写好的代码需要大家用patpat评测,所有测试点都通过以后即可上传到云平台完成本次实验。希望大家认真完成哦!请勿抄袭,抄袭会被查到的(盯

题目背景 #

软件学院云平台(青春版),即MySCS,是一款更加轻量化的命令行操作的云平台,屏幕前的你拥有完全自主知识产权,有极大的使用价值和收藏价值。

MySCS分为教师端和学生端,可以实现传统scs的大部分功能,如教师端对课程的增删改查,对课程所属的实验的增删改查,教师还可以为课程添加学生和助教,学生可以查看参与的课程并提交实验作业,助教可以协同老师管理课程等。

命令概览 #

命令行功能输出
QUIT系统关机—– Good Bye! —–
register 学工号 名 姓 邮箱 密码 确认密码注册register success
already logged in
user id illegal
user id duplication
user name illegal
email address illegal
password illegal
passwords inconsistent
login 学工号 密码登录Hello 名~
Hello Professor 姓~
already logged in
user id illegal
user id not exist
wrong password
printInfo打印本人信息Name: 名 姓
ID: xxx
Type: Student(或Professor)
Email: xxx

login first
printInfo 学号打印其他人信息Name: 名 姓
ID: xxx
Type: Student(或Professor)
Email: xxx

login first
user id illegal
user id not exist
permission denied
logout退出当前用户Bye~
not logged in

功能描述 #

1.开关机 #

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

首先,你的任务是编写一个Test类:

  • 当程序启动,进入main方法,并连续读入输入的命令行,命令行的基本格式为:
命令 [参数1] [参数2] [参数3]

其中参数数目为不定项;命令和参数,参数和参数之间由一个或多个空白符分隔;命令之前和最后一个参数之后可以没有或有若干个空白符。

当输入的某一行只有空白符,什么都不会输出。

  • 当终端输入 QUIT 时,系统退出(程序退出状态为0),并在终端打印一行字符:
----- Good Bye! -----

2.用户注册 #

用户需要注册账号并登录后才能使用MySCS。

用户注册时,需要提供学工号,名,姓,邮箱,密码和确认密码。

学号 #
  • 对学生而言,一般情况下学号为8位数字,从高向低数,最高两位代表入学年份,随后的两位代表学院编号,随后的一位代表大班号,最低3位代表班内编号。

其中,入学年份取值范围为$[17,22]$,学院编号取值范围为$[01,43]$,大班号取值为$[1,6]$,最低三位没有特殊要求,取值范围为$[001,999]$。

如,$19375030$代表19年入学,在序号为37的学院,第五大班。

有些情况下,学号为2位大写字母+7位数字,SY开头代表学术型硕士研究生,ZY开头 代表专业型硕士研究生,BY开头代表博士研究生。

由于本科生和博士生最多读6年,硕士生最多读4年将被退学,所以硕士生的入学年份取值为$[19,22]$ ,博士生的入学年份取值为$[17,22]$,且硕士和博士研究生的班内编号只有2位,取值范围为$[01,99]$,其他要求相同。

如,$SY2021118$代表硕士研究生,20年入学,21系,第1大班。

合法的学生学号实例:

19375030 19375168 BY2215201 SY2021118

  • 对教师而言,工号为5位数字,没有特殊限制,取值范围为$[00001,99999]$。
姓,名 #

姓和名都应该只由字母组成,其中首字母大写,非首字母小写,姓和名的长度都在1个字符到20个字符之间。

邮箱 #

一个合法的邮箱地址由 用户名 + @ + 服务器域名 组成。

本题要求中,用户名应为长度$\geq1$的字符串,只能由大小写字母,下划线和数字中的一种或几种组 成。

服务器域名的规律为“[N级域名.]…[三级域名.]二级域名.顶级域名”,比如如“qq.com”、 “mp.weixin.qq.com”、“buaa.edu.cn”,“T_T.QAQ.cn"等,域名同样只能由大小写字母,下划线和数字中的一种或几种组成。(即最少有两级域名,最多不限)

密码 #

密码应该为8-16位,只能由大小写字母,下划线和数字中的一种或几种组成,要求以字母开头。

确认密码 #

确认密码必须与密码一致才能成功注册。

成功输出 #

当学工号,姓名,邮箱,密码和确认密码都符合上述要求时,注册成功,系统输出:

register success
失败输出 #
  • 当系统目前有用户登录时,输出
already logged in

(MySCS只允许同时有一位用户处于登录状态,此时不可以执行登录或注册命令)。

  • 学号不合法时,输出
user id illegal
  • 学号已被注册时,输出
user id duplication
  • 姓或名不合法时,输出
user name illegal
  • 邮箱不合法时,输出
email address illegal
  • 密码不合法时,输出:
password illegal
  • 两次密码不一致时,输出:
passwords inconsistent

3.用户登录 #

成功输出 #

当当前没有用户登录,学工号已经注册且密码正确,登录成功,

  • 如果当前为学生登录,系统输出:
Hello 名~
  • 如果当前为教师登录,系统输出:
Hello Professor 姓~
失败输出 #
  • 当系统目前有用户登录时,输出
already logged in
  • 学号不合法时,输出
user id illegal
  • 学号未被注册时,输出
user id not exist
  • 密码错误时,输出
wrong password

3. 用户登出 #

成功输出 #

当当前有用户登录,则登出成功,系统输出:

Bye~
失败输出 #
  • 当系统目前未有用户登录时,输出
not logged in

4.打印信息 #

建议同学们重写Object类的toString()方法完成这项功能。

  • 当命令为 printInfo 时,按以下格式打印本人个人信息。(教师与学生均可使用)
Name: 名 姓
ID: xxx
Type: Student/Professor
Email: xxxxxx
  • 老师有权查看其他老师和学生的个人信息,所以当当前登录用户为教师时,当命令为 printInfo 学号 时,按上述格式打印该人个人信息。
失败输出 #
  • 当前未有用户登录,输出
login first
  • 当学生调用有参数的 printInfo ,输出
permission denied
  • 当作为参数的学号不合法,输出
user id illegal
  • 当学号对应的用户未注册,输出
user id not exist

输出优先级 #

首先,当输入的命令未定义时,输出

command '命令' not found

例如: 输入: loggin 19375030 123456

由于命令 loggin 未定义,所以输出 command 'loggin' not found

其次,当输入的命令有定义,但是参数的个数不符合要求时,输出

arguments illegal

输入: login 19375030 123456 hahalogin 19375030 都对应着 arguments illegal

命令有定义,参数个数正确时,才会输出 Bye~ 或者 user id illegal 等成功或失败输出。

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

例如,注册时学号和姓名均非法,按上述顺序,输出 user id illegal,而不是user name illegal

HINT #

在判断姓名,邮箱和密码等的合法与否时,非常建议利用正则表达式来实现,这是一个非常方便实用常用的技巧,希望同学们趁这个机会学习一二,菜鸟教程的Java正则表达式教程就是个不错的小教程。

例如,想判断19375030@buaa.edu.cn是否满足题目中的条件,用一行代码即可:

public class Demo {
    public static void main(String[] args) {
        String st = "19375030@buaa.edu.cn";
        boolean res = st.matches("\\w+@\\w+(\\.\\w+)+");
        System.out.println(res);//true
    }
}

同样地,想要快速便捷地判断密码是否合法,姓名是否合法,甚至处理一行输入中的空白符,都可以考虑利用正则表达式这个好工具。

当然,同学们可以用能想到的任何合理方法解决(不合理方法:打表等)。

测试样例 #

register 19375030 Xinlei Bao 3499475017@qq.com a7ki7kibangbang a7ki7kibangbang
register success
login 19375030 a7ki7kibangbang
Hello Xinlei~
register 10086 Alex Herbert 10086@buaa.edu.cn 123 123
already logged in
logout
Bye~
register 10086 Alex Herbert 10086@buaa.edu.cn a12345678 a12345678
register success
login 10086 a12345678
Hello Professor Herbert~
printInfo
Name: Alex Herbert
ID: 10086
Type: Professor
Email: 10086@buaa.edu.cn
printInfo 19375030
Name: Xinlei Bao
ID: 19375030
Type: Student
Email: 3499475017@qq.com
logout
Bye~
QUIT
----- Good Bye! -----