1. 程式人生 > >圖書管理系統 [c語言實現] [全部代碼]

圖書管理系統 [c語言實現] [全部代碼]

要求 不解釋 height next malloc 管理 stdin fflush ext

  • 直接上代碼不解釋

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define AVAILABLE 0
#define UNAVAILABLE 1
#define MAXNAME 30
#define CLEAR "cls"

typedef struct book{
    char *name;
    int id;
    int count;
    int status;
    struct book *next;
}Book;

void welcome();
void
error(char *); // [異常提醒] char land(); // [主頁面項目] int usrstudent(); // [學生入口]返回 0表示返回主頁 1表示繼續執行本函數 int usrmanager(); // [管理員入口]返回 0表示返回主頁 1表示繼續執行本函數 int viewbook(); // [查看圖書]返回打印的圖書個數 失敗返回-1 int addbook(); // [註冊圖書]添加圖書成功 返回圖書id 失敗返回-1
int modbook(); // [修改圖書]修改圖書信息 成功後返回id 失敗 -1 int delbook(); // [註銷圖書]刪除成功 返回被刪除圖書的id 失敗返回-1 void printbook(Book *); // [打印圖書] Book *lookup(char *, int); // [搜索圖書] int borrowbook(); // [借閱圖書] int returnbook(); // [歸還圖書] Book *head = NULL; int nbook = 0
; int main(){ welcome(); return 0; } void welcome(){ printf("*************************歡迎使用圖書管理系統*************************\n"); while(1){ printf("-------------------------------------\n"); printf("請輸入項目前編號執行相關操作:\n"); printf("\n[1] 管理員入口\n\n[2] 學生入口\n\n[0] 退出\n\n"); switch(land()){ case 1: while(1){ if(usrmanager()){ continue; }else{ break; } } break; case 2: while(1){ if(usrstudent()){ continue; }else{ break; } } break; case 0: exit(0); default: error("采集項目參數失敗"); } } } char land(){ char c, flag; int i; while(1){ for(i = 0; (c = getchar()) != \n; flag = c, ++i) ; if(i == 1){ if(flag == 1 || flag == 2 || flag == 0){ return flag; } }else if(i == 0){ continue; } error("[請輸入命令: 1 / 2 / 0 選擇項目]"); } return \0; } void error(char *s){ fprintf(stderr, "%s\n", s); } char dostudent(){ char c, flag; int i; while(1){ for(i = 0; (c = getchar()) != \n; flag = c, ++i ) ; if(i == 1){ if(flag == 1 || flag == 2 || flag == 3 || flag == 0){ return flag; } }else if(i == 0){ continue; } error("[請輸入命令: 1 / 2 / 3/ 0 選擇項目]"); } } int usrstudent(){ printf("-------------------------------------\n"); printf("請輸入項目前編號執行相關操作:\n\n"); printf("[1] 借閱圖書\n[2] 歸還圖書\n[3] 查看館存圖書\n"); printf("[0] 返回主頁\n"); switch(dostudent()){ case 1: borrowbook(); break; case 2: returnbook(); break; case 3: viewbook(); break; case 0: return 0; default: error("采集項目參數失敗"); break; } return 1; } int borrowbook(){ system(CLEAR); char sname[MAXNAME]; printf("搜索圖書:\n"); scanf("%s", sname); getchar(); Book *bp; char *namep = NULL; if((bp = lookup(namep = strdup(sname), 0)) == NULL){ printf("圖書 %s 不存在\n", namep); fflush(stdin); return -1; }else{ printbook(bp); if(! bp->status){ printf("借閱圖書: Y N\n"); }else{ printf("圖書外借中\n"); return 0; } while(1){ char c = \0; scanf("%c", &c); getchar(); if(!(c == Y || c == y || c == N || c == n)){ fflush(stdin); error("指令無效"); continue; } if(c == Y || c == y){ --bp->count > -1 ? printf("成功\n") : printf("失敗\n"); if(! bp->count){ bp->status = UNAVAILABLE; } return bp->id; }else{ return 0; } } } return -1; } int returnbook(){ system(CLEAR); char sname[MAXNAME]; printf("歸還圖書:\n"); scanf("%s", sname); getchar(); Book *bp; char *namep; if((bp = lookup(namep = strdup(sname), 0)) == NULL){ fflush(stdin); printf("此圖書並不是館內圖書\n"); return -1; }else{ printbook(bp); printf("歸還圖書: Y N\n"); while(1){ char c = \0; scanf("%c", &c); getchar(); if(!(c == Y || c == y || c == N || c == n)){ fflush(stdin); error("指令無效"); }else if(c == Y || c == y){ bp->count++ ? : (bp->status = AVAILABLE); printf("成功\n"); return bp->id; }else{ return 0; } } } return -1; } char domanager(){ char c, flag; int i; while(1){ for(i = 0; (c = getchar()) != \n; flag = c, ++i) ; if(i == 1){ if(flag == 1 || flag == 2 || flag == 3 || flag == 4 || flag == 0){ return flag; } }else if(i == 0){ continue; } error("[請輸入命令: 1 / 2 / 3/ 4 / 0 選擇項目]"); } return \0; } int usrmanager(){ printf("-------------------------------------\n"); printf("請輸入項目前編號執行相關操作:\n\n"); printf("[1] 查看已存圖書\n[2] 註冊新圖書\n[3] 修改已有圖書信息\n[4] 註銷現存圖書\n"); printf("[0] 返回主頁\n"); switch(domanager()){ case 1: viewbook(); break; case 2: addbook(); break; case 3: modbook(); break; case 4: delbook(); break; case 0: return 0; default: error("采集項目參數失敗"); break; } return 1; } int viewbook(){ system(CLEAR); /////////////////////////////////////////// Book *bp; for(bp =head; bp != NULL; bp = bp->next){ printbook(bp); } if(nbook){ return nbook; }else{ printf("圖書館還沒有圖書哦\n"); return 0; } return -1; } void printbook(Book *bp){ printf("圖書編號:%d\n", bp->id); printf("圖書名:%s\n", bp->name); printf("圖書存數:%d\n", bp->count); printf("圖書狀態:%s\n", bp->status ? "不可借" : "可借"); } int addbook(){ system(CLEAR); /////////////////////////////////////////// char sname[MAXNAME]; int id, count; char *namep; while(1){ id = 0; count = 0; namep = NULL; printf("請輸入圖書名:\n"); scanf("%s", sname); getchar(); printf("請輸入小於1000的圖書編號:\n"); scanf("%d", &id); getchar(); if(!(id > 0 && id < 1000)){ error("輸入編號不符合要求"); fflush(stdin); continue; } printf("請輸入小於50的圖書數量:\n"); scanf("%d", &count); getchar(); if(!(count > 0 && count < 50)){ error("輸入數目不符合要求"); fflush(stdin); continue; } Book *bp; if((bp = lookup(namep = strdup(sname), id)) == NULL){ bp = (Book *)malloc(sizeof (Book)); if(bp == NULL || (bp->name = namep) == NULL){ error("註冊圖書失敗"); fflush(stdin); continue; } bp->id = id; bp->count = count; bp->status = AVAILABLE; ++nbook; bp->next = head; head = bp; printf("圖書 %s 註冊成功\n", sname); return id; }else{ fflush(stdin); error("圖書名或編號已經被占用"); } } return -1; } Book *lookup(char *s, int id){ Book *bp; for(bp = head; bp != NULL; bp = bp->next){ if(id == bp->id || strcmp(s, bp->name) == 0){ return bp; } } return NULL; } int modbook(){ // 修改除id之外的信息 因為要修改id 直接刪掉後重新添加會更好 system(CLEAR); /////////////////////////////////////////// Book *bp = NULL; while(1){ int id = 0; printf("請輸入要修改信息的圖書編號:\n"); scanf("%d", &id); getchar(); if(!(id > 0 && id < 1000)){ fflush(stdin); error("圖書編號不符合要求"); continue; } if((bp = lookup("", id)) != NULL){ printf("以下為要修改的圖書的現有信息:\n"); printbook(bp); printf("[1] 修改圖書名\n[2] 修改圖書數量\n[3] 修改圖書狀態\n[0] 放棄修改\n"); while(1){ int i; scanf("%d", &i); getchar(); if(!(i == 1 || i == 2 || i == 3 || i == 0)){ fflush(stdin); error("輸入項目前編號選擇相關項目"); continue; } switch(i){ case 1: while(1){ char newname[MAXNAME], *namep; printf("圖書名:\n"); scanf("%s", newname); getchar(); if((lookup(namep = strdup(newname), 0)) != NULL){ fflush(stdin); error("圖書名已存在"); continue; } if((bp->name = namep) != NULL){ printf("修改成功\n"); return id; } } break; case 2: while(1){ int bnum; printf("輸入圖書數量:\n"); scanf("%d", &bnum); getchar(); if(!(bnum > 0 || bnum < 1000)){ fflush(stdin); error("數目不符合要求"); continue; } bp->count = bnum; printf("修改成功\n"); return id; } break; case 3: while(1){ char c; int status; status = bp->status; status == AVAILABLE ? printf("修改狀態為[不可借]: Y N\n") : printf("修改狀態為[可借]: Y N\n"); scanf("%c", &c); getchar(); if(!( c == Y || c == y || c == N || c == n)){ fflush(stdin); error("指令無效"); continue; } if(c == Y || c == y){ status == AVAILABLE ? bp->status = UNAVAILABLE : (bp->status = AVAILABLE); printf("修改成功\n"); return id; }else{ printf("放棄修改\n"); return 0; } } break; case 0: return 0; default: error("獲取參數失敗"); break; } } }else{ printf("沒有此圖書\n"); return 0; } } return -1; } int delbook(){ system(CLEAR); /////////////////////////////////////////// Book *bp, *fbp; int id = 0; printf("請輸入要註銷的圖書編號:\n"); scanf("%d", &id); getchar(); if(!(id > 0 && id < 1000)){ fflush(stdin); error("圖書編號不符合要求"); return -1; } for(fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next){ if(bp->id == id){ printbook(bp); break; } } if(bp != NULL){ while(1){ printf("確定要註銷此圖書:Y N\n"); char YN; scanf("%c", &YN); getchar(); if(!((YN == Y || YN == y) || (YN == N || YN == n))){ fflush(stdin); error("指令無效\n"); continue; } if(YN == Y || YN == y){ bp == head ? head = bp->next : (fbp->next = bp->next); free(bp); printf("圖書註銷成功\n"); break; }else{ printf("放棄註銷\n"); return 0; } } return id; }else{ printf("要註銷的圖書編號不存在\n"); return -1; } return -1; }

  • 效果展示

技術分享圖片

圖書管理系統 [c語言實現] [全部代碼]