心得感悟
可能还是因为练得太少,C语言中一连贯写到底的习惯还没改过来,即使掌握了将不同功能用不同的类实现,还是习惯在一个类的一个方法里写到底。而且之前学的东西没有很好理解吸收,一直在用一些很基础的方法。在自己写后再看老师怎么写的确能学到很多,能知道自己的整个思路有没有问题,知道这个程序哪里还可以优化,知道原来这个功能还能用这个方法。
内容简概
一、低阶版密码解锁
二、高阶版密码解锁
三、运行效果
具体内容
一、 低阶版密码解锁
1. 分析程序结构
程序逻辑结构分析我设计的密码解锁主要有三个部分,用三个不同的类完成各部分的功能,如下图所示。但其实保存密码和调取密码都是通过文件来执行的,完全可以再多分一个类。
2. 解锁界面(LoginView)
这个最简单,就先从这个开始。代码还是很容易理解的,没什么好说的。
public class LoginView {
public void piture(){
int j = 0;
//显示九个点
System.out.println("***********************");
for(int i = 1; i < 10; i++) {
System.out.print(i + " ");
if ((i % 3) == 0) {
System.out.println();
}
}
System.out.println("***********************");
}
}
3. 保存/验证密码(CheckPassword)
学了IO流后,我们可以通过文件来保存密码,这样下一次运行程序时,依然是原来设置的密码。实际上这个类还可以细分,再写一个文件读取和保存的类,就不至于代码过长,耦合性过高。
public class CheckPassword {
public void PassWord() throws IOException {
//循环变量
int i = 3;
String SavePassword;
String InputPassword;
//创建文件
String path = "F:/homework/java/MyApplication/lib/src/main/java/MyUnlock";
//命名文件
File file1 = new File(path.concat("/1.txt"));
// 判断是否存在
if (file1.exists() == false){
// 不存在就创建
file1.createNewFile();
System.out.println("第一次登陆请设置密码:");
//接收用户输入
Scanner scanner = new Scanner(System.in);
String savePassword = scanner.nextLine();
//若有空格则去掉
if (savePassword.indexOf(" ") != -1){
SavePassword = savePassword.replaceAll(" ","");
}else {
SavePassword = savePassword;
}
//新建文件保存密码
FileOutputStream beginPassword = new FileOutputStream(file1);
beginPassword.write(SavePassword.getBytes());
beginPassword.close();
System.out.println("密码已经保存");
}
else{ // 密码已存在
System.out.println("请输入解锁密码:");
while(i != 0) {
//接收用户输入
Scanner scanner = new Scanner(System.in);
String inputPassword = scanner.nextLine();
//若有空格则去掉
if (inputPassword.indexOf(" ") != -1){
InputPassword = inputPassword.replaceAll(" ","");
}else {
InputPassword = inputPassword;
}
//读取文件中的密码
BufferedReader br = new BufferedReader(new FileReader(file1));
String OldPassword = br.readLine();
br.close();
//判断密码正误
if (InputPassword.equals(OldPassword)) {
System.out.println("解锁成功!");
break;
} else {
i--;
if (i == 0){
System.out.println("错误次数过多,系统已锁定");
break;
}
System.out.println("解锁失败!还有"+i+"次机会,请重新输入:");
}
}
}
}
}
4. 用户输入界面(Login)
在起名字方面不太给力,整个程序的可读性不高,英语水平和程序逻辑有待提高。
public class Login {
public static void main(String[] args) throws IOException {
//解锁界面
View startView = new View();
startView.piture();
//判断登录状态
//第一次登录则保存密码
//再次登录则判断密码正误
CheckPassword login = new CheckPassword();
login.PassWord();
}
}
二、高阶版密码解锁
1. 分析程序结构
在这里省略了密码图案界面的编写,主要编写它的内部操作。
程序逻辑结构分析
2. 文件操作(FileOperation)
保存判断密码和判断密码都需要用到文件的读写,若放到密码判断类里面,会让程序不够简洁,故可以新建一个类专门管理文件的操作。
public class FileOperation {
public static final String PATH = "F:/homework/java/day1/java/src/main/java/day8/1.txt";
String password;
File file = new File(PATH);
public static final FileOperation instance = new FileOperation();
private FileOperation(){
try {
load();
}catch (IOException e){
System.out.println();
}
}
public void load () throws IOException {
FileInputStream fis = new FileInputStream(PATH);
byte[] pwd = new byte[4];
int count = fis.read(pwd);
if (count == -1){
password = null;
}else{
password = new String(pwd);
}
fis.close();
}
public void save(String password){
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(password.getBytes());
fos.close();
} catch (IOException e){
System.out.println();
}
}
public String read() throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));
String oldPassword = br.readLine();
br.close();
return oldPassword;
}
}
3. 用户操作界面(Login)
保存判断密码和判断密码都需要用到文件的读写,若放到密码判断类里面,会让程序不够简洁,故可以新建一个类专门管理文件的操作。
public class Login {
public static void main(String[] args) throws IOException {
boolean logined =false;
//判断是否已经登录
String Password = FileOperation.instance.password;
if (Password != null){
logined = true;
}
//提示用户操作
String alert;
if (logined) {
alert = "请输入密码:";
} else {
alert = "请设置密码:";
}
System.out.println(alert);
String firt = null;
int wrongTime = 3;
while (wrongTime > 0) {
//接收用户输入
Scanner scanner = new Scanner(System.in);
String inputPassword = scanner.nextLine();
//判断操作
if (logined) {
//已经登陆过 直接比较
Password = FileOperation.instance.read();
if (Password.equals(inputPassword)) {
System.out.println("解锁成功!");
break;
} else {
wrongTime--;
if (wrongTime != 0) {
System.out.println("解锁失败 请重新输入:");
}
else {
System.out.println("三次解锁失败,系统已锁定");
break;
}
}
}else{
//没有登陆过 在设置密码
//判断是设置密码的第一次还是第二次
if (firt == null){
//第一次 保存第一次输入的密码
firt = inputPassword;
System.out.println("请确认密码:");
}else{
//第二次 比较两次输入的密码是否相同
if (firt.equals(inputPassword)){
System.out.println("设置密码成功!");
//保存设置的密码
FileOperation.instance.save(firt);
break;
}else{
wrongTime--;
if (wrongTime != 0){
System.out.println("两次密码不一致 请重新设置密码:");
firt = null;
}
else {
System.out.println("错误次数过多,请稍后再试!");
break;
}
}
}
}
}
}
}
网友评论