圖書管理系統 (c語言實現) (全部代碼)


  • 直接上代碼不解釋

 

#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->name); //2018-05-26修改:添加釋放name這塊內存//bp內存的只是指向name的指針
free(bp);
bp = NULL; printf(
"圖書注銷成功\n"); break; }else{ printf("放棄注銷\n"); return 0; } } return id; }else{ printf("要注銷的圖書編號不存在\n"); return -1; } return -1; }

  • 效果展示

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM