信息时代的到来,人类逐渐走向信息化,图书馆保存这大量信息资源,需要一个信息库对图书信息进行保存,图书馆管理系统应此而生。
该图书馆管理系统使用vs2019编译器c语言进行编写,首先对可能会使用到的c语言知识进行学习,再开始对程序的编写。
程序编写中首先理清程序框架,以程序框图的方法画出整个程序各个功能的连接与关系。然后实现界面设计,最终补充程序的基础功能和高级功能,最后对程序进行debug和优化程序逻辑,最终对程序进行最终测试,优化程序,最终完成图书馆管理系统。
目前程序已实现众多功能,面向管理员:非明文登录,图书信息登录,图书信息修改,用户信息管理,浏览借阅信息,浏览用户信息。面向用户:用户的注册和登录,查看图书信息,浏览目前已借阅书籍,查看归还时间,借阅和归还书籍。
程序的亮点,目前有动态展示界面,以及保持界面位置恒定不变,对管理员账号进行了重点保护。
本程序可以放内置bgm,不过需要easyx的支持,且将文件名改为k(拓展名为MP3)并与程序放在同一目录。
也可以使用软件的欢迎窗口,同样是easyx的功能,文件名为t(默认格式jfif,若要使用其他格式图片,请修改代码中的拓展名)。
动态展示界面需要创建文件名为
1.txt(展示登录与注册动态界面)
用户.txt(展示用户操作动态界面)
管理员.txt(展示管理员操作动态界面)
并在里面写入你要展示的界面即可。
话不多说,下面展示代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<graphics.h>//图形库头文件
#include<mmsystem.h>//多媒体设备接口文件
#include<Windows.h>//调用sleep函数
#include<time.h>
#pragma comment(lib,"winmm.lib")
#define MAX 80
#include <conio.h>
#pragma warning(disable:4996)
/
char null[20] = {""};
char adminlogin[20];//用于接受当前登录用户的用户名
struct joints* result_;
//以下是图形库内容
void PlayBGM()
{
//1打开音乐
mciSendString("open k.mp3", 0, 0, 0);
//2播放音乐
mciSendString("play k.mp3", 0, 0, 0);
//3关闭音乐
// Sleep(3000);
//mciSendString("close k.mp3", 0, 0, 0);
}
void playbgmandpicture(void)
{
initgraph(800, 517,SHOWCONSOLE);
IMAGE img;
loadimage(&img, "t.jfif");
putimage(0, 0, &img);
//setbkcolor(YELLOW);//设置背景色,考虑不使用暂时储存
//cleardevice();//清空画板和上面配套使用
PlayBGM();
}
struct admin
{
char username[20];//用户账号名
char pin[20];//用户密码
char name[20];//用户借阅书的名字
int Num;//用户借书数量
time_t start;//借书时间
};
struct joints
{
struct admin data;
struct joints* next;
};
struct joints* _list = NULL;
//制作表头
struct joints* createHeadadmin_()
{
struct joints* headNode = (struct joints*)malloc(sizeof(struct joints));//动态内存申请
headNode->next = NULL;
return headNode;
}
//制作节点
struct joints* createNode_(struct admin data)
{
struct joints* newNode = (struct joints*)malloc(sizeof(struct joints));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//表头法插入
void insertNodeByHead_(struct joints* headNode, struct admin data)
{
struct joints* newNode = createNode_(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//文件存储操作
void saveInfoTofile_(const char* filename, struct joints* headNode)
{
FILE* fp = fopen(filename, "w");
struct joints* pMove = headNode->next;
while (pMove != NULL)
{
fprintf(fp, "%s\t%s\t%s\t%d\t%d\n", pMove->data.username, pMove->data.pin, pMove->data.name, pMove->data.Num,pMove->data.start);
pMove = pMove->next;
}
fclose(fp);
}
//文件读操作
void readInfoFromFile_(const char* filename, struct joints* headNode)
{
FILE* fp = fopen(filename, "r");
if (fp == NULL)//如果文件不存在就创建一个文件
{
fp = fopen(filename, "w+");
}
struct admin tempData;
while (fscanf(fp, "%s\t%s\t%s\t%d\t%d\n", tempData.username, tempData.pin, tempData.name, &tempData.Num,&tempData.start) != EOF)//EOF是文件结束标记,当没有读到文件结束标记时进行链表插入
{
insertNodeByHead_(_list, tempData);
}
fclose(fp);
}
//查找用户名
struct joints* searchByusername(struct joints* headNode, char* temp)
{
struct joints* posNode = headNode->next;
while (posNode != NULL && strcmp(posNode->data.username, temp))
{
posNode = posNode->next;
}
return posNode;
}
//查找密码
struct joints* searchBypin(struct joints* headNode, char* temp)
{
struct joints* posNode = headNode->next;
while (posNode != NULL && strcmp(posNode->data.pin, temp))
{
posNode = posNode->next;
}
return posNode;
}
//查找已经借阅书籍
struct joints* searchByname(struct joints* headNode, char* temp)
{
struct joints* posNode = headNode->next;
while (posNode != NULL && strcmp(posNode->data.pin, temp))
{
posNode = posNode->next;
}
return posNode;
}
//指定删除用户
void shanchu_(struct joints*