第一篇:JavaWeb用MV模式C实现简单的图书管理系统报告资料
《软件开发基础(Java)》
综合性实验报告
题
目:
MVC实验 图书管理系统 班
级:
学生学号:
学生姓名:
指导老师:
提交时间:
2016年1月14日
数学与信息学院
一、实验目的
掌握基于MVC的三层架构。
二、实验题目
通过数据源和DAO对象访问数据库。其中JavaBeans实现模型,访问数据库,Servlet实现控制器,JSP页面实现视图。
模型包括2个JavaBean:BookBean用于存放图书信息,BookDAO用于访问数据库。 控制器包括2个Servlet:BookQueryServlet根据请求参数查询图书信息、BookInsertServlet用来向数据库中插入数据。 视图包括4个JSP页面:bookQuery.jsp显示查询页面、bookInsert.jsp显示插入页面、display.jsp显示查询结果页面和errorPage.jsp显示错误页面。
三、具体实现
1.设计数据库
CREATE TABLE books(bookid varchar(20)PRIMARY KEY, title varchar(50)author varchar(30), publisher varchar(40), price Float);
2.程序流程 查询图书信息
插入图书信息
3.代码实现
(1)存放图书信息的JavaBeans代码BookBean.java package com.beans;import java.io.*;
public class BookBean implements Serializable{
private String bookid = null;//图书编号
private String title = null;// 图书书名
private String author = null;// 图书作者
private String publisher = null;// 图书出版社
private float price = 0.0F;// 图书价格
public BookBean(){}
public BookBean(String bookId, String author,String title, String publisher, float price){
this.bookid = bookId;
this.title = title;
this.author = author;
this.publisher = publisher;this.price = price;
}
public String getBookid(){ return this.bookid;}
public String getTitle(){ return title;}
public String getAuthor(){ return this.author;}
public float getPrice(){ return price;}
public String getPublisher(){ return publisher;}
public void setBookid(String bookid){ this.bookid=bookid;}
public void setTitle(String title){this.title=title;}
public void setAuthor(String author){ this.author = author;}
public void setPrice(float price){this.price=price;}
public void setPublisher(String publisher){ this.publisher = publisher;} }
(2)BookDAO是一个简单的JavaBeans,它实现数据库的访问 package com.beans;import java.sql.*;
import javax.sql.*;import javax.naming.*;import java.util.ArrayList;
public class BookDAO{
private static Context context= null;
private DataSource dataSource = null;
public BookDAO(){
try{
if(context == null){
context = new InitialContext();
context =(Context)context.lookup(“java:comp/env”);
// 连接的是在context.xml下面配置的数据库连接池
dataSource =(DataSource)context.lookup(“databasePool”);
}
}catch(NamingException e2){
}
}
// 根据书号查询图书信息
public BookBean searchBook(String bookid){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
BookBean book = new BookBean();
try{
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(“SELECT * FROM books WHERE bookid=?”);
pstmt.setString(1,bookid);
rst = pstmt.executeQuery();
if(rst.next()){
book.setBookid(rst.getString(“bookid”));
book.setTitle(rst.getString(“title”));
book.setAuthor(rst.getString(“author”));
book.setPublisher(rst.getString(“publisher”));
book.setPrice(rst.getFloat(“price”));
return book;
}else{
return null;
}
}catch(SQLException se){
return null;
}finally{
try{
conn.close();
}catch(SQLException se){
}
}
}
// 插入一本图书记录
public boolean insertBook(BookBean book){
Connection conn = null;
PreparedStatement pstmt = null;
try{
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(“INSERT INTO books VALUES(?,?,?,?,?)”);
pstmt.setString(1,book.getBookid());
pstmt.setString(2,book.getTitle());
pstmt.setString(3,book.getAuthor());
pstmt.setString(4,book.getPublisher());
pstmt.setFloat(5,book.getPrice());
pstmt.executeUpdate();
pstmt.close();
return true;
}catch(SQLException se){
return false;
}finally{
try{
conn.close();
}catch(SQLException se){ }
}
}
}
(3)JSP页面bookQuery.jsp实现根据书号查询图书信息 <%@ page contentType=“text/html;charset=UTF-8” %>
第二篇:c语言图书管理系统
C语言——图书管理系统
代码部分: #include
/*定义数据库相关操作变量*/ MYSQL mysql;
// MYSQL_RES *result;
//定义结果集变量 MYSQL_ROW row;
//定义行变量 char ch[2];
void ShowAll();
/*显示所有的图书信息*/ void AddBook();
/*添加图书信息*/ void ModifyBook();
/*修改图书信息*/ void DeleteBook();
/*删除图书信息*/ void QueryBook();
/*查询图书信息*/
/*显示菜单*/ void showmenu(){
system(“cls”);
printf(“nnnnn”);
printf(“t╔═══════════════════════════╗n”);
printf(“t║
Welcome To Lemon Books System
║n”);
printf(“t╠═══════════════════════════╣n”);
printf(“t║t 1添加图书信息
║n”);
printf(“t║t 3删除图书信息
║n”);
printf(“t║t 5退出
║n”);
printf(“t╚═══════════════════════════╝n”);
printf(“n
ENTER YOUR CHOICE(1-6):”);
}
void inquire()/*询问用户是否显示主菜单*/ {
printf(“t 显示主菜单?(y/n):”);
scanf(“%s”,ch);
if(strcmp(ch,“Y”)==0||strcmp(ch,“y”)==0)/*判断是否要显示查找到的信息*/
{
showmenu();
/*显示菜单*/
}
else
{
exit(0);
} }
/*显示主菜单,连接数据库*/ int main(){
int n;
//定义变量
存储用户输入的编号
mysql_init(&mysql);//初始化mysql结构
showmenu();
/*显示菜单*/
scanf(“%d”,&n);/*输入选择功能的编号*/
while(n)
{
switch(n)
{
case 1:
ShowAll();
/*调用显示所有图书数据的过程*/
break;
case 2:
AddBook();
/*添加图书信息*/
break;
case 3:
ModifyBook();
/*修改图书信息*/
break;
case 4:
DeleteBook();
/*删除图书信息*/
break;
case 5:
QueryBook();
/*查询图书信息*/
break;
case 6:
exit(0);
/*退出*/
default:break;
}
scanf(“%d”,&n);
} }
void ShowAll()
/*调用显示所有图书数据的过程*/ {
/*连接数据库*/
if(!mysql_real_connect(&mysql,“127.0.0.1”,“root”,“111”,“db_books”,0,NULL,0))
{
printf(“nt 不能连接数据库!n”);
}
else
{
/*数据库连接成功*/
if(mysql_query(&mysql,“select * from tb_book”))
{
//如果查询失败
printf(“nt 查询 tb_book 数据表失败!n”);
}
else
{
result=mysql_store_result(&mysql);//获得结果集
if(mysql_num_rows(result)!=NULL)
{ //有记录的情况,只有有记录取数据才有意义
printf(“t ════════════════════════════
n”);
printf(“t
显 示 所 有 图 书 信 息
n”);
printf(“t ════════════════════════════ n”);
printf(“t图书编号
图书名
作者
出版社
n”);
printf(“t-------------------------n”);
while((row=mysql_fetch_row(result)))
{
//取出结果集中记录
fprintf(stdout,“t
%s
%s
%s
%s
n”,row[0],row[1],row[2],row[3]);//输出这行记录
}
printf(“t ════════════════════════════ n”);
}
else
{
printf(“nt 没有记录信息!n”);
}
mysql_free_result(result);
//释放结果集
}
mysql_close(&mysql);
//释放连接
}
inquire();
/*询问是否显示主菜单*/ }
void AddBook()
/*添加图书信息*/ {
int rowcount;
/*结果集中的行数*/
char id[10];
/*编号*/
char *bookname;
char *author;
char *bookconcern;
char *sql;
char dest[500] ={“
”};
/*连接数据库*/
if(!mysql_real_connect(&mysql,“127.0.0.1”,“root”,“111”,“db_books”,0,NULL,0))
{
printf(“nt 不能连接数据库!n”);
}
else
{
/*数据库连接成功,插入数据*/
printf(“t ════════════════════════════ n”);
printf(“t
添 加 图 书 信 息
n”);
printf(“t ════════════════════════════ n”);
if(mysql_query(&mysql,“select * from tb_book”))
{
//如果查询失败
printf(“nt 查询 tb_book 数据表失败!n”);
}
else
{
result=mysql_store_result(&mysql);//获得结果集
rowcount=mysql_num_rows(result);//获得行数
row=mysql_fetch_row(result);
//获取结果集的行
printf(“t 图书编号:”);
scanf(“%s”,id);
/*输入图书编号*/
sql=“insert into tb_book(ID,bookname,author,bookconcern)values(”;
strcat(dest,sql);
strcat(dest,“'”);
strcat(dest,id);
strcat(dest,“', '”);
if(mysql_num_rows(result)!=NULL)
{
/*判断输入的编号是否存在*/
do
{
//存在相同编号
if(!strcmp(id,row[0]))
{
// printf(“%s”,row[0]);
printf(“nt 记录存在,按任意键继续!n”);
getch();
mysql_free_result(result);
/*释放结果集*/ mysql_close(&mysql);
/*释放连接*/
inquire();
/*询问是否显示主菜单*/
return;
}
}while(row=mysql_fetch_row(result));
}
bookname =(char*)malloc(50);
author =(char*)malloc(50);
bookconcern =(char*)malloc(50);
//不存在相同的编号
printf(“t 图书名:”);
scanf(“%s”,bookname);
/*输入图书名*/
strcat(dest,bookname);
/*将图书编号追加到sql语句后面*/
printf(“t 作者:”);
scanf(“%s”,author);
/*输入作者*/
strcat(dest,“', '”);
strcat(dest,author);
printf(“t 出版社:”);
scanf(“%s”,bookconcern);
/*输入出版社*/
strcat(dest,“', '”);
strcat(dest,bookconcern);
strcat(dest,“')”);
//printf(“%s”,dest);
if(mysql_query(&mysql,dest)!=0)
{
fprintf(stderr,“t 不能插入记录!”,mysql_error(&mysql));
}
else
{
printf(“t 插入成功!n”);
}
mysql_free_result(result);
//释放结果集
}
mysql_close(&mysql);
//释放连接
}
inquire();
/*询问是否显示主菜单*/ }
void ModifyBook()
/*修改图书信息*/ {
char id[10];
/*结果集中的行数*/
char *sql;
char dest[500] ={“
”};
char dest1[500] ={“
”};
char *bookname;
char *author;
char *bookconcern;
if(!mysql_real_connect(&mysql,“127.0.0.1”,“root”,“111”,“db_books”,0,NULL,0))
{
printf(“t 不能连接数据库!n”);
}
else
{
/*数据库连接成功*/
// printf(“连接成功”);
printf(“t 请输入您想要修改的图书编号.”);
scanf(“%s”,id);
/*输入图书编号*/
sql = “select * from tb_book where id=”;
strcat(dest,sql);
strcat(dest,id);
/*将图书编号追加到sql语句后面*/
//printf(“%sn”,dest);
/*查询该图书信息是否存在*/
if(mysql_query(&mysql,dest))
{
//如果查询失败
printf(“n 查询 tb_book 数据表失败!n”);
}
else
{
result=mysql_store_result(&mysql);//获得结果集
if(mysql_num_rows(result)!=NULL)
{
//有记录的情况,只有有记录取数据才有意义
printf(“t 发现记录信息,是否显示?(y/n)”);
scanf(“%s”,ch);
if(strcmp(ch,“Y”)==0||strcmp(ch,“y”)==0)/*判断是否要显示查找到的信息*/
{
printf(“t ════════════════════════════
n”);
printf(“t
***** 显示图书信息 *****
n”);
printf(“t ════════════════════════════ n”);
printf(“t图书编号
图书名
作者
出版社
n”);
printf(“t-------------------------n”);
while((row=mysql_fetch_row(result)))
{
//取出结果集中记录
fprintf(stdout,“t
%s
%s
%s
%s
n”,row[0],row[1],row[2],row[3]);//输出这行记录
}
printf(“t ════════════════════════════ n”);
}
printf(“t Modify?(y/n)”);
scanf(“%s”,ch);
if(strcmp(ch,“Y”)==0||strcmp(ch,“y”)==0)
/*判断是否需要录入*/
{
sql = “update tb_book set bookname= '”;
strcat(dest1,sql);
//
printf(“%s”,sql);
bookname =(char*)malloc(20);
author =(char*)malloc(20);
bookconcern =(char*)malloc(20);
printf(“t 图书名:”);
scanf(“%s”,bookname);
/*输入图书名*/
strcat(dest1,bookname);
// printf(“%s”,&bookname);
printf(“t 作者:”);
scanf(“%s”,author);
/*输入作者*/
strcat(dest1,“', author= '”);
strcat(dest1,author);
/*追加sql语句*/
printf(“t 出版社:”);
scanf(“%s”,bookconcern);
/*输入出版社*/
strcat(dest1,“', bookconcern = '”);
strcat(dest1,bookconcern);
/*追加sql语句*/
strcat(dest1,“' where id= ”);
strcat(dest1,id);
//printf(“%s”,dest1);
if(mysql_query(&mysql,dest1)!=0)
{
fprintf(stderr,“t 不能修改记录!n”,mysql_error(&mysql));
}
else
{
printf(“t 修改成功!n”);
}
}
}
else
{
printf(“t 没有发现要修改的信息!n”);
}
}
mysql_free_result(result);
//释放结果集
}
mysql_close(&mysql);
//释放连接
inquire();
/*询问是否显示主菜单*/ }
void DeleteBook()
/*删除图书信息*/ {
char id[10];
/*结果集中的行数*/
char *sql;
char dest[100] ={“
”};
char dest1[100] ={“
”};
if(!mysql_real_connect(&mysql,“127.0.0.1”,“root”,“111”,“db_books”,0,NULL,0))
{
printf(“t 不能连接数据库!n”);
}
else
{
printf(“t 请输入您想要删除的图书编号.”);
scanf(“%s”,id);
/*输入图书编号*/
sql = “select * from tb_book where id=”;
strcat(dest,sql);
strcat(dest,id);
/*将图书编号追加到sql语句后面*/
//printf(“%sn”,dest);
/*查询该图书信息是否存在*/
if(mysql_query(&mysql,dest))
{
//如果查询失败
printf(“n 查询 tb_book 数据表失败!n”);
}
else
{
result=mysql_store_result(&mysql);//获得结果集
if(mysql_num_rows(result)!=NULL)
{ //有记录的情况,只有有记录取数据才有意义
printf(“t 发现记录信息,是否显示?(y/n)”);
scanf(“%s”,ch);
if(strcmp(ch,“Y”)==0||strcmp(ch,“y”)==0)/*判断是否要显示查找到的信息*/
{
printf(“t ════════════════════════════
n”);
printf(“t
***** 显示图书信息 *****
n”);
printf(“t ════════════════════════════ n”);
printf(“t图书编号
图书名
作者
出版社
n”);
printf(“t-------------------------n”);
while((row=mysql_fetch_row(result)))
{
//取出结果集中记录
fprintf(stdout,“t
%s
%s
%s
%s
n”,row[0],row[1],row[2],row[3]);//输出这行记录
}
printf(“t ════════════════════════════ n”);
}
printf(“t 是否删除?(y/n)”);
scanf(“%s”,ch);
if(strcmp(ch,“Y”)==0||strcmp(ch,“y”)==0)
/*判断是否需要录入*/
{
sql = “delete from tb_book where ID= ”;
printf(“%s”,dest1);
strcat(dest1,sql);
strcat(dest1,id);
// printf(“%s”,dest1);
if(mysql_query(&mysql,dest1)!=0)
{
fprintf(stderr,“t 不能删除记录!n”,mysql_error(&mysql));
}
else
{
printf(“t 删除成功!n”);
}
}
}
else
{
printf(“t 没有发现要删除的信息!n”);
}
}
mysql_free_result(result);
//释放结果集
}
mysql_close(&mysql);
inquire();
/*询问是否显示主菜单*/ }
void QueryBook()
/*查询图书信息*/ {
char id[10];
/*结果集中的行数*/
char *sql;
char dest[100] ={“
”};
if(!mysql_real_connect(&mysql,“127.0.0.1”,“root”,“111”,“db_books”,0,NULL,0))
{
printf(“t 不能连接数据库!n”);
}
else
{
printf(“t 请输入您想要查询的图书编号:”);
scanf(“%s”,id);
/*输入图书编号*/
sql = “select * from tb_book where id=”;
strcat(dest,sql);
strcat(dest,id);
/*将图书编号追加到sql语句后面*/
if(mysql_query(&mysql,dest))
{
//如果查询失败
printf(“n 查询 tb_book 数据表失败!n”);
}
else
{
result=mysql_store_result(&mysql);//获得结果集
if(mysql_num_rows(result)!=NULL)
{ //有记录的情况,只有有记录取数据才有意义
printf(“t ════════════════════════════
n”);
printf(“t
显示图书信息
n”);
printf(“t ════════════════════════════ n”);
printf(“t图书编号
图书名
作者
出版社
n”);
printf(“t-------------------------n”);
while((row=mysql_fetch_row(result)))
{
//取出结果集中记录
fprintf(stdout,“t
%s
%s
%s
%s
n”,row[0],row[1],row[2],row[3]);//输出这行记录
}
printf(“t ════════════════════════════ n”);
}
else
{
printf(“t 没有发现要查询的信息!n”);
}
mysql_free_result(result);
//释放结果集
}
mysql_close(&mysql);
//释放连接
}
inquire();
/*询问是否显示主菜单*/ }
说明部分
附加MySQL数据库
将工程文件夹中的data文件夹下的db_books文件夹拷贝到本地Mysql数据库安装文件夹的data文件夹中。即可完成对数据库的附加。
连接MySql的步骤
MySQL为C语言提供了连接数据库的API,要想正常使用这些API,需要做以下两件事情:(1)包含这些API的声明文件,即mysql.h。
(2)让编译器找到这些API的可执行程序,即DLL库。下面介绍一下详细的步骤: 1.
下面解决,让编译器找到mysql.h的问题。需要在编译环境中作如下的设置: 在Visual C++ 6.0中,选择Tools(工具)/Options(选项)菜单项,如下图所示。
选择菜单命令
即可打开Options对话框,在Options对话框中选择Directories选项卡,在Show directories for下拉列表框中选择Include files选项,在Directiories列表框中添加本地安装MySQL的include目录路径。如下图所示。默认的路径应该在C:Program FilesMySQLMySQL Server 5.0include。
添加mysql.h文件
通过上述设置,编译器就可以知道MySQL的API接口中有哪些函数,以及函数的原型是怎样的。在编译时,所编写的程序已经能够通过编译(compile)这步了。
2.引入库函数
经过上一步的设置,程序已经可以编译通过了,但是编译通过并不等于可以生成可执行文件。还需要告诉编译器这些API函数的可执行文件在哪个DLL文件(libmysql.dll)中。
在工程中选择Tools/Options菜单命令,将弹出Options对话框,在该对话框中选择Directories选项卡,在Show directories for下拉列表框中选择Include files选项。添加本地安装的MySQL的Lib目录路径。默认的安装路径是C:Program FilesMySQLMySQL Server 5.0libdebug 或者C:Program
FilesMySQLMySQL Server 5.0libopt)。设置完成的效果如下图所示。
引用库
单击OK按钮,关闭Options对话框。选择Project/Settings菜单命令。如下图所示。
选择Project/Settings菜单项
下面添加libmysql.lib到工程中。选择Project/Settings菜单项,将弹出Project Settings对话框,在该对话框中选择Link选项卡。在Object/library modules文本框末尾添加libmysql.lib。如下图所示。
添加libmysql.lib到工程中
最好将libmysql.lib以及libmysql.dll文件拷贝到工程的目录下。设置完成后就可以运行程序了程序运行界面如下图所示:
第三篇:用mysql数据库实现的C++图书管理系统
#include
#include
#include
#define NONE “ 33[m” #define RED “ 33[0;32;31m” #define GREEN “ 33[0;32;32m” #define BLUE “ 33[0;32;34m” #define YELLOW “ 33[1;33m”
#define LIGHT_RED “ 33[1;31m” #define LIGHT_GREEN “ 33[1;32m” #define LIGHT_BLUE “ 33[1;34m” /* 在编译程序之前,请先开启mysql服务器(命令为 sudo mysqld_safe &),然后再登录mysql客户端(命令为 mysql-u root-p)建立数据库 stu;建立数据表reader,book;具体操作语句如下:
create database stu;
create table reader(stu_name varchar(20),stu_phone varchar(15),stu_password varchar(10),stu_num int,debt float,lend_time double,back_time double,count int);
create table book(book_name varchar(40),book_aut varchar(40),book_pre varchar(40),book_num int,book_mux int,book_con int);
编译时用如下命令:
g++ $(mysql_config--cflags)110.cpp-o t $(mysql_config--libs)*/
//定义mysql数据库变量
MYSQL
mysql;MYSQL_RES * results;
MYSQL_FIELD *fileds;
MYSQL_ROW rows;
char strHost[] = “localhost”;
char strUser[] = “root”;
char strPasswd[] = “3335599”;
char strDb[] = “stu”;char strSQL[200];
unsigned int num_fields;/* 程序导读:
1.程序中对书的操作,可通过书名,编号来进行,flag=0按书名来操作,flag=1按书编号来操作
2.程序中对用户的操作,也可通过姓名,用户ID号或编号两种方式来进行,flag=0按姓名来操作,flag=1按用户ID号或编号来操作
3.本程序分5个部分,具体已标识如(1)图书管理...4.本程序即可实现将数据保存至本地即stu.txt,book.txt,又可将数据保存至mysql数据库,只
需稍加修改,具体如何修改,在此就不做说明 */
using namespace std;class Book { public: string book_name;string book_num;//编号
string book_pre;//出版社
string book_aut;//作者
int book_con;//这样的书还有几本
int book_mux;//这样的书总共有几本
public: Book(){book_con=0;book_mux=0;} void show_book();
};
/****************************************(1)图书管理*******************************************/ void Book::show_book(){ cout<<“书名:”< class BookNode { public: Book book;BookNode *next;};BookNode *headbook=NULL; void savebook(BookNode *p);//保存图书信息到数据库 void del_sql_book(BookNode *p);//将图书信息从数据库中删除 class BookManage { public: int totolbook;public: BookManage(){totolbook=0;} void addbook(); void delbook(string s,int num,int flag);void findbook(string s,int flag);//查询图书 }; void BookManage::addbook(){ string h; cout<<“添加输入0,退出输入-1”< if(h==“-1”)break;else if(h==“0”){ string na,nu,p1,aut;int con;BookNode *p=new BookNode;cout<<“请输入书名:”< cout<<“继续添加输入0,取消添加输入-1”< cin>>h; } else cout< void BookManage::delbook(string s,int num,int flag){ BookNode *p=headbook;if(headbook!=NULL){ switch(flag) { case 0: if(headbook->book.book_name==s) { if(headbook->book.book_con>1) {headbook->book.book_con-=num;headbook->book.book_mux-=num;} else { headbook=p->next;totolbook-=num; del_sql_book(p);//从数据库中删除 //delete p; } } else if(p->next) { for(p=headbook;p->next!=NULL&&p!=NULL;p=p->next) { if(p->next->book.book_name==s) { if(p->next->book.book_con>1) { p->next->book.book_con-=num;headbook->book.book_mux-=num; break; } else { p->next=p->next->next; totolbook-=num; del_sql_book(p->next);//从数据库中删除 //delete p->next; break; } } } if(p->next==NULL) cout< break;case 1: if(headbook->book.book_num==s){ if(headbook->book.book_con>1) {headbook->book.book_con-=num;headbook->book.book_mux-=num;} else { headbook=p->next; totolbook-=num; del_sql_book(p);//从数据库中删除 //delete p; } } else if(p->next) { for(p=headbook;p->next!=NULL&&p!=NULL;p=p->next) { if(p->next->book.book_num==s) { if(p->next->book.book_con>1) { p->next->book.book_con-=num;headbook->book.book_mux-=num; break; } else { p->next=p->next->next; totolbook-=num; del_sql_book(p->next);//从数据库中删除 //delete p->next; break; } } } if(p->next==NULL) cout< } break; default: cout< } } } void BookManage::findbook(string s,int flag){ BookNode *p;int h=0;switch(flag){ case 0: for(p=headbook;p!=NULL;p=p->next)//先查看是否有此书 { if(p->book.book_name==s)break;} if(NULL==p)cout< if(p->book.book_name==s){ p->book.show_book();//显示出图书的基本信息 if(p->book.book_con==0) 打印出来 } cout< cout< } } break;case 1: for(p=headbook;p!=NULL;p=p->next){ if(p->book.book_num==s) { p->book.show_book(); if(p->book.book_con==0) cout< } } if(NULL==p)cout< /****************************************(*******************************************/ class Admin//管理员 { public: string adm_name;//帐号 string adm_passw;//密码 public: Admin(){ adm_name=“adm”; adm_passw=“123”;} }; class LendBook { public: string bookname[3];int count;//借多少本数 time_t lend_time;time_t back_time;LendBook(){count=0;} }; class Stu { public: string stu_name; }; 2)用户管理 string stu_phone;//联系方式 string stu_num;//学号(登录帐号)string password;//密码 float debt;//欠费额 LendBook lendbook;//用户借书信息 public: void show_stu();//把此人所有信息(包括借书)显示出来 void Stu::show_stu(){ cout<<“姓名:”< class StuNode { public: Stu stu;StuNode *next;};StuNode *headstu=NULL; void savestu(StuNode *p);//保存读者信息到数据库 void del_sql_stu(StuNode *p);//将读者信息从数据库中删除 class StuManage:public BookManage { private: int totolstu;//用户总数 public: StuManage(){totolstu=0;} void addstu();//增加用户 void delstu(string s,int flag);//删除用户 void findstu(string s,int flag);//查找用户 void lendbook(string ss,string s,int flag);//借书 void backbook(string ss,string s,int flag);//还书 void paydebt(string s);//还款 void mux_stu_book();//查询图书管总的图书量与总的用户量 }; void StuManage::addstu(){ string h; cout<<“添加输入0,退出输入-1”< if(h==“-1”)break;else if(h==“0”){ string na,num,p1,pa,pa1,pa2; StuNode *p=new StuNode; cout<<“请输入姓名:”< cin>>na; p->stu.stu_name=na; cout<<“请输入联系电话:”< cout<<“请输入六位密码:”< (StuManage::totolstu)++;//用户总数加一 cout<<“继续添加输入0,取消添加输入-1”< } else cout< void StuManage::delstu(string s,int flag){ StuNode *p=headstu;if(headstu!=NULL){ switch(flag) { case 0: if(headstu->stu.stu_name==s)//当要删除的用户位于链表的头结点位置 { headstu=p->next;StuManage::totolstu--;del_sql_stu(p);//从数据库中删除 delete p;} else if(p->next)//非头结点位置 { for(p=headstu;p->next!=NULL&&p!=NULL;p=p->next){ if(p->next->stu.stu_name==s) { p->next=p->next->next; totolstu--; del_sql_stu(p->next);//从数据库中删除 //delete p->next; break; } } if(p->next==NULL) cout< break;case 1: if(headstu->stu.stu_name==s){ headstu=p->next;totolstu--;del_sql_stu(p);//从数据库中删除 delete p;} else if(p->next){ for(p=headstu;p->next!=NULL&&p!=NULL;p=p->next){ if(p->next->stu.stu_name==s) { p->next=p->next->next; totolstu--; del_sql_stu(p->next);//从数据库中删除 //delete p->next; break; } } if(p->next==NULL) cout< } break; default: cout< } } } void StuManage::findstu(string s,int flag){ StuNode *p;int h=0,m=1;switch(flag){ case 0: for(p=headstu;p!=NULL;p=p->next) { if(p->stu.stu_name==s) break; } if(p==NULL) cout< for(p=headstu;p!=NULL;p=p->next) { if(p->stu.stu_name==s)h++;} if(h>0)cout< p->stu.show_stu(); if(p->stu.lendbook.count>=3) { cout< ”NONE< cout<<“所借书的名字为:”< while(i) { cout<<“t(”< } cout< } else { int i=p->stu.lendbook.count; if(i>0) cout<<“所借书的名字为:”< while(i) { cout<<“t(”< } } } break;case 1: } cout<<“您已借了”< stu.lendbook.count<<“本书!”< for(p=headstu;p!=NULL;p=p->next) { if(p->stu.stu_num==s) { p->stu.show_stu(); if(p->stu.lendbook.count>=3) { cout< int i=p->stu.lendbook.count; cout<<“所借书的名字为:”< //输出用户所借书的名字 cout<<“t(”< } cout< } else { int i=p->stu.lendbook.count; cout<<“所借书的名字为:”< while(i) { //输出用户所借书的名字 cout<<“t(”< } cout<<“您已借了”< stu.lendbook.count<<“本书!”< cout<<“您还可以借”<<3-p->stu.lendbook.count<<“本书!”NONE< cout< } break; } } if(p==NULL) cout< break; default: cout< } void StuManage::mux_stu_book(){ StuNode *p;BookNode *q;int i=0,j=0,h=0;for(p=headstu;p!=NULL;p=p->next)i++;cout<<“当前图书馆注册用户数为:”<next){ h+=q->book.book_mux; j+=q->book.book_con;} } cout<<“当前图书馆库存的总书记数为:”< if(q->stu.stu_num==ss) {del_sql_stu(q);break;}//丛数据库中删除 } if(q==NULL){cout< switch(flag){ case 0: for(p=headbook;p!=NULL;p=p->next) { if(p->book.book_name==s) { “NONE< del_sql_book(p);//从数据库中删除 int i=q->stu.lendbook.count;if(i>=3||q->stu.debt>0){ if((i>=3)&&(q->stu.debt==0)){cout< if((i<3)&&(q->stu.debt>0)) {cout< if((i>=3)&&(q->stu.debt>0)) {cout< } else { //记录下所借书的名字存入用户信息中 q->stu.lendbook.bookname[i]=p->book.book_name; time_t now; time(&now); q->stu.lendbook.lend_time=time(&now);//保存借书时间 q->stu.lendbook.count++;//所借书数目加一 p->book.book_con--;//同样的书的个数减一 } break; } } if(p==NULL) cout< break; case 1: for(p=headbook;p!=NULL;p=p->next) { if(p->book.book_num==s) { del_sql_book(p);//从数据库中删除 int i=q->stu.lendbook.count; if(i>=3||q->stu.debt>0) { if((i>=3)&&(q->stu.debt==0)) {cout< if((i<3)&&(q->stu.debt>0)) {cout< if((i>=3)&&(q->stu.debt>0)) {cout< } else { } q->stu.lendbook.bookname[i]=p->book.book_name; time_t now; time(&now); q->stu.lendbook.lend_time=time(&now); q->stu.lendbook.count++; p->book.book_con--;//同样的书的个数减一 } break; } } if(p==NULL) cout< break;default: cout< void StuManage::backbook(string ss,string s,int flag)//还书 { BookNode *p;StuNode *q;for(q=headstu;q!=NULL;q=q->next){ if(q->stu.stu_num==ss) {del_sql_stu(q);break;}//丛数据库中删除 } if(q==NULL){cout< switch(flag){ case 0: for(p=headbook;p!=NULL;p=p->next) { if(p->book.book_name==s) { del_sql_book(p);//从数据库中删除 time_t now; time(&now); q->stu.lendbook.back_time=time(&now); q->stu.lendbook.count--; p->book.book_con++;//同样的书的个数加一 time_t s=difftime(q->stu.lendbook.lend_time,q->stu.lendbook.back_time); if(s>2592000)//2592000为一个月的秒数 { int t=ceil((s-2592000)/86400); q->stu.debt=t*0.1; } break;} } if(p==NULL) cout< break; case 1: for(p=headbook;p!=NULL;p=p->next) { if(p->book.book_num==s) { del_sql_book(p);//从数据库删除 time_t now; time(&now); q->stu.lendbook.back_time=time(&now); q->stu.lendbook.count--; p->book.book_con++;//同样的书的个数加一 //计算借用图书的时间,超过一个月,开始计费 time_t s=difftime(q->stu.lendbook.lend_time,q->stu.lendbook.back_time); } if(s>2592000)//2592000为一个月的秒数 { int t=ceil((s-2592000)/86400); q->stu.debt=t*0.1; } break; } } if(p==NULL)cout< } void StuManage::paydebt(string s){ StuNode *p; for(p=headstu;p!=NULL;p=p->next)//查找用户 { if(p->stu.stu_num==s){ p->stu.debt=0; cout< stream << result;//将string输入流 stream >> stu_str;//从i中抽取前面插入的string值 return stu_str;} void savestu(StuNode *p)//保存读者信息到数据库 { memset((void*)strSQL,0,200);sprintf(strSQL,“insert into reader values(%s,%s,%s,%s,%f,%ld,%ld,%d)”,change_char(p->stu.stu_name),change_char(p->stu.stu_phone),change_char(p->stu.password),change_char(p->stu.stu_num),p->stu.debt,(long)(p->stu.lendbook.lend_time),(long)(p->stu.lendbook.back_time),p->stu.lendbook.count);if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0) printf(“记录插入失败!n”);} void savebook(BookNode *p)//保存图书信息到数据库 { memset((void*)strSQL,0,200);sprintf(strSQL,“insert into book values(%s,%s,%s,%s,%d,%d)”,change_char(p->book.book_name),change_char(p->book.book_aut),change_char(p->book.book_pre),change_char(p->book.book_num),p->book.book_mux,p->book.book_con);if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0) printf(“记录插入失败!n”); } void del_sql_stu(StuNode *p)//将读者信息从数据库中删除 { memset((void*)strSQL,0,200);sprintf(strSQL,“delete from reader where stu_name='%s'”,change_char(p->stu.stu_name));if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0) printf(“记录删除失败!n”);} void del_sql_book(BookNode *p)//将图书信息从数据库中删除 { memset((void*)strSQL,0,200);sprintf(strSQL,“delete from book book_name='%s'”,change_char(p->book.book_name));if(mysql_real_query(&mysql,strSQL,strlen(strSQL))!= 0) printf(“记录删除失败!n”); } /* void savestu()//保存读者信息文件 { ofstream outfile(“./stu.txt”,ios::out); if(!outfile){ cerr<<“open error!”< return;} StuNode *p; for(p=headstu;p!=NULL;p=p->next)//数据写入文件 { outfile< stu.stu_name<<“ ”< stu.stu_phone; outfile<<“ ”< stu.password<<“ ”< stu.stu_num; where outfile<<“ ”< stu.debt; outfile<<“ ”< stu.lendbook.lend_time; outfile<<“ ”< stu.lendbook.back_time; outfile<<“ ”< stu.lendbook.count; outfile<<“ ”< } outfile.close();} void savebook()//保存图书信息文件 { ofstream outfile(“./book.txt”,ios::out); if(!outfile){ cerr<<“open error!”< return;} BookNode *p; for(p=headbook;p!=NULL;p=p->next)//数据写入文件 { outfile< book.book_name<<“ ”< book.book_num; outfile<<“ ”< book.book_pre<<“ ”< book.book_aut; outfile<<“ ”< book.book_mux; outfile<<“ ”< book.book_con; outfile<<“ ”< void loadstu()//从学生数据数据库reader中读取 { int i = 0;memset((void*)strSQL,0,100); strcpy(strSQL,“select * from reader”); mysql_query(&mysql,strSQL); //查询 results = mysql_store_result(&mysql); //获取记录 num_fields = mysql_num_fields(results); //获取字段数 fileds = mysql_fetch_fields(results); //获取字段数组 while((rows = mysql_fetch_row(results))!= NULL) //循环显示 { while(i < num_fields) { StuNode *p=new StuNode; p->stu.stu_name =(rows[i]?rows[i++]:“NULL”); p->stu.stu_phone =(rows[i]?rows[i++]:“NULL”); p->stu.password =(rows[i]?rows[i++]:“NULL”); p->stu.stu_num =(rows[i]?rows[i++]:“NULL”); p->stu.debt = atof(rows[i]?rows[i++]:“NULL”); p->stu.lendbook.lend_time =(time_t)(rows[i]?rows[i++]:“NULL”); p->stu.lendbook.back_time =(time_t)(rows[i]?rows[i++]:“NULL”); p->stu.lendbook.count = atoi(rows[i]?rows[i++]:“NULL”); p->next=headstu;//建立用户链表 headstu=p; } i = 0;} } void loadbook()//从书数据库中读取 { int i = 0;memset((void*)strSQL,0,100); strcpy(strSQL,“select * from book”); mysql_query(&mysql,strSQL); //查询 results = mysql_store_result(&mysql); //获取记录 num_fields = mysql_num_fields(results); //获取字段数 fileds = mysql_fetch_fields(results); //获取字段数组 while((rows = mysql_fetch_row(results))!= NULL) //循环显示 { while(i < num_fields) { BookNode *p=new BookNode; p->book.book_name =(rows[i]?rows[i++]:“NULL”); p->book.book_aut =(rows[i]?rows[i++]:“NULL”); p->book.book_pre =(rows[i]?rows[i++]:“NULL”); p->book.book_num =(rows[i]?rows[i++]:“NULL”); p->book.book_mux = atoi(rows[i]?rows[i++]:“NULL”); p->book.book_con = atoi(rows[i]?rows[i++]:“NULL”); p->next=headbook;//建立用户链表 headbook=p; } i = 0;} } /* void loadstu()//从学生数据文件读取 { ifstream infile(“./stu.txt”,ios::in); if(!infile){ cout< return;} if(infile.eof()){ cout< infile.close();} else { while(infile.peek()!=EOF)//数据从文件读出 { StuNode *p=new StuNode; infile>>p->stu.stu_name>>p->stu.stu_phone; infile>>p->stu.password>>p->stu.stu_num; infile>>p->stu.debt>>p->stu.lendbook.lend_time; infile>>p->stu.lendbook.back_time>>p->stu.lendbook.count; if(p->stu.stu_name!=“") { p->next=headstu;//建立用户链表 headstu=p; } else delete p; } infile.close();} } void loadbook()//从书数据文件读取 { ifstream infile(”./book.txt“,ios::in); if(!infile){ } cout< while(infile.peek()!=EOF)//数据从文件读出 { BookNode *p=new BookNode;infile>>p->book.book_name>>p->book.book_num;infile>>p->book.book_pre>>p->book.book_aut;infile>>p->book.book_mux>>p->book.book_con; if(p->book.book_name!=”“){ p->next=headbook;//建立图书链表 headbook=p;} else delete p; } } */ } infile.close();/****************************************(*******************************************/ void MenuAdmin(){ 4)界面部分 cout< $“NONE< $“NONE< $“NONE< 删除书目 $“NONE< $“NONE< cout< 借书 $“NONE< $“NONE< cout< 还书 $“NONE< $“NONE< 查询图书 $“NONE< $“NONE< $“NONE< $“NONE< $“NONE< $“NONE< 查询用户 $“NONE< $“NONE< 用户交费 $“NONE< $“NONE< $“NONE< $“NONE< 0 退出 $“NONE< $“NONE< void MenuStu(){ 选 择 (输 入 相 应 数 cout< cout< $“NONE< cout< 借书 $“NONE< $“NONE< cout< 还书 $“NONE< $“NONE< 查询图书 $“NONE< $“NONE< 个人信息 $“NONE< $“NONE< 0 退出 $“NONE< $“NONE< int getch()//密码不回显函数1 { int c=0; struct termios org_opts, new_opts; int res=0; //-----store old settings----------- res=tcgetattr(STDIN_FILENO, &org_opts); assert(res==0); //----set new terminal parms-------- memcpy(&new_opts, &org_opts, sizeof(new_opts)); new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL); tcsetattr(STDIN_FILENO, TCSANOW, &new_opts); c=getchar(); //------restore old settings--------- res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts); assert(res==0); return c;} string set_passwd()//密码不回显函数2 { string result;char pd[128];int i;getch();/* 当帐号和密码一起输入,且刚输完帐号后就要输入密码时,set_passwd会把帐号结束时的回车赋‘n’拿过来作为自己的第一个输入,这样容易造成密码输入的错 误,为避免 这种情况的发生,所以就可以在for循环之前假如了getch()把‘n’吸收掉 */ for(i=0;;i++) { pd[i]=getch(); if(pd[i]=='n') { pd[i]=' '; break; } if(pd[i]==127) { printf(”b b“); i=i-2; } else printf(”*“); if(i<0) pd[0]=' '; } stringstream stream;stream << pd;//将char输入流 stream >> result;//从stream中抽取前面插入的char值 return result;} /****************************************(5)主函数部分*******************************************/ int main(){ mysql_init(&mysql);//数据库初始化 if(!mysql_real_connect(&mysql,strHost,strUser,strPasswd,strDb,0,NULL,0))//连接数据库 { printf(”连接数据库失败!/n“); return 0; } loadstu();loadbook(); mysql_free_result(results);//释放数据库结果集 BookManage bookmanage;StuManage stumanage; Admin admin;int i;string s;int num,flag;string s1,s2,ss;StuNode *p;system(”clear“);//清理屏幕 cout< ~Welecome to come in~“NONE< switch(i){ case 0: break; case 1: while(1) { cout<<”请输入管理员登录名:“< cin>>s1; if(s1==”0“) return 0; cout<<”请输入密码:“< s2=set_passwd(); cout< if(admin.adm_name==s1) { while(1) { if(admin.adm_passw==s2) break; else { cout< s2=set_passwd();cout< if(s2==”0“)return 0; //cin>>s2 } } } if(s1!=admin.adm_name) cout< else break; } while(1){ MenuAdmin();int t;cin>>t;switch(t){ ”< “< case 0: //savestu();savebook(); mysql_close(&mysql);//关闭数据库链接 return 0;break; case 1:bookmanage.addbook();//增加书本 system(”clear“);break;//清理屏幕 case 2: cout<<”按书名删除请输入 0 “< cin>>flag; if(flag==0) {cout<<“请输入书名:”;cin>>s;} else if(flag==1) {cout<<“请输入书编号:”;cin>>s;} else cout< cout<<“请输入要删除书的数目:”< cin>>num; bookmanage.delbook(s,num,flag);//删除书本 system(“clear”);//清理屏幕 break; case 3: cout<<“按书名借书请输入 0 ”< cin>>flag; if(flag==0) {cout<<”请输入书名:“;cin>>s;} else if(flag==1) {cout<<”请输入书编号:“;cin>>s;} else cout< cout<<”请输入借书人的编号:“< cin>>ss; stumanage.lendbook(ss,s,flag); system(”clear“);//清理屏幕 break; case 4: cout<<”按书名还书请输入 0 “< cin>>flag;if(flag==0) {cout<<”请输入书名:“;cin>>s;} else if(flag==1){cout<<”请输入书编号:“;cin>>s;} else ”< “< ”< cout< break;case 5: cout<<“按书名查找请输入 0 ”< else cout< system(”clear“);//清理屏幕 break;case 7: cout<<”按姓名删除请输入 0 “< if(flag==0){cout<<“请输入姓名:”;cin>>s;} else if(flag==1){cout<<“请输入学号:”;cin>>s;} else cout< system(“clear”);//清理屏幕 break;case 8: cout<<“按姓名查找请输入 0 ”<