设计高级语言程序的方法
设计高级语言程序的方法
源代码
#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;
}
}
}
}