图书管理系统 [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);
                printf("图书注销成功\n");
                break;
            }else{
                printf("放弃注销\n");
                return 0;
            }
        }
        return id;
    }else{
        printf("要注销的图书编号不存在\n");
        return -1;
    }
    return -1;
}

  • 效果展示


原文地址:https://www.cnblogs.com/xinglichao/p/9064415.html

时间: 2024-10-31 03:19:30

图书管理系统 [c语言实现] [全部代码]的相关文章

C语言课程设计—图书管理系统

这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<stdio.h> #include<stdlib.h> #include<string.h> struct book{ char book_name[30]; int bianhao; double price; char author[20]; char state[20]; cha

C语言项目2:图书管理系统

项目名称:图书管理系统 项目作者:宁哥 开发工具:Visual Studio 2017 编程语言:C语言 意义:链表.文件存储.数据加解密.多文件开发综合应用 功能描述: 1:增.删.改.查 2:数据加解密 3:文件数据库,带记忆功能 4:初始化 5:搜索 检查时间:2017年8月6日 结构体原型: struct _book { char bid[10];//编号 char name[30];//书名 int page;//页数 int price;//价格 struct _book *next

c语言小项目-使用mysql数据库的图书管理系统

VS2013通过MySQL方式连接到MySQL MySQL官网上C++的API有两个.一个是很成熟的mysql++,另一个是MySQL Connector/C++,近两年才出的,模仿JDBC做的,封装得很方便使用.这里使用的是mysql方式. 1.新建bookAdminSys工程 2.将文件夹MySQL目录下的include添加到VC++目录中的包含目录中,另外将文件夹MySQL目录下的lib添加到VC++目录中的库目录中 3.添加附加依赖项,将MySQL目录下的libmysql.lib添加到L

放出一批jsp图书管理系统图书借阅系统源码代码运行

基于jsp+mysql的JSP图书销售管理系统 https://www.icodedock.com/article/105.html基于jsp+Spring+Spring MVC的Spring图书借阅管理系统 https://www.icodedock.com/article/71.html基于jsp+mysql的JSP图书管理系统 https://www.icodedock.com/article/39.html基于jsp+Spring+mybatis+Spring boot的SpringBo

图书管理系统

该图书馆里系统能实现基本的对图书信息的操作和借阅.归还功能. 一.主要内容: 本课程设计结合本学期所学C语言知识,数组.函数.结构体.指针.链表.文件读取操作等等,准备设计开发一个简单的图书管理系统.设计开发这个系统需要用到链表.文件读取操作.结构体.函数.指针.等C语言知识.本课程设计将会实现对图书信息的账号登录.注册账号.密码修改.密码查找.查找.输出.排序.备份.恢复.图书借阅和归还功能.本着简单.易用的设计原则,本课程设计在尽量优化界面在保证输入输出美观的同时又不失友好的交互界面. 本次

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website development Tags asp.net / mvc4 相关资源 ibatis manual pro git 廖雪峰的官方网站 BookMS-V1.0 上一篇链接 任务简介 开发工具:VS2010 项目框架:MVC4 浏览器:Chrome 数据库ORM框架:iBatis.net 数据库:mysql 后端开

[mysql+qt] 图书管理系统

一.图书管理数据库概念模式设计 图书管理系统包括了游客.用户登录.管理员登录三种模式. 在游客模式下,可以实现检索书籍的功能. 游客可以注册用户,但是借书权限需要管理员授予. 用户登录后,在检索书籍功能的基础上,还可以进行书籍的借阅,并且查看自己的借还情况. 管理员登录后,可以对图书进行管理,即入库新的书籍,也可以对用户进行管理,即授予用户借书证,注销用户. 二.数据库设计         管理员(manager) 属性 主码/外码 数据类型 说明 Username 主码 varchar(20)

在Django中使用ORM创建图书管理系统

一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等)会有点区别, 因此直接在你的项目中使用sql语句的话,不便于以后的修改,万一更换了数据库,那所有sql语句不就要重新写吗? 所以这个时候ORM就体现出优点了,你只需要写ORM的代码,它就会根据你连接的数据库自动帮你翻译成对应的sql语句, 也就是说无论你使用的是mysql还是oracle,ORM操

基于jsp+servlet图书管理系统之后台用户信息删除操作

上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732955 自此,基于jsp+servlet开发的用户信息增删该查已经全部写完了,上面的链接是全部的代码,包含增删该查和数据库. 注意点: 1:删除操作使用的是伪删除.即只是不在页面显示了,但是还保存在数据库. 2:分页查询使用的是一个小工具,后面有时间把这些