import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
/*
图书登记管理程序
注意:该程序由C语言改写而成,注释的内容可能与java语言不符。。。。*/
//定义一个图书类
class BOOK {
String ISBN;// 国际标准书号(ISBN)
String name;// 图书名称
String publishHouse;// 图书出版社
String author;// 图书作者
Float price;// 图书价格,并初始化
String publishDate;// 出版日期
Integer amount;// 图书数量
BOOK pNext;
}
public class Main {
static Scanner in = new Scanner(System.in);
static BOOK head = new BOOK();// 头结点,全局变量
//=======main========main==========main
public static void main(String[] args) throws InterruptedException {
// head.pNext=null;
// system(" mode con cols=130 lines=45 "); //cols为控制台的宽度,lines则代表控制台的高度。
while (true) {
displayMenu();
doMenu();
// doMenu();
}
}
//=========main======main==========main===========main========main==========main===========main
// 显示菜单
static void displayMenu() {
System.out.println("\t\t \t\t ");
System.out.println("\t\t*****************************************");
System.out.println("\t\t* \t\t");
System.out.println("\t 图书登记管理系统 \t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t1-从键盘输入添加新图书\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t2-从文件中添加新图书\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t3-保存所有图书信息到文件\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t4-显示书库所有图书信息\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t5-根据作者,查找图书\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t6-根据ISBN,查找图书\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t7-根据ISBN,修改图书\t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*\t\t8-根据ISBN,删除图书\t\t");
System.out.println("\t\t*\t\t \t\t\n");
System.out.println("\t\t*\t\t9-查看图书总数量\t\t");
System.out.println("\t\t*\t\t \t\t\n");
System.out.println("\t\t*\t\t0---退出--- \t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t* \t\t");
System.out.println("\t\t*****************************************");
}
static void doMenu() {
System.out.println("请输入数字进行选择");
int choice = in.nextInt();
switch (choice) {
case 1:
addNewBook();
displayMenu();
break;
case 2:
addBookFromFile();
displayMenu();
doMenu();
break;
case 3:
saveBookToFile();
displayMenu();
doMenu();
break;
case 4:
displayAllBooks();
displayMenu();
doMenu();
break;
case 5:
knowAuthorFindBook();// 根据作者,查找图书
displayMenu();
doMenu();
break;
case 6:
know_ISBN_FindBook();// 根据ISBN,查找图书
displayMenu();
doMenu();
break;
case 7:
know_ISBN_MotifyBook();
displayMenu();
doMenu();
break;
case 8:
know_ISBN_DeleteBook();
displayMenu();
doMenu();
break;
case 9:
displayBookAllCount();
displayMenu();
doMenu();
case 0:
System.exit(0);
break;
}
}
static void addNewBook() {// 创建链表添加图书
BOOK pTail;
System.out.println("\t\t \t\t\n");
System.out.println(
"|-------------------------请输入图书的以下内容(以空格分开),以下一本图书的ISBN为0结束添加图书---------------------------------|");
System.out.println("\t\t \t\t\n");
System.out.println(
"|-ISBN(13位数字)-|----------名称----------|--------出版社--------|----作者----|--价格--|出版日期用-分隔|--数量(本)--|");
if (head.pNext == null)// 如果头结点的指针等于空
pTail = head;// 尾指针指向头结点
else
pTail = head.pNext;// 否则即 已经存在有图书数据, 尾指针指向最后一个结点 ,最后一个结点的特点是指针域为空
char end = '1';
while (true) {
BOOK pNewNode = new BOOK();// 申请空间专用指针
if (pNewNode == null)// 申请失败则malloc会返回空
System.out.println("图书添加功能发生了错误,请联系技术人员!\n");
pNewNode.ISBN = in.next();
end = pNewNode.ISBN.charAt(0);
if (end == '0') {// 是则退出循环
// free(pNewNode);//释放指针
break;
} // .......控制while循环,退出循环
pNewNode.name = in.next();
pNewNode.publishHouse = in.next();
pNewNode.author = in.next();
pNewNode.price = in.nextFloat();
pNewNode.publishDate = in.next();
pNewNode.amount = in.nextInt();
pTail.pNext = pNewNode;
pTail = pNewNode;
} // 尾指针指向最后一个结点pNewNode
if (head.pNext == null)
System.out.println("没有添加图书\n正在返回主菜单");// 进来但没加图书的的情况
else
System.out.println("以上图书添加成功!");// 以上一本或多本图书成功添加
}
// 显示所有图书
static void displayAllBooks() {
BOOK printAll = new BOOK();// 指向头结点的指针域(存放第一个数据域的地方)
printAll = head.pNext;
if (printAll == null) {
System.out.println("还没有图书,快去添加图书吧");
return;
}
System.out.println("所有的图书:");
System.out.println(
"|------ISBN------|-----------名称----------|-----------出版社-------|----作者-----|--价格--|----出版日期----|--数量(本)--|");
while (printAll != null) {
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |\n", printAll.ISBN,
printAll.name, printAll.publishHouse, printAll.author, printAll.price, printAll.publishDate,
printAll.amount);
printAll = printAll.pNext;
System.out.println(
"|----------------|-------------------------|------------------------|------------|--------|---------------|------------|");
// system("pause");
}
}
// 根据作者,查找图书
static void knowAuthorFindBook() {
BOOK pFind = head.pNext;// 指向头结点的指针域(存放第一个数据域的地方)
System.out.println("请输入图书作者的名字,以进行查找");
String name = in.next();// 建立数组存放用户的输入
// scanf("%s",name);
while (pFind != null) {
if (pFind.author.equals(name) == true) {
System.out.println("找到了该书");
System.out.println(
"|------ISBN------|-----------名称----------|-----------出版社-------|----作者-----|--价格--|----出版日期----|--数量(本)--|");
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |\n", pFind.ISBN,
pFind.name, pFind.publishHouse, pFind.author, pFind.price, pFind.publishDate, pFind.amount);
System.out.println(
"|----------------|-------------------------|------------------------|------------|--------|---------------|------------|\n");
break;
}
pFind = pFind.pNext; // 往下找
}
if (pFind == null)
System.out.println("没有");
}
// 根据ISBN,查找图书
static void know_ISBN_FindBook() {
BOOK pFind = head.pNext;// 指向头结点的指针域(存放第一个数据域的地方)
System.out.println("请输入图书的ISBN,以进行查找");
String ISBN = in.next();
// scanf("%s",ISBN);
while (pFind != null) {
if (pFind.ISBN.equals(ISBN) == true) {// 存在相同,找到...
System.out.println("找到了该书");
System.out.println(
"|------ISBN------|----------名称-----------|--------出版社----------|----作者----|--价格--|----出版日期---|--数量(本)--|");
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |", pFind.ISBN, pFind.name,
pFind.publishHouse, pFind.author, pFind.price, pFind.publishDate, pFind.amount);
System.out.println(
"|----------------|-------------------------|------------------------|------------|--------|---------------|------------|");
// system("pause");
break;
}
pFind = pFind.pNext;
} // 往下找
if (pFind == null)
System.out.println("没有该图书存在");
}
static void know_ISBN_MotifyBook() {
BOOK pFind = head.pNext;// 指向头结点的指针域(存放第一个数据域的地方)
System.out.println("请输入图书的ISBN,以进行修改");
String ISBN = in.next();
while (pFind != null) {
if (pFind.ISBN.equals(ISBN) == true) { // 存在相同则找到
System.out.println("存在该书");
System.out.println(
"|------ISBN------|----------名称-----------|--------出版社----------|----作者----|--价格--|----出版日期---|--数量(本)--|");
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |\n", pFind.ISBN,
pFind.name, pFind.publishHouse, pFind.author, pFind.price, pFind.publishDate, pFind.amount);
System.out.println(
"|----------------|-------------------------|------------------------|------------|--------|---------------|------------|");
System.out.println("请输入修改后的数据\n");
System.out.println(
"|------ISBN------|----------名称-----------|--------出版社----------|----作者----|--价格--|----出版日期---|--数量(本)--|");
pFind.ISBN = in.next();
pFind.name = in.next();
pFind.publishHouse = in.next();
pFind.author = in.next();
pFind.price = in.nextFloat();
pFind.publishDate = in.next();
pFind.amount = in.nextInt();
System.out.println("修改成功,如下\n");// 输出修改后的数据结用户核对一下
System.out.println(
"|------ISBN------|----------名称-----------|--------出版社----------|----作者----|--价格--|----出版日期---|--数量(本)--|\n");
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |\n", pFind.ISBN,
pFind.name, pFind.publishHouse, pFind.author, pFind.price, pFind.publishDate, pFind.amount);
// system("pause");
break;
}
pFind = pFind.pNext;
} // 往下找
if (pFind == null)
System.out.println("没有该书,修改失败!");
}
// 根据ISBN,删除图书
static void know_ISBN_DeleteBook() {
BOOK previous = head;// 待删除的数据存放在前一个结点,指向待删除的前一个节点
BOOK pRemove = head.pNext; // 指向待删除的结点
char sel;
System.out.println("请输入图书的ISBN,以删除该书!\n");
// char ISBN[20];
String ISBN = in.next();
// scanf("%s",ISBN);
while (pRemove != null) {
if (pRemove.ISBN.equals(ISBN) == true) {// 找到了
System.out.println("找到这本书\n");
System.out.println(
"|------ISBN------|----------名称-----------|--------出版社----------|----作者----|--价格--|----出版日期---|--数量(本)--|\n");
System.out.printf("| %-14s | %-23s | %-22s | %-10s | %-6.2f | %-13s | %-10d |\n", pRemove.ISBN,
pRemove.name, pRemove.publishHouse, pRemove.author, pRemove.price, pRemove.publishDate,
pRemove.amount);
System.out.println(
"|----------------|-------------------------|------------------------|------------|--------|---------------|------------|\n");
System.out.println("是否确定删除该图书?!\n输入Y确定,输入其他按键取消删除!\n");
sel = in.next().charAt(0);
if (sel == 'Y' || sel == 'y') {
previous.pNext = pRemove.pNext;// 断链操作
System.out.println("删除成功!\n");
return;
} else {
System.out.println("取消删除成功!\n");
// system("pause");
return;
}
}
previous = previous.pNext;// 往下找
pRemove = pRemove.pNext;// 往下找
System.out.println("正在查找.....请稍候.......\n");
}
System.out.println("没有找到该书,删除失败!!!");
return;
}
// 保存所有图书信息到文件
static void saveBookToFile() {
// FILE *fp;//定义一个文件指针
if (head.pNext == null) {// 当头结点的指针域没有存放数据
System.out.println("书库没有图书,无法保存\n");
// system("pause");
return;
}
try {
BOOK pWrite = head.pNext;
// TODO: handle exception
FileWriter fw = new FileWriter("F:/图书.txt");
while (pWrite != null) {
fw.write(pWrite.ISBN + "\t" + pWrite.name + "\t" + pWrite.publishHouse + "\t" + pWrite.author + "\t"
+ pWrite.price + "\t" + pWrite.publishDate + "\t" + pWrite.amount + "\t" + "\n");
fw.flush();
pWrite = pWrite.pNext;
System.out.println("数据保存中......\n");
}
fw.close();
System.out.println("数据保存成功..!\n");
} catch (Exception e) {
// TODO: handle exception
System.out.println("保存失败..!\n");
e.printStackTrace();// 捕获异常
}
// system("pause");
return;
}
//从文件中添加图书
static void addBookFromFile() {
int n;
// 删除链表的数据 //定义了两个指针,一个是用来作副本,一个进行相关操作
BOOK pTail, pCloseToHead;// pTail指针先是从头开始找最终最指向最后一个结点命名为pTail, 而第二个指针始终指向头结点的指针域(存放第一个数据域的地方)
pTail = pCloseToHead = head.pNext;
while (pCloseToHead != null) {// 有数据存在时
pTail = pTail.pNext;// 尾巴从前面的头往下移
// free(pCloseToHead);//释放了指针
pCloseToHead = pTail; // 尾巴赋值结pCloseToHead指针, pCloseToHead指针指向了尾指针
}
// BOOK head = new BOOK();
pTail = head;
try {
BufferedReader br = new BufferedReader(new FileReader("F:/图书.txt"));
String line = null;
while ((line = br.readLine()) != null) {
BOOK pNewNode = new BOOK();// 创建新结点
String[] BOOKInfos = line.split("\t");// 读取数据并暂时存入s,即存入数据
pNewNode.ISBN = BOOKInfos[0];
pNewNode.name = BOOKInfos[1];
pNewNode.publishHouse = BOOKInfos[2];
pNewNode.author = BOOKInfos[3];
pNewNode.price = pNewNode.price.parseFloat(BOOKInfos[4]);
pNewNode.publishDate = BOOKInfos[5];
pNewNode.amount = pNewNode.amount.parseInt(BOOKInfos[6]);
pTail.pNext = pNewNode;// 把新结点挂在尾指针的指针域
pTail = pNewNode;// 尾指针指向整个新结点
if (head.pNext == null) { // 如果头的指针域为空,则为这个链表没有数据
head.pNext = pNewNode; // 把刚刚已经存放到新结点的结点给头结点的指针域用来存放到链表中
pTail = head.pNext;
} // 尾指针指向头的数据域
else {// 如果链表已经有数据存在的情况下
pTail.pNext = pNewNode;// 上面的新结点挂在尾指针的指针域用来存放新数据
pTail = pTail.pNext;// 因为多了一个刚才新加的结点,目前尾结点指的不是最后一个指点,则现在让尾指针移动到最后一个结点
pTail.pNext = null; // 最后一个结点的指针域赋值为空
}
System.out.println("数据读取中......!\n"); // 提示用户,数据正在读取中
}
System.out.println("读取成功!\n");
System.out.println("图书添加成功!\n");
br.close();
} catch (Exception e) {
System.out.println("失败!\n");
e.printStackTrace();
}
}
static void displayBookAllCount() {
BOOK pFind = new BOOK();
pFind = head.pNext;// 指向头结点的指针域(存放第一个数据域的地方)
int sumBooks = 0;
while (pFind != null) {
sumBooks += pFind.amount;
pFind = pFind.pNext; // 往下找
}
displayAllBooks();
System.out.printf(
"|*****************************************************************************************| 所有的图书总数为 %d 本图书 \n",
sumBooks);
}
}
运行效果