图书管理系统

include #include #include #defineAVAILABLE 0#defineUNAVAILABLE 1#defineMAXNAME 30#defineCLEAR "cls"typedef struct book{

char*name;

int id;

int count;

int status;

structbook *next;

}Book;void welcome();voiderror(char*);// [异常提醒]charland();// [主页面项目]intusrstudent();// [学生入口]返回 0表示返回主页 1表示继续执行本函数intusrmanager();// [管理员入口]返回 0表示返回主页 1表示继续执行本函数intviewbook();// [查看图书]返回打印的图书个数 失败返回-1intaddbook();// [注册图书]添加图书成功 返回图书id 失败返回-1intmodbook();// [修改图书]修改图书信息 成功后返回id 失败 -1intdelbook();// [注销图书]删除成功 返回被删除图书的id 失败返回-1voidprintbook(Book *);// [打印图书]Book lookup(char,int);// [搜索图书]intborrowbook();// [借阅图书]intreturnbook();// [归还图书]Book *head = NULL;intnbook =0;int main(){

welcome();

return0;

}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;

        }

    }elseif(i ==0){

        continue;

    }

    error("[请输入命令: 1 / 2 / 0 选择项目]");

}

return'\0';

}voiderror(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;

        }

    }elseif(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':

        return0;

    default:

        error("采集项目参数失败");

        break;

}

return1;

}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");

            return0;

        }

        while(1){

            charc ='\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;

                }

                returnbp->id;

            }else{

                return0;

            }

        }

    } 

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){

        charc ='\0';

        scanf("%c", &c);

        getchar();

        if(!(c =='Y'|| c =='y'|| c =='N'|| c =='n')){

            fflush(stdin);

            error("指令无效");

        }elseif(c =='Y'|| c =='y'){

            bp->count++ ? : (bp->status = AVAILABLE);

            printf("成功\n");

            returnbp->id;

        }else{

            return0;

        }

    }

}

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;

        }

    }elseif(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':

        return0;

    default:

        error("采集项目参数失败");

        break;

}

return1;

}int viewbook(){

system(CLEAR);      ///////////////////////////////////////////Book *bp;

for(bp =head; bp != NULL; bp = bp->next){

    printbook(bp);

}

if(nbook){

    return nbook;

}else{

    printf("图书馆还没有图书哦\n");

    return0;

}

return-1;

}voidprintbook(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(chars,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;

}intmodbook(){// 修改除id之外的信息 因为要修改id 直接删掉后重新添加会更好system(CLEAR);///////////////////////////////////////////Book *bp = NULL;

while(1){

    intid =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){

                case1:

                    while(1){

                        charnewname[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;

                case2:

                    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;

                case3:

                    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");

                            return0;

                        }

                    }

                    break;

                case0:

                    return0;

                default:

                    error("获取参数失败");

                    break; 

            }

        }

    }else{

        printf("没有此图书\n");

        return0;

    }

}

return-1;

}int delbook(){

system(CLEAR);      ///////////////////////////////////////////Book *bp, *fbp;



intid =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");

            return0;

        }

    } 

    return id;

}else{

    printf("要注销的图书编号不存在\n");

    return-1;

}

return-1;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容