用C语言编写简易图书管理系统
功能:1,查询功能2,排序功能3,统计总价格(并存入另一个文件夹中)4,图书修改5,图书借阅功能欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Mar...
1,查询功能
2,排序功能
3,统计总价格(并存入另一个文件夹中)
4,图书修改
5,图书借阅功能
在程序开始之前,需创建一个txt文件夹写入信息,我的txt文件保存在D盘的根目录下,所以books函数是D:…
如图
详细设计:
程序中的主要调用函数功能在menu()函数的switch中,main函数只需调用menu()函数,在menu()函数中利用switch调用各个函数中的功能,在最外层添加do-while(1)死循环,在do-while上面先调用books()函数,将txt文件存入结构体变量中,然后在do-while中选择自己所需要的功能调用函数。在各个函数结尾都存在调用menu函数或者调用自己,若想结束程序,则必须先返回主菜单选择0确定结束程序即可。
功能要求:
1.将txt文件中的内容存入结构体数组中时,第一步应该用FILE *fp=fopen(“txt文件中的地址,需要添加后缀.txt”,”r”);可以适当加一个if语句判断fp是否等于NULL。先存入第一行,用一个单独的字符串数组存,然后可以用for。
循环或者while将后面的的信息依次一行行存入结构体中,并要在存储完了以后加上文件关闭fcolse()。
2.在主函数中调用菜单函数,利用菜单函数选项加入switch调用各函数的功能,并加入死循环,用退出选项调用函数退出。
3.图书查询功能,按书名查找,先用for循环判断这个书是否在已经存入的结构体数组中,并引入一个判断条件,如果实在数组中,则令那个int值为一个特定值,则就可以在函数外用if—else语句写存在后与不存在时的操作,当存在时,则打印第一行的标题与对应的图书,不存在时则提示无此书。在这个函数的后面还可以加入判断条件,是否继续查询,是的话就调用这个查询功能函数,不是则调用主菜单返回。
4.打印全部图书直接用for循环打印即可
5.排序图书的数量,用冒泡排序法,互换了数量的位置后将与其对应的编号图书名等也互换位置,字符串用strcpy复制,数值用赋值
6.重新定义一个总价数组,将将总价存入数组中,打开另一个文件,”w”只写,然后在第一行加入总价并存入文件中,用for循环将下面的信息存入另一个文件中。
7.先用图书名或者作家名查找是否存在此图书,如果存在则显示该图书的信息,然后提示你所要修改的选项,利用switch语句修改对应的选项,字符串用strcpy,数值用赋值,修改完后将文件打开重新存入文件夹中,然后在函数结尾提示是否继续修改图书操作即可。
8.借阅图书时,先查找是否有此图书,如果有判断其图书的数量是否大于0,大于0则将其数量减1,否则提示库存不足,查询最后一次还没有找到此书则提示无此书。
9.退出程序时用exit(0).
第一次写博客,不喜勿喷!!!
全部代码
#include "stdio.h"
#include "stdlib.h" //system("cls")清空上面的内容用到的头文件
#include "string.h"
#define N 100
typedef struct book //用了typedef以后定义结构体时候不用struct Book a[N],直接用Book a[N];
{
int num; //编号
char type[20]; //分类
char name[20]; //书名
char author[20]; //作者
char press[30]; //出版社
int quantity; //数量
double price; //价格
char nume[7]; //txt文件中的第一行
}Book;
Book a[N];
void menu(); //菜单
void books(); //将txt文件存入结构体
void refer(); //1.查询
void show(); //2.打印全部图书
void amount(); //3.查看图书数量
void pr(); //4.统计价格
void alter(); //5.图书修改
void borrow(); //6.借阅图书
void over(); //7.退出
void menu() //@@@@@@@@@@@@@@@@@@@@菜单
{
books();
do
{
int n;
printf(" __________________________________\n");
printf("|******---------------------******|\n");
printf("| 欢迎进入图书管理系统 |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| * 1.图书查询 * |\n");
printf("| * 2.打印全部图书 * |\n");
printf("| * 3.图书数量排序 * |\n"); //按数量排序
printf("| * 4.统计价格 * |\n"); //统计每本书的总价及所有图书的总价
printf("| * 5.图书修改 * |\n");
printf("| * 6.借阅图书 * |\n");
printf("| * 0.退出 * |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("|******---------------------******|\n");
printf("|_________________________________|\n");
printf(" 注:输入对应序号!\n");
scanf("%d",&n);
fflush(stdin);
switch( n )
{
case 1 : refer(); break;
case 2 : show(); break;
case 3 : amount(); break;
case 4 : pr(); break;
case 5 : alter(); break;
case 6 : borrow(); break;
case 0 : over(); break;
default :break;
}
}while(1);
}
void books() //@@@@@@@@@@@@@@@@@@@@@@@将txt文件存入结构体
{
int n = 0;
FILE *fr = fopen("D:\JK0627.txt","r+");
if(fr == NULL) {
printf("打开文件出错。\n");
return 1;
}
//存入第一行
fscanf(fr,"%s\t%s\t%s\t%s\t%s\t%s\t%s",&a[0].nume,&a[1].nume,&a[2].nume,&a[3].nume,&a[4].nume,&a[5].nume,&a[6].nume);
while(!feof(fr)) { // feof(fr)有两个返回值: 如果遇到文件结束,函数feof(fr)的值为非零值,否则为0
//存入1~10行 整数类的必须加入地址符,字符串可要可不要
fscanf(fr,"%d\t%s\t%s\t%s\t%s\t%d\t%lf\n",&a[n].num,&a[n].type,&a[n].name,&a[n].author,&a[n].press,&a[n].quantity,&a[n].price);
n++;
}
fclose(fr);
}
void refer() //@@@@@@@@@@@@@@@@@@@@@@@ 图书查询
{
int i,n,m=0,p;
char nam[30];
system("cls");
printf("请输入您要查询的书名:");
scanf("%s",&nam);
fflush(stdin);
for( i=0; i < 10; i++ )
{
if( strcmp(nam,a[i].name) == 0 ){
m = 1;
p = i; // p值为了记录i为多少,方便后面使用
break;
}
}
if( m = 1) {
system("cls");
printf("*************************************************图书总览***********************************************\n");
printf("--------------------------------------------------------------------------------------------------------\n");
// 打印第一行
printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
// 打印特定行
printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[p].num,a[p].type,a[p].name,a[p].author,a[p].press,a[p].quantity,a[p].price);
printf("--------------------------------------------------------------------------------------------------------\n");
}else {
printf("馆内无此书!");
}
printf("\n\n-----------------------\n");
printf("| 是否继续查询? |\n");
printf("| 1.是 2.否 |\n");
printf("-----------------------\n");
scanf("%d",&n);
if( n==1 ){
refer();
}
else if( n==2 ){
system("cls");
menu();
}
}
void show() //@@@@@@@@@@@@@@@@@@@ 打印全部图书
{
system("cls");
int i;
char n;
printf("*************************************************图书总览***********************************************\n");
printf("--------------------------------------------------------------------------------------------------------\n");
printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
for( i=0; i<10; i++ )
{
printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
}
printf("--------------------------------------------------------------------------------------------------------\n");
printf("\n按任意字符回车返回主菜单!\n");
fflush(stdin);
n=getchar();
system("cls");
menu();
}
void amount() //@@@@@@@@@@@@@@@查看图书数量
{
int i,j;
char n;
for( i=0; i<10-1; i++ )
{
for( j=0; j<10-1-i; j++ )
{
if( a[j].quantity > a[j+1].quantity ) //冒泡排序法
{
int m;
double p;
char b[30];
m = a[j].quantity; a[j].quantity = a[j+1].quantity; a[j+1].quantity = m; //当数量互换了位置以后,其对应的价格以及分类也要对应互换位置
m = a[j].num; a[j].num = a[j+1].num; a[j+1].num = m;
p = a[j].price; a[j].price = a[j+1].price; a[j+1].price = p;
strcpy(b,a[j].type); strcpy(a[j].type,a[j+1].type); strcpy(a[j+1].type,b);
strcpy(b,a[j].name); strcpy(a[j].name,a[j+1].name); strcpy(a[j+1].name,b);
strcpy(b,a[j].author); strcpy(a[j].author,a[j+1].author); strcpy(a[j+1].author,b);
strcpy(b,a[j].press); strcpy(a[j].press,a[j+1].press); strcpy(a[j+1].press,b);
}
}
}
system("cls"); //将重新排序的结果打印
printf("*************************************************图书总览***********************************************\n");
printf("--------------------------------------------------------------------------------------------------------\n");
printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
for( i=0; i<10; i++ )
{
printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
}
printf("--------------------------------------------------------------------------------------------------------\n");
printf("\n按任意字符回车返回主菜单!\n");
fflush(stdin);
n=getchar();
system("cls");
menu();
}
void pr() // @@@@@@@@@@@@@@@@@@@统计价格
{
int i;
char n;
double b[10],sum=0.0;
for( i=0; i<10; i++ )
{
b[i] = a[i].price*a[i].quantity; //重新定义的一个b数组 将图书的数量与对应的价格相乘
sum = sum + b[i];
}
FILE *fp = fopen("D:\ZJ0627.txt","w"); //将总价格一起写入另一个文件夹中
fprintf(fp,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume,"总价");
for( i=0; i<10; i++ ){
//存入1~10行
fprintf(fp,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price,b[i]);
}
fprintf(fp,"\t\t\t\t\t\t\t\t\t\t%s\t%.2lf","总价",sum); //最后一行写入总价
if( fp != NULL )
{
system("cls");
printf("恭喜你,存入文件夹成功!\n");
}
fclose(fp);
printf("\n按任意字符回车返回主菜单!\n");
fflush(stdin);
n=getchar();
system("cls");
menu();
}
void alter() // @@@@@@@@@@@@@@@@@@@图书修改
{
system("cls");
char b[20],c[20];
int i,n,m;
double p;
printf("输入你要修改的图书名或作家名:");
fflush(stdin);
scanf("%s",&b);
for( i=0; i<10; i++ )
{
if( strcmp( b , a[i].name ) == 0 || strcmp( b , a[i].author) == 0 )
{
system("cls");
printf("*************************************************图书总览***********************************************\n");
printf("--------------------------------------------------------------------------------------------------------\n");
// 打印第一行
printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
// 打印1~10行
printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
printf("--------------------------------------------------------------------------------------------------------\n");
printf("\n注:编号(0),分类(1),书名(2),作者(3),出版社(4),数量(5),单价(6)\n输入您要修改的选项的序号:");
fflush(stdin);
scanf("%d",&n);
switch( n )
{
system("cls");
case 0:printf("输入你要修改后的[%s]:",a[0].nume);fflush(stdin);scanf("%d",&m);a[i].num = m; // 整数赋值
if( a[i].num == m ){ printf("修改成功!\n"); } break;
case 1:printf("输入你要修改后的[%s]:",a[1].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].type,c); //字符拷贝strcpy
if( strcmp(a[i].type,c) == 0 ){ printf("修改成功!\n"); } break;
case 2:printf("输入你要修改后的[%s]:",a[2].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].name,c);
if( strcmp(a[i].name,c) == 0 ){ printf("修改成功!\n");} break;
case 3:printf("输入你要修改后的[%s]:",a[3].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].author,c);
if( strcmp(a[i].author,c) == 0 ){ printf("修改成功!\n");} break;
case 4:printf("输入你要修改后的[%s]:",a[4].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].press,c);
if( strcmp(a[i].press,c) == 0 ){ printf("修改成功!\n");} break;
case 5:printf("输入你要修改后的[%s]:",a[5].nume);fflush(stdin);scanf("%d",&m);a[i].quantity = m;
if( a[i].quantity == m ){ printf("修改成功!\n");} break;
case 6:printf("输入你要修改后的[%s]:",a[6].nume);fflush(stdin);scanf("%lf",&p);a[i].price = p;
if( a[i].price==p ){ printf("修改成功!\n");} break;
default :printf("修改失败!\n"); break;
}
FILE *f = fopen("D:\JK0627.txt","w"); // 修改成功后重新存入文件中
fprintf(f,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
for( i=0; i<10; i++ )
{
fprintf(f,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
}
if( f != NULL )
{
printf("存入文件夹成功!\n");
}
else
{
printf("存入文件夹失败!\n");
}
fclose(f);
printf("-----------------------\n");
printf("| 继续修改? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
fflush(stdin);
scanf("%d",&n);
if( n==1 ){
alter();
}else{
system("cls");
menu();
}
}else if( i == 9){
printf("你所要修改的图书不在书库中,请重新输入!\n");
printf("-----------------------\n");
printf("| 继续修改? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
fflush(stdin);
scanf("%d",&n);
if( n==1 ){
alter();
}else{
system("cls");
menu();
}
}
}
}
void borrow() //@@@@@@@@@@@@@@@@@借阅图书
{
system("cls");
int i,n;
char b[20];
printf("输入你要借阅的书籍:");
scanf("%s",&b);
for( i=0; i<10; i++ )
{
if( strcmp( b , a[i].name ) == 0 ) //判断是否有对应相等
{
if( a[i].quantity > 0 )
{
a[i].quantity = a[i].quantity - 1; // 如果数量大一0 数量减一
printf("\n\n借出成功!");
FILE *f = fopen("D:\JK0627.txt","w"); //减一后再将结果重新存入文件
fprintf(f,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
for( i=0; i<10; i++ )
{
fprintf(f,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
}
if( f != NULL )
{
printf("存入文件夹成功!\n");
}
else
{
printf("存入文件夹失败!");
}
fclose(f);
printf("-----------------------\n");
printf("| 继续借阅? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
fflush(stdin);
scanf("%d",&n);
if( n==1 ){
borrow();
}else{
system("cls");
menu();
}
}else{
printf("次书库存不足!\n");
printf("-----------------------\n");
printf("| 继续借阅? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
fflush(stdin);
scanf("%d",&n);
if( n==1 ){
borrow();
}else{
system("cls");
menu();
}
}
}else if( i == 9 ){
printf("书库中无此书!\n");
printf("-----------------------\n");
printf("| 继续借阅? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
fflush(stdin);
scanf("%d",&n);
if( n==1 ){
borrow();
}else{
system("cls");
menu();
}
}
}
}
void over() //@@@@@@@@@@@@@@@@@@退出程序
{
int n;
system("cls");
printf("-----------------------\n");
printf("| 您确定要退出吗? |\n");
printf("| 1.确定 2.取消 |\n");
printf("-----------------------\n");
scanf("%d",&n);
if( n==1 ){
exit(0); //结束程序
}
else if( n==2 ){
system("cls");
menu(); // 返回菜单
}
}
int main()
{
menu();
return 0;
}
运行结果:
更多推荐
所有评论(0)