【C 数据结构】图书管理系统(顺序表)

c语言-图书管理系统--顺序表实现增删改查

采用外部控制台运行,若直接控制台输出,则清屏命令无效

每种图书信息包括ISBN、书名、价格

具有以下几种功能 0.初始化图书表,  1.录入图书信息 ,2.打印图书信息 , 3.查找图书信息 ,

4.插入图书信息 ,5.删除图书信息 , 6.修改图书信息 , 7.排序图书价格 , 8.统计图书数量

(1)查找:根据指定的ISBN或书名查找相应图书的有关信息,并返回该图书在表中的位置序号。
(2)插入:插入一条新的图书信息。
(3)删除:删除一条图书信息。
(4)修改:根据指定的ISBN,修改该图书的价格。
(5)排序:将图书按照价格由低到高进行排序。
(6)计数:统计文件中的图书数量。

【C 数据结构】图书管理系统(顺序表)_第1张图片

【C 数据结构】图书管理系统(顺序表)_第2张图片

#include
#include
#include
#include 

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100    //顺序表可能达到的最大长度


typedef struct {
    char id[8];
    char name[20];
    double price;
} BOOK;

typedef struct {
    BOOK *elem;  //存储空间的基地址
    int length;  //图书表中当前图书个数
} SqList;        //图书表的顺序存储结构 SqList

SqList Ll;

void menu();                       //主界面函数
int InitList(SqList *L);           //初始化空表;
void inputBook(SqList *L);         //录入图书信息
void printfBook(SqList L);         // 打印图书信息
void seekBook(SqList L);           //查找图书信息
void seekBookISBN(SqList L);       //按ISBN查询图书
void seekBookName(SqList L);       //查找书名图书信息
int seekBookSeat(SqList L);        //查找位置图书信息
int ListInsert(SqList *L);          // 插入图书信息
void listDeleta(SqList *L);         //删除图书信息
void revisePrice(SqList L);        //修改图书信息(价格)
void sortPrice(SqList L);          //排序图书价格
void color(short x);               //改变字体颜色
void backtrack();                  //返回

int main() {
    //程序入口
    menu();
    return 0;
}


void menu() {
    //主界面
    int l;
    printf("\t欢迎使用图书管理系统\t\n");
    printf("\t     0.初始化图书表 \t\n");
    printf("\t     1.录入图书信息 \t\n");
    printf("\t     2.打印图书信息 \t\n");
    printf("\t     3.查找图书信息 \t\n");
    printf("\t     4.插入图书信息 \t\n");
    printf("\t     5.删除图书信息\t\n");
    printf("\t     6.修改图书信息\t\n");
    printf("\t     7.排序图书价格   \n");
    printf("\t     8.统计图书数量   \n");
    printf("=================================\n");
    printf("请输入要执行的操作: ");
    scanf("%d", &l);
    switch (l) {
        case 0:
            system("cls");
            InitList(&Ll);
            if (Ll.elem) {
                color(2);//绿色字体
                printf("图书表初始化成功!\n");
                color(0xF);//白色字体
            }
            menu();
            break;
        case 1:
            system("cls");
            inputBook(&Ll);
            Sleep(2000);
            system("cls");
            menu();
            break;
        case 2:
            system("cls");
            printfBook(Ll);
            break;
        case 3:
            system("cls");
            seekBook(Ll);
            break;
        case 4:
            system("cls");
            ListInsert(&Ll);
            break;
        case 5:
            system("cls");
            listDeleta(&Ll);
            break;
        case 6:
            system("cls");
            revisePrice(Ll);
            break;
        case 7:
            system("cls");
            sortPrice(Ll);
            break;
        case 8:
            printf("表长为:%d\n", Ll.length);
            Sleep(5000);
            menu();
            break;
        default:
            color(0xc); //红色字体
            printf("[输入错误]请重新输入有效数字!\n");
            Sleep(1000);
            color(0xF);//白色字体
            system("cls");
            menu();
            break;
    }
}

void color(short x) {
    //改变字体颜色
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}


int InitList(SqList *L) {
    //初始化空表
    (L)->elem = (BOOK *) malloc(sizeof(BOOK) * MAXSIZE); //申请内存空间
    if (!(L)->elem)
        exit(OVERFLOW);
    (L)->length = 0;
    return OK;
}


void inputBook(SqList *L) {
    //录入图书信息
    int number;
    printf("请输入存储的数量:");
    scanf("%d", &number);
    getchar();
    int start = L->length;
    for (int i = start; i < (start + number); i++) {
        printf("请输入第%d本图书信息!\n", i + 1);
        printf("图书ISBN:");
        scanf("%s", (L)->elem[i].id);
        getchar();
        printf("图书名字:");
        scanf("%s", (L)->elem[i].name);
        getchar();
        printf("图书价格:");
        scanf("%lf", &(L)->elem[i].price);
        getchar();
        (L)->length++;
        printf("\n");
    }
    color(2);//绿色字体
    printf("[tip]录入完成!\n");
    color(0xF);//白色字体
}

void printfBook(SqList L) {
    // 打印图书信息
    if (L.length == 0) {
        return;
    }
    printf("ISBN                书名                定价\n");
    for (int i = 0; i < L.length; i++) {
        printf("%-20s%-20s%.2f\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
    }
    printf("\n\n是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        system("cls");
        menu();
    }
}

void seekBook(SqList L) {
    //查找图书信息
    int l;
    printf("\t欢迎使用图书查询系统\t\n");
    printf("\t   1.按ISBN查询图书 \t\n");
    printf("\t   2.按书名查询图书 \t\n");
    printf("\t   3.按位置查询图书\t\n");
    printf("\t   4.返回  \n");
    printf("\t=================================\n");
    printf("\t请输入要执行的操作: ");
    scanf("%d", &l);
    switch (l) {
        case 1:
            system("cls");
            seekBookISBN(L);
            break;
        case 2:
            system("cls");
            seekBookName(L);
            break;
        case 3:
            system("cls");
            seekBookSeat(L);

            break;
        case 4:
            system("cls");
            menu();
            break;
        default:
            color(772);
            printf("[输入错误]请3秒后重新输入有效数字!\n");
            Sleep(3000);
            color(7);
            system("cls");
            seekBook(L);
            break;
    }
}
void backtrack(){
    printf("\n\n是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        system("cls");
        menu();
    }
}

void seekBookISBN(SqList L) {
    //按ISBN查询图书
    char id_1[8];
    printf("请输入需要查询书籍的ISBN:");
    scanf("%s", id_1);
    for (int i = 0; i < L.length; i++) {
        if (strcmp(L.elem[i].id, id_1)==0) {
            printf("\nISBN为%s的书籍信息如下:\n", id_1);
            color(2);//绿色字体
            printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
            color(0xF);//白色字体
            backtrack();

        }
    }
    color(0xc);
    printf("\n【错误】无相关书籍信息!\n");
    color(0xF);//白色字体
    backtrack();
}

void seekBookName(SqList L) {
    //查找书名图书信息
    char name_1[20];
    printf("请输入需要查询书籍的书名:");
    scanf("%s", name_1);
    for (int i = 0; i < L.length; i++) {
        if (strcmp(L.elem[i].name, name_1)==0) {
            printf("\n书名为%s的书籍信息如下:\n", name_1);
            color(2);//绿色字体
            printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
            color(0xF);//白色字体
            backtrack();
        }
    }
    color(0xc);
    printf("\n【错误】无相关书籍信息!\n");
    color(0xF);//白色字体
    backtrack();
}

int seekBookSeat(SqList L) {
    //查找位置图书信息
    int seat;
    printf("请输入需要查询书籍的位置:");
    scanf("%d", &seat);
    if (seat < 1 || seat > L.length)
        return ERROR;
    for (int i = 0; i < L.length; i++) {
        if ((i + 1) == seat) {
            printf("\n位置为%d的书籍信息如下:\n", seat);
            color(2);//绿色字体
            printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
            color(0xF);//白色字体
            backtrack();
        }
    }
    color(0xc);
    printf("\n【错误】无相关书籍信息!\n");
    color(0xF);//白色字体
    backtrack();
    return OK;
}

int ListInsert(SqList *L) {
    // 插入图书信息
    BOOK e;
    int insertSeat;
    printf("请输入插入的位置:");
    scanf("%d", &insertSeat);
    getchar();
    if ((insertSeat < 1) || (insertSeat > L->length))
        return ERROR;
    printf("\n请需要插入都图书信息!\n");
    printf("图书ISBN:");
    scanf("%s", e.id);
    getchar();
    printf("图书名字:");
    scanf("%s", e.name);
    getchar();
    printf("图书价格:");
    scanf("%lf", &e.price);
    getchar();
    printf("\n");
    for (int i = L->length - 1; i >= insertSeat - 1; i--) {
        L->elem[i + 1] = L->elem[i];
    }
    L->elem[insertSeat - 1] = e;
    ++L->length;
    color(2);//绿色字体
    printf("\n\n【tip】插入成功!是否返回主界面?(y/n)\n");
    color(0xF);//白色字体
    char ch = getchar();
    if (ch == 'y') {
        system("cls");
        menu();
    }
    return OK;
}

void listDeleta(SqList *L) {
    //删除图书信息
    int i;
    printf("请输入需要删除的图书位置:");
    scanf("%d", &i);
    if ((i < 1) || (i > L->length))
        return;
    printf("\n位置为%d的书籍信息如下:\n", i);
    color(2);//绿色字体
    printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n", L->elem[i].id, L->elem[i].name, L->elem[i].price);
    color(0xF);//白色字体
    for (int j = i; j <= L->length; j++) {
        L->elem[j - 1] = L->elem[j];
    }
    L->length--;
    printf("\n\n【tip】删除成功!是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        Sleep(10);
        system("cls");
        menu();
    }
}

void revisePrice(SqList L) {
    // 修改图书信息(价格)
    char isbn[8];
    double pr;
    printf("请输入要修改的书籍的ISBN:");
    scanf("%s", isbn);
    for (int i = 0; i < L.length; i++) {
        if (strcmp(L.elem[i].id, isbn)==0) {
            printf("\n原书籍信息如下:\n");
            color(2);//绿色字体
            printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
            color(0xF);//白色字体
            printf("请输入修改后的价格:");
            scanf("%lf", &pr);
            L.elem[i].price = pr;
            printf("\n修改后书籍信息如下:\n");
            color(2);//绿色字体
            printf("ISBN:%-20s书名:%-20s价格:%.2lf!\n\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
            color(0xF);//白色字体
            printf("\n\n【tip】是否返回主界面?(y/n)\n");
            getchar();
            if (getchar() == 'y') {
                system("cls");
                menu();
            }
        }

    }
    color(0xc);
    printf("\n【错误】无相关书籍信息!\n");
    color(0xF);//白色字体
    printf("\n\n【tip】是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        system("cls");
        menu();
    }
}

void sortPrice(SqList L) {
    //排序图书价格 降序
    BOOK t;
    for (int i = 0; i < L.length; i++) {
        for (int j = 0; j < L.length - i - 1; j++) {
            if ((L.elem[j].price) < (L.elem[j + 1].price)) {
                t = L.elem[j];
                L.elem[j] = L.elem[j + 1];
                L.elem[j + 1] = t;
            }
        }
    }
    printf("排序后书籍信息如下(降序)\n");
    printfBook(L);
}

你可能感兴趣的:(c++,算法,c语言,数据结构)