十几天前合作写了图书馆管理系统,我是其中馆长部分的,馆长的主要功能就是:
#ifndef LIBRARIAN_H
#define LIBRARIAN_H
#include "admin.h"
//馆长
typedef struct Librarian
{
//账号
char id[17];
//密码
char password[16];
}Librarian;
//登录
void land_librarian(void);
//登录财管
void re_land_caiguan(void);
//添加管理员
void add_admin(void);
//删除管理员
void del_admin(void);
//查看员工工作状态
void seek_admin(void);
//修改密码
void mod_passwd(void);
//菜单
void meun_guanzhang(void);
#endif //LIBRARIAN_H
为了便于区分,我把财务管理和馆长写在了两个.c 文件中
这是财务管理的:
#ifndef CAIGUAN_H
#define CAIGUAN_H
#include "book.h"
#include "list.h"
//登录
void land_caiguan(void);
//1:查看总收入
void see_incame(void);
//2:查看破损赔偿
void see_cost(void);
//3:买书消费
void buy_book(void);
//4:消除 赔偿
void del_cost(void);
//菜单
void meun_caiguan(void);
#endif //CAIGUAN_H
定义完头文件之后那就是实现函数功能了。
首先是两个菜单函数:
void meun_guanzhang(void)
{
for (;;)
{
puts("\n\n------------------欢迎使用图书馆管理系统------------------");
puts("1.添加管理员");
puts("2.删除管理员");
puts("3.查看员工工作状态");
puts("4.财务管理系统");
puts("5.修改密码");
puts("0.返 回");
puts("------------------欢迎使用图书馆管理系统------------------\n\n");
switch (get_cmd('0', '5'))
{
case '0':
return;
case '1':
add_admin();
break;
case '2':
del_admin();
break;
case '3':
seek_admin();
break;
case '4':
re_land_caiguan();
break;
case '5':
mod_passwd();
break;
default:
break;
}
}
}
//财管菜单
void meun_caiguan(void)
{
for (;;)
{
printf("\n\n---------------欢迎使用财务管理功能---------------------\n");
puts("1.查看总资产");
puts("2.查看破损赔偿");
puts("3.买书消费");
puts("4.消除赔偿");
puts("0.返回");
printf("---------------欢迎使用财务管理功能---------------------\n\n");
switch (get_cmd('0','4'))
{
case '0':
return;
case '1':
see_incame();
break;
case '2':
see_cost();
break;
case '3':
buy_book();
break;
case '4':
del_cost();
break;
default:
break;
}
}
}
然后是登录功能:
//登录功能
void land_librarian(void)
{
read_guanzhang();//读取馆长的密码,默认馆长为唯一最高管理员,所以无账号直接输入密码即可。
system("clear");
if (read_guanzhang())
{
printf("馆长登录,请输入密码:");
char x[20];
get_passwd(x, 20, true);//自定义的函数,功能是ture输入内容转成*,false不显示输入
if (!strcmp(x, passwd))
{
printf("欢迎馆长使用图书管理系统\n");
sleep(1);
meun_guanzhang();//登陆成功跳转菜单函数;
}
else
{
printf("密码输入错误!");
}
}
}
然后是各项功能函数:
//添加管理员
void add_admin(void)
{
adm = malloc(sizeof(Admin));
get_str_s("请输入管理员姓名:", adm->name, 13);
get_str_s("请输入管理员工号:", adm->id, 17);
printf("添加成功:%s %s\n", adm->name, adm->id);
strcpy(adm->password, "123456");
adm->working = false;
write_adm(adm);//在管理员文件末尾写入新管理员信息
anykey_continue();
}
//删除管理员。
void del_admin(void)
{
list = create_list();
read_adm();//读取管理员文件函数;
size_t i = 0;
char name1[13];
char name2[13];
get_str_s("请输入要删除的管理员姓名:", name1, 13);
for (Node *n = list->head->next; n != list->head; n = n->next)
{
i++;
if (!strcmp(name1, ((Admin *)n->data)->name))
{
get_str_s("请再次输入姓名确定:", name2, 13);
if (!strcmp(name1, name2))
{
size_t x = i - 1;
del_index_list(list, x);
printf("成功删除!\n");
rewrite_adm(list);//重写管理员文件函数
anykey_continue();//自定义的按任意键退出函数
return;
}
}
}
printf("删除失败!");
anykey_continue();
}
//查看管理员工作状态
void seek_admin(void)
{
list = create_list();
read_adm();
for (Node *n = list->head->next; n != list->head; n = n->next)
{
printf("姓名:%s 工号:%s \n", ((Admin *)n->data)->name, ((Admin *)n->data)->id);
if (((Admin *)n->data)->working)
{
printf("该员工当前正在努力工作!\n");
}
else
{
printf("该员工今天不上班!\n");
}
}
anykey_continue();
}
//修改馆长密码
void mod_passwd(void)
{
if (read_guanzhang())
{
char passwd0[20];
printf("%s\n", passwd);
char passwd1[20];
char passwd2[20];
printf("请输入馆长密码:\n");
get_passwd(passwd0, 20, true);
printf("%s\n", passwd0);
if (!(strcmp(passwd, passwd0)))
{
printf("请输入要修改的密码:\n");
get_passwd(passwd1, 20, true);
printf("请再次输入密码:");
get_passwd(passwd2, 20, true);
if (!strcmp(passwd1, passwd2))
{
rewrite_guanzhang(passwd1);
printf("密码修改成功!");
}
else
printf("密码修改失败\n");
anykey_continue();
}
else
{
printf("密码输入错误!\n");
anykey_continue();
}
}
}
//登录财管菜单
void re_land_caiguan(void)
{
if (read_guanzhang())
{
char passwd0[20];
printf("登录财务管理系统需再次输入密码\n请输入馆长密码:\n");
get_passwd(passwd0, 20, true);
if (!(strcmp(passwd, passwd0)))
{
land_caiguan();
}
else
{
printf("密码输入错误!\n");
anykey_continue();
}
}
}
然后是财务管理系统:
//登录功能
void land_caiguan(void)
{
int x;
srand(time(NULL));
int y = rand()%9000+1000;///生成随机四位数。
printf("财务管理系统,请输入验证码:%d\n",y);//验证码功能,加入网络之后可以实现,这里的只是加个这个功能的位置。
scanf("%d",&x);
if (x==y)
{
meun_caiguan();
}
else
{
printf("验证码输入错误!");
}
}
//读取资产文件:
void read_money(List *money_list)
{
FILE *frp = fopen("./data/property.txt", "r");
if (NULL == frp)
{
printf("找不到文件!");
free(list);
anykey_continue();
return;
}
while (1)
{
float *money = malloc((sizeof(float)));
if (0 >= fscanf(frp, "%f", money))
break;
add_tail_list(money_list, money);
}
}
//尾部添加资产
void rewrite_money(float money)
{
FILE *fap = fopen("./data/property.txt", "a");
fprintf(fap, "%f\n", money);
fclose(fap);
}
//读赔偿文件
void read_reader(void)
{
FILE *frp = fopen("./data/breakedge.txt", "r");
if (NULL == frp)
{
printf("找不到文件!");
anykey_continue();
return;
}
list = create_list();
Damage *p = malloc(sizeof(Damage));
while (0 < fscanf(frp, "%s %s %f", p->number, p->name, &p->price))
{
add_tail_list(list, p);
p = malloc(sizeof(Damage));
}
}
//重写赔偿文件
void rewrite_reader(List *list)
{
FILE *fwp = fopen("./data/breakedge.txt", "w");
for (Node *n = list->head->next; n != list->head; n = n->next)
{
Damage* _dmage = (Damage*)n->data;
fprintf(fwp, "%s %s %f\n", _dmage->number, _dmage->name, _dmage->price);
}
fclose(fwp);
}
//1:查看总收入
void see_incame(void)
{
float all_money = 0;
float all_cost = 0;
float all_incame = 0;
float p;
int i = 1;
money_list = create_list();
read_money(money_list);
for (Node *n = money_list->head->next; n != money_list->head; n = n->next)
{
p = *(float *)(n->data);
if (p > 0)
{
printf("%d 收入:%.2f\n", i++, p);
all_incame += p;
}
else
{
printf("%d 支出:%.2f\n", i++, -p);
all_cost += p;
}
all_money = all_cost + all_incame;
}
printf("总收入:%.2f\n总支出:%.2f\n总资产:%.2f\n", all_incame, -all_cost, all_money);
anykey_continue();
}
//2:查看破损赔偿
void see_cost(void)
{
list = create_list();
read_reader();
for (Node *n = list->head->next; n != list->head; n = n->next)
{
Damage* _damage = (Damage *)n->data;
printf("书名:%s 赔偿人姓名:%s 赔偿金额:%.2f\n", _damage->number, _damage->name, _damage->price);
}
anykey_continue();
}
//3:买书消费
void buy_book(void)
{
float cost;
money_list = create_list();
read_money(money_list);
printf("请输入买书消费");
scanf("%f", &cost);
cost = -cost;
rewrite_money(cost);
float *p = malloc((sizeof(float)));
*p = cost;
add_tail_list(money_list, p);
printf("成功支出:%f", cost);
anykey_continue();
}
//4:消除 赔偿
void del_cost(void)
{
size_t i = 0;
char name[13];
char name1[13];
money_list = create_list();
list = create_list();
read_money(money_list);
read_reader();
printf("请输入赔偿人姓名:");
get_str(name, 13);
for (Node *n = list->head->next; n != list->head; n = n->next)
{
i++;
strcpy(name1, ((Damage *)n->data)->name);
if (!strcmp(name, name1))
{
rewrite_money(((Damage *)n->data)->price);
del_index_list(list, i - 1);
break;
}
}
rewrite_reader(list);
anykey_continue();
}
基本上就是这些东西。,管理员和读者部分是队友写的我不太清楚所以就不放出来了。