返回顶部

收藏

很久以前写的一个 图书信息管理系统

更多

大一时的期末作业,是 图书信息管理系统,花了些时间撸了一把,就完成了。

主要是:链表+文件操作+输入输出。

/************************************************
选题5:图书信息管理系统设计
图书信息包括:登录号、书名、作者名、分类号、出版单
位、出版时间、价格等。试设计一图书信息管理系统,使
之能提供以下功能:
1、图书信息录入功能(图书信息用文件保存)
2、图书信息浏览功能
3、查询或排序功能:(至少一种查询方式)
A、按书名查询
B、按作者名查询
4、图书信息的删除与修改
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct bookinfo book;
/****** 图书信息结构体 *******/
struct bookinfo
{
    int id;     /* 登录号 */
    char    name[32];   /* 书名 */
    char    author[12]; /* 作者名 */ 
    int class_id;   /* 分类号 */
    char    unit[256];  /* 出版单位 */
    int time[3];    /* 出版时间 */
    float   price;      /* 价格 */

    struct bookinfo *next;  /* 下个图书的信息 */
};
/*****************************/

/* 功能:录入图书信息 */
void input(book **head)
{
    book *s, *p;

    if(*head == NULL) {/* 如果表头为空,先为它分配内存 */
        *head = (book *)calloc(1, sizeof(book));
        p = *head;
    } else {/* 否则,就说明有内容,直接切换到尾结点 */
        p = *head;
        while(p->next) 
        p = p->next; 
    }

    /* 为这个结点分配内存 */
    s = (book *)calloc(1, sizeof(book));
    printf("登录号:");
    scanf("%d", &s->id);

    printf("书名:");
    scanf("%s", s->name);

    printf("作者名:");
    scanf("%s", s->author);

    printf("分类号:");
    scanf("%d", &s->class_id);

    printf("出版单位:");
    scanf("%s", s->unit);

    printf("出版时间[年 月 日]:");
    scanf("%d %d %d", &s->time[0], &s->time[1], &s->time[2]);

    printf("价格:");
    scanf("%f", &s->price);

    p->next = s; /* 保存这个结点 */
    p = p->next; /* 切换至下个结点 */
    p->next = NULL;  

    printf("已经成功录入!\\n");
}

int output(book *head)
{
    book *p;
    p = head->next; 
    if(head == NULL || head->next == NULL)
    {
        printf("\\t\\t未记录图书信息!\\n");
        return -1;
    }
    system("cls");/* 清空屏幕内容 */
    /* 打印表头 */
    printf(
        "┌───┬──────┬────┬───┬───────┬─────┬───┐\\n"
        "│%s│    %s    │ %s │%s│   %s   │ %s │ %s │\\n"
        "├───┼──────┼────┼───┼───────┼─────┼───┤\\n"
        ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");
    /* 打印表中间的内容 */
    do {
        printf( "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│\\n", 
                p->id, p->name, p->author, p->class_id, p->unit, 
                p->time[0],p->time[1],p->time[2], p->price
        );
        p = p->next;/* 切换至下个结点 */ 
    } while(p != NULL);
    /* 打印表尾 */  
    printf( "└───┴──────┴────┴───┴───────┴─────┴───┘\\n");
    return 0;
}

/* 功能:保存链表中的图书信息数据至文件 */
int save_data(book *head)
{
    book *p;
    FILE *fp;
    /* 以只“写”的方式打开book.data二进制文件 */
    fp = fopen("book.data", "wb");
    /* 如果文件打开失败,就返回-1 */ 
    if(NULL == fp) {
        return -1;
    }
    p = head->next; 
    do {
        /* 
         * 把这个结点的数据全部写入至文件内
         * 由于next指针不需要写入至文件,因此,数据大小就是:
         * sizeof(book)-sizeof(book*)
         * 总数据大小减去指针的大小 
         */
        fwrite(p, sizeof(book), 1, fp);
        p = p->next;/* 切换至下个结点 */
    } while(p != NULL);

    fclose(fp);/* 关闭文件 */
    return 0; 
}

/* 功能:从文件读取图书信息数据 */
int read_data(book **head)
{
    int n;
    book *s, *p;
    FILE *fp;
    /* 以只“读”的方式打开book.data二进制文件 */
    fp = fopen("book.data", "rb");
    /* 如果文件打开失败,就返回-1 */ 
    if(NULL == fp) { 
        *head = NULL; 
        return -1;
    } 

    *head = (book *)calloc(1, sizeof(book));
    p = *head; 

    while(!feof(fp)) { 
        /* 为下个结点分配内存空间 */
        s = (book *)calloc(1, sizeof(book));
        /* 从文件内读取数据保存至结点 */ 
        n = fread(s, sizeof(book), 1, fp);
        if(n < 1) {
            free(s);
            p->next= NULL;   /* 最后一个结点为NULL */
            break; 
        }

        p->next = s; /* 保存下个结点 */
        p = p->next; /* 切换至下个结点 */
        p->next= NULL;   /* 最后一个结点为NULL */
    }

    fclose(fp);/* 关闭文件 */ 
    return 0; 
}

/* 功能:删除指定登录号的图书的信息 */
int delete(book *head)
{
    char name[256];
    int choice, id;
    int found = 0;
    book *p, *t;

    /* 如果表头为空 */
    if(head == NULL || head->next == NULL) {
        printf("没有记录学生信息!\\n");
        return -1;
    }
    printf( 
        "要删除图书信息,请选择删除方式:\\n"
        "[1]通过书名来删除\\n"
        "[2]通过登录号来删除\\n"
        "选择:"
    );
    while(1) {
        scanf("%d", &choice);
        if(choice > 0 && choice < 3) {
            break;  
        }

        printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
        printf("请输入书名:");
        scanf("%s", name);
    } else if(choice == 2) {
        printf("请输入登录号:");
        scanf("%d", &id);
    }

    p = head;

    while(p->next) {
        t = p;
        p = p->next;
        /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */ 
        if( choice == 1 && strcmp(p->name, name) == 0
        || choice == 2 && p->id == id) {
            found = 1;
            break;
        }
    }
    /* 如果没有找到 */
    if( found != 1 ) {
        printf("没有找到需删除信息的学生!\\n");
        return -1;
    }
    /* 打印表头 */
    printf(
        "┌───┬──────┬────┬───┬───────┬─────┬───┐\\n"
        "│%s│    %s    │ %s │%s│   %s   │ %s │ %s │\\n"
        "├───┼──────┼────┼───┼───────┼─────┼───┤\\n"
        ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");
    /* 打印中间内容 */ 
    printf( "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│\\n", 
        p->id, p->name, p->author, p->class_id, p->unit, 
        p->time[0],p->time[1],p->time[2], p->price
    );
    /* 打印表尾 */  
    printf( "└───┴──────┴────┴───┴───────┴─────┴───┘\\n");

    while(1) {
        printf("真的需要删除?[1:是  2:否]:"); 
        scanf("%d", &choice); 
        if(choice == 1) {
            t->next = p->next;
            free(p); /* 释放这个结点占用的内存 */
            printf("已经删除!\\n");
            break;
        } else if(choice == 2) {
            printf("任意键继续......");
        } 
    }
    return 0;
}

/* 功能:查询图书信息 */
int find(book *head)
{
    char author[256], name[256];
    int choice;
    int found = 0;
    book *p, *t;

    if(head == NULL || head->next == NULL) {
        printf("没有记录学生信息!\\n");
        return -1;
    }
    printf( 
        "要查询图书信息,请选择查询方式:\\n"
        "[1]通过书名来查询\\n"
        "[2]通过作者名来查询\\n"
        "选择:"
    );
    while(1) {
        scanf("%d", &choice);
        if(choice > 0 && choice < 3) { 
            break; 
        } 
        printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
        printf("请输入书名:");
        scanf("%s", name);
    } else if(choice == 2) {
        printf("请输入作者名:");
        scanf("%s", author);
    }

    p = head;
    printf("查询结果:\\n");

    /* 打印表头 */
    printf(
        "┌───┬──────┬────┬───┬───────┬─────┬───┐\\n"
        "│%s│    %s    │ %s │%s│   %s   │ %s │ %s │\\n"
        "├───┼──────┼────┼───┼───────┼─────┼───┤\\n"
        ,"登录号","书名","作者名","分类号","出版单位","出版时间","价格");

    while(p->next) {
        t = p;
        p = p->next;
        /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */ 
        if( choice == 1 && strcmp(p->name, name) == 0
        || choice == 2 && strcmp(p->author, author) == 0) {
            found = 1;
            /* 打印中间内容 */ 
            printf( 
                "│%6d│%12s│%8s│%6d│%14s│%04d-%02d-%02d│%6.1f│\\n", 
                p->id, p->name, p->author, p->class_id, p->unit, 
                p->time[0],p->time[1],p->time[2], p->price
            );
        }
    }
    /* 打印表尾 */  
    printf( "└───┴──────┴────┴───┴───────┴─────┴───┘\\n");
    /* 如果没有找到 */
    if(found != 1) {
        printf("没有找到符合要求的学生信息!\\n");
        return -1;
    }
    return 0;
}

/* 功能:修改图书信息 */
int modify(book *head)
{
    char name[256];
    int choice, id;
    int found = 0;
    book *p;

    if(head == NULL || head->next == NULL) {
        printf("没有记录学生信息!\\n");
        return -1;
    }
    printf( 
        "要修改图书信息,请选择修改方式:\\n"
        "[1]通过书名来修改\\n"
        "[2]通过登录号来修改\\n"
        "选择:"
    );
    while(1) {
        scanf("%d", &choice);

        if(choice > 0 && choice < 3) { 
            break; 
        } 
        printf("选择错误,请重新选择:");
    }
    /* 接受用户输入的内容 */
    if(choice == 1) {
        printf("请输入书名:");
        scanf("%s", name);
    } else if(choice == 2) {
        printf("请输入登录号:");
        scanf("%d", &id);
    }

    p = head;

    while(p->next) {
        p = p->next;
        /* 根据用户输入的内容以及选择的方式,来查找匹配数据 */ 
        if( choice == 1 && strcmp(p->name, name) == 0
        || choice == 2 && p->id == id) {
            found = 1;
            break;
        }
    }

    if(found != 1) {
        printf("没有找到符合要求的图书信息!\\n");
        return -1;
    }
    printf("登录号:");
    scanf("%d", &p->id);

    printf("书名:");
    scanf("%s", p->name);

    printf("作者名:");
    scanf("%s", p->author);

    printf("分类号:");
    scanf("%d", &p->class_id);

    printf("出版单位:");
    scanf("%s", p->unit);

    printf("出版时间[年 月 日]:");
    scanf("%d %d %d", &p->time[0], &p->time[1], &p->time[2]);

    printf("价格:");
    scanf("%f", &p->price);
    printf("已经修改!");
    return 0;
}

int main(void)
{
    int choice;
    book *head = NULL;
    read_data(&head);/* 读取数据 */
    while(1) {
        system("cls");/* 清空屏幕内容 */

        printf(
        "*********************************\\n\\n"
        "*\\t图书信息管理系统\\t*\\n"
        "*\\t\\t\\t\\t*\\n"
        "*\\t1 --- 录入图书信息\\t*\\n"
        "*\\t2 --- 查询图书信息\\t*\\n"
        "*\\t3 --- 删除图书信息\\t*\\n"
        "*\\t4 --- 修改图书信息\\t*\\n"
        "*\\t5 --- 输出全部图书信息\\t*\\n"
        "*\\t0 --- 退出并保存数据\\t*\\n"
        "*********************************\\n\\n"
        "请输入选项<0-5>:"
        );
        scanf("%d", &choice); 
        if(choice == 0) {
            break;
        }
        switch(choice) {
        case 1 : input(&head);  getch();break;
        case 2 : find(head);    getch();break;
        case 3 : delete(head);  getch();break;
        case 4 : modify(head);  getch();break;
        case 5 : output(head);  getch();break;
        }
    }
    save_data(head);
    return 0;
}
//该片段来自于http://outofmemory.cn

标签:c++,基础

收藏

0人收藏

支持

0

反对

0

发表评论