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.pswp.cn/diannao/72514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72514.shtml
英文地址,請注明出處:http://en.pswp.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 在運…