数组的小使用
/*
作业:使用数组实现注册登陆功能,
第一步: 提示用户选择功能, 1(注册) 2(登陆) 。
1. 提示用户输入注册的账号(数字)与密码,如果输入账号已经存在数组中,提示用户重新输入。
登陆:
提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在数组中,那么登陆成功,否则登陆失败
查看:
查看注册完毕之后,把集合中的所有用户信息打印出来。
退出登录,修改密码放在登录中做
退出系统
*/
import java.util.Scanner;
public class UserManage {
// 总数组长度 最大能够存储多少个账号
public static final int USER_COUNT = 1000;
// 声明数组 用于存在一定数量的账号 同一个账号对应的密码下标必须一致
public static String[] accountArr = new String[USER_COUNT];
public static String[] passwordArr = new String[USER_COUNT];
// 表示当前数组存储数据的下标
public static int index = 0;
/**
* 记录登录用户的用户名
*/
public static String loggedUserName;
// 记录登录用户在数组中的下标
public static int loggedUserIndex = -1;
/**
* 根据用户名获取在数组对应的下标
*
* @return -1表示没有找到对应的账号
*/
public static int getIndexByName(String name) {
// 一定要注意判断name是否为null
if (name == null) return -1;
for (int i = 0; i < accountArr.length; i++) {
if (name.equals(accountArr[i])) { // 依次使用用户名和数组的每个元素进行判断
return i; // 相等 则说明找到 可以直接返回对应的下标
}
}
return -1; // 没有找到对应的数据 则返回-1
}
/**
* 保存用户名和密码
*
*/
public static void register() {
String name = getInput("请输入用户名:");
String password = getInput("请输入密码:");
// 存储数据的下标该多少?
// 1. 声明一个变量进行计数
// 2. 通过循环找到对应的下标值为null的位置
if (index >= USER_COUNT) {
System.out.println("用户已满");
return;
}
// 1.判断是否已经存在相同的用户
if (getIndexByName(name) != -1) {
System.out.println("注册失败,存在相同用户名,请重新填写!");
return; // 存储失败
}
// 使用相同下标进行数据的存储 保证数据的对应
accountArr[index] = name;
passwordArr[index] = password;
index++;//计数 增加 使下一次存储的数据在下一个位置
System.out.println("注册成功");
}
/**
* 登录
*
*/
public static boolean login() {
String name = getInput("请输入用户名:");
String password = getInput("请输入密码:");
int i = getIndexByName(name); // 通过用户找下标
if (i < 0 || i >= USER_COUNT) {
System.out.println("用户名不存在");
return false;
}
// 判断密码
if (!password.equals(passwordArr[i])) { // 密码的下标必须和用户的下标一致
System.out.println("密码不正确");
return false;
}
// 保存登录用户的信息
loggedUserIndex = i; // 下标
loggedUserName = name;// 用户名
return true;
}
// 显示未登录的菜单
public static void showUnLoginMenu() {
System.out.println("-------------");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.退出系统");
// 直接调用方法获取输入的值
int input = getInput(3);
if (input == 3) {
return;
}
if (input == 1) {
// 进行登录
boolean result = login();// 进行登录并获取登录结果
if (result) {
showLoggedMenu(); // 显示已经登录的按钮
}
} else {
// 进行注册
register();
}
showUnLoginMenu(); // 继续显示菜单
}
public static void showLoggedMenu() {
System.out.println("-----欢迎 " + loggedUserName + " 使用系统--------");
System.out.println("1.修改密码");
System.out.println("2.查看所有用户");
System.out.println("3.退出登录");
System.out.println("4.退出系统");
int input = getInput(4);
switch (input) {
case 1 -> updatePassword(); // 密码修改
case 2 -> showAll(); // 列出用户
case 3 -> {
// 重置登录信息
loggedUserName = null;
loggedUserIndex = -1;
return;
}
case 4 ->
// 退出系统 -- 不能return,因为此处return仅仅是返回到showUnLoginMenu 方法 还是会显示未登录菜单
System.exit(0);
}
showLoggedMenu();
}
/**
* 修改密码
*/
public static void updatePassword(){
String oldPwd = getInput("请输入原始密码:");
// 通过登录的下标获取保存的密码
String oriPwd = passwordArr[loggedUserIndex];
if(oldPwd.equals(oriPwd)){
// 继续输入新密码进行
String newPwd = getInput("请输入新的密码:");
passwordArr[loggedUserIndex] = newPwd; // 覆盖原始密码
System.out.println("密码修改成功");
}else{
System.out.println("原始密码不正确!");
}
}
/**
* 显示所有已经注册的用户
*/
public static void showAll(){
// 此处可以写 accountArr.length 但是没有必要 因为 当前数组只存储到index结束的
for (int i = 0;i < index; i ++){
System.out.printf("%s\t",accountArr[i]);
if((i + 1) % 4 == 0){
System.out.println();
}
}
System.out.println();
}
/**
* 获取输入的int值
*
* @param max 最大值
*/
private static int getInput(int max) {
System.out.print("请选择操作编号:");
Scanner in = new Scanner(System.in);
while (true) {
int input = in.nextInt();
// 判断输入的值是否在范围内
if (input < 1 || input > max) {
System.out.print("输入的菜单编号不正确,请重新输入:");
continue;
}
return input;
}
}
/**
* 获取输入的字符串
*
* @param title 输入提示字符串
*/
private static String getInput(String title) {
System.out.print(title);
Scanner in = new Scanner(System.in);
return in.next();
}
// 入口方法
public static void main(String[] args) {
index++;
accountArr[0] = "aa";
passwordArr[0] = "123";
// 程序启动直接显示未登录的菜单
showUnLoginMenu();
}
}