高级语言程序设计——图书管理系统的设计与实现

来源:互联网 发布:ajax json类型 编辑:程序博客网 时间:2024/04/30 21:25

源代码

#ifndef _LIBSYS_H_
#define _LIBSYS_H_

#define KEY 5//加密密钥
typedef struct book
{
 char num[10];
 char name[40];
 char publisher[40];
 char date[10];
 char writer[10];
 char pages[5];
 char price[6];
 char borrower[10];//borrower[0]为0,则图书未借出
 struct book *next;
}book;

typedef struct user
{
 char num[10];
 char name[10];
 char password[10];
 char sex[2];
 char phone[15];
 int count;//借书数量
 struct user *next;
}user;

typedef struct
{
 char name[10];
 char password[10];
}admin;

book *initbook();
user *inituser();
user *login(user *);
void encrypt(char *);
void addbook(book *);
void consultbook(book *);
void delbook(book *);
void borrow(book *,user *);
void returnbook(book *,user *);
void Adduser(user *);
void consultuser(user *);
void deluser(user *);
void brwinfo(book *,user *,user *);
void about();
void save(book *,user *);
user *searchuser(user *,char *,int);

#endif

//定义全局变量:管理员账号和管理员密码
admin admin1={"admin","admin"};

void encrypt(char *p)
//加密函数,对称的异或加密
{
 int i;
 for(i=0;i<10&&p[i]!='/0';i++) p[i]^=KEY;//把密码的每一位与KEY异或
 for(;i<10;i++) p[i]=0;//剩下的位置零
}

user *login(user *userh)
//登录函数,userh为用户链表头指针
{
 int i;
 char name[10];
 char password[12];
 user *curuser;
 
 while(1)
 {
  system("cls");
  printf("************************************************************************/n");
  printf("/t/t图书借阅管理系统 V0.12 Beta 1/n/t/t(c)Copyright 2006-2008 甄志坚/n");
  printf("************************************************************************/n");
  printf("帐号:");
  scanf("%s",name);//输入帐号
  printf("密码:");
  for(i=0;i<12&&(password[i]=getch())!=13;i++)//输入密码,不回显,遇回车停止
   if(password[i]==8) i-=2;//遇到退格键,后退两位
  password[i]='/0';
  putchar('/n');
  if(curuser=searchuser(userh,name,2))
  //调用寻找用户结点函数,按帐号查找用户,并判断是否找到
  {
   encrypt(password);//调用加密函数把密码明文换算成密文
   for(i=0;i<10;i++) if(password[i]!=curuser->password[i]) break;
   if(i==10) return curuser;
   //判断密码是否正确
  }
  else if((!strcmp(name,admin1.name))&&(!strcmp(password,admin1.password)))
   return NULL;
  //找不到用户则判断是否管理员,并判断密码是否正确
  else//不是用户也不是管理员,则让用户选择重新登录或注册用户
  {
   printf("无此用户。/n/t(1)重新登录。/n/t(2)注册。/n选择(1-2):");
   scanf("%d",&i);
   if(i==2) Adduser(userh);//调用增加用户函数注册会员
  }
 }
}

void about()//版本信息函数
{
 printf("************************************************************************/n");
 printf("/t/t图书借阅管理系统 V0.12 Beta 1/n/t/t(c)Copyright 2006-2008 甄志坚/n");
 printf("************************************************************************/n");
 getch();//等待用户按任意键返回
}

void save(book *bookh,user *userh)
//保存函数,bookh为图书链表头指针,userh为用户链表头指针
{
 book *bp=bookh;
 user *up=userh;
 FILE *fp;

 fp=fopen("book.dat","wb");//打开文件
 while(bp)//判断是否已到链尾
 {
  fwrite(bp,sizeof(book),1,fp);//写入一个结点
  bp=bp->next;//指针下移
 }
 fclose(fp);//关闭文件
 fp=fopen("user.dat","wb");//打开文件
 while(up)//判断是否已到链尾
 {
  fwrite(up,sizeof(user),1,fp);//写入一个结点
  up=up->next;//指针下移
 }
 fclose(fp);//关闭文件
}

book *initbook()//图书链表初始化,返回图书链表头指针
{
 book *bookh,*p0,*p1;
 FILE *fp;
 bookh=(book *)malloc(sizeof(book));//生成图书链表头结点
 bookh->next=NULL;
 if(!(fp=fopen("book.dat","rb"))) return bookh;//打开图书信息文件,如果不存在,则返回头指针初始值NULL
 p1=(book *)malloc(sizeof(book));//申请一个图书结点空间,准备存放第一个结点
 while(fread(p1,sizeof(book),1,fp))//读取一个结点
 {
  if(bookh->next==NULL)//判断是否第一个结点
  {
   bookh->next=p0=p1;
   p1=(book *)malloc(sizeof(book));
   p0->next=p1;//指针下移
  }
  else
  {
   p0=p1;
   p1=(book *)malloc(sizeof(book));
   p0->next=p1;//指针下移
  }
 }
 p0->next=NULL;//为最后一个结点的next赋NULL
 free(p1);//释放多申请了的一个结点
 fclose(fp);//关闭文件
 return bookh;//返回头指针地址
}

void addbook(book *bookh)//增加图书函数
{
 book *p0,*p1;

 p0=bookh;
 while(p0->next) p0=p0->next;//寻找最后一个结点
 p1=(book *)malloc(sizeof(book));//申请一个结点空间
 p0->next=p1;
 p1->next=NULL;
 p1->borrower[0]=0;//borrower[0]=0代表该图书未借出
 printf("键入:书号 书名 出版社 出版年份 作者 页数 价格:/n");
 scanf("%s %s %s %s %s %s %s",p1->num,p1->name,p1->publisher,p1->date,p1->writer,p1->pages,p1->price);
 //录入信息
}

book *searchbook(book *p,char *s,int i)
//寻找图书函数,p为当前结点,s为匹配字符串,i为匹配成员变量选择
{
 if(p=p->next)//指针下移,并判断是否链尾
 {
  switch(i)
  //判断是否找到匹配的结点,找不到则指针下移,找到则返回该结点地址
  //直到链尾都找不到,则返回NULL
  {
  case 1:
   {
    while(strcmp(p->num,s)&&p->next) p=p->next;
    if(!strcmp(p->num,s)) return p;
    else return NULL;
    break;
   }
  case 2:
   {
    while(strcmp(p->name,s)&&p->next) p=p->next;
    if(!strcmp(p->name,s)) return p;
    else return NULL;
    break;
   }
  case 3:
   {
    while(strcmp(p->writer,s)&&p->next) p=p->next;
    if(!strcmp(p->writer,s)) return p;
    else return NULL;
    break;
   }
  }
 }
 else return p;
}

void consultbook(book *bookh)//查找图书函数,bookh为图书链表头指针
{
 int i;
 char s[40];
 book *p=bookh;

 printf("/t(1)通过书号查找/n/t(2)通过书名查找/n/t(3)通过作者查找/n选择(1-3):");
 scanf("%d",&i);
 printf("查找:");
 scanf("%s",s);
 printf("书号/t书名/t出版社/t出版年份/t作者/t页数/t价格/t是否已借出/n");
 while(p=searchbook(p,s,i))//调用寻找图书结点函数,成功则输出该结点,并继续寻找直到链尾
 {
  printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s",p->num,p->name,p->publisher,p->date,p->writer,p->pages,p->price);
  if(p->borrower[0]==0) printf("否/n");
  else printf("是/n");
 }
 getch();//等待用户按任意键返回
}

void delbook(book *bookh)//删除图书函数,bookh为图书头指针
{
 int i;
 char s[40];
 book *p,*p0=bookh;

 printf("/t(1)通过书号删除/n/t(2)通过书名删除/n选择(1-2):");
 scanf("%d",&i);
 printf("删除:");
 scanf("%s",s);
 if(p=searchbook(bookh,s,i))//调用寻找图书结点函数,寻找要删除的图书结点
 {
  while(p0->next!=p) p0=p0->next;//用p0指向要删除的结点的前趋
  p0->next=p->next;//调整指针
  free(p);//释放空间
  printf("删除成功。");
 }
 else printf("查无此书。");
 getch();//等待用户按任意键返回
}

void borrow(book *bookh,user *curuser)//借书函数,bookh为图书链表的头指针,curuser为当前用户
{
 int i;
 char s[40];
 book *p,*p0=bookh;

 if(curuser->count<=10)//判断该用户借书的数目是否已超过10本
 {
  printf("/t(1)通过书号借阅/n/t(2)通过书名借阅/n选择(1-2):");
  scanf("%d",&i);
  printf("借阅:");
  scanf("%s",s);
  if(p=searchbook(bookh,s,i))//寻找要借的图书结点,并判断是否找到
  {
   if(p->borrower[0]) printf("该书已借出,请见谅。借阅不成功。");//判断是否已借出
   else
   {
    strcpy(p->borrower,curuser->name);//录入借阅人的姓名
    curuser->count++;//当前用户借书数目加1
    printf("借阅成功。");
   }
  }
  else printf("查无此书。");
 }
 else printf("每位会员最多只能借阅10本,您借阅数量已到上限,谢谢合作。/n");
 getch();//等待用户按任意键退出
}

void returnbook(book *bookh,user *curuser)//还书函数,bookh为图书链表头指针,curuser为当前用户指针
{
 char s[10];
 book *p;

 printf("请键入要还的书籍的书号:");
 scanf("%s",s);
 if(p=searchbook(bookh,s,1))//调用寻找图书函数,寻找所还的书,并判断是否能找到
 {
  if(strcmp(p->borrower,curuser->name)) printf("您不是该书的借阅人。");//判断该用户是不是借阅人
  else
  {
   p->borrower[0]=0;//borrower[0]置零代表该书未借出(已还)
   p->borrower[1]='/0';
   curuser->count--;//当前用户借书数目减一
   printf("还书成功。");
  }
 }
 else printf("查无此书。");
 getch();//等待用户按任意键返回
}

user *inituser()//用户链表初始化函数,返回用户链表头指针
{
 user *userh,*p0,*p1;
 FILE *fp;
 userh=(user *)malloc(sizeof(book));//生成用户链表头结点
 userh->next=NULL;
 if(!(fp=fopen("user.dat","rb"))) return userh;//打开用户信息文件,如果不存在,则返回头指针初始值NULL
 p1=(user *)malloc(sizeof(book));//申请一个用户结点空间,准备存放第一个结点
 while(fread(p1,sizeof(user),1,fp))//读取一个结点
 {
  if(userh->next==NULL)//判断是否第一个结点
  {
   userh->next=p0=p1;
   p1=(user *)malloc(sizeof(user));
   p0->next=p1;//指针下移
  }
  else
  {
   p0=p1;
   p1=(user *)malloc(sizeof(user));
   p0->next=p1;//指针下移
  }
 }
 p0->next=NULL;//为最后一个结点的next赋NULL
 free(p1);//释放多申请了的一个结点
 fclose(fp);//关闭文件
 return userh;//返回头指针地址
}

void Adduser(user *userh)//增加用户函数
{
 int i;
 user *p0,*p1;
 char password[11];

 p0=userh;
 while(p0->next) p0=p0->next;//寻找最后一个结点
 p1=(user *)malloc(sizeof(user));//申请一个结点空间
 p0->next=p1;
 p1->next=NULL;
 p1->count=0;
 printf("键入:编号 姓名 登录密码(10位以内) 性别(F or M) 联系电话/n");
 scanf("%s %s %s %s %s",p1->num,p1->name,password,p1->sex,p1->phone);
 encrypt(password);//调用加密函数,为用户密码加密
 for(i=0;i<10;i++) p1->password[i]=password[i];//把加密后的密码存入用户结点
}

user *searchuser(user *p,char *s,int i)
//寻找用户函数,p为当前结点,s为匹配字符串,i为匹配成员变量选择
{
 if(p=p->next)//指针下移,并判断是否链尾
 {
  switch(i)
  //判断是否找到匹配的结点,找不到则指针下移,找到则返回该结点地址
  //直到链尾都找不到,则返回NULL
  {
  case 1:
   {
    while(strcmp(p->num,s)&&p->next) p=p->next;
    if(!strcmp(p->num,s)) return p;
    else return NULL;
    break;
   }
  case 2:
   {
    while(strcmp(p->name,s)&&p->next) p=p->next;
    if(!strcmp(p->name,s)) return p;
    else return NULL;
    break;
   }
  }
 }
 else return p;
}

void consultuser(user *userh)//查询用户函数,userh为图书链表头指针
{
 int i;
 char s[10];
 user *p;

 printf("/t(1)通过编号查找/n/t(2)通过姓名查找/n选择(1-2):");
 scanf("%d",&i);
 printf("查找:");
 scanf("%s",s);
 printf("编号/t姓名/t性别/t联系电话/t借书数量/n");
 if(p=searchuser(userh,s,i))//调用寻找用户结点函数,成功则输出该结点
  printf("%-10s%-10s%-10s%-10s%10d/n",p->num,p->name,p->sex,p->phone,p->count);
 else printf("查无此人。");
 getch();//等待用户按任意键返回
}

void deluser(user *userh)//删除用户函数,userh为用户链表头指针
{
 int i;
 char s[10];
 user *p,*p0=userh;

 printf("/t(1)通过编号删除/n/t(2)通过姓名删除/n选择(1-2):");
 scanf("%d",&i);
 printf("删除:");
 scanf("%s",s);
 if(p=searchuser(userh,s,i))
 //调用寻找用户结点函数,寻找要删除的结点,并判断是否找到
 {
  while(p0->next!=p) p0=p0->next;//寻找要删除结点的前一个结点
  p0->next=p->next;//调整指针
  free(p);//释放空间
  printf("删除成功。");
 }
 else printf("查无此人。");
 getch();//等待用户按任意键返回
}

void brwinfo(book *bookh,user *userh,user *curuser)
//用户借书信息函数,bookh为图书链表头指针,userh为用户链表头指针,curuser为当前用户指针
{
 int i;
 char s[10];
 book *p=bookh;

 if(!curuser)
 //判断是管理员调用还是会员调用(管理员调用curuser为NULL)
 {
  printf("/t(1)通过会员编号查询/n/t(2)通过会员姓名查询/n选择(1-2):");
  scanf("%d",&i);
  printf("查询:");
  scanf("%s",s);
  if(!(curuser=searchuser(userh,s,i)))//调用寻找用户结点函数,并判断是否找到
  {
   printf("查无此人。");
   getch();
   return;
  }
 }
 p=p->next;
 printf("该会员借书信息:/n编号/t书名/n");
 for(i=0;i<curuser->count;i++)
 //查找该用户所借的所有图书,并输出
 {
  while(strcmp(p->borrower,curuser->name)) p=p->next;
  printf("%-10s%-10s/n",p->num,p->name);
  p=p->next;
 }
 getch();//等待用户按任意键退出
}

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include"LibSys.h"
#include"Admin.h"
#include"sys.c"
#include"book.c"
#include"user.c"

int main()
{
 book *bookh;//图书链表头指针
 user *userh,*curuser=NULL;//用户链表头指针和当前用户指针
 int i;

 bookh=initbook();//图书链表初始化
 userh=inituser();//用户链表初始化
 curuser=login(userh);//用户登录
 while(1)//界面
 {
  system("cls");//清屏
  if(!curuser)
  {
   printf("************************************************************************/n");
   printf("/t/t欢迎使用图书借阅管理系统/n");
   printf("************************************************************************/n");
   printf("************************************************************************/n");
   printf("图书管理:/n");
   printf("/t(1)增加图书/n/t(2)查询图书/n/t(3)删除图书/n");
   printf("************************************************************************/n");
   printf("会员管理:/n");
   printf("/t(4)增加会员/n/t(5)查询会员/n/t(6)删除会员/n/t(7)借书信息/n");
   printf("************************************************************************/n");
   printf("帮助:/n");
   printf("/t(8)关于…/n/t(9)退出/n");
   printf("************************************************************************/n");
   printf("选择(1-9):");
   scanf("%d",&i);
   switch(i)
   {
   case 1:addbook(bookh);break;
   case 2:consultbook(bookh);break;
   case 3:delbook(bookh);break;
   case 4:Adduser(userh);break;
   case 5:consultuser(userh);break;
   case 6:deluser(userh);break;
   case 7:brwinfo(bookh,userh,NULL);break;
   case 8:about();break;
   case 9:save(bookh,userh);return 1;
   }
  }
  else
  {
   printf("************************************************************************/n");
   printf("/t/t欢迎使用图书借阅管理系统/n");
   printf("************************************************************************/n");
   printf("************************************************************************/n");
   printf("图书管理:/n");
   printf("/t(1)查询图书/n/t(2)图书借阅/n/t(3)还书/n");
   printf("************************************************************************/n");
   printf("会员管理:/n");
   printf("/t(4)借书信息/n");
   printf("************************************************************************/n");
   printf("帮助:/n");
   printf("/t(5)关于…/n/t(6)退出/n");
   printf("************************************************************************/n");
   printf("选择(1-6):");
   scanf("%d",&i);
   switch(i)
   {
   case 1:consultbook(bookh);break;
   case 2:borrow(bookh,curuser);break;
   case 3:returnbook(bookh,curuser);break;
   case 4:brwinfo(bookh,userh,curuser);break;
   case 5:about();break;
   case 6:save(bookh,userh);return 1;
   }
  }
 }
}

原创粉丝点击