我用c语言做的,有待优化。

本文介绍了一个图书管理系统的实现细节,包括使用C语言通过链表结构管理图书馆的书籍信息、借阅记录等功能。系统提供了查看图书信息、图书借阅及归还等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

//书籍链表

struct book{

    char name[20];//书名;

    int page;//页数;

    int price;//价格;

    int total;//数量库存;

int borrow;//借出多少本

int countborrow;//一本书借过多少次,

int count;//总共有多少本

    struct book *next;

};

//借出书籍的链表

struct borrow

{

char person[20];//借的人

char name[20];//借出的书名子

int num;//借了好了本

int days;//借出多少天

int month;//借的月份

int day;//借的号数

struct borrow * next;

};

 

struct book *head,*end,*q,*p;

struct borrow *bhead,*bend,*btemp;

//开始主菜单

int menu()

{

    int num;

   

printf("\n");

printf("\t\t|-----------------成信大图书管理----------------|\t\t");

printf("\t\t|\t1.查看所有图书信息\t\t\t|\t\t");

printf("\t\t|\t2.图书信息修改\t\t\t\t|\t\t");

printf("\t\t|\t3.图书出借\t\t\t\t|\t\t");

printf("\t\t|\t4.图书归还\t\t\t\t|\t\t");

printf("\t\t|\t5.单个图书信息插入\t\t\t|\t\t");

printf("\t\t|\t6.删除书籍\t\t\t\t|\t\t");

printf("\t\t|\t7.统计\t\t\t\t\t|\t\t");

printf("\t\t|\t8.查询\t\t\t\t\t|\t\t");

printf("\t\t|\t9.借出统计\t\t\t\t|\t\t");

printf("\t\t|\t0.退出,请正常退出,以免文件错误\t|\t\t");

printf("\t\t|-----------------------------------------------|\t\t");//\t调节页面样式,一个\t相当于一个turbo

scanf("%d",&num);

 

if(num<0||num>9)

{

return menu();

}

else

return num ;

}

 

//获取时间

int date(char * type){

time_t rawtime;

struct tm * timeinfo;

time(&rawtime);

timeinfo=localtime(&rawtime);

if(strcmp(type,"month")==0){

return timeinfo->tm_mon;

}

if(strcmp(type,"day")==0){

return timeinfo->tm_mday;

}

if(strcmp(type,"year")==0){

return timeinfo->tm_year;

}

if(strcmp(type,"hour")==0){

return timeinfo->tm_hour;

}

}

//得到书籍链表输出控制台

void output(struct book *head1)

{

    struct book *q;

   

    q=head1->next;

    while(q!=NULL)

    {

printf("%s\t%d页\t%d元\t还剩%d本\t总数%d本\n",q->name,q->page,q->price,q->total,q->count);

        q=q->next;

    }

    printf("\n");

}

//得到书籍链表将其写入文件

void fput(struct book *head1)

{

    FILE *fp1;

    struct book *q;

    fp1=fopen("lib.txt","w");

    q=head1->next;

    while(q!=NULL)

    {

        fprintf(fp1,"%s\t%d\t%d\t%d\t%d\t%d\t%d\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);

        q=q->next;

    }

    fclose(fp1);

}

//输出统计

void count(struct book *head1)

{

int count=0;//书馆书的总数

int countborrow=0;//统计被借出多少

int counttotal=0;//统计书馆现有多少书籍

int countb=0;

struct book *q;

int num[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};int i=0,temp,x,y;

    q=head1->next;

    while(q!=NULL)

    {

count = count + q->count;

countborrow = countborrow +q->borrow;

counttotal = counttotal + q->total;

countb = countb + q->countborrow;

//统计总共书籍数,借出书籍数,剩余书籍数,借出次数

if(q->countborrow!=NULL)

num[i]=q->countborrow;

if(q->next==NULL||9==i)

{

for(x=0;x<i;x++) 

{

for(y=0;y<i-1-x;y++)

{

if(num[y]<num[y+1])

{

temp=num[y];

num[y]=num[y+1];

num[y+1]=temp;

 }//从大到小排序

}

}

}

if(q->countborrow>num[9]&&i>9)

{

temp=num[9];

num[9]=countborrow;

for(x=0;x<10;x++) 

{

for(y=0;y<10-1-x;y++)

{

if(num[y]<num[y+1]) 

{

temp=num[y];

num[y]=num[y+1];

num[y+1]=temp;

 }

}

}//把第十一本书借出去的次数和前十中借出次数最少的相比较,再进行排序

}

i++;

q=q->next;

    }

printf("书籍总数%d本,\t借出%d本,\t在馆书籍%d本,借过%d次\n",count,countborrow,counttotal,countb);

if(countborrow!=0) 

{

  q=head1->next;

for(x=0;x<=i;x++)

{

 while(q!=NULL)

{

if(q->countborrow==num[x])

{

printf("第%d是%s,借出%d次,总数%d本,借出%d本\n",x+1,q->name,q->countborrow,q->count,q->borrow);

}

q=q->next;

}

}

}

}

//查询

void see(struct book *head1)

{

int num;

char str[20];

struct book *q=head1->next;

loop:

printf("1.通过名字查询\t2.通过价格查询\t3.通过页数查询\t4.全部借出的书\n");

scanf("%d",&num);

switch(num)

{

case 1:

{

printf("输入模糊名字,大小写区分\n");

scanf("%s",&str);

while(q!=NULL)

{

if(strstr(q->name,str))

{

printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);

}

q=q->next;

}

}

break;

case 2:

{

//printf("输入价格 ( >价格 )表示查询大于等于输入价格,直接输入表示查询等价的\n");

printf("输入价格 \n");

scanf("%d",&num);

while(q!=NULL)

{

if(q->price==num)

{

printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);

}

q=q->next;

}

//可添加根据范围查询价格

}

break;

case 3:

{

  printf("输入页数\n"); //可添加根据大于小于查询页数

scanf("%d",&num);

while(q!=NULL)

{

if(q->page==num)

{

printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);

}

q=q->next;

}

break;

case 4:

{

while(q!=NULL)

{

if(q->borrow==q->count)

{

printf("书名%s,%d页,%d本/元,剩%d本,借出%d本,借过%d次,总计%d本\n",q->name,q->page,q->price,q->total,q->borrow,q->countborrow,q->count);

}

q=q->next;

}

  } 

break;

default :goto loop; 

}

}

//从书籍文件得到链表,

void foutput(int flag)

{

    FILE *fp;

    fp=fopen("lib.txt","r");

    head=(struct book *)malloc(sizeof(struct book));

    end=head;

    end->next=NULL;

 

    while(!feof(fp)) //------!feof(fp)值为0,不在执行循环语句  ------

    {

p=(struct book *)malloc(sizeof(struct book));

if(fscanf(fp,"%s %d %d %d %d %d %d\n",&p->name,&p->page,&p->price,&p->total,&p->borrow,&p->countborrow,&p->count)==7)

        {

p->next=NULL;

end->next=p;

end=p;

}

    }

if(1==flag)

{

output(head);//函数调用,输出书籍链表

}

if(0==flag)

{

count(head);

}

if(2==flag)

{

see(head);

}

 

    fclose(fp);    //----关闭文件-----

}

 

//从借出文件得到链表,

void borrowf()

{

 

    FILE *fp;

    fp=fopen("borrow.txt","r");

bhead=(struct  borrow*)malloc(sizeof(struct borrow));

    bend=bhead;

    bend->next=NULL;

    while(!feof(fp)) //------!feof(fp)值为0,不在执行循环语句  ------

    {

btemp=(struct borrow *)malloc(sizeof(struct borrow));

if(fscanf(fp,"%s %s %d %d %d %d \n",&btemp->person,&btemp->name,&btemp->num,&btemp->days,&btemp->month,&btemp->day)==6)

        {

btemp->next=NULL;

bend->next=btemp;

bend=btemp;

}

    }

    fclose(fp);    //----关闭文件-----

}

//输出借出文件的

void boutput(struct borrow * bhead){

    btemp=bhead->next;

    while(btemp!=NULL)

    {

printf("%s借%s,%d本,借了%d天 %d月 %d号 \n",btemp->person,btemp->name,btemp->num,btemp->days,btemp->month++,btemp->day);

        btemp=btemp->next;

    }

    printf("\n");

}

//得到借出链表表将其写入文件

void fborrput(struct borrow * bhead)

{

    FILE *fp1;

    fp1=fopen("borrow.txt","w");

    btemp=bhead->next;

    while(btemp!=NULL)

    {

        fprintf(fp1,"%s %s %d %d %d %d \n",btemp->person,btemp->name,btemp->num,btemp->days,btemp->month,btemp->day);

        btemp=btemp->next;

    }

    fclose(fp1);

}

//删除图书

void shanchu()

{

 

    int m=0;

    char name[20];

    struct book *q;

    foutput(1);

    printf("请输入你要删除的书籍\n");

    scanf("%s",name);

    q=head;

    p=q->next;

    while(p!=NULL)

    {

 

    

        if(strcmp(name,p->name)==0)

        {

 

if(p->next==NULL){

q->next=NULL;

m++;

break;

}

else{

   q->next=p->next;

free(p);

p=q->next;

m++;

break;

}

 

 

        }

 

        q=q->next;

p=q->next;

    }

    if(m==0)   printf("\n图书库内没有您要删除的书\n");

    else

{

printf("已删除\n");

fput(head);//将删除后的书籍存入文件中

}

}

 

//图书信息修改

void xiugai()

{

    char name[20];

    int m=0;

    foutput(1);//先得到文件中的所有书籍,

    printf("请输入您要修改的书名\n");

    scanf("%s",name);

    p=head->next;

    while(p!=NULL)

    {

        if(strcmp(name,p->name)==0)//比较两个字符串是否相同

        {

            printf("请输入你要修改后的书名\n");

            scanf("%s",p->name);

            printf("请输入你要修改后的页数\n");

            scanf("%d",&p->page);

            printf("请输入你要修改后的书价\n");

            scanf("%d",&p->price);

            printf("请输入你要修改后的数量\n");

            scanf("%d",&p->total);

printf("请输入你要修改后的总数\n");

scanf("%d",&p->count);

            m++;

        }

        p=p->next;

    }

    if(m==0)

printf("\n没有找到所要修改的书!\n\n");

    else{

        fput(head);//将修改后的书籍存入文件中

printf("修改成功!");

}

}

//书籍出借

void chujie()

{

    int m=0,n;

    char name[20];

    foutput(1);

borrowf();

    printf("请您输入您要借阅的书名\n");

    scanf("%s",name);

    p=head->next;

    while(p!=NULL)

    {

        if(strcmp(name,p->name)==0)//比较两个字符串是否相同

        {

            printf("请问您要借几本?请输入\n");

            scanf("%d",&n);

            if(p->total==0)    printf("\n您要的书已经借光\n");

            if(n>p->total)        printf("\n您要借的书籍库存不够\n");

            else

            {

btemp=(struct borrow *)malloc(sizeof(struct borrow));

printf("请输入你的名字\n");

scanf("%s",&btemp->person);

strcpy(btemp->name,name);

btemp->num=n;

printf("借好多天,注意!超出天数将根据单价罚款!\n");

scanf("%d",&btemp->days);

btemp->month=date("month");

btemp->day=date("day");

                p->total = p->total - n;//从总数中把借出去的数量扣除d

p->borrow=p->borrow+n;

p->countborrow+=1;

                printf("\n欢迎您的借阅\n");

            }

m++;

        }

        p=p->next;

    }

    if(m==0) printf("\n对不起,图书库内没有您要借阅的书\n");

    else 

{

fput(head);//将借出后剩余的书籍存入文件中

btemp->next=NULL;

bend->next=btemp;

bend=btemp;

fborrput(bhead);

}

}

//图书归还

void guihuan()

{

    int m=0,n;

    char name[20];

    foutput(1);

    printf("请输入您要归还的书名\n");

    scanf("%s",name);

    p=head->next;

    while(p!=NULL)

    {

        if(strcmp(name,p->name)==0)//比较字符串是否相同

        {

            printf("请输入您要归还的数量\n");

            scanf("%d",&n);

            p->total=p->total+n;

p->borrow=p->borrow-1;

            m++;

        }

        p=p->next;

    }

    if(m==0)    printf("\n对不起,此书未借出or书名错误!!!\n");

    else fput(head);//将归还后的书籍数量存入文件中

 

}

 

 

//单个录入书籍

void record()

{

    foutput(1);

    p=(struct book *)malloc(sizeof(struct book));//分配内存空间来录入书籍

    printf("请输入你要增加的书名\n");

    scanf("%s",&p->name);

    printf("请输入你要增加的书的页数\n");

    scanf("%d",&p->page);

    printf("请输入你要增加的书的价格\n");

    scanf("%d",&p->price);

    printf("请输入你要增加的书的总数\n");

scanf("%d",&p->count);

    p->total=p->count;

p->borrow=0;

p->countborrow=0;

    p->next=NULL;

    end->next=p;

    end=p;

    fput(head);

printf("增加成功!\n");

}

 

 

void  kongzhi(int n)//设计思路

{

 

    switch(n)

{

         case 1: foutput(1);break;

         case 2: xiugai();break;

         case 3: chujie();break;

         case 4: guihuan();break;

         case 5: record();break;

         case 6: shanchu();break;

case 7: foutput(0);break;

case 8: foutput(2);break;

case 9: {borrowf();boutput(bhead);break;}

     }

 

 

}

//主函数,调用处

int main()

{

    int n;

 

 

    FILE *fp1;

//书籍文件

    fp1=fopen("lib.txt","r+");

    if(fp1==NULL)

{

        fp1=fopen("lib.txt","w+");

        fclose(fp1);

    }

 

//打开借出文件

fp1=fopen("borrow.txt","r+");

if(fp1==NULL)

{

  fp1=fopen("borrow.txt","w+");

 fclose(fp1);

}

 

n=menu();

while(n!=0)

{

kongzhi(n);

n=menu();

 

}

system("cls");

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/dengdajun/blog/472278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值