资源描述
数学和计算机学院 C程序设计 课程
设计汇报
年级 学号 110911 姓名 刘怡然
成绩
专业 电气
试验地点 B3-401 指导老师 许景山
试验项目 简单个人书籍管理系统设计和实现
试验日期 6月23日
一、 试验题目
简单个人书籍管理系统设计和实现
二、 试验目标、要求
1、存放书籍多种相关信息。
2、提供查找功效,根据多个关键码查找需要书籍,查找成功后能够修改统计相关项。
3、提供排序功效,根据多个关键码对全部书籍进行排序,比如根据购置日期进行排序。
4、其它辅助维护工作。
三、 数据结构及算法描述
1、使用C++中类来实现,其中有DATE类和Book类,进行类复合。数据均为私有数据。
class DATE
{
public:
friend ostream & operator<<(ostream &output, DATE &t); //友元函数重载流插入运算符
friend istream & operator>>(istream &input, DATE &t); //友元函数重载流提取运算符
public:
DATE(int y=0,int m=0,int d=0); //初始化
virtual ~DATE();
DATE &operator=(DATE &); //重载时间等于运算符
int operator < (DATE &); //重载时间小于运算符
int operator ==(DATE &); //重载时间等于判定运算符
private:
int year,month,day;
};
----------------------------------------------------------------------------------------------------------
class Book
{
public:
Book(int t,char *n,char *a,float p,int y,int m,int d);
Book(){};
virtual ~Book();
int f_new(); //新建书籍信息
int f_save(); //保留书籍信息
int f_open(); //打开书籍信息
int display(); //显示书籍信息
int e_delete(); //删除书籍信息
int e_update(); //修改书籍信息
int showInfo(); //显示部分书籍信息
int sort(); //排序书籍信息
Book &operator=(Book &); //重载等于运算符
private:
int type; //书籍类型
char name[MAX]; //书籍名称
char author[MAX]; //作者
float price; //书籍价格
DATE date; //购置日期
};
2、定义数组Book books[200]使用流提取、流插入方法进行数据读取和存放。
3、在排序函数int sort( )中使用冒泡算法排序:
for(i=0;i<num-1;i++)
{
for(j=i+1;books[i].date<books[j].date||books[i].date==books[j].date;j++)
{
ex=books[i];
books[i]=books[j];
books[j]=ex;
}
}
四、程序步骤图
程序整体功效模块以下所表示:
main
sort
edit
file
display
e_update
e_delete
f_save
f_new
f_open
各个功效模块含义以下:
1、“主函数”模块main()
此模块循环显示第一级操作命令菜单,接收键盘输入命令,检验命令是否正当,若正当则调用对应下层函数。命令菜单中包含“退出系统”命令,当接收到该命令时立即终止整个程序运行。
2、“新建”模块f_new():
此模块清空books数组;进入输入状态,接收键盘输入全部数据保留在books数组中,按“购置日期”次序输入统计。
3、“打开”模块f_open():
此模块清除books数组中原有数据,从A盘上已经存在数据文件(books.dat)中读入全部数据到books数组中,并将全部数据按读入次序显示在屏幕上。
4、“保留”模块f_save():
此模块将books数组中全部有效数据保留到A盘books.dat文件中。
5、“删除”模块e_delele():
此模块接收从键盘输入一条统计“购置日期”和“书名”,在books数组中查找,如找到则从books数组中删除该统计,不然显示“未找到”。
6、“更新”模块e_update():
此模块接收键盘输入一条统计“购置日期”和“书名”,在 books 数组中查找,如找到则显示该统计原数据并提醒键盘输入新数据用以替换原有数据,如未找到则显示“未找到”。
7、“显示”模块display():
此模块显示类别名称和编号,提醒用户输入类别编号,显示books数组中指定类别书籍统计,或显示全部书籍统计。
8、“排序”模块sort():
此模块对books数组中全部统计按“购置时间”排序。
五、源程序清单
文件 DATE.h:类DATE定义
// DATE.h: interface for the DATE class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DATE_H__6B5CFDD0_60A3_4347_853E_4B83FD47F383__INCLUDED_)
#define AFX_DATE_H__6B5CFDD0_60A3_4347_853E_4B83FD47F383__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <iostream.h>
class DATE
{
public:
friend ostream & operator<<(ostream &output, DATE &t); //友元函数重载流插入运算符
friend istream & operator>>(istream &input, DATE &t); //友元函数重载流提取运算符
public:
DATE(int y=0,int m=0,int d=0); //初始化
virtual ~DATE();
DATE &operator=(DATE &); //重载时间等于运算符
int operator < (DATE &); //重载时间小于运算符
int operator ==(DATE &); //重载时间等于判定运算符
private:
int year,month,day;
};
#endif // !defined(AFX_DATE_H__6B5CFDD0_60A3_4347_853E_4B83FD47F383__INCLUDED_)
----------------------------------------------------------------------------------------------------------------------
DATE.cpp:类DATE实现
// DATE.cpp: implementation of the DATE class.
//
//////////////////////////////////////////////////////////////////////
#include "DATE.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DATE::DATE(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
DATE::~DATE()
{
}
ostream & operator<<(ostream &output, DATE &t)
{
if(t.month>0&&t.month<13&&t.day>0&&t.day<31)
output<<t.year<<"-"<<t.month<<"-"<<t.day<<endl;
else
output<<"日期错误!"<<endl;
return output;
}
istream & operator>>(istream &input, DATE &t)
{
input>>t.year>>t.month>>t.day;
return input;
}
int DATE::operator <(DATE &operand)
{
if(year<operand.year) return 1;
else if(year>operand.year) return 0;
else if(month<operand.month) return 1;
else if(month>operand.month) return 0;
else if(day<operand.day) return 1;
else return 0;
}
int DATE::operator ==(DATE &right)
{
if(year==right.year&&month==right.month&&day==right.day)
return 1;
else
return 0;
}
DATE &DATE::operator =(DATE &right)
{
year=right.year;
month=right.month;
day=right.day;
return *this;
}
----------------------------------------------------------------------------------------------------------------------
Book.h:类Book定义
// Book.h: interface for the Book class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_BOOK_H__0541F24F_979E_4421_8EAC_FD9__INCLUDED_)
#define AFX_BOOK_H__0541F24F_979E_4421_8EAC_FD9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <string.h>
#include "fstream.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "DATE.h"
#define MAX 12
class Book
{
public:
Book(int t,char *n,char *a,float p,int y,int m,int d);
Book(){};
virtual ~Book();
int f_new(); //新建书籍信息
int f_save(); //保留书籍信息
int f_open(); //打开书籍信息
int display(); //显示书籍信息
int e_delete(); //删除书籍信息
int e_update(); //修改书籍信息
int showInfo(); //显示部分书籍信息
int sort(); //排序书籍信息
Book &operator=(Book &); //重载等于运算符
private:
int type; //书籍类型
char name[MAX]; //书籍名称
char author[MAX]; //作者
float price; //书籍价格
DATE date; //购置日期
};
#endif // !defined(AFX_BOOK_H__0541F24F_979E_4421_8EAC_FD9__INCLUDED_)
----------------------------------------------------------------------------------------------------------------------
Book.cpp:类Book实现
// Book.cpp: implementation of the Book class.
//
//////////////////////////////////////////////////////////////////////
#include "Book.h"
Book books[200]; //定义200条数组
int num=0; //初始化书籍信息条数零
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Book::Book(int t,char *n,char *a,float p,int y,int m,int d)
:date(y,m,d)
{
type=t;
price=p;
strncpy(name,n,MAX);
name[MAX]=0;
strncpy(author,a,MAX);
author[MAX]=0;
}
Book::~Book()
{
}
int Book::f_new()
{
system("cls");
cout<<"1--学习"<<" "<<"2--名著"<<" "<<"3--小说"<<" "<<"4--散文"<<endl<<endl<<endl;
cout<<"请输入书籍类型:";cin>>books[num].type;
printf("请输入书名:");gets(books[num].name);
printf("请输入作者名:");gets(books[num].author);
cout<<"请输入书籍价格:";cin>>books[num].price;
cout<<"请输入购置日期:";cin>>books[num].date;
num++;
return 1;
}
int Book::f_save()
{
ofstream outFile("book.dat",ios::out|ios::binary);
if(!outFile)
cerr<<"Open file or create file error."<<endl;
else
{
outFile<<num;
outFile.write((char *)&books,sizeof(books));
outFile.close();
cout<<"保留成功!"<<endl;
}
return 1;
}
int Book::f_open()
{
system("cls");
int i;
ifstream infile("book.dat",ios::in|ios::binary);
{
infile>>num;
if(num==0)
{
cout<<"没有统计!请先输入书籍信息。"<<endl;
system("pause");
return 1;
}
for(i=0;i<num;i++)
infile.read((char *)&books[i],sizeof(books));
infile.close();
}
return 1;
}
int Book::sort()
{
char c;
system("cls");
printf("\n---------------------------排序书籍信息-----------------------\n\n");
cout<<"1----------------按时间次序排序"<<endl<<"2----------------按书名次序排序"<<endl;
c=getch();
switch(c)
{
case'1':
system("cls");
int i,j;Book ex;
printf("\n-------------------------时间次序排序书籍信息---------------------\n\n");
for(i=0;i<num-1;i++)
{
for(j=i+1;books[i].date<books[j].date||books[i].date==books[j].date;j++)
{
ex=books[i];
books[i]=books[j];
books[j]=ex;
}
}
for(i=0;i<num-1;i++)
books[i].showInfo();
system("pause");
return 1;
}
return 1;
}
int Book::display()
{
char *s;char *s1="学习";char *s2="名著";char *s3="小说";char *s4="散文";
char c;
for(;;)
{
system("cls");
cout<<"1. 显示全部书籍信息。"<<endl;
cout<<"2. 显示指定类别书籍信息。"<<endl;
cout<<"0. 返回上一层。"<<endl;
c=getch();
if(c=='0')
break;
switch(c)
{
case'1':
{
system("cls");
printf("\n---------------------------全部书籍列表-----------------------\n\n");
printf("类型 书名 作者 价格 日期\n\n");
for(int i=0;i<num;i++)
{
switch(books[i].type)
{
case 1:
s=new char[strlen(s1)+1];
strcpy(s,s1);
break;
case 2:
s=new char[strlen(s2)+1];
strcpy(s,s2);
break;
case 3:
s=new char[strlen(s3)+1];
strcpy(s,s3);
break;
case 4:
s=new char[strlen(s4)+1];
strcpy(s,s4);
break;
}
printf("%-15s%-18s%-15s%-15.1f",s,name,author,price);cout<<date<<endl;
}
}
break;
case'2':
system("cls");
printf("\n---------------------------书籍分类列表-----------------------\n\n");
for(int i=0;i<num;i++)
if(books[i].type==1)
cout<<"学习类:"<<endl<<books[i].name<<" "<<books[i].author<<endl;
for(i=0;i<num;i++)
if(books[i].type==2)
cout<<"名著类:"<<endl<<books[i].name<<" "<<books[i].author<<endl;
for(i=0;i<num;i++)
if(books[i].type==3)
cout<<"小说类:"<<endl<<books[i].name<<" "<<books[i].author<<endl;
for(i=0;i<num;i++)
if(books[i].type==4)
cout<<"散文类:"<<endl<<books[i].name<<" "<<books[i].author<<endl;
}
system("pause");
}
return 1;
}
int Book::showInfo()
{
char *s;char *s1="学习";char *s2="名著";char *s3="小说";char *s4="散文";
switch(type)
{
case 1:
s=new char[strlen(s1)+1];
strcpy(s,s1);
break;
case 2:
s=new char[strlen(s2)+1];
strcpy(s,s2);
break;
case 3:
s=new char[strlen(s3)+1];
strcpy(s,s3);
break;
case 4:
s=new char[strlen(s4)+1];
strcpy(s,s4);
break;
}
printf("%-15s%-18s%-15s%-15.1f",s,name,author,price);cout<<date<<endl;
return 1;
}
int Book::e_delete()
{
char c;
char s[MAX];
system("cls");
cout<<"请输入要删除书籍名:";cin>>s;
for(int i=0;i<num;i++)
{
if(strcmp(s,books[i].name)==0)
{
printf("\n---------------------------搜索书籍列表-----------------------\n\n");
printf("类型 书名 作者 价格 日期\n\n");
books[i].showInfo();
cout<<"1----------------删除并保留"<<endl<<"2----------------返回"<<endl;
c=getch();
switch(c)
{
case'1':
books[i]=books[200];
num--;
system("cls");
cout<<"删除成功!"<<endl;
system("pause");
return 0;
case '2':
return 0;
}
}
else
{
cout<<"没有匹配搜索对象"<<endl;
system("pause");
return 0;
}
}
return 0;
}
int Book::e_update()
{
char c;
char n[MAX];
Book ex;
system("cls");
cout<<"请输入要修改书籍名:";cin>>n;
for(int i=0;i<num;i++)
{
if(strcmp(n,books[i].name)==0)
{
printf("\n---------------------------搜索书籍列表-----------------------\n\n");
printf("类型 书名 作者 价格 日期\n\n");
books[i].showInfo();
cout<<"1----------------修改此书籍信息"<<endl<<"2----------------返回"<<endl;
c=getch();
switch(c)
{
case'1':
printf("\n---------------------------修改书籍信息-----------------------\n\n");
cout<<"1--学习"<<" "<<"2--名著"<<" "<<"3--小说"<<" "<<"4--散文"<<endl<<endl<<endl;
cout<<"请输入修改后书籍类型:";cin>>ex.type;
printf("请输入修改后书名:");gets(ex.name);
printf("请输入修改后作者名:");gets(ex.author);
cout<<"请输入修改后书籍价格:";cin>>ex.price;
cout<<"请输入修改后购置日期:";cin>>ex.date;
books[i]=ex;
cout<<"修改成功!"<<endl;
system("pause");
return 1;
case'2':
return 1;
}
}
}
return 1;
}
Book &Book::operator =(Book &right)
{
type=right.type;
strncpy(name,right.name,MAX);
name[MAX]=0;
strncpy(author,right.author,MAX);
author[MAX]=0;
price=right.price;
date=right.date;
return *this;
}
----------------------------------------------------------------------------------------------------------------------
main.cpp:主函数
#include "Book.h"
int main()
{
extern Book books[200];
extern num;
char c;
Book *mptr;
mptr=&books[num];
for(;;)
{
system("cls");
printf("\n ________________ ");
printf("\n ---------------------------|个人书籍管理系统|------------------------");
printf("\n ^^^^^^^^^^^^^^^^ \n\n\n");
cout<<" ||----------------------------按0键结束程序------------------------||"<<endl;
cout<<" ||--------------------------按1键添加书籍信息----------------------||"<<endl;
cout<<" ||--------------------------按2键显示书籍信息----------------------||"<<endl;
cout<<" ||--------------------------按3键删除书籍信息----------------------||"<<endl;
cout<<" ||--------------------------按4键修改书籍信息----------------------||"<<endl;
cout<<" ||--------------------------按5键排列书籍信息----------------------||"<<endl;
cout<<" 电气七班 刘怡然"<<endl;
c=getch();
if(c=='0')
break;
switch(c)
{
case '1':
mptr->f_open();
mptr->f_new();
mptr->f_save();
break;
case '2':
mptr->f_open();
mptr->display();
break;
case '3':
mptr->f_open();
mptr->e_delete();
mptr->f_save();
break;
case '4':
mptr->f_open();
mptr->e_update();
mptr->f_save();
break;
case '5':
mptr->f_open();
mptr->sort();
break;
}
}
return 1;
}
六、程序测试
主界面:
全部书籍列表:
修改书籍:
时间次序排序书籍信息:
展开阅读全文