??? 歡迎大家來到小傘的大講堂??
🎈🎈養成好習慣,先贊后看哦~🎈🎈
所屬專欄:數據結構與算法
小傘的主頁: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; }