C语言课设---图书管理系统

目 录
一、程序主要功能
二、程序设计思路
三、程序流程图
四、数据结构
五、程序代码
六、程序运行结果
七、新功能的设计说明——Correct
八、两个主要算法说明

一、程序主要功能
图书管理系统要求实现图书管理的基本功能,包括图书的录入、删除、查找和导入/导出等。图书的属性包括书号、书名、第一作者、版次、出版年等信息。
功能要求:
1.创建:创建图书管理系统,用逐条输入的方式;
2.显示:分屏显示图书管理系统中的所有记录;
3.插入:向图书管理系统中插入一条记录;
4.删除:删除一条已经存在的记录项;
5.排序:以编号为依据升序排列所有记录项;
6.查找:根据用户输入的属性值查找符合条件的记录项;
7.导入/导出:可以从文件读入已有的图书管理系统,也可将文件中的图书信息导出到文件;
8.反序:以编号为依据将按序排列的记录项反序排列;
9.删除相同记录;
10附加功能:修改特定记录的特定信息。先显示所有信息,用户输入所要修改的图书序号,选择要修改信息的属性,修改

构建如图菜单系统,程序执行过程为:循环显示主菜单,用户在Give your choice:处输入选项,即按照功能列表输入0~10中的任意一个数字,按回车后,执行相应的功能。功能执行完毕,返回菜单。

二、程序设计思路
1.首先,我先根据老师的题目要求,确定了目录里各个功能的顺序,从而知道switch里case的顺序;
2.然后开始设计主程序(main函数),将要求达到的功能先放在一边,考虑大体的结构框架;
3.最后对于要求的那些功能,为了使得程序的可读性提高,我决定通过主函数不断对子函数进行调用的方式来实现这些功能,一个或多个子函数共同完成一项功能,
当然,为了保证程序运行的正确性,我是通过分开编写子函数,确定是正确的之后,再将它们拼装起来,实现要求的功能。
三、流程图
在这里插入图片描述
四、数据结构
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct //定义数据类型
{
char ISBN[10]; //书号
char book[30]; //书名
char author[20]; //作者
int edition; //版本号
char press[50]; //出版社名
int year; //年份
}Bookinfo;

int Input(Bookinfo dictList[],int n) // 从键盘输入若干条记录,依次存放到结构体数组dictList中,返回最后的记录数
{
int m,i; //m:要输入的本数,i循环控制量
printf(“请输入要输入图书的本数\n”);
scanf(“%d”,&m);
getchar();
printf(“\n”);
for(i=0;i<m;i++)
{
printf(“请输入第%d本:\n”,i+1);
printf(“书号:”);
gets(dictList[n+i].ISBN);
printf(“书名:”);
gets(dictList[n+i].book);
printf(“作者:”);
gets(dictList[n+i].author);
printf(“版本号:”);
scanf(“%d”,&dictList[n+i].edition);
getchar();
printf(“出版社名:”);
gets(dictList[n+i].press);
printf(“出版年份:”);
scanf(“%d”,&dictList[n+i].year);
getchar();
printf(“\n”);
}
printf(“输入完毕!请继续:”);
return (n+m); //返回总的图书本数
}

void Display(Bookinfo dictList[],int n) //显示所有图书信息,每10本暂停一次
{
int i,js=1; //js:计数,统计已经输出的本数
char zt;
printf(“书号 书名 作者 版本号 出版社 出版年份\n”);
printf(“---------------------------------------------------------------------\n”);
printf(“\n”);
for(i=0;i<n;i++,js++)
{
printf(“%-8s”,dictList[i].ISBN); //-号用于左对齐
printf(“%-15s”,dictList[i].book); //-号用于左对齐
printf(“%-13s”,dictList[i].author); //-号用于左对齐
printf(“第%3d版 “,dictList[i].edition);
printf(”%-14s”,dictList[i].press); //-号用于左对齐
printf(“%d\n”,dictList[i].year);
if(js%10==0) //每输出十本暂停一下
{
printf(“任意键,继续输出”);
zt=getchar(); //防止回车键的影响
}
}
printf(“输出完毕!请继续:”);
}

int Delete(Bookinfo dictList[],int n,char *book) //删除某一本书
{
int i,j,t;
char del[10],c,*zj; //删除的目标书号
printf(“请选择书号:”);
gets(del);
for(i=0;i<n;i++)
{
for(j=0,zj=book;j<30 && dictList[i].book[j]!=‘\0’;j++,zj++)
{
if(dictList[i].book[j]*zj)
t=1;
else
{
t=0;
break;
}
}
if(t
1)
{
for(j=0;j<10 && dictList[i].ISBN[j]!=‘\0’;j++)
{
if(dictList[i].ISBN[j]del[j]) t=1;
else {t=0;j=10;}
}
printf(“确定删除,请按回车键!”);
c=getchar();
if(c!=‘\n’)
t=0;
if(t
1)
{
for(;i<n-1;i++)
{
dictList[i]=dictList[i+1];
}
}
}
}
printf(“成功删除”);
return n-1;
}

int Delete_a_record(Bookinfo dictList[],int n)
{
int i,t,p;
char sm[30],*book; //sm:书名,待删除书本的书名
printf(“请输入待删除书本的名字:”);
getchar();
gets(sm);
book=&sm[0];
for(i=0;i<n;i++)
{
for(p=0;p<30 && dictList[i].book[p]!=‘\0’;p++)
{
if(dictList[i].book[p]sm[p])
t=1;
else
{
t=0;
break;
}
}
if(t
1)
{
printf(“书号 书名\n”);
printf(“____________\n”);
printf(“%-8s”,dictList[i].ISBN);
printf(“%-8s\n”,dictList[i].book);
}
}
n=Delete(dictList,n,book);
return n;
}

void Sort_by_name(Bookinfo dictList[],int n) //数组按书名升序排列
{
int i,j,p,bj;
Bookinfo ls;
for(i=0;i<n-1;i++)
{
p=i;
for(j=i+1;j<n;j++)
{
bj=strcmp(dictList[i].book,dictList[j].book);
if(bj>0)
p=j;
}
if(p!=i)
{
ls=dictList[i];
dictList[i]=dictList[p];
dictList[p]=ls;
}
}
printf(“排序完成\n”);
}

int Insert(Bookinfo dictList[],int n,Bookinfo *s) //有序插入
{
int i,j,p;
for(i=0;i<=n;i++)
{
p=strcmp(dictList[i].book,(*s).book); //strcmp函数,用于比较s1,s2的大小,s1>s2,返回1;s1=s2,返回0;s1<s2,返回-1
if(i=n) //所插入的比所有值都大,或者相等,则插入最后
{
dictList[i]=*s;
i=n+1;
j=n+1;
}
if(p>0)
{
for(j=n;j>i;j–)
dictList[j]=dictList[j-1];
dictList[i]=*s;
i=n+1;
}
}
return(n+1);
}

int Insert_a_record(Bookinfo dictList[ ],int n) //有序插入
{
Bookinfo pp,*s;
s=&pp;
getchar();
printf(“书号:”);
gets(pp.ISBN);
printf(“书名:”);
gets(pp.book);
printf(“作者:”);
gets(pp.author);
printf(“版本号:”);
scanf(“%d”,&pp.edition);
getchar();
printf(“出版社名:”);
gets(pp.press);
printf(“出版年份:”);
scanf(“%d”,&pp.year);
getchar();
n=Insert(dictList,n,s);
Sort_by_name(dictList,n);
printf(“插入成功”);
return n;
}

int Query(Bookinfo dictList[],int n,Bookinfo *book) //查找并显示书名为book的所有记录,查找成功返回该书记录个数,失败则返回-1
{
int i,p,t,m=0;
for(i=0;i<n;i++)
{
for(p=0;p<30 && dictList[i].book[p]!=‘\0’;p++)
{
if(dictList[i].book[p](*book).book[p])
t=1;
else
{
t=0;
break;
}
}
if(t
1) //输出查找该书名的所有记录
{
printf(“书号 书名 作者 版本号 出版社 出版年\n”);
printf(“__________________________________________________\n”);
printf(“%-8s”,dictList[i].ISBN);
printf(“%-8s”,dictList[i].book);
printf(“%-8s”,dictList[i].author);
printf(“第%3d版 “,dictList[i].edition);
printf(”%-8s”,dictList[i].press);
printf(“%d\n”,dictList[i].year);
m=m+1;
}
}
return m;
}

void Query_a_record(Bookinfo dictList[],int n) //输入待查书名
{
Bookinfo cz,*czz;
int a;
czz=&cz;
printf(“请输入要查找的书名:”);
getchar();
gets(cz.book);
a=Query(dictList,n,czz);
if(a>0)
printf(“找到了%d本名为%s的书!”,a,cz.book);
else
printf(“没有找到名称为%s的书”,cz.book);
}

void WritetoText(Bookinfo dictList[],int n,char *filename) //将记录写到文件里
{
int i;
FILE *fp;
fp=fopen(filename,“w”);
if(fp==NULL)
{
printf(“不能打开文件\n”);
exit(1);
}
fprintf(fp,“%d\n”,n);
for(i=0;i<n;i++)
{
fprintf(fp,“%s\t%s\t%s\t%d\t%s\t%d\n”,dictList[i].ISBN,dictList[i].book,dictList[i].author,dictList[i].edition,dictList[i].press,dictList[i].year);
}
printf(“成功记录到文件!”);
}

int AddfromText(Bookinfo dictList[],int n,char *filename) //从文件中导入数据
{
int i;
Bookinfo s;
FILE *p;
system(“cls”);
p=fopen(filename,“r”);
fscanf(p,“%d”,&i);
while(i–)
{
fscanf(p,“%s\t%s\t%s\t%d\t%s\t%d”,s.ISBN,s.book,s.author,&s.edition,s.press,&s.year);
n=Insert(dictList,n,&s);
}
fclose§;
printf(“成功输入\n”);
return(n);
}

void Display_main_menu() //显示主菜单
{
system(“cls”); //清屏
printf(" Menu\n"); //输出menu并且换行
printf(“_____________________________________\n”);
printf(“1. Input Records\n”);
printf(“2. Display All Records\n”);
printf(“3. Insert A Record\n”);
printf(“4. Delete A Recrod\n”);
printf(“5. Sort\n”);
printf(“6. Query\n”);
printf(“7. Add Rrcords From a Text File\n”);
printf(“8. Write To a Text File\n”);
printf(“9. Reverse List\n”);
printf(“10. Delate the same records\n”);
printf(“11. Correct a record\n”); //修改数据记录
printf(“0. Quit\n”);
printf(“______________________________________\n”);
printf(“Give Your Choice(0-11):”);
}

void copyBook(Bookinfo *a,Bookinfo b)
{
strcpy(a->author,b.author);
strcpy(a->book,b.book);
a->edition = b.edition;
strcpy(a->ISBN,b.ISBN);
strcpy(a->press,b.press);
a->year = b.year;
}

void Reverse(Bookinfo dictList[],int len) //int len = sizeof(dictList)/sizeof(dictList[0]);
{
Bookinfo temp;
int i=0;
for(i=0;i<(len+1)/2;i++)
{
copyBook(&temp,dictList[i]);
copyBook(&dictList[i],dictList[len-1-i]);
copyBook(&dictList[len-1-i],temp);
}
printf(“逆转完成”);
}

int SameBook(Bookinfo a,Bookinfo b) //删除相同数据
{
return !strcmp(a.author,b.author) //判断作者,书名等信息是否相同,如果有一个不相同,那么在&&中就有一个为0,则返回值为0,只有全部相同时,返回值才为1
&& !strcmp(a.book,b.book)
&& a.editionb.edition
&& !strcmp(a.ISBN,b.ISBN)
&& !strcmp(a.press,b.press)
&& a.year
b.year;
}

int DeleteSame(Bookinfo dictList[], int n)
{
int newLen=1;
int i,j;
int canAdd = 1;
Bookinfo tempStorage[50];
copyBook(&tempStorage[0],dictList[0]);
for(i=1;i<n;i++)
{
canAdd = 1;
for(j=0;j<newLen;j++)
{
if(SameBook(dictList[i],tempStorage[j]))
{
canAdd = 0;
break;
}
}
if(canAdd)
{
copyBook(&tempStorage[newLen++],dictList[i]);
}
}
memcpy(dictList,tempStorage,sizeof(dictList[0])*50); //memcpy函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。
printf(“剔除完成”);
return newLen;
}

void Correct(Bookinfo dictList[],int n) //显示所有记录,并对其中某一个进行修改
{
char xg[30];
int i,bj,m;
Display(dictList,n);
system(“pause”);
printf(“请输入所要修改图书记录的书号:\n”);
scanf(“%s”,xg);
for(i=0;i<n;i++)
{
bj=strcmp(dictList[i].ISBN,xg);
if(bj==0) break;
}
printf(“所要修改对象信息如下:\n”);
printf(“书号 书名 作者 版本号 出版社 出版年份\n”);
printf(“--------------------------------------------------------------\n”);
printf(“%-7s”,dictList[i].ISBN);
printf(“%-16s”,dictList[i].book);
printf(“%-8s”,dictList[i].author);
printf(“第%3d版 “,dictList[i].edition);
printf(”%-14s”,dictList[i].press);
printf(“%d\n”,dictList[i].year);
printf(“请输入所要修改对内容的序号\n”);
printf(“1.书号\n2.书名\n3.作者\n4.版本号\n5.出版社\n6.出版年份\n”);
scanf(“%d”,&m);
switch (m)
{
case 1:
{
printf(“书号:”);
scanf(“%s”,dictList[i].ISBN);
break;
}
case 2:
{
printf(“书名:”);
scanf(“%s”,dictList[i].book);
break;
}
case 3:
{
printf(“作者:”);
scanf(“%s”,dictList[i].author);
break;
}
case 4:
{
printf(“版本号:”);
scanf(“%d”,&dictList[i].edition);
getchar();
break;
}
case 5:
{
printf(“出版社:”);
scanf(“%s”,dictList[i].press);
break;
}
case 6:
{
printf(“出版年份:”);
scanf(“%d”,&dictList[i].year);
getchar();
break;
}
}
}

void main()
{
int n=0;
int input;
Bookinfo dictList[50];
for(;😉
{
Display_main_menu();
scanf(“%d”,&input);
switch(input)
{
case 1:
{
n=Input(dictList,n);
system(“pause”);
break;
}
case 2:
{
Display(dictList,n);
system(“pause”);
break;
}
case 3:
{
n=Insert_a_record(dictList,n);
system(“pause”);
break;
}
case 4:
{
n=Delete_a_record(dictList,n);
system(“pause”);
break;
}
case 5:
{
Sort_by_name(dictList,n);
system(“pause”);
break;
}
case 6:
{
Query_a_record(dictList,n);
system(“pause”);
break;
}
case 7:
{
char *filename,s[30];
printf(“请输入文件名\n”);
scanf(“%s”,s);
filename=s;
n=AddfromText(dictList,n,filename);
system(“pause”);
break;
}
case 8:
{
char *filename,s[30];
printf(“请输入文件名\n”);
scanf(“%s”,s);
filename=s;
WritetoText(dictList,n,filename);
system(“pause”);
break;
}
case 9:
{
Reverse(dictList,n);
system(“pause”);
break;
}
case 10:
{
n = DeleteSame(dictList,n);
system(“pause”);
break;
}
case 11:
{
Correct(dictList,n);
system(“pause”);
break;
}
case 0:
{
printf(“Goodbye!\n”);
system(“pause”);
exit(0);
}
}
}
}

六、程序运行结果
1.数据输入和输出数据
输入1,则开始录入数据,我们不妨先录入5本书的数据:1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5,然后按任意键返回,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
4 5 5 第 5版 5 5
2.插入一条结点记录
我们先随便录入一些数据,比如,我们先用1,录入1 1 1 1 1 1,然后我们输入2,看到录入的结果为;
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
然后我们输入3,进行数据的录入,比如,我输入:2 2 2 2 2 2,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3.删除一条结点记录
我们先随便录入一些数据,比如,我们先用1,录入1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 ,然后我们输入2,看到录入的结果为;
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
然后我们输入4,进行数据的删除,比如,我输入:2 2 2 2 2,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
3 3 3 第 3版 3 3
4.排序
我们先随便录入一些数据,比如,我们先用1,录入2 2 2 2 2 2 3 3 3 3 3 3 1 1 1 1 1 1,然后我们输入2,看到录入的结果为;
书号 书名 作者 版本号 出版社 出版年份

2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
1 1 1 第 1版 1 1
然后我们输入5,进行数据的排序(数组按书号升序排列),然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
5.查询数据
我们先随便录入一些数据,比如,我们输入1,则开始录入数据,我们不妨先录入5本书的数据:1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5,然后按任意键返回,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
4 5 5 第 5版 5 5
然后,我们输入6,屏幕会显示:请输入书名:比如,我输入3,便会显示:
书号 书名 作者 版本号 出版社 出版年份

3 3 3 第 3版 3 3
6.从文件中整批输入数据
我们在record.txt中输入相应的数据,然后在界面上输入2,便会显示出record.txt中的数据
7.将记录写到文件
我们先随便录入一些数据,比如,我们输入1,则开始录入数据,我们不妨先录入5本书的数据:1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5,然后按任意键返回,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
4 5 5 第 5版 5 5
然后输入8,便会在外面的record.txt中出现相同的数据。
8.将表反序存放
我们先随便录入一些数据,比如,我们输入1,则开始录入数据,我们不妨先录入3本书的数据: 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 ,然后按任意键返回,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
然后输入9,再输入2,便会显示:
书号 书名 作者 版本号 出版社 出版年份

4 4 4 第 4版 4 4
3 3 3 第 3版 3 3
2 2 2 第 2版 2 2
9.删除雷同记录
我们先随便录入一些数据,比如,我们输入1,则开始录入数据,我们不妨先录入7本书的数据:1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 1 1 1 3 3 3 3 3 3 ,然后按任意键返回,然后输入2,然后便会显示出:
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
4 5 5 第 5版 5 5
1 1 1 第 1版 1 1
3 3 3 第 3版 3 3
然后输入10,再输入2,便会显示
书号 书名 作者 版本号 出版社 出版年份

1 1 1 第 1版 1 1
2 2 2 第 2版 2 2
3 3 3 第 3版 3 3
4 4 4 第 4版 4 4
4 5 5 第 5版 5 5
10.退出管理系统
输入0,然后按任意键返回。
七、新功能的设计说明——Correct
此功能用于数据的修改,比如,在一些外国图书出版以后,由于英译问题,导致系统记录信息不正确,因此需要实时的修改数据库里的数据,于是,我设计了一个函数来实现这个功能。我的做法是先显示所有信息,用户输入所要修改的图书序号,选择要修改信息的属性,进行修改。
八、两个主要算法说明
1.Insert
在这里插入图片描述
2.Delete
在这里插入图片描述

  • 20
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值