<1>来源:简易的C语言图书管理系统
<2>运行环境:
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct LIB{
char bId[10];//书号
char bName[20];//书名
char aName[20];//作者
char pName[20];//出版社
char sort[20];//分类
float bPrice;//价格
int bNum;//书籍数量
struct LIB *next;
};
struct LIB * fileBuild(void);//文件创建
void writeInFile(struct LIB *head);//文件写入
void addBookInfo(struct LIB *head);//增
void delBookInfo(struct LIB *head);//删
void changeBookInfo(struct LIB *head);//改
void findBookInfo(struct LIB *head);//查
void showBooks(struct LIB *head);//显示所有书籍
void bookMenu(void);//显示菜单
int count;
int main()
{
int action;
struct LIB *const head =fileBuild();
bookMenu();
while(1)
{
printf("请输入要进行的操作序号:");
scanf("%d",&action);
switch(action)
{
case 1:system("CLS");bookMenu();addBookInfo(head);break;
case 2:system("CLS");bookMenu();delBookInfo(head);break;
case 3:system("CLS");bookMenu();changeBookInfo(head);break;
case 4:system("CLS");bookMenu();findBookInfo(head);break;
case 5:system("CLS");bookMenu();showBooks(head);break;
case 6:writeInFile(head);printf("已退出...\n");exit(0);break;
default:printf("没有这个序号!");break;
}
}
return 0;
}
struct LIB * fileBuild(void)
{
FILE *file,*f2;
int i;
struct LIB * const head = (struct LIB *)malloc(sizeof(struct LIB));
struct LIB *pb,*pa;
pa = pb = head;
pb->next = NULL;
if(!(fopen("LibBook.txt","r")))
{
printf("文件创建中...");
file = fopen("LibBook.txt","w");
f2 = fopen("Numcount.txt","w");
fprintf(f2,"%d\n",count);
fclose(f2);
fclose(file);
}
else
{
file = fopen("LibBook.txt","r");
f2 = fopen("Numcount.txt","r");
fscanf(f2,"%d",&count);
for(i=0;i<count;i++)
{
pa = (struct LIB *)malloc(sizeof(struct LIB));
fscanf(file,"%s%s%s%s%s%f%d",pa->bId,pa->bName,pa->aName,
pa->pName,pa->sort,&pa->bPrice,&pa->bNum);
pb->next = pa;
pb = pa;
pb->next = NULL;
}
fclose(f2);
fclose(file);
}
return head;
}
void writeInFile(struct LIB *head)
{
struct LIB *pa = head;
FILE *file,*f2;
file = fopen("LibBook.txt","w");
f2 = fopen("Numcount.txt","w");
fscanf(file,"%d",&count);
count = 0;
while(pa->next!=NULL)
{
count++;
pa=pa->next;
fprintf(file,"%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,pa->aName,
pa->pName,pa->sort,pa->bPrice,pa->bNum);
}
fprintf(f2,"%d\n",count);
fclose(f2);
fclose(file);
printf("写入成功!");
}
void addBookInfo(struct LIB *head)
{
struct LIB *pa,*pb,*pc;
pa = pb =head;
pc=(struct LIB *)malloc(sizeof(struct LIB));
printf("请输入要增加的信息(书号、书名、作者、出版社、分类、价格、数量):");
scanf("%s%s%s%s%s%f%d",pc->bId,pc->bName,pc->aName,pc->pName,pc->sort,
&pc->bPrice,&pc->bNum);
while(pa->next!=NULL)
{
pa = pa->next;
if(atoi(pa->bId)>atoi(pc->bId))
{
pc->next = pa;
pb->next = pc;
printf("添加成功!\n");
return;
}
pb = pa;
}
if(pa->next==NULL)
{
pa->next = pc;
pc->next = NULL;
}
}
void delBookInfo(struct LIB *head)
{
struct LIB *pa,*pb;
pa = pb =head;
char name[10];
printf("请输入要删除信息的书名:");
scanf("%s",name);
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->bName,name)==0)
{
pb->next = pa->next;
free(pa);
printf("删除成功!");
break;
}
pb = pa;
}
}
void changeBookInfo(struct LIB *head)
{
struct LIB *pa = head,*pb;
pb = (struct LIB *)malloc(sizeof(struct LIB));
char name[10],action[10];
int c,borrow,addnum;
printf("请输入要修改信息的书名:");
scanf("%s",name);
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->bName,name)==0)
{
printf("找到书籍:%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
printf("请问想要借书还是还书?");
scanf("%s",action);
if(strcmp(action,"借书")==0)
{
printf("请输入借书的数量:");
scanf("%d",&borrow) ;
pa->bNum = pa->bNum-borrow;
printf("借书成功!\n");
}
else if(strcmp(action,"还书")==0)
{
printf("请输入还书的数量:");
scanf("%d",&addnum) ;
pa->bNum = pa->bNum+addnum;
printf("还书成功!\n");
}
else
{
printf("没有这个选项!\n");
}
return;
}
}
}
void findBookInfo(struct LIB *head)
{
struct LIB *pa = head;
char name[20];
printf("请输入要查询的书名:");
scanf("%s",name);
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->bName,name)==0)
{
printf("找到书籍:%s %s %s %s %s %0.2f %d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
return;
}
}
if(pa->next==NULL)
{
printf("未找到!\n");
}
}
void bookMenu(void)
{
printf(" =========图书管理系统==========\n");
printf("| 1、添加书籍数据 |\n");
printf("| 2、删除书籍数据 |\n");
printf("| 3、借书以及还书 |\n");
printf("| 4、查找指定书籍 |\n");
printf("| 5、显示全部书籍 |\n");
printf("| 6、退出管理系统 |\n");
printf(" ===============================\n");
}
void showBooks(struct LIB *head)
{
struct LIB *pa = head;
printf("书号\t\t书名\t\t作者\t\t出版社\t\t分类\t\t价格\t\t数量\t\t\n");
while(pa->next!=NULL)
{
pa = pa->next;
printf("%-16s%-16s%-16s%-16s%-16s%-17.2f%-18d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
}
}
<3>运行结果
<4>问题列表
- 系统表达存在不通顺的问题。借书和还书功能的“请输入想要修改的书名”表达不妥。找到指定书籍后,根据情景应只显示该图书现存数目。图书库没有图书,却仍有属性行,十分违和。查找书籍后,反馈不规范,没头没尾,应考虑更通俗更人性化的表达方式。
- 演示中发现,当想要借的书库存为零的时候,仍可以进行借书行为(借书数目应小于等于图书书目)。而且并未考虑借还书籍在原书库内不存在的情况。功能存在漏洞。
- 查找功能单一,仅能通过书名查找,应再加考虑通过作者查找(增设作者专栏)、书号查找和类别查找(否则类别属性有些赘余)。
- 由可以查询到每本书的书号,且书号是唯一的,故在借还书和修改书籍信息是采用图书号,防止出现重书名、重作者等情况。
- 添加书籍数据时,只能创建一条新的数据。若数据已存在,不能选择修改部分信息。
- 书号应该由系统自动确认,不可修改,方便查找等活动。
<5>改进代码
- 修改图书数据功能
点击查看代码
void modifyBookInfo(struct LIB *head)
{
struct LIB *pa = head;
int id;
printf("请输入要修改的书号:");
scanf("%d",&id);
int flag=0;
while(pa->next!=NULL)
{
pa = pa->next;
if(pa->bId == id)
{
flag==1;
printf("书号:%d 书名:%s 作者:%s 出版社:%s 分类:%s 价格:%0.2f 数量:%d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
printf("请输入要修改的信息(书名、作者、出版社、分类、价格、数量):\n");
scanf("%s%s%s%s%f%d",pa->bName,pa->aName,pa->pName,pa->sort,&pa->bPrice,&pa->bNum);
printf("修改成功!");
return;
}
}
if(flag==0)
{
printf("该图书不存在!\n");
}
}
- 借书以及还书功能
点击查看代码
void changeBookInfo(struct LIB *head)
{
struct LIB *pa = head;
char name[10],action[10];
int c,borrow,addnum,id;
printf("请输入要寻找的图书号:");
scanf("%d",&id);
int flag=1;
while(pa->next!=NULL)
{
pa = pa->next;
if(pa->bId==id)
{
printf("找到书籍:%s,现存有%d本\n",pa->bName,pa->bNum);
printf("请问想要借书还是还书?");
scanf("%s",action);
if(strcmp(action,"借书")==0)
{
printf("请输入借书的数量:");
scanf("%d",&borrow) ;
if(pa->bNum >= borrow){
pa->bNum = pa->bNum-borrow;
printf("借书成功!\n");
}
else{
printf("抱歉,图书存量不足,借书失败!\n");
}
}
else if(strcmp(action,"还书")==0)
{
printf("请输入还书的数量:");
scanf("%d",&addnum) ;
pa->bNum = pa->bNum+addnum;
printf("还书成功!\n");
}
else
{
printf("没有这个选项!\n");
}
flag=0;break;
}
}
if(flag==1) printf("抱歉,该图书不存在\n");
return;
}
- 图书查找功能
点击查看代码
void findMenu(void){
printf(" =========图书查找方式==========\n");
printf("| 1、按书名查找 |\n");
printf("| 2、按作者查找 |\n");
printf("| 3、按书号查找 |\n");
printf("| 4、按类别查找 |\n");
printf(" ===============================\n");
}
void findBookInfo(struct LIB *head)
{
findMenu();
struct LIB *pa=head;
int action;
printf("请输入要进行的查找方式序号:");
scanf("%d",&action);
switch(action)
{
case 1:system("CLS");bookMenu();findBookInfo_bName(pa);break;
case 2:system("CLS");bookMenu();findBookInfo_aName(pa);break;
case 3:system("CLS");bookMenu();findBookInfo_bId(pa);break;
case 4:system("CLS");bookMenu();findBookInfo_sort(pa);break;
default:printf("查找方式不存在!");break;
}
return;
}
void findBookInfo_bName(struct LIB *pa)
{
int flag;
char name[20];
printf("请输入要查询的书名:");
scanf("%s",name);
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->bName,name)==0)
{
if(flag==0){
printf("找到书籍:\n");
flag=1;
}
printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
}
}
if(flag==0)
{
printf("未找到!\n");
}
return;
}
void findBookInfo_aName(struct LIB *pa)
{
char name[20];
printf("请输入要查询的作者:");
scanf("%s",name);
int flag=0;
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->aName,name)==0)
{
if(flag==0){
printf("找到书籍:\n");
flag=1;
}
printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
}
}
if(flag==0)
{
printf("未找到!\n");
}
return;
}
void findBookInfo_bId(struct LIB *pa)
{
int id;
printf("请输入要查询的书号:");
scanf("%d",&id);
while(pa->next!=NULL)
{
pa = pa->next;
if(pa->bId == id)
{
printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
return ;
}
}
printf("未找到!\n");
}
void findBookInfo_sort(struct LIB *pa)
{
char sort[20];
printf("请输入要查询的类别:");
scanf("%s",sort);
int flag=0;
while(pa->next!=NULL)
{
pa = pa->next;
if(strcmp(pa->sort,sort)==0)
{
if(flag==0){
printf("找到书籍:\n");
flag=1;
}
printf("书号:%-6d 书名:%-15s 作者:%-7s 出版社:%-7s 分类:%-8s 价格:%-5.2f 数量:%-5d\n",pa->bId,pa->bName,
pa->aName,pa->pName,pa->sort,pa->bPrice,pa->bNum);
}
}
if(flag==0)
{
printf("未找到!\n");
}
return;
}
- 许多在表达细节与的修改在此不予赘述
<6>改进后运行测试
<7>总结:软件的设计功能规划是需要从用户体验出发的,一切设计都是为了客户的便利而设计。将大致的功能规划落实到实际代码设计的时候,要注意一些细节上的处理,如借书数目应小于实际库存数,按书名或者作者名查找时是否存在同名的情况等等。除此之外,还要注意给用户提供一个看起来简单整齐、表达准确的可视化页面,力求确保程序使用的高效率。
标签:head,struct,LIB,第一周,next,pa,实验,printf From: https://www.cnblogs.com/lijin-001/p/18047293