C语言_图书管理系统_借阅系统管理

 ✨✨ 欢迎大家来到小伞的大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:数据结构与算法
小伞的主页:xiaosan_blog

本文所需对顺序表的理解:

注:由于顺序表实现图书管理系统较为简单,本文主要是对顺序表的回顾和对两系统头文件的穿插使用和思路的实现。所以对于图书管理系统,讲述较为简单。如需详解可查看以往顺序表的文章。

顺序表入门  ,顺序表深入

目标需求:

学校图书有数十万本藏书数千位读者每本书具有书号、书名、读者、专业和借阅人等登记项其中各书的书号不重复每位读者具有读者号、姓名、专业和所借图书等登机项,读者都是本校的老师和学生。

出纳台的功能有:

1.注册新读者

2.查询某书的下落

3.借出书给某人

4.收回某人归还的某书 

思路:

图书管理系统

由于顺序表实现图书管理系统较为简单,本文主要是对顺序表的回顾和对两系统头文件的穿插实现。所以对于图书管理系统,讲述较为简单。如需详解可查看以往文章

1. 创建图书(book)结构体

要实现出纳台的功能,我们就得先完成对图书的管理系统,先有图书,再有读者。

按照要求我们需要创建图书结构体(book)

#define _CRT_SECURE_NO_WARNINGS 1#define MAX 10000#define MAX_NAME 15
#define MAX_ID 5
#define MAX_AUTHOR 12
#define MAX_PUBLISH 20struct Book
{char name[MAX_NAME];//书名int id;//书版号char author[MAX_AUTHOR];//作者char publish[MAX_PUBLISH];//出版社int opp;//借书状态//1被借出//0没有被借出char reader_b[15];//借阅本书的读者//char tec_b[20];//专业time_t start;//借书的时间time_t end;//归还书籍时间double total;//时间差
};//每一本图书的信息内容
2. 图书管理功能

这是我们要实现的图书功能 

//初始化图书管理系统
void InitContact(struct Contact* ps);//添加一本图书的信息
void AddContact(struct Contact* ps);//删除一本图书的信息
void DeleteContact(struct Contact* ps);//查找指定图书并打印其信息
int SreachContact(const struct Contact* ps);//修改指定图书的信息
void ModifyContact(struct Contact* ps);//打印图书管理系统中的全部信息
void ShowContact(const struct Contact* ps);//通过名字排序图书管理系统中图书的先后顺序
void SortContact(struct Contact* ps);
2.1 初始化图书管理系统

对于图书的存储,我们可利用顺序表,链表等数据结构,因为对于图书管理系统,查阅和添加是很多的,所以我们这里使用顺序表。

顺序表: 

void InitContact(struct Contact* ps)
{memset(ps->data, 0, sizeof(ps->data));//将待用内存空间设置为0ps->size = 0;//设置图书管理系统最初只有0个元素
}
//图书管理系统类型
struct Contact
{struct Book data[MAX];//存放1000本图书的信息int size;//记录当前已有图书的本数
};
2.2 添加一本图书的信息

对于编号重复,查询图书的问题,我们创建FindByID和FindByName函数

顺序表ID的查询(FindByID)

int FindByID(int id, const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (ps->data[i].id == id)return i;//找到了返回下标}return -1;//找不到的情况
}

顺序表name的查询 (FindByName)

//通过名字查找图书,找到了返回下标,没找到返回-1
static int FindByName(char name[MAX_NAME], const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0)return i;//找到了返回下标}return -1;//找不到的情况
}

 因为是顺序表的结构,我们很快的知道我们需要插入数组的下标size

注意:

每次的插入大小需要增加 1 ;size++;

图书状态初始化为 0 (未借出状态); opp = 0;

//添加一本图书的信息
void AddContact(struct Contact* ps)
{if (ps->size == MAX){printf("图书管理系统已满,无法添加!\n");}//图书管理系统内图书本数已达上限else{printf("请输入书名:>");scanf("%s", ps->data[ps->size].name);printf("请输入编号:>");int id;scanf("%d", &(id));int i = FindByID(id, ps);if (i != -1) {printf("编号重复,请重新添加\n");Sleep(1000);system("cls");return;}ps->data[ps->size].id = id;printf("请输入作者:>");scanf("%s", ps->data[ps->size].author);printf("请输入出版社:>");scanf("%s", ps->data[ps->size].publish);ps->size++;//图书管理系统中图书本数+1printf("添加成功\n");ps->data[ps->size].opp = 0;}Sleep(1000);system("cls");
}
2.3 删除一本图书的信息
//删除一本图书的信息
void DeleteContact(struct Contact* ps)
{char name[MAX_NAME];printf("请输入要删除图书的书名:>");scanf("%s", name);//查找int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1//删除if (pos == -1){printf("查无此书\n");}else{int j = 0;for (j = pos; j < ps->size - 1; j++){ps->data[j] = ps->data[j + 1];}//从要删除的图书位置开始,后一本图书信息覆盖前一本图书信息printf("删除成功\n");ps->size--;//图书管理系统中图书本数-1}Sleep(1000);system("cls");
}
2.4 查找指定图书并打印其信息
//查找指定图书并打印其信息
int SreachContact(const struct Contact* ps)
{char name[MAX_NAME];printf("请输入要查找图书的书名:>");scanf("%s", name);int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1if (pos == -1){printf("查无此书\n");return -1;}else{printf("%-15s %-4s    %-5s   %-12s\n", "书名", "编号", "作者", "出版社");printf("%-15s %-4d    %-5s   %-12s\n",ps->data[pos].name,ps->data[pos].id,ps->data[pos].author,ps->data[pos].publish);Sleep(1000);system("cls");return 1;}//打印该图书的信息内容Sleep(1000);system("cls");
}
2.5 修改指定图书的信息
//修改指定图书的信息
void ModifyContact(struct Contact* ps)
{char name[MAX_NAME];printf("请输入要修改的图书的书名:>");scanf("%s", name);int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1if (pos == -1){printf("查无此书\n");}else{printf("请输入书名:>");scanf("%s", ps->data[pos].name);printf("请输入编号:>");scanf("%d", &(ps->data[pos].id));printf("请输入作者:>");scanf("%s", ps->data[pos].author);printf("请输入出版社:>");scanf("%s", ps->data[pos].publish);printf("修改成功\n");}//修改图书信息,即将该图书信息重新录入Sleep(1000);system("cls");
}
2.6 打印图书管理系统中的全部信息
//打印图书管理系统中的全部信息
void ShowContact(const struct Contact* ps)
{if (ps->size == 0){printf("图书管理系统为空\n");}//图书管理系统中图书本数为0else{//打印信息栏int i = 0;for (i = 0; i < ps->size; i++){printf("%-15s %-4s    %-5s   %-12s\n", "书名", "编号", "作者", "出版社");printf("%-15s %-4d    %-5s   %-12s\n",ps->data[i].name,ps->data[i].id,ps->data[i].author,ps->data[i].publish);}//打印图书管理系统全部信息内容}Sleep(1000);system("cls");
}
2.7 通过名字排序图书管理系统中图书的先后顺序(可选)
//自定义的比较函数
int CmpByName(const void* e1, const void* e2)
{return strcmp((const char*)e1, (const char*)e2);
}//通过名字排序图书管理系统中图书的先后顺序
void SortContact(struct Contact* ps)
{qsort(ps->data, ps->size, sizeof(struct Book), CmpByName);//排序
}

借阅系统

与图书管理系统类似,创建reader和borrow结构体 ,本程序的变量名过多,注意区分

struct borrow
{struct Book borrow_book [10];int limit_date;
};struct reader
{char r_id[10];//学号char r_name[10];//姓名char r_pos[10];//老师或者学生char tec[20];//专业struct borrow borrow;//借书情况};//初始化图书管理系统
void Init_reader(struct borrow* ps);void InitBorrow(b_reader* con);
//销毁
void DestroyBorrow(b_reader* con);//添加读者
void AddB_reader(b_reader* con);//借书
void borrow_book(b_reader* ps1, struct Contact* ps);//归还书籍
void receive_b(b_reader* ps1, struct Contact* ps);void search_B_R(struct Contact* ps);
1. 初始化

这里借用了book 

//初始化
void InitBorrow(b_reader* con) {SLInit(con);
}//初始化借书系统
void Init_reader(struct borrow* ps) {memset(ps->borrow_book, 0, sizeof(ps->borrow_book));ps->limit_date = 0;
}
2. 销毁

由于引用之前的顺序表结构,这里就直接使用顺序表的销毁函数 

//销毁
void DestroyBorrow(b_reader* con) {SLDestroy(con);}
3.添加读者

这里也存在重复学号的判断,我们只需要判断是否存在 ,判断返回是否为-1,如果是,则存在,返回。反之,则添加读者。

int FindBy_R_ID(b_reader* con, char ID[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].r_id, ID)){//找到了return i;}}//没有找到return -1;
}//添加读者
void AddB_reader(b_reader* con) {struct reader info;Init_reader(&info.borrow);printf("请输入你的学号:>");char id[10];scanf("%s", id);int i = FindBy_R_ID(con, id);if (i != -1) {printf("学号已注册\n");Sleep(1000);system("cls");return;}strcpy(info.r_id, id);printf("请输入你的姓名:>");scanf("%s", info.r_name);printf("请输入你的职业:>");scanf("%s", info.r_pos);printf("请输入你的专业:>");scanf("%s", info.tec);//往通讯录中添加联系人数据printf("创建成功\n");SLPushBack(con, info);Sleep(1000);system("cls");
}
4. 借书系统

借书系统的难点在于对书籍是否存在,是否被借阅,读者是否超过借阅书籍数量,对数据状态的更新。

int FindBy_R_Name(b_reader* con, char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].r_name, name)){//找到了return i;}}//没有找到return -1;
}//通过名字查找图书,找到了返回下标,没找到返回-1
static int FindByName(char name[MAX_NAME], const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0)return i;//找到了返回下标}return -1;//找不到的情况
}//借书
void borrow_book(b_reader* ps1,struct Contact* ps) {char name[10] = {0};printf("请输入你的姓名:>");scanf("%s", name);//书是否存在printf("请输入你要借阅的书籍:>");char name_b[15];scanf("%s", name_b);int b = FindByName(name_b, ps);if (b == -1) {printf("查无此书\n");Sleep(1000);system("cls");return;}else {//存在//书是否被借出if (ps->data[b].opp == 1) {printf("已被借出\n");Sleep(1000);system("cls");return;}//读者是否创建if (FindBy_R_Name(ps1,name) == -1) {printf("是否需要创建读者 y/n \n");char y;scanf("%c", &y);if (y == 'y') {AddB_reader(ps1);}Sleep(1000);system("cls");return;}//读者是否超过借书限制else {int i = FindBy_R_Name(ps1, name);if (ps1->arr[i].r_pos == "teacher") {if (ps1->arr[i].borrow.limit_date >= 8) {printf("你已超过借阅数量\n");Sleep(1000);system("cls");return;}}if (ps1->arr[i].r_pos == "studnt") {if (ps1->arr[i].borrow.limit_date >= 4) {printf("你已超过借阅数量\n");Sleep(1000);system("cls");return;}}//读者存在,更改内容*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].name = *ps->data[b].name;*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].author = *ps->data[b].author;ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].id = ps->data[b].id;*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].publish = *ps->data[b].publish;strcpy(ps->data[b].reader_b, ps1->arr[i].r_name);//strcpy(ps->data[b].tec_b, ps1->arr[i].tec);ps->data[b].opp = 1;time(&(ps->data[b].start));printf("借阅成功\n");Sleep(1000);system("cls");return;}}
}
5. 归还系统

 归还系统难点在于time函数的使用。

void search_B_R(struct Contact* ps) {printf("请输入你要查询的书籍:>");char name[15];scanf("%s", &name);int i = FindByName(name, ps);if (i == -1) {printf("查无此书\n");}else {if (ps->data[i].opp == 0) {printf("无人借阅\n");}else {printf("书籍被%s借阅\n", ps->data[i].reader_b);}}Sleep(1000);system("cls");
}//归还书籍
void receive_b(b_reader* ps1 ,struct Contact* ps) {char name_r[10] = { 0 };printf("请输入你的姓名:>");scanf("%s", name_r);int r = FindBy_R_Name(ps1, name_r);if (r == -1) {printf("查无此人\n");Sleep(1000);system("cls");return;}printf("请输入你要归还的书:>");char name_b[15];scanf("%s", name_b);int i = FindByName(name_b, ps);if (i == -1) {printf("查无此书\n");Sleep(1000);system("cls");return;}else {//读者下借阅的书归还int j = 0;for (j = 0; j < ps1->arr[r].borrow.limit_date; j++){if (strcmp(ps1->arr[r].borrow.borrow_book[j].name, name_b) == 0)break;}for (; j < ps1->arr[r].borrow.limit_date-1; j++) {ps1->arr[r].borrow.borrow_book[j] = ps1->arr[r].borrow.borrow_book[j + 1];}ps1->arr[r].borrow.limit_date--;ps->data[i].opp = 0;*ps->data[i].reader_b = 0;time(&(ps->data[i].end));ps->data[i].total = (double)(ps->data[i].end - ps->data[i].start);if (ps->data[i].total < 1000) {printf("您以借阅%.1lf毫秒\n", ps->data[i].total);}else if (ps->data[i].total < 60000) {ps->data[i].total /= 1000;printf("您以借阅%.1lf秒\n", ps->data[i].total);}else if (ps->data[i].total < 3600000) {ps->data[i].total /= 60000;printf("您以借阅%.1lf分\n", ps->data[i].total);}else if (ps->data[i].total < 21600000) {ps->data[i].total /= 3600000;printf("您以借阅%.1lf小时\n", ps->data[i].total);}else if (ps->data[i].total < 51800000) {ps->data[i].total /= 21600000;printf("您以借阅%.1lf天\n", ps->data[i].total);}ps->data[i].end = 0;ps->data[i].start = 0;ps->data[i].total = 0;printf("归还成功,欢迎下次借阅\n");Sleep(1000);system("cls");return;}}

看到这里,我们就完成了图书管理系统_借阅系统!!!

完整代码展示:

SeqList.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"reader.h"
//定义顺序表的结构//#define N 100
//
静态顺序表
//struct SeqList
//{
//	int arr[N];
//	int size;//有效数据个数
//};typedef struct reader SLDataType;
//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size; //有效数据个数int capacity; //空间大小
}SL;//typedef struct SeqList SL;//顺序表初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
void SLPrint(SL s);//头部插入删除 / 尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);

SeqList.c

#include"SeqList.h"
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr) //等价于  if(ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{//插入数据之前先看空间够不够if (ps->capacity == ps->size){//申请空间//malloc calloc realloc  int arr[100] --->增容realloc//三目表达式int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//要申请多大的空间if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序,不再继续执行}//空间申请成功ps->arr = tmp;ps->capacity = newCapacity;}
}
//尾插
void SLPushBack(SL* ps, SLDataType x)
{温柔的解决方式//if (ps == NULL)//{//	return;//}assert(ps); //等价与assert(ps != NULL)//ps->arr[ps->size] = x;//++ps->size;SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}
//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//先让顺序表中已有的数据整体往后挪动一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]}ps->arr[0] = x;ps->size++;
}void SLPrint(SL s)
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//顺序表不为空//ps->arr[ps->size - 1] = -1;--ps->size;
}
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//数据整体往前挪动一位for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1]; //arr[size-2] = arr[size-1]}ps->size--;
}
//指定位置的删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

reader.h

#pragma once
#include"book.h"
#include"SeqList.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef  struct SeqList b_reader;struct borrow
{struct Book borrow_book [10];int limit_date;
};struct reader
{char r_id[10];//学号char r_name[10];//姓名char r_pos[10];//老师或者学生char tec[20];//专业struct borrow borrow;//借书情况};//初始化图书管理系统
void Init_reader(struct borrow* ps);void InitBorrow(b_reader* con);
//销毁
void DestroyBorrow(b_reader* con);//添加读者
void AddB_reader(b_reader* con);//借书
void borrow_book(b_reader* ps1, struct Contact* ps);//归还书籍
void receive_b(b_reader* ps1, struct Contact* ps);void search_B_R(struct Contact* ps);

reader.c

#define _CRT_SECURE_NO_WARNINGS  1#include"reader.h"
#include<Windows.h>//初始化
void InitBorrow(b_reader* con) {SLInit(con);
}//初始化借书系统
void Init_reader(struct borrow* ps) {memset(ps->borrow_book, 0, sizeof(ps->borrow_book));ps->limit_date = 0;
}//销毁
void DestroyBorrow(b_reader* con) {SLDestroy(con);}int FindBy_R_ID(b_reader* con, char ID[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].r_id, ID)){//找到了return i;}}//没有找到return -1;
}//添加读者
void AddB_reader(b_reader* con) {struct reader info;Init_reader(&info.borrow);printf("请输入你的学号:>");char id[10];scanf("%s", id);int i = FindBy_R_ID(con, id);if (i != -1) {printf("学号已注册\n");Sleep(1000);system("cls");return;}strcpy(info.r_id, id);printf("请输入你的姓名:>");scanf("%s", info.r_name);printf("请输入你的职业:>");scanf("%s", info.r_pos);printf("请输入你的专业:>");scanf("%s", info.tec);//往通讯录中添加联系人数据printf("创建成功\n");SLPushBack(con, info);Sleep(1000);system("cls");
}int FindBy_R_Name(b_reader* con, char name[])
{for (int i = 0; i < con->size; i++){if (0 == strcmp(con->arr[i].r_name, name)){//找到了return i;}}//没有找到return -1;
}//通过名字查找图书,找到了返回下标,没找到返回-1
static int FindByName(char name[MAX_NAME], const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0)return i;//找到了返回下标}return -1;//找不到的情况
}//借书
void borrow_book(b_reader* ps1,struct Contact* ps) {char name[10] = {0};printf("请输入你的姓名:>");scanf("%s", name);//书是否存在printf("请输入你要借阅的书籍:>");char name_b[15];scanf("%s", name_b);int b = FindByName(name_b, ps);if (b == -1) {printf("查无此书\n");Sleep(1000);system("cls");return;}else {//存在//书是否被借出if (ps->data[b].opp == 1) {printf("已被借出\n");Sleep(1000);system("cls");return;}//读者是否创建if (FindBy_R_Name(ps1,name) == -1) {printf("是否需要创建读者 y/n \n");char y;scanf("%c", &y);if (y == 'y') {AddB_reader(ps1);}Sleep(1000);system("cls");return;}//读者是否超过借书限制else {int i = FindBy_R_Name(ps1, name);if (ps1->arr[i].r_pos == "teacher") {if (ps1->arr[i].borrow.limit_date >= 8) {printf("你已超过借阅数量\n");Sleep(1000);system("cls");return;}}if (ps1->arr[i].r_pos == "studnt") {if (ps1->arr[i].borrow.limit_date >= 4) {printf("你已超过借阅数量\n");Sleep(1000);system("cls");return;}}//读者存在,更改内容*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].name = *ps->data[b].name;*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].author = *ps->data[b].author;ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].id = ps->data[b].id;*ps1->arr[i].borrow.borrow_book[ps1->arr->borrow.limit_date].publish = *ps->data[b].publish;strcpy(ps->data[b].reader_b, ps1->arr[i].r_name);//strcpy(ps->data[b].tec_b, ps1->arr[i].tec);ps->data[b].opp = 1;time(&(ps->data[b].start));printf("借阅成功\n");Sleep(1000);system("cls");return;}}
}void search_B_R(struct Contact* ps) {printf("请输入你要查询的书籍:>");char name[15];scanf("%s", &name);int i = FindByName(name, ps);if (i == -1) {printf("查无此书\n");}else {if (ps->data[i].opp == 0) {printf("无人借阅\n");}else {printf("书籍被%s借阅\n", ps->data[i].reader_b);}}Sleep(1000);system("cls");
}//归还书籍
void receive_b(b_reader* ps1 ,struct Contact* ps) {char name_r[10] = { 0 };printf("请输入你的姓名:>");scanf("%s", name_r);int r = FindBy_R_Name(ps1, name_r);if (r == -1) {printf("查无此人\n");Sleep(1000);system("cls");return;}printf("请输入你要归还的书:>");char name_b[15];scanf("%s", name_b);int i = FindByName(name_b, ps);if (i == -1) {printf("查无此书\n");Sleep(1000);system("cls");return;}else {//读者下借阅的书归还int j = 0;for (j = 0; j < ps1->arr[r].borrow.limit_date; j++){if (strcmp(ps1->arr[r].borrow.borrow_book[j].name, name_b) == 0)break;}for (; j < ps1->arr[r].borrow.limit_date-1; j++) {ps1->arr[r].borrow.borrow_book[j] = ps1->arr[r].borrow.borrow_book[j + 1];}ps1->arr[r].borrow.limit_date--;ps->data[i].opp = 0;*ps->data[i].reader_b = 0;time(&(ps->data[i].end));ps->data[i].total = (double)(ps->data[i].end - ps->data[i].start);if (ps->data[i].total < 1000) {printf("您以借阅%.1lf毫秒\n", ps->data[i].total);}else if (ps->data[i].total < 60000) {ps->data[i].total /= 1000;printf("您以借阅%.1lf秒\n", ps->data[i].total);}else if (ps->data[i].total < 3600000) {ps->data[i].total /= 60000;printf("您以借阅%.1lf分\n", ps->data[i].total);}else if (ps->data[i].total < 21600000) {ps->data[i].total /= 3600000;printf("您以借阅%.1lf小时\n", ps->data[i].total);}else if (ps->data[i].total < 51800000) {ps->data[i].total /= 21600000;printf("您以借阅%.1lf天\n", ps->data[i].total);}ps->data[i].end = 0;ps->data[i].start = 0;ps->data[i].total = 0;printf("归还成功,欢迎下次借阅\n");Sleep(1000);system("cls");return;}}

book.h

#pragma once#define _CRT_SECURE_NO_WARNINGS 1#define MAX 10000#define MAX_NAME 15
#define MAX_ID 5
#define MAX_AUTHOR 12
#define MAX_PUBLISH 20#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>enum Option
{EXIT,//0ADD,//1DELETE,//2SREACH,//3MODIFY,//4SHOW,//5SORT//6
};//增加代码可读性struct Book
{char name[MAX_NAME];int id;char author[MAX_AUTHOR];char publish[MAX_PUBLISH];int opp;//1被借出//0没有被借出char reader_b[15];//char tec_b[20];//专业time_t start;time_t end;double total;
};//每一本图书的信息内容//图书管理系统类型
struct Contact
{struct Book data[MAX];//存放1000本图书的信息int size;//记录当前已有图书的本数
};//初始化图书管理系统
void InitContact(struct Contact* ps);//添加一本图书的信息
void AddContact(struct Contact* ps);//删除一本图书的信息
void DeleteContact(struct Contact* ps);//查找指定图书并打印其信息
int SreachContact(const struct Contact* ps);//修改指定图书的信息
void ModifyContact(struct Contact* ps);//打印图书管理系统中的全部信息
void ShowContact(const struct Contact* ps);//通过名字排序图书管理系统中图书的先后顺序
void SortContact(struct Contact* ps);

book.c

#define _CRT_SECURE_NO_WARNINGS  1
#include"book.h"
#include<Windows.h>
//初始化图书管理系统
void InitContact(struct Contact* ps)
{memset(ps->data, 0, sizeof(ps->data));//将待用内存空间设置为0ps->size = 0;//设置图书管理系统最初只有0个元素
}//通过名字查找图书,找到了返回下标,没找到返回-1
static int FindByName(char name[MAX_NAME], const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (strcmp(ps->data[i].name, name) == 0)return i;//找到了返回下标}return -1;//找不到的情况
}int FindByID(int id, const struct Contact* ps)
{int i = 0;for (i = 0; i < ps->size; i++){if (ps->data[i].id == id)return i;//找到了返回下标}return -1;//找不到的情况
}//添加一本图书的信息
void AddContact(struct Contact* ps)
{if (ps->size == MAX){printf("图书管理系统已满,无法添加!\n");}//图书管理系统内图书本数已达上限else{printf("请输入书名:>");scanf("%s", ps->data[ps->size].name);printf("请输入编号:>");int id;scanf("%d", &(id));int i = FindByID(id, ps);if (i != -1) {printf("编号重复,请重新添加\n");Sleep(1000);system("cls");return;}ps->data[ps->size].id = id;printf("请输入作者:>");scanf("%s", ps->data[ps->size].author);printf("请输入出版社:>");scanf("%s", ps->data[ps->size].publish);ps->size++;//图书管理系统中图书本数+1printf("添加成功\n");ps->data[ps->size].opp = 0;}Sleep(1000);system("cls");
}//删除一本图书的信息
void DeleteContact(struct Contact* ps)
{char name[MAX_NAME];printf("请输入要删除图书的书名:>");scanf("%s", name);//查找int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1//删除if (pos == -1){printf("查无此书\n");}else{int j = 0;for (j = pos; j < ps->size - 1; j++){ps->data[j] = ps->data[j + 1];}//从要删除的图书位置开始,后一本图书信息覆盖前一本图书信息printf("删除成功\n");ps->size--;//图书管理系统中图书本数-1}Sleep(1000);system("cls");
}//查找指定图书并打印其信息
int SreachContact(const struct Contact* ps)
{char name[MAX_NAME];printf("请输入要查找图书的书名:>");scanf("%s", name);int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1if (pos == -1){printf("查无此书\n");return -1;}else{printf("%-15s %-4s    %-5s   %-12s\n", "书名", "编号", "作者", "出版社");printf("%-15s %-4d    %-5s   %-12s\n",ps->data[pos].name,ps->data[pos].id,ps->data[pos].author,ps->data[pos].publish);Sleep(1000);system("cls");return 1;}//打印该图书的信息内容Sleep(1000);system("cls");
}//修改指定图书的信息
void ModifyContact(struct Contact* ps)
{char name[MAX_NAME];printf("请输入要修改的图书的书名:>");scanf("%s", name);int pos = FindByName(name, ps);//找到了返回下标,没找到返回-1if (pos == -1){printf("查无此书\n");}else{printf("请输入书名:>");scanf("%s", ps->data[pos].name);printf("请输入编号:>");scanf("%d", &(ps->data[pos].id));printf("请输入作者:>");scanf("%s", ps->data[pos].author);printf("请输入出版社:>");scanf("%s", ps->data[pos].publish);printf("修改成功\n");}//修改图书信息,即将该图书信息重新录入Sleep(1000);system("cls");
}//打印图书管理系统中的全部信息
void ShowContact(const struct Contact* ps)
{if (ps->size == 0){printf("图书管理系统为空\n");}//图书管理系统中图书本数为0else{//打印信息栏int i = 0;for (i = 0; i < ps->size; i++){printf("%-15s %-4s    %-5s   %-12s\n", "书名", "编号", "作者", "出版社");printf("%-15s %-4d    %-5s   %-12s\n",ps->data[i].name,ps->data[i].id,ps->data[i].author,ps->data[i].publish);}//打印图书管理系统全部信息内容}Sleep(1000);system("cls");
}//自定义的比较函数
int CmpByName(const void* e1, const void* e2)
{return strcmp((const char*)e1, (const char*)e2);
}//通过名字排序图书管理系统中图书的先后顺序
void SortContact(struct Contact* ps)
{qsort(ps->data, ps->size, sizeof(struct Book), CmpByName);//排序
}

test.c

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include"book.h"
#include"reader.h"
#include <stdlib.h>
#include<Windows.h>void menu()
{printf("|-----------------------|\n");printf("|        contact        |\n");printf("|   1.book     2.reader |\n");printf("|        0.Exit         |\n");printf("|-----------------------|\n");
}//打印菜单void menu_b()
{printf("|-----------------------|\n");printf("|        contact        |\n");printf("|   1.Add     2.Delete  |\n");printf("|   3.Search  4.Modify  |\n");printf("|   5.Show    6.Sort    |\n");printf("|       0.Return        |\n");printf("|-----------------------|\n");
}//打印菜单void menu_r()
{printf("|-----------------------|\n");printf("|        contact        |\n");printf("|   1.Add     2.Search  |\n");printf("|   3.Lend    4.receive |\n");printf("|       0.Return        |\n");printf("|-----------------------|\n");
}//打印菜单int main()
{int input = 0;int input_r = 0;int input_b = 0;//创建图书管理系统struct Contact con;//con就是图书管理系统,里面包含1000个元素的数组和size//初始化图书管理系统InitContact(&con);b_reader con_r; InitBorrow(&con_r);do{menu();//主菜单printf("请选择:>");scanf("%d", &input);Sleep(1000);system("cls");switch (input){case 1: {do{menu_b();printf("请选择:>");scanf("%d", &input_b);Sleep(1000);system("cls");switch (input_b){case ADD:AddContact(&con);break;case DELETE:DeleteContact(&con);break;case SREACH:SreachContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT: {printf("退出图书管理系统\n");Sleep(1000);system("cls");break;}default: {printf("选择错误,请重新选择\n");Sleep(1000);system("cls");break;}}} while (input_b);break;}case 2:{do {//读者管理menu_r();printf("请选择:>");scanf("%d", &input_r);Sleep(1000);system("cls");switch (input_r){case 1:AddB_reader(&con_r);break;case 2:search_B_R(&con);break;case 3:borrow_book(&con_r, &con);break;case 4:receive_b(&con_r, &con);break;case 0:printf("退出读者管理系统\n");Sleep(1000);system("cls");break;default:printf("选择错误,请重新选择\n");Sleep(1000);system("cls");break;}} while (input_r);break;}case 0:{break;}}} while (input);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表达式基础

文章目录 1、表达式组成1、运算符 2、表达式的分类1、算数运算符1、自增运算符和自减运算2、取余运算(%)3、除法运算(/)4、案例 2、关系运算符3、逻辑运算符4、条件运算符(三目运算符)1、案例 5、赋值运算()1、赋值类型转换2、复合赋值运算 6、逗号运算7、取地址运算(&)8、…

除了合并接口,还有哪些优化 Flask API 的方法?

除了合并接口&#xff0c;还有许多其他方法可以优化 Flask API&#xff0c;以下从性能优化、代码结构优化、安全性优化、错误处理优化等方面详细介绍&#xff1a; 性能优化 1. 使用缓存 内存缓存&#xff1a;可以使用 Flask-Caching 扩展来实现内存缓存&#xff0c;减少对数…

Web服务器配置

配置虚拟主机 通过虚拟主机&#xff0c;可以实现用自定义的域名来访问&#xff0c;并且可以为不同的域名指定不同的站点目录。 配置IP地址和域名的映射关系 申请真实的域名需要一定的费用&#xff0c;为了方便开发&#xff0c;可以通过修改hosts文件来实现将任意域名解析到本…

爬虫逆向实战小记——解决webpack实记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; aHR0cHM6Ly9wbW9zLnhqLnNnY2MuY29tLmNuOjIwMDgwL3B4Zi1zZXR0bGVtZW50LW91dG5ldHB1Yi8jL3B4Zi1zZXR0bGVtZW5…

蓝桥杯 之 前缀和与查分

文章目录 题目求和棋盘挖矿 前缀和有利于快速求解 区间的和、异或值 、乘积等情况差分是前缀和的反操作 前缀和 一维前缀和&#xff1a; # 原始的数组num,下标从1到n n len(num) pre [0]*(n1) for i in range(n):pre[i1] pre[i] num[i] # 如果需要求解num[l] 到num[r] 的区…

Windows10下本地搭建Manim环境

文章目录 1. 简介2. Python环境3. uv工具4. Latex软件5. 安装Manim数学库6. 中文支持参考 1. 简介 manim是个一科普动画的库&#xff0c; 本文用到的是社区版本。 2. Python环境 这个不用多说&#xff0c;可以参考其他的文章。记得把pip也安上。 3. uv工具 上面的pip是老…

#UVM# 关于field automation机制中的 pack_bytes 和unpack_bytes 函数剖析

一 pack_bytes 函数 在 UVM 中,pack_bytes 函数用于将类中的所有字段打包成一个字节流(byte stream)。这是 UVM 提供的字段自动化(field automation)机制的一部分,用于简化数据打包和传输。 extern function int pack_bytes(ref byte unsigned bytestream[], input uv…

YOLOv8 自定义目标检测

一、引言 YOLOv8 不仅支持预训练模型的推理&#xff0c;还允许用户将其应用于自定义对象检测。本文将详细介绍如何使用 YOLOv8 训练一个新的模型&#xff0c;并在自定义数据集上进行对象检测。 二、数据集准备 1. 数据集格式 YOLOv8 支持多种数据集格式&#xff0c;包括 CO…

关于tresos Studio(EB)的MCAL配置之GPT

概念 GPT&#xff0c;全称General Purpose Timer&#xff0c;就是个通用定时器&#xff0c;取的名字奇怪了点。定时器是一定要的&#xff0c;要么提供给BSW去使用&#xff0c;要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…

Dify 开源大语言模型应用开发平台使用(一)

文章目录 一、创建锂电池专业知识解答应用1.1 应用初始化 二、核心功能模块详解2.1 知识库构建2.2 工作流与节点编排节点类型说明工作流设计示例&#xff1a;锂电池选型咨询 2.3 变量管理 三、测试与调试3.1 单元测试3.2 压力测试3.3 安全验证 四、部署与优化建议4.1 部署配置4…

《Java基础 聊天窗口案例:剖析 GUI、文件 I/O 等关键技术知识》

1. 面向对象编程 类与对象&#xff1a;代码中定义了 Chat 类&#xff0c;它是整个程序的核心&#xff0c;封装了与聊天窗口相关的属性和方法。在 main 方法中创建了 Chat 类的对象&#xff0c;并调用其方法来完成相应的功能。继承与多态&#xff1a;ButtonClickListener 类实现…

IDE集成开发环境MyEclipse中安装SVN

打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后&#xff0c;会刷新出两个选项&#xff0c;需要选中的 点击next&#xff0c;出现许可的时候选中同意&#xff0c;一直结束等…

归并排序:分治哲学的完美演绎与时空平衡的艺术

引言&#xff1a;跨越世纪的算法明珠 在计算机科学的璀璨星河中&#xff0c;归并排序犹如一颗恒久闪耀的明星。1945年&#xff0c;现代计算机之父冯诺伊曼在EDVAC计算机的研发过程中首次系统性地提出了这一算法&#xff0c;其精妙的分治思想不仅奠定了现代排序算法的理论基础&…

服务器CPU微架构

1、微架构图 前端&#xff1a;预解码、解码、分支预测、L1指令缓存、指令TLB缓存 后端&#xff1a;顺序重排缓存器ROB处理依赖&#xff0c;调度器送到执行引擎 执行引擎&#xff1a;8路超标量&#xff0c;每一路可以进行独立的微操作处理 Port0、1、5、6支持整数、浮点数的加…

SpringBoot调用DeepSeek

引入依赖 <dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>deepseek-spring-boot-starter</artifactId><version>1.4.5</version> </dependency>配置 deepseek:api-key: sk-******base-url: https://api.…

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…

OpenMCU(一):STM32F407 FreeRTOS移植

概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中&#xff0c;忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程&#xff0c;该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…

NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo

NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo NetBeans 8.2 开发 CIFLog3.5 - 创建WelcomeDemo创建一个基于CIFLog平台的应用系统1. 下载安装CIFLog2. 授权使用3. 解决本地机器码验证错误问题4. 创建一个基于CIFLog平台的应用系统&#xff08;1&#xff09;新建项目&#xf…

ESP8266连接网络实时上传数据

要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…

pytest中pytest.ini文件的使用

pytest.ini 是 pytest 测试框架的配置文件,它允许你自定义 pytest 的行为。通过在 pytest.ini 中设置各种选项,可以改变测试用例的发现规则、输出格式、插件行为等。以下详细介绍 pytest.ini 文件的使用。 1. 文件位置 pytest.ini 文件通常位于项目的根目录下,pytest 在运…