图书管理系统c语言 结构体数组实现

图书管理系统是数据结构常见的课设题,在这里写一个简单的c语言实现代码。没有使用指针,链表。第一次需要写一些内容到程序中,之后注释掉creat(),creat2()两个函数即可从文件中读取。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define M 1


typedef struct node//图书信息的结构体
{
    char bookid[10];
    char bookname[50];
    char author[20];
    int leibie;
    int sum;
    int now;
}book;
typedef struct//用于存放所有的图书的结构体
{
    book book1[1000];
    int len;
}books;


typedef struct xcv
{
    char book2[10];

    char shijian[30];
}yijie;
typedef struct node1//借书证信息的结构体
{
    char cardid[10];
    char studentname[10];
    char studentclass[10];
    yijie yijieshu[10];
    int len3;

}card;
typedef struct//用于存放所有的借书卡的结构体
{
    card card1[100];
    int len1;
}cards;

books s;
cards p;
char *t2;
void fun()//显示系统当前时间函数
{

    time_t t1;
    t1=time(NULL);
    t2=ctime(&t1);
    printf("现在的时间是:%s\n",t2);
    printf("                    自现在起一个月后请归还图书\n");

}


void print()//屏幕前空格
{
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
}

void save()//保存文件用于创建图书
{
    FILE *fp;
    int i;
    if((fp=fopen("book.dat","wb"))==NULL)
    {
        printf("cannot open this file\n");
        return ;
    }
    for(i=0;i<s.len;i++)
    if(fwrite(&(s.book1[i]),sizeof(book),1,fp)!=1)
    printf("file write error\n");
    fclose(fp);
}

void creat(int n)//创建图书
{
    s.len=0;
    int i;
    for(i=0;i<n;i++)
    {
        printf("请输入书号\n");
        scanf("%s",s.book1[i].bookid);
        printf("请输入书名\n");
        scanf("%s",s.book1[i].bookname);
        printf("请输入作者\n");
        scanf("%s",s.book1[i].author);
        printf("请输入书籍类别:1:文学 2:科技 3:历史 4:其他\n");
        scanf("%d",&s.book1[i].leibie);
        printf("请输入书的总数\n");
        scanf("%d",&s.book1[i].sum);
        printf("请输入书的现量\n");
        scanf("%d",&s.book1[i].now);
        s.len++;
    }
    save();
}

void save1()//保存文件用于创建书卡
{
    FILE *fp;
    int i;
    if((fp=fopen("card.dat","wb"))==NULL)
    {
        printf("cannot open file\n");
        return ;
    }
    for(i=0;i<p.len1;i++)
    if(fwrite(&(p.card1[i]),sizeof(card),1,fp)!=1)
    printf("file write error!\n");
    fclose(fp);
}

void creat2(int n)//创建书卡
{
    p.len1=0;
    int i;
    for(i=0;i<n;i++)
    {
        printf("请输入卡号\n");
        scanf("%s",p.card1[i].cardid);
        printf("请输入姓名\n");
        scanf("%s",p.card1[i].studentname);
        printf("请输入班级\n");
        scanf("%s",p.card1[i].studentclass);
        p.card1[i].len3 = 0;
        p.len1++;
    }
    save1();
}

int find(char *str)
{
    int i = 0;
    for( ; i < s.len ; ++i)
    {
        if(!strcmp(str , s.book1[i].bookid))
        {
            return i;
        }
    }
    return i;
}

int findpeo(char *str)
{
    int i = 0;
    for( ; i < p.len1 ;++i)
    {
        if(!strcmp(str , p.card1[i].cardid))
        {
            return i;
        }
    }
    return i;
}

void findbook()//查找图书
{
    char str[10];
    int a,b,i,c;
    print();
    printf("                    请选择您的查找方式:\n");
    printf("                     ************************\n");
    printf("                      1:按书号查找\n                      2:按类别显示\n");
    printf("                     ************************\n                     ");
    getchar();
    scanf("%d",&b);
    system("cls");
    if(b==2)
    {
        print();
        printf("                   请输入您想查找的图书类别:\n                    ***********************\n                    1:文学   2:科技\n                    3:历史   4:其他\n                    ************************\n");
        printf("                     ");
        getchar();
        scanf("%d",&c);
        system("cls");
        print();
        printf("                    该类别的图书有\n");
        printf("                    ********************************************\n");
        printf("                    书号      书名      作者      总量      现量\n");
        for(i=0;i<s.len;i++)
        {
            if(c==s.book1[i].leibie)
            printf("                    %-7s%-12s%-10s %-10d%d\n",s.book1[i].bookid,s.book1[i].bookname,s.book1[i].author,s.book1[i].sum,s.book1[i].now);
        }
        printf("                    ********************************************\n");
    }
    else if(b==1)
    {
        print();
        printf("                    请输入要查找的书的书号\n");
        printf("                    ");
        scanf("%s",str);
        a=find(str);
        if(a == s.len)
        {
            puts("                    抱歉您查找的图书不存在");
            printf("                    请按任意键返回\n                    ");
            getchar();
            getchar();
            return ;
        }
        if(!s.book1[a].now)
        {
            puts("                    该图书已经借光了");
            printf("                    请按任意键返回\n                    ");
            getchar();
            getchar();
            return ;
        }
        printf("                    该书的名字是<<%s>>,\n                    该书一共有%d本,\n                    现在还有%d本可以借阅.\n",s.book1[a].bookname,s.book1[a].sum,s.book1[a].now);
    }
    else
    {
        print();
        printf("                    输入错误,按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    printf("                    查询结束.请按任意键返回上一层\n                    ");
    getchar();
    getchar();
}

void borrow()//借阅图书
{

    char str[10];
    char peo[10];
    char d;
	print();
    printf("                    请输入要查找的书号\n");
    int t, tpeo ,i;
	printf("                    ");
    scanf("%s" ,str);
    t = find(str);
    if(t == s.len)
    {
         puts("                    抱歉您要借的图书不存在");
         printf("                    请按任意键返回\n                    ");
         getchar();
         getchar();
         return ;
    }
    if(!(s.book1[t].now))
    {
        puts("                    该图书已经借光了");
        printf("                    请按任意键返回\n                    ");
        getchar();
        getchar();
        return ;
    }
    printf("                    请输入您的卡号\n");
	printf("                    ");
    scanf("%s",peo);
    tpeo = findpeo(peo);
    if(tpeo==p.len1)
    {
        printf("                    您输入的卡号不存在,按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    if(p.card1[tpeo].len3>=10)
    {
        printf("                    您的借书证借书数量已经达到上限,不允许再借书.按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    printf("                    查询成功,确定要借这本书吗?(y/n)\n");
    getchar();
	printf("                    ");
    scanf("%c",&d);
    if(!(d=='Y'||d=='y'))
    {
        printf("                    操作失败.按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    printf("                    您借书的开始时间为:\n                    ");
    fun();

    strcpy(p.card1[tpeo].yijieshu[p.card1[tpeo].len3].shijian,t2);
    s.book1[t].now--;
    strcpy(p.card1[tpeo].yijieshu[p.card1[tpeo].len3].book2, s.book1[t].bookid);
    p.card1[tpeo].len3++;
    printf("                    借阅成功,库存量减少一,当前书变为:%-d本,\n                    此书的书号为:%s.\n",s.book1[t].now,s.book1[t].bookid);

    printf("                    操作成功.按任意键返回上一层\n                    ");
    getchar();
    getchar();
}

void returnbook()//归还图书
{
    char str[10];
    char str2[10];
    char c;
    int i,j,k,a,b,flag=0;
	print();
    printf("                    请输入要归还的书号:\n");
	printf("                    ");
    scanf("%s",str);
    a=find(str);
    if(a == s.len)
    {
         puts("                    抱歉您要归还的图书不存在");
         printf("                    请按任意键返回\n                    ");
         getchar();
         getchar();
         return ;
    }
    printf("                    请输入您的借书证号:\n");
	printf("                    ");
    scanf("%s",str2);
    b=findpeo(str2);
    if(b==p.len1)
    {
        printf("                    您输入的卡号不存在.按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    for(i=0;i<p.card1[b].len3;i++)
    {
        //printf("%s ",p.card1[b].book2[i]);
        if(strcmp(p.card1[b].yijieshu[i].book2,str)==0)
        flag=1;
    }
    if(flag==0)
    {
        printf("                    借书证并没有借这本图书.按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    printf("                    查询成功,确定要归还这本书吗?(y/n)\n");
    getchar();
    printf("                    ");
    scanf("%c",&c);
    if(!(c=='Y'||c=='y'))
    {
        printf("                    操作失败.按任意键返回上一层\n                    ");
        getchar();
        getchar();
        return ;
    }
    s.book1[a].now++;
    for(j=0;j<p.card1[b].len3;j++)
    if(strcmp(p.card1[b].yijieshu[j].book2,str)==0)
    for(k=j;k<p.card1[b].len3-1;k++)
    {
        strcpy(p.card1[b].yijieshu[k].book2,p.card1[b].yijieshu[k+1].book2);
        strcpy(p.card1[b].yijieshu[k].shijian,p.card1[b].yijieshu[k+1].shijian);
    }


    p.card1[b].len3--;
    printf("                    还书成功,库存量增加一,当前书变为:%d本,\n                    此书的书号是:%s.\n",s.book1[a].now,s.book1[a].bookid);
    printf("                    操作成功.按任意键返回上一层\n                    ");
    getchar();
    getchar();
}

void addbook()//添加
{
    char str[10];
    char c,e='y';
    int a,b;
    do
    {   print();
        printf("                    请输入要添加的图书编号\n");
        getchar();
		printf("                    ");
        scanf("%s",str);
        a=find(str);
        if(a==s.len)
        {
            printf("                    这本书是新书\n");
            printf("                    请选择书的类型\n");
            printf("                    *********************\n");
            printf("                    1.文学\n                    2.科技\n                    3.历史\n                    4.其他\n");
            printf("                    *********************\n");
            getchar();
			printf("                    ");
            scanf("%d",&b);
            switch(b)
            {
                case 1:s.book1[s.len].leibie=1;break;
                case 2:s.book1[s.len].leibie=2;break;
                case 3:s.book1[s.len].leibie=3;break;
                case 4:s.book1[s.len].leibie=4;break;
                default:printf("                    您输入的类别有误.按任意键返回上一层\n                    ");getchar();return ;
            }
            //printf("请输入这本书的书号\n");
            //scanf("%s",s.book1[s.len].bookid);
			system("cls");
            strcpy(s.book1[s.len].bookid,str);
		    print();
            printf("                    请输入这本书的书名:\n");
			printf("                    ");
            scanf("%s",s.book1[s.len].bookname);
            printf("                    请输入这本书的作者:\n");
			printf("                    ");
            scanf("%s",s.book1[s.len].author);
            printf("                    请输入要添加的书的总量:\n");
			printf("                    ");
            scanf("%d",&s.book1[s.len].sum);
            s.book1[s.len].now=s.book1[s.len].sum;
            s.len++;
        }
        else if(a<s.len)
        {
            printf("                    这本书已经有记录了,若添加则其总量加一.\n                    是否要继续添加工作?(y/n)\n");
            getchar();
			printf("                    ");
            scanf("%c",&c);
            if(!(c=='y'||c=='Y'))
            {
                printf("                    操作失败.按任意键返回上一层\n                    ");
                getchar();
                getchar();
                return ;
            }
            s.book1[a].sum++;
            s.book1[a].now++;
            printf("                    现在此书的总数为%d.\n",s.book1[a].sum);
        }
        printf("                    请问还要继续添加图书吗?(y/n)\n");
        getchar();
		printf("                    ");
        scanf("%c",&e);

    }while(e=='y'||e=='Y');
    printf("                    操作完毕.按任意键返回上一层\n                    ");
    getchar();
    return ;
}

void deletebook()//删除图书
{
    char str[10];
    char b,c,e='y';
    int a,i;
    do
    {   print();
        printf("                    请输入要删除的图书编号\n");
        getchar();
		printf("                    ");
        scanf("%s",str);
        a=find(str);
        if(a==s.len)
        {
            printf("                    您要删除的书不存在\n");
        }
        else if(s.book1[a].sum!=s.book1[a].now)
        {
            printf("                    该书仍有人借阅未归还,还要继续删除这本书吗?(y/n)\n");
            getchar();
			printf("                    ");
            scanf("%c",&b);
            if(!(b=='y'||b=='Y'))
            {
                printf("                    操作失败.按任意键结束返回上一层\n                    ");
                getchar();
                return ;
            }
            printf("                    删除成功!\n");
            for(i=a;i<s.len-1;i++)
            s.book1[i]=s.book1[i+1];
            s.len--;
        }
        else
        {
            printf("                    确定要删除这本书吗?(y/n)\n");
            getchar();
			printf("                    ");
            scanf("%c",&b);
            if(!(b=='y'||b=='Y'))
            {
                printf("                    操作失败.按任意键结束返回上一层\n                   ");
                getchar();
                return ;
            }
            printf("                    删除成功!\n");
            for(i=a;i<s.len-1;i++)
            s.book1[i]=s.book1[i+1];
            s.len--;
        }
        printf("                    请问还要继续删除图书吗?(y/n)\n");
        getchar();
		printf("                    ");
        scanf("%c",&e);
    }while(e=='y'||e=='Y');
    printf("                    操作完毕.按任意键返回上一层\n                   ");
    getchar();
    return ;
}

void tongji()//统计图书
{
    int i;
	system("cls");
    print();
    printf("         图书输出为:\n");
    printf("         ********************************************************\n");
    printf("          书号      书名      作者      类别      总量      现量\n");
    for(i=0;i<s.len;i++)
    {
        printf("           %-7s%-12s%-10s",s.book1[i].bookid,s.book1[i].bookname,s.book1[i].author);
        switch(s.book1[i].leibie)
        {
            case 1:printf("文学      ");break;
            case 2:printf("科技      ");break;
            case 3:printf("历史      ");break;
            case 4:printf("其它      ");break;
        }
        printf(" %-10d%d\n",s.book1[i].sum,s.book1[i].now);
    }
    printf("         ********************************************************\n");
    printf("          显示完毕.按任意键返回上一层\n                    ");
    getchar();
}

void tongji2()//统计书卡
{
    int i,b;
    char h;
    char str2[10];
    system("cls");
	print();
    printf("         借书卡输出为:\n");
    printf("         ************************************************\n");
    printf("          借书卡id     持卡人姓名     班级       已借总数\n");
    for(i=0;i<p.len1;i++)
    {
        printf("          %-15s%-14s%-12s%-15d\n",p.card1[i].cardid,p.card1[i].studentname,p.card1[i].studentclass,p.card1[i].len3);
    }
    printf("         ************************************************\n");
    printf("         请问要显示某位同学所借书的详细信息吗?(y/n)\n          ");
    getchar();
    scanf("%c",&h);
    if(h=='y'||h=='Y')
    {
         printf("          请输入您要查找的借书证号:\n");
         printf("          ");
         getchar();
         scanf("%s",str2);
         b=findpeo(str2);
         if(b==p.len1)
        {
            printf("                    您输入的卡号不存在.按任意键返回上一层\n                    ");
            getchar();
            getchar();
            return ;
        }
        printf("          卡号为%s的借书内容显示如下:\n",p.card1[b].cardid);
        printf("          *********************************\n");
        printf("           书号          借书日期\n");
        for(i=0;i<p.card1[b].len3;i++)
        {
            printf("          %-10s%s\n",p.card1[b].yijieshu[i].book2,p.card1[b].yijieshu[i].shijian);
        }
        printf("           ********************************\n");
    }
    printf("          显示完毕.按任意键返回上一层\n          ");
    getchar();
}

int main()
{
	system("color F0");

    int a,b;
    int i=0,x;
    FILE *fp,*fp1;
    FILE *fq,*fq1;
    //creat(2);
    //creat2(2);
	system("cls");

    s.len=0;
    p.len1=0;
    if((fp=fopen("book.dat","rb"))==NULL)
    {
        printf("cannot open this file\n");
        exit(0);
    }
    while(fread(&(s.book1[i]),sizeof(book),1,fp)!=0)
    {
        s.len++;
        i++;
    }
    fclose(fp);
	i=0;
    if((fp1=fopen("card.dat","rb"))==NULL)
    {
        printf("cannot open this file\n");
        exit(0);
    }
    while(fread(&(p.card1[i]),sizeof(card),1,fp1)!=0)
    {
        p.len1++;
        i++;
    }
    fclose(fp1);
    do
    {
        print();
        printf("                    您好,欢迎使用图书管理系统\n");
        printf("                   *****************************\n");
        printf("                         1:查找图书\n                         2:借阅图书\n                         3:归还图书\n                         4:管理系统\n                         5:退出系统\n");
        printf("                   *****************************\n");
        printf("                    请选择您想进行的操作是:\n");
		printf("                    ");

        scanf("%d",&a);

        while(!(a==1||a==2||a==3||a==4||a==5))
        {
                    printf("                    输入错误,请重新输入\n                    ");
                    getchar();
                    scanf("%d",&a);

        }
        system("cls");
        switch(a)
        {
            case 1:findbook();break;
            case 2:borrow();break;
            case 3:returnbook();break;
            case 4:print();
				   printf("                    请输入六位管理员密码\n");
                   getchar();
				   printf("                    ");
                   scanf("%d",&x);
                   if(!(x==M))
                   {
                      printf("                    您的密码输入错误.按任意键返回上一层\n                   ");
                      getchar();
                      getchar();
                      break;
                   }
                   do
                   {
                       system("cls");
					   print();
                        printf("                    欢迎进入管理系统\n");
                        printf("                  **********************\n");
                        printf("                       1:添加图书\n                       2:删除图书\n                       3:图书统计\n                       4:书卡统计\n                       5:返回上层\n");
                        printf("                  **********************\n");
                        printf("                    您想进行的操作是:\n");
						printf("                    ");
                        scanf("                    %d",&b);
                        while(!(b==1||b==2||b==3||b==4||b==5))
                        {
                            printf("                    输入错误,请重新输入\n                    ");
                            getchar();
                            scanf("%d",&b);

                        }
                        switch(b)
                        {

                            case 1:system("cls");addbook();getchar();break;
                            case 2:system("cls");deletebook();getchar();break;
                            case 3:system("cls");tongji();getchar();break;
                            case 4:system("cls");tongji2();getchar();break;
                        }
                        system("cls");
                    } while(b!=5);break;
            case 5:break;
            //default:printf("                     输入有误,请重新输入\n                    ");break;
        }
        system("cls");
    }while(a!=5);
    if((fq=fopen("book.dat","wb"))==NULL)
    {
         printf("cannot open this file\n");
         exit(0);
    }
    for(i=0;i<s.len;i++)
    if(fwrite(&(s.book1[i]),sizeof(book),1,fq)!=1)
    printf("file write error!\n");
    fclose(fq);
    if((fq1=fopen("card.dat","wb"))==NULL)
    {
         printf("cannot open this file\n");
         exit(0);
    }
    for(i=0;i<p.len1;i++)
    if(fwrite(&(p.card1[i]),sizeof(card),1,fq1)!=1)
    printf("file write error!\n");
    fclose(fq1);
    print();
     printf("                    谢谢您的使用,再见!\n");
	 printf("                    ");
    return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值