系统要实现的功能概述:
(1)用户登录:管理员根据用密码进行身份验证登录系统
(2)菜单介绍:根据菜单介绍本系统的使用规则
(3)图书信息录入:根据编号录入图书信息
(4)图书信息浏览:根据编号显示图书信息
(5)图书信息查找:根据编号查找图书信息
(6)图书信息修改:根据编号修改图书信息
(7)图书信息保存:输入图书信息文件存档
(8)图书信息插入:输入图书信息插入系统
(9)图书信息删除:根据图书编号进行删除
目录
人生漫长,晴雨交加
但若是心怀热爱,即使岁月荒芜
亦能奔山赴海,静待一树花开
对于这种代码量超百位数的,大家最好养成分模块写代码的习惯:
代码的讲解如下:
头文件:
#include <stdio.h>//标准输入输出函数
#include <stdlib.h>//动态内存malloc函数,system函数
#include <string.h> //strcmp比较字符串函数
#include <assert.h>//断言判断malloc的空间有没有开辟成功,没有成功就产生断点
宏定义:
#define n 10
结构体:
typedef struct
{
char num[n]; //编号
char namebook[n]; //名字
int price; //价格
}book;
typedef struct lnode
{
book date; //数据域,结构体的嵌套
struct lnode* next; //指针域
}lnode, * node; //指向节点的指针
用户登录系统
void menu2()
{
int input = 0, count = 0, i = 0;
char mima[20] = "123";//登入的密码
char shuru[20] = { 0 };
system("color f4");
printf("\t\t\t **************************************\n");
printf("\t\t\t | *欢迎使用图书管理系统* |\n");
printf("\t\t\t | *管理员: 小唐* |\n");
printf("\t\t\t ------------------------------------\n");
printf("请输入管理员密码:\n");
while ((count = _getch()) != '\r')
{
if (count == '\b')
{
i--;
printf("\b \b");
}
else
{
shuru[i++] = count;
printf("*");
}
}
shuru[i++] = '\0';
if (strcmp(mima, shuru) == 0)
{
printf("\n密码正确,您已进入系统!\n");
}
else
{
printf("\n密码错误,请重新输入!\n");
exit(0); //输入错误,直接退出
}
system("pause");
system("cls");
}
系统菜单提示
这是我们的介绍帮助副菜单:
void assist()
{
printf("\t\t-------------------------------*系统菜单介绍*--------------------------------------------\n");
printf("图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐\n");
printf("而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出错\n");
printf("给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件\n");
printf("让管理员方便的管理图书及用户信息,方便用户查找图书\n");
}
这是我们的选择功能主菜单:
void menu()
{
printf("\n");
system("color f4");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*---------------------------------------------------*\n");
printf("\t\t\t* 图书管理系统 *\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t********************系统功能菜单*********************\n");
printf("\t\t\t---------------------- --------------------------\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 1、使用帮助菜单 * 2、浏览图书信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 3、插入图书信息 * 4、删除图书信息 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 5、图书信息保存 * 6、退出管理系统 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t** 7、修改图书信息 * 8、查找图书系统 **\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t*****************************************************\n");
printf("\t\t\t---------------------- --------------------------\n");
}
图书信息录入
node inputbook() //输入图书信息(尾插法)
{
printf("--------------------------*图书录入系统*----------------------------------\n");
node l,p,s; //设置三个结构体指针变量
l = (node)malloc(sizeof(lnode)); //用malloc开辟头节点l结构体的动态内存
assert(l); //断言判断动态空间是否开辟成功
s = l; //将头节点赋值给s
int input; //定义一个变量input来判断录入图书的数量
printf("请输入图书数量:");
scanf("%d", &input);
while (input--)
{
p = (node)malloc(sizeof(lnode)); //为p开辟空间也就是创建下一个节点
assert(p); //断言判断空间是否开辟成功
printf("请输入图书信息>:\n"); //输入基本信息
printf("*-----------------------*\n");
printf("请输入图书编号:\n");
scanf("%s", p->date.num);
printf("*-----------------------*\n");
printf("请输入图书名字:\n");
scanf("%s", p->date.namebook);
printf("*-----------------------*\n");
printf("请输入图书价格:\n");
scanf("%d", &p->date.price); //因为不是数组所以用&
printf("------------------------*您的图书数据已录入系统*-----------------------------------\n");
system("pause"); //按任意键
system("cls"); //清除屏幕
p->next = null; //如果不在录入图书信息就指向null
s->next = p; //s指向下一个节点,并将p赋值给s
s = p;
}
return l; //返回给链表头节点l
}
图书信息浏览
void printbook(node l)
{
node n;
n = l->next;
printf("------------------------*图书信息显示*------------------------\n");
while (n)
{
printf("书名:%s\t编号:%s\t价格:%d", n->date.namebook,n->date.num,n->date.price);
n = n->next;
printf("\n");
}
printf("-----------------------*感谢使用本系统*-----------------------\n");
}
图书信息插入
void chabook(node l)
{
int m, j, n = 0;
node s, ptr;
ptr = l; //让定义的结构体指针指向头节点l
while (ptr != null) //通过遍历算出节点数
{
ptr = ptr->next; //当ptr访问的下一个节点为null时,就停止访问
n++;
}
printf("请输入将图书插入的位置:\n");
scanf("%d", &m);
while (m > n) //如果输入数字大于节点数就会执行以下语句
{
printf("输入的位置大于图书数量,请重新输入!\n");
scanf("%d", &m);
}
ptr = l; //让ptr重新指向头节点l
j = 1;
while (ptr && (j < m)) //循环到插入位置的前一个节点
{
ptr = ptr->next;
j++;
}
s = (node)malloc(sizeof(lnode)); //对新节点进行动态内存开辟
assert(s); //判断s的动态空间开辟有没有成功
printf("----------------------------*图书插入系统*-----------------------------------------\n");
printf("请输入图书信息:\n");
printf("\n");
printf("*-----------------------*\n");
printf("请输入图书的名字:\n");
scanf("%s", s->date.namebook);
printf("*-----------------------*\n");
printf("请输入图书的编号:\n");
scanf("%s", s->date.num);
printf("*-----------------------*\n");
printf("请输入图书价格:\n");
scanf("%d", &s->date.price);
s->next = ptr->next; //将新结点的next指针指向插入位置后的结点
ptr->next = s; //将插入位置前结点的next指针指向插入结点
printf("——————————————*信息插入成功*-------------------------------------——\n");
}
图书信息删除
void freebook(node l)
{
int m, n = 0, j;
node p, q;
p = l->next; //让定义的结构体指针指向头节点l
while (p != null) //通过遍历算出节点数
{ //当ptr访问的下一个节点为null时,就停止访问
p = p->next;
n++;
}
printf("----------------------------------*图书删除系统*-------------------------------------\n");
printf("请输入要删除图书的位置:\n");
scanf("%d", &m);
while (n < m) //如果输入数字大于节点数就会执行以下语句
{
printf("输入的图书超过总数,请重新输入要删除的图书位置:\n");
scanf("%d", &m);
}
p = l; j = 1; //让p重新指向头节点l
while ((p->next) && (j < m)) //循环到插入位置的前一个节点
{
p = p->next;
j++;
}
q = p->next; //q指向指定节点m
p->next = q->next; //两个节点手拉手
free(q); //释放内存空间
printf("———————-----------————*图书删除成功*—--------------------------—————\n");
}
图书信息保存
void fopenbook(node l)
{
file* fp; //定义文件指针file* 类型的fp
node ptr = l;
char filename[n];
printf("------------------------------\n");
printf("---*请输入你要保存的文件名*---\n");
printf("------------------------------\n");
scanf("%s", filename);
if ((fp = fopen(filename, "wb")) == null) //fopen打开文件,wb为了输出数据,打开一个二进制文件
{
printf("------------------------*打开文件失败*---------------------------\n");
exit(0); //如果fp为null就说明打开文件失败,退出文件操作
}
while (ptr->next != null) //while循环遍历整个链表
{
printf("------------------------*保存文件成功*---------------------------\n");
fprintf(fp, "%s\n", ptr->next->date.namebook); //fprintf格式化输出函数
fprintf(fp, "%s\n", ptr->next->date.num); //将链表节点的信息在文件上显示
fprintf(fp, "%d\n", ptr->next->date.price);
ptr = ptr->next; //访问下一个节点
}
fclose(fp); //关闭文件
fp = null;
}
图书信息查找
void seebook(node l)
{
char num[n];
node p;
printf("-----------------------------------*图书查找系统*--------------------------------------------\n");
printf("请输入查找的图书编号:>\n");
scanf("%s", num);
p = l->next; //结构体指针p指向头节点的下一位
while (p && strcmp(p->date.num, num) != 0) //strcmp函数比较两个字符串的大小
{ //如果p不指向null,且两个字符串大小不相同就进入循环
p = p->next; //访问下一个节点
}
if (p) //现在访问的就是目标节点
{
printf("*-----------------------*\n");
printf("书名:%s\t编号:%s\t价格:%d", p->date.namebook, p->date.num, p->date.price); //如果不是null,就输出节点信息
printf("*-----------------------*\n");
}
else
{
printf("该图书信息还没有录入系统!\n");
}
printf("------------------------------------*图书查找系统欢迎您*---------------------------------------\n");
}
图书信息修改
void editbook(node l)
{
char num[n];
int input = 0;
node p;
printf("-----------------------------------*图书修改系统*--------------------------------------------\n");
printf("----------------------------\n");
printf("|-------*1.图书编号*-------|\n");
printf("|-------*2.图书名字*-------|\n");
printf("|-------*3.图书价格*-------|\n");
printf("----------------------------\n");
printf("请输入查找的图书编号:>\n");
scanf("%s", num);
p = l->next;
while (p && strcmp(p->date.num, num) != 0) //strcmp函数比较两个字符串的大小
{
p = p->next;
}
if (p)
{
printf("请选择你要修改的图书内容>:\n");
printf("*-------------------------*\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("-------*修改图书编号*-------\n");
scanf("%s", p->date.num);
break;
case 2:
printf("-------*修改图书名字*-------\n");
scanf("%s", p->date.namebook);
break;
case 3:
printf("-------*修改图书价格*-------\n");
scanf("%d", &p->date.price);
break;
default:
printf("*-------------------------*\n");
printf("输入错误,重新操作!\n");
break;
}
}
else
{
printf("该图书信息还没有录入系统!\n");
}
}
退出管理系统
void quitbook(node l)
{
printf("*-------------------------#您已退出此系统,欢迎下次使用#-------------------------------*\n");
exit(0);
}
主函数的介绍
int main()
{
menu2();
menu();
node l;
l = inputbook();
int input = 0;
while (1)
{
menu();
printf("\n*请输入你要进行的图书操作>:\n");
scanf("%d", &input);
switch (input)
{
case 1:assist(); break;
case 2:printbook(l); break;
case 3:chabook(l); break;
case 4:freebook(l); break;
case 5:fopenbook(l); break;
case 6:quitbook(l); break;
case 7:editbook(l); break;
case 8:seebook(l); break;
}
}
return 0;
}
发表评论