综合练习:图书管理系统
需求:
图书管理系统,要把图书馆的图书管理、读者管理、图书借阅管理等日常管理工作实行计算机统一管理,以提高工作效率和管理水平。目前我们还没学习数据库,所以将数据存储在数组中;配合流程控制来开发图书管理系统。
流程控制在一个项目开发中至关重要,它决定着项目的执行流程,通过它可完成逻辑控制。流程控制分为三类:顺序执行、条件控制、循环控制。
条件控制:if-else;switch-case
循环控制:for;while;do-while循环
Java 语言中提供的数组是用来存储固定大小的同类型元素,是有序数据的集合,可以用一个统一的数组名和下标来唯一地确定数组中的元素。数组有一维数组和多维数组。
package com.liudm.demo4;
import java.util.Scanner;
public class library {
public static void main(String[] args) {
int [] bookNum = new int [10];
String [] bookName = new String [10];
int [] bookState = new int [10];
String isCont;
//初始化原始信息
bookNum[0] = 1001;
bookName[0] = "第一本书";
bookState[0] = 1;
bookNum[1] = 1002;
bookName[1] = "第二本书";
bookState[1] = 1;
bookNum[2] = 1003;
bookName[2] = "第三本书";
bookState[2] = 1;
do{
System.out.println("欢迎使用图书馆里系统\n"
+ "——————————————————\n"
+ "1、 新增图书\n"
+ "2、 查看图书\n"
+ "3、 删除图书\n"
+ "4、 借出图书\n"
+ "5、 归还图书\n"
+ "6、 退出图书\n"
+ "——————————————————\n");
System.out.println("请输入您需要的操作前的序号:");
Scanner op = new Scanner(System.in);
int operate = op.nextInt();
switch (operate) {
case 1: //新增图书
System.out.println("————新增图书————\n"
+ "请输入新图书编号:");
Scanner num1 = new Scanner(System.in);
int booknum = num1.nextInt();
System.out.println("请输入书名:");
Scanner name = new Scanner(System.in);
String bookname = name.next();
for (int i = 0; i < bookNum.length; i++) {
if (bookNum[i] == 0) {
bookNum[i] = booknum;
bookName[i] = bookname;
bookState[i] = 1;
}
}
System.out.println("您新增的图书是:" + booknum + "\t" + bookname);
break;
case 2: //查看图书
System.out.println("————查看图书————\n"
+ "查找图书?[a] / 查看书库?[b]");
Scanner op2 = new Scanner(System.in);
String oper1 = op2.next();
switch (oper1) {
case "a":
System.out.println("请输入要查看的图书的编号:");
Scanner num2 = new Scanner(System.in);
int searchNum = num2.nextInt();
for (int i = 0; i < bookNum.length; i++) {
if (bookNum[i] == searchNum) {
System.out.println("您查找的图书是:" + bookNum[i] + "\t" + bookName[i]);
}
}
break;
case "b":
System.out.println("图书馆里的图书有:\n"
+ "序号" + "\t" + "图书编号" + "\t" + "书名");
for (int i = 0; i < bookNum.length && 0 != bookNum[i]; i++) {
System.out.println((i+1) + ". " + "\t" + bookNum[i] + "\t" + bookName[i]);
}
break;
default:
System.out.println("输入错误!");
break;
}
break;
case 3: //删除图书
System.out.println("————删除图书————\n"
+ "请输入要删除的图书的编号:");
Scanner num3 = new Scanner(System.in);
int delNum = num3.nextInt();
for (int i = 0; i < bookNum.length; i++) {
if (bookNum[i] == delNum) {
System.out.println("您要删除的图书是:" + bookNum[i] + "\t" + bookName[i]);
System.out.println("删除中……\n"
+ "删除成功!");
bookNum[i] = 0;
bookName[i] = null;
bookState[i] = 0;
}
}
break;
case 4: //借出图书
System.out.println("————借出图书————\n"
+ "请输入要借的图书的编号:");
Scanner num4 = new Scanner(System.in);
int borrowNum = num4.nextInt();
for (int i = 0; i < bookNum.length; i++) {
if (bookNum[i] == borrowNum) {
if (bookState[i] == 1) {
System.out.println("您要借的图书是:" + bookNum[i] + "\t" + bookName[i]);
bookState[i] = 0;
}
else if (bookState[i] == 0) {
System.out.println("对不起,这本图书已经被借出!");
}
else {
System.out.println("ERROR!图书状态出错!");
}
}
}
break;
case 5: //归还图书
System.out.println("————借出图书————\n"
+ "请输入要借的图书的编号:");
Scanner num5 = new Scanner(System.in);
int returnNum = num5.nextInt();
for (int i = 0; i < bookNum.length; i++) {
if (bookNum[i] == returnNum) {
System.out.println("您要归还的图书是:" + bookNum[i] + "\t" + bookName[i]);
bookState[i] = 1;
System.out.println("归还成功!");
}
}
break;
case 6: //退出
break;
default:
System.out.println("WARNING!非法操作!");
break;
}
System.out.println("是否继续? [Y/N]");
Scanner cont = new Scanner(System.in);
isCont = cont.next();
}while("Y".equals(isCont));
}
}
参考完整代码:
package my.bookmanager;
import java.util.Scanner;
public class BookManager {
public static void main(String[] a) {
/*
* 创建数组存储图书信息
*/
String[] bookname = new String[7]; // 存储图书名称数组
int[] bookstate = new int[7]; // 存储图书借出状态:0已借出/1可借
int[] bookdate = new int[7]; // 存储图书借出日期
int[] bookcount = new int[7]; // 借出次数
int choose = 1; // 判断用户是否选择退出或是非法操作,1为初始值2为退出或者非法操作
Scanner input = new Scanner(System.in);
/*
* 初始三个图书
*/
bookname[0] = "平凡的世界";
bookstate[0] = 0;
bookdate[0] = 1;
bookcount[0] = 12;
bookname[1] = "骆驼祥子";
bookstate[1] = 1;
bookcount[1] = 10;
bookname[2] = "朝花夕拾";
bookstate[2] = 1;
bookcount[2] = 20;
do {
/*
* 开始菜单
*/
System.out.println("欢 迎 使 用 迷 你 图书 管 理 器");
System.out.println("-------------------------------------");
System.out.println("1. 新 增 图书");
System.out.println("2. 查 看 图书");
System.out.println("3. 删 除 图书");
System.out.println("4. 借 出 图书");
System.out.println("5. 归 还 图书");
System.out.println("6. 退 出图书");
System.out.print("--------------------------------------\n");
System.out.print("请选择: ");
int choice = input.nextInt();
/*
* switch循环提供菜单选择操作
*/
switch (choice) {
case 1:
/*
* 新增图书
*/
System.out.println("---> 新增图书\n");
System.out.print("请输入图书名称: ");
String name = input.next();
if (bookname[5] != null) {
System.out.println("新增《" + name + "》失败!货架已满!");
break;
}
for (int i = 0; i < bookname.length; i++) { // 循环遍历bookname数组
if (bookname[i] == null) { // 查询最后一个空位置插入
bookname[i] = name;
bookstate[i] = 1;// 置新增的图书可借状态
bookcount[i] = 0;// 置借出次数为0
System.out.println("新增《" + name + "》成功!");
break;
}
}
System.out.println("**************************");
break; // 跳出switch循环
case 2:
/*
* 查看图书
*/
System.out.println("---> 查看图书\n");
System.out.println("序号\t状 态\t名称\t\t借出日期\t借出次数");
for (int i = 0; i < bookname.length; i++) {
if (bookname[i] == null) {
break;
} else if (bookstate[i] == 0) { // bookstate[i]为0则说明该图书已借出
System.out.println((i + 1) + "\t已借出\t" + "<<"
+ bookname[i] + ">>\t" + bookdate[i] + "日\t"
+ bookcount[i] + "次");
} else if (bookstate[i] == 1) { // bookstate[i]为1则说明该图书可借
System.out.println((i + 1) + "\t可 借\t" + "<<"
+ bookname[i] + ">>" + "\t\t" + bookcount[i] + "次");
}
}
System.out.println("**************************");
break;
case 3:
/*
* 删除图书
*/
boolean flag = false;// 标识删除成功与否
System.out.println("---> 删除图书\n");
System.out.print("请输入图书名称: ");
name = input.next();
// 遍历数组,查找匹配信息
for (int i = 0; i < bookname.length; i++) {
// 查找到,每个元素前移一位
if (bookname[i] != null && bookname[i].equalsIgnoreCase(name)
&& bookstate[i] == 1) { // equalsIgnoreCase方法判断字符串是否相同且忽略大小写
int j = i;
while (bookname[j + 1] != null) { // 遍历需删除的元素之后的非空元素
bookname[j] = bookname[j + 1];
bookstate[j] = bookstate[j + 1];
bookdate[j] = bookdate[j + 1];
bookcount[j] = bookcount[j + 1];
j++;
}
// 最后一个不为空的元素置空
bookname[j] = null;
bookdate[j] = 0;
System.out.println("删除《" + name + "》成功!");
flag = true;// 表示删除成功
break;
} else if (bookname[i] != null
&& bookname[i].equalsIgnoreCase(name) && bookstate[i] == 0) {
System.out.println("《" + name + "》为借出状态,不能删除!");
flag = true;
break;
}
}
if (!flag) { // 若flag不为true则说明用户输入的名称在bookname数组中没有匹配成功
System.out.println("没有找到匹配信息!");
}
System.out.println("**************************");
break;
case 4:
/*
* 借出图书
*/
System.out.println("---> 借出图书\n");
System.out.print("请输入图书名称: ");
String want = input.next(); // 要借出的图书名称
for (int i = 0; i < bookname.length; i++) {
if (bookname[i] == null) { // 无匹配
System.out.println("没有找到匹配信息!");
break;
} else if (bookname[i].equals(want) && bookstate[i] == 1) { // 找到匹配可借
bookstate[i] = 0; // 将此图书置于借出状态
System.out.print("请输入借出日期:");
bookdate[i] = input.nextInt();
while (bookdate[i] < 1 || bookdate[i] > 31) { // 一个月只有31天则需要数据校验
System.out.print("必须输入大于等于1且小于等于31的数字,请重新输入:");
bookdate[i] = input.nextInt();
}
System.out.println("借出《" + want + "》成功!");
bookcount[i]++;
break;
} else if (bookname[i].equals(want) && bookstate[i] == 0) { // 找到匹配已被借出
System.out.println("《" + want + "》已被借出!");
break;
}
}
System.out.println("**************************");
break;
case 5:
/*
* 归还图书并计算租金
*/
System.out.println("---> 归还图书\n");
int charge = 0;// 租金
System.out.print("请输入图书名称: ");
want = input.next();
for (int i = 0; i < bookname.length; i++) {
if (bookname[i] == null) { // 无匹配
System.out.println("没有找到匹配信息!");
break;
} else if (bookname[i].equals(want) && bookstate[i] == 0) { // 找到匹配
bookstate[i] = 1;
System.out.print("请输入归还日期:");
int rebookdate = input.nextInt();
while (rebookdate < bookdate[i] || rebookdate > 31) { // 归还日期的数据校验
if (rebookdate < bookdate[i]) {
System.out.print("归还日期不能小于借出日期,请重新输入:");
rebookdate = input.nextInt();
} else {
System.out.print("一个月只有31天,请重新输入:");
rebookdate = input.nextInt();
}
}
charge = rebookdate - bookdate[i];
System.out.println("\n归还《" + want + "》成功!");
System.out.println("借出日期为:" + bookdate[i] + "日");
System.out.println("归还日期为:" + rebookdate + "日");
System.out.println("应付租金(元):" + charge);
break;
} else if (bookname[i].equals(want) && bookstate[i] == 1) { // 找到匹配但没有借出
System.out.println("该图书没有被借出!无法进行归还操作。");
break;
}
}
System.out.println("**************************");
break;
case 6:
choose = 2; // 用户选择退出
break;
default:
System.out.println("非法操作");
choose = 2; // 用户没有输入1到6的整形数据则属于非法操作直接退出程序
break;
}
if (choose != 2) {// 如果为2则是用户选择了退出或者是非法操作
System.out.println("输入0返回 ");
int back = input.nextInt();
if (back != 0) {// 如果用户没选择0则为非法操作
System.out.println("非法操作");
choose = 2;
}
}
} while (choose == 1); // 判断用户择退出还是返回
System.out.print("谢谢使用");
}
}