#include
#include
#include
typedef struct BOOK{
int num;
char bname[128];
char wname[128];
int dnum;
char cname[128];
int time;
float price;
}BOOK;
typedef struct list{
BOOK *data;
int size;
int length;
}list,*List;
int menu(List);
void menu0(List);
int menu2(List);
void menu3(List);
void menu4(List);
int Init(List);
int Input(List);
int Find(List,char*);
int Find2(List,int);
int Find3(List,char*);
int Find4(List,char*);
int Insert(List);
int Insert2(List,int);
void Delete(List);
void Update(List);
void Look(List);
void sort1(List);
void sort2(List);
void sort3(List);
void sort4(List);
int Load(List);
void booknumberfind(List);
void booknamefind(List);
void writernamefind(List);
void cnamefind(List);
提前进行函数声明,避免因函数相互调用而出现的逻辑错误。
一级菜单menu()及四个二级菜单menu0()、menu2()、menu3()、menu4(),层次分明、逻辑清晰,且切换菜单时均有提示,便于操作。
int menu(List L){
int flag = 1;
int n;
while(flag){
printf("****欢迎来到图书信息管理系统****\n");
printf("0.初始化 1.录入 2.编辑 \n3.浏览 4.查询 5.退出\n");
printf("Please choose 0~5:");
scanf("%d",&n);
switch(n){
case 0:
menu0(L);
break;
case 1:
Input(L);
break;
case 2:
menu2(L);
break;
case 3:
menu3(L);
break;
case 4:
menu4(L);
break;
case 5:
flag = 0;
printf("您已成功退出系统!\n");
break;
default:
printf("Error!Please choose again:");
break;
}
}
return 1;
}
void menu0(List L){
int n;
int flag = 1;
printf("****初始化****\n");
while(flag){
printf("1.载入已有信息 2.新建书单\n");
scanf("%d",&n);
switch(n){
case 1:
if(Load(L))
flag = 0;
break;
case 2:
Init(L);
flag = 0;
break;
default:
printf("选择无效!\n");
break;
}
}
}
int menu2(List L){
int n;
int flag = 1;
while(flag){
printf("****编辑菜单****\n");
printf("1.插入 2.删除 3.修改 0.退出\n");
printf("Please choose 0~3:");
scanf("%d",&n);
switch(n){
case 1:
Insert(L);
break;
case 2:
Delete(L);
break;
case 3:
Update(L);
break;
case 0:
flag = 0;
printf("您已退出编辑菜单\n");
break;
default:
printf("Error!Please choose again:");
break;
}
}
return 1;
}
void menu3(List L){
int n;
int flag = 1;
while(flag){
printf("****浏览菜单****\n");
printf("1.书号↑2.书号↓\n3.价格↑ 4.价格↓\n0.退出\n");
printf("Please choose 0~4:");
scanf("%d",&n);
switch(n){
case 1:
sort1(L);
Look(L);
break;
case 2:
sort2(L);
Look(L);
break;
case 3:
sort3(L);
Look(L);
break;
case 4:
sort4(L);
Look(L);
break;
case 0:
flag = 0;
printf("您已退出浏览菜单\n");
break;
default:
printf("输入错误!\n");
break;
}
}
}
void menu4(List L){
int flag = 1;
int n;
while(flag){
printf("****查询菜单****\n");
printf("1.书号 2.书名 \n3.作者名 4.出版社 \n0.退出\n");
printf("Please choose 0~4:");
scanf("%d",&n);
switch(n){
case 1:
booknumberfind(L);
break;
case 2:
booknamefind(L);
break;
case 3:
writernamefind(L);
break;
case 4:
cnamefind(L);
break;
case 0:
flag = 0;
break;
}
}
printf("您已退出查询菜单!\n");
return;
}
//初始化(新建书单)
int Init(List L){
printf("请输入书单最大长度:\n");
int max;
scanf("%d",&max);
L->data = new BOOK[max];
if(L->data == NULL){
printf("Space request failed!\n");
return 0;
}
L->size = max;
L->length = 0;
printf("Creat successfully!\n");
return 1;
}
//录入函数
int Input(List L){
//检查书单是否存在
if(L->data == NULL){
printf("请先创建书单!\n");
return 0;
}
//确定本次录入的数据规模
BOOK x;
int i, length;
printf("请输入此次要录入的数目:");
scanf("%d",&length);
for(i = 0; i < length ;i++){
Insert2(L,L->length+1);
}
printf("录入成功!\n");
return 1;
}
//插入函数
int Insert(List L){
int i;
printf("请输入插入位置:");
scanf("%d",&i);
if(i < 1 || i > L->length + 1){
printf("插入位置不合理!\n");
return 0;
}
if(L->length >= L->size){
printf("容量不够!\n");
return 0;
}
int k;
for(k = L->length ; k >= i;k--){
L->data[k] = L->data[k-1];
}
BOOK x;
printf("请依次输入以下信息(空格隔开):\n");
printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
L->data[i-1] = x;
L->length++;
printf("插入成功!\n");
return 1;
}
//录入中的插入函数
int Insert2(List L,int i){
if(i < 1 || i > L->length + 1){
printf("插入位置不合理!\n");
return 0;
}
if(L->length >= L->size){
printf("容量不够!\n");
return 0;
}
int k;
for(k = L->length ; k >= i;k--){
L->data[k] = L->data[k-1];
}
BOOK x;
printf("请依次输入第%d本书的信息(空格隔开):\n",i);
printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
L->data[i-1] = x;
L->length++;
printf("插入成功!\n");
return 1;
}
// 查找函数
///按书名
int Find(List L,char temp[128]){
int i;
for( i = 0 ; i < L->length;i++){
if(strcmp(L->data[i].bname, temp) == 0){
return i;
}
}
return -1;
}
///按书号
int Find2(List L,int t){
int i;
for( i = 0 ; i < L->length;i++){
if(L->data[i].num == t){
return i;
}
}
return -1;
}
///按作者名
int Find3(List L,char temp[128]){
int i;
for( i = 0 ; i < L->length;i++){
if(strcmp(L->data[i].wname, temp) == 0){
return i;
}
}
return -1;
}
///按出版社
int Find4(List L,char temp[128]){
int i;
for( i = 0 ; i < L->length;i++){
if(strcmp(L->data[i].cname, temp) == 0){
return i;
}
}
return -1;
}
void Delete(List L){
printf("请输入要删除的图书名称:\n");
char temp[128];
scanf("%s",temp);
int n = Find(L,temp);
if(n == -1){
printf("未找到该图书!\n");
return;
}
int i;
for( i = n; i < L->length - 1 ;i++ ){
L->data[i] = L->data[i+1];
}
L->length--;
printf("删除成功!\n");
return;
}
//修改
void Update(List L){
printf("请输入要修改的图书名称:\n");
char temp[128];
scanf("%s",temp);
int n = Find(L,temp);
if(n == -1){
printf("未找到该图书!\n");
return;
}
BOOK x;
printf("请输入新的图书信息(空格隔开):\n");
printf("书号 书名 作者名 分类号 出版社 出版时间 价格\n");
scanf("%d%s%s%d%s%d%f",&x.num,x.bname,x.wname,&x.dnum,x.cname,&x.time,&x.price);
L->data[n] = x;
printf("修改成功!\n");
return;
}
载入函数中的读取格式一定要和保存数据的写入格式完全一致,不然会发生读取错误。
//载入书单
int Load(List L){
FILE *fp;
fp = fopen("C:/Users/lenovo/Desktop/data.txt","r");
if(fp == NULL ){
printf("文件不存在!\n");
return 0;
}
int i;
fscanf(fp,"%d %d\n",&L->length,&L->size);
L->data = new BOOK[L->size];
for( i = 0; i < L->length ;i++){
fscanf(fp,"%d %s %s %d %s %d %lf\n",&L->data[i].num,L->data[i].bname,L->data[i].wname,&L->data[i].dnum,L->data[i].cname,&L->data[i].time,&L->data[i].price);
}
fclose(fp);
printf("载入成功!\n");
return 1;
}
//浏览函数
void Look(List L){
if(L->length == 0){
printf("无数据\n");
return;
}
int i;
printf("信息如下:\n");
for(i = 0; i < L->length ;i++){
printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
}
return;
}
采用选择排序法进行排序。
//排序输出
///按书号升序
void sort1(List L){
if(L->length == 0){
printf("没有数据!\n");
return;
}
BOOK temp;
int i,j,min;
//选择排序
for(i = 0; i < L->length - 1 ;i++){
for( min = i, j = i + 1; j < L->length; j++){
if(L->data[j].num < L->data[min].num){
temp = L->data[j];
L->data[j] = L->data[min];
L->data[min] = temp;
}
}
}
printf("已按书号升序排序\n");
return;
}
///按书号降序
void sort2(List L){
if(L->length == 0){
printf("没有数据!\n");
return;
}
BOOK temp;
int i,j,max;
//选择排序
for(i = 0; i < L->length - 1 ;i++){
for( max = i, j = i + 1; j < L->length; j++){
if(L->data[j].num > L->data[max].num){
temp = L->data[j];
L->data[j] = L->data[max];
L->data[max] = temp;
}
}
}
printf("已按书号降序排序\n");
return;
}
///按价格升序
void sort3(List L){
if(L->length == 0){
printf("没有数据!\n");
return;
}
BOOK temp;
int i,j,min;
//选择排序
for(i = 0; i < L->length - 1 ;i++){
for( min = i, j = i + 1; j < L->length; j++){
if(L->data[j].price < L->data[min].price){
temp = L->data[j];
L->data[j] = L->data[min];
L->data[min] = temp;
}
}
}
printf("已按价格升序排序\n");
return;
}
///按价格降序
void sort4(List L){
if(L->length == 0){
printf("没有数据!\n");
return;
}
BOOK temp;
int i,j,max;
//选择排序
for(i = 0; i < L->length - 1 ;i++){
for( max = i, j = i + 1; j < L->length; j++){
if(L->data[j].price > L->data[max].price){
temp = L->data[j];
L->data[j] = L->data[max];
L->data[max] = temp;
}
}
}
printf("已按价格降序排序\n");
return;
}
//查询函数
/// 按书名
void booknamefind(List L){
char temp[128];
printf("请输入书名:\n");
scanf("%s",temp);
int i = Find(L,temp);
if(i == -1){
printf("查无此书!\n");
return;
}
printf("信息如下:\n");
printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
return;
}
///按书号
void booknumberfind(List L){
int temp;
printf("请输入书号:\n");
scanf("%d",&temp);
int i = Find2(L,temp);
if(i == -1){
printf("查无此书!\n");
return;
}
printf("信息如下:\n");
printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
return;
}
///按作者名
void writernamefind(List L){
char temp[128];
printf("请输入作者名:\n");
scanf("%s",temp);
int i = Find3(L,temp);
if(i == -1){
printf("查无此书!\n");
return;
}
printf("信息如下:\n");
printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
return;
}
///按出版社名
void cnamefind(List L){
char temp[128];
printf("请输入出版社名:\n");
scanf("%s",temp);
int i = Find4(L,temp);
if(i == -1){
printf("查无此书!\n");
return;
}
printf("信息如下:\n");
printf("%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
return;
}
//主函数
int main(){
list list;
List L = &list;
menu(L);
FILE *fp;
fp = fopen("C:/Users/lenovo/Desktop/data.txt","w+");
if(fp == NULL){
printf("文件打开(创建)失败!\n");
return 0;
}
int i;
fprintf(fp,"%d %d\n",L->length,L->size);
for( i = 0; i < L->length ;i++){
fprintf(fp,"%d %s %s %d %s %d %lf\n",L->data[i].num,L->data[i].bname,L->data[i].wname,L->data[i].dnum,L->data[i].cname,L->data[i].time,L->data[i].price);
}
fclose(fp);
return 0;
}
文件操作采用的是格式化录入数据,即先录入书单已保存书的数目和书单最大长度,之后依次换行录入每本书的信息。载入书单即读取已存数据,两者格式必须一致,详见载入函数。
若读者想直接control + cv使用,请注意更改主函数及载入函数中文件的地址,避免出现错误。
除模糊查询功能外基本实现功能要求,欢迎大家批评指正~