轻松学做C语言课程设计:图书管理系统-数组实现

C语言课程设计,对于初学者来说,主要是综合运用C语言基础知识,以实际项目的形式锻炼编程能力。从今天开始,一起轻松学做C语言课程设计常见项目,建议先运行代码,再一步步理解其实现。

题目要求

图书管理系统提供图书信息管理以及借还管理。图书信息至少包括:图书编号、书名、价格、作者、借还状态,提供以下功能:

  • 1.增加图书信息,录入;

  • 2.查询已有的所有图书信息;

  • 3.删除图书;

  • 4.修改图书信息;

  • 5.借阅图书;

  • 6.归还图书;

  • 7.退出;

实现要点

  • 该要求较为简单,可采用结构数组实现

  • 使用文件保存图书信息;

  • 图书借还状态使用整数保存,1表示已还,0表示借出;

备注:初学者掌握数组、链表、文件这几种方式即可,对于计算机专业,学过数据结构课程的学生,还可以用二叉树等方式实现更多功能。

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

编程环境

  • 采用Dev-C++集成开发环境;

  • 涉及C语言知识点:结构、数组、枚举、函数、文件读写;

源代码

#include <stdio.h>
#include <stdlib.h>
*/
// 书本最大数量
#define BOOK_NUM   200  
// 书名最大长度
#define NAME_LEN   60    
// 作者姓名最大长度
#define AUTHOR_LEN 60  
// 结构保存书本信息
typedef struct {
  // 编号
  int    id;
  // 书名
  char  name[NAME_LEN];
  // 价格
  double  price;
  // 作者
  char    author[AUTHOR_LEN];
  // 借出状态,1表示借出,0表示未借出
  int   state;
} BOOK;
/* 全局数组保存图书 */
BOOK books[BOOK_NUM];
/* 当前书本数量 */
int book_sum = 0;
/*
  定义功能函数,实现图书信息的增加、删除、修改、查阅、借还等功能。
*/
// 显示功能菜单
void showMenu();  
// 添加图书信息 
void addBook();  
// 查看图书信息 
void queryBook(); 
// 删除图书信息 
void deleteBook();  
// 修改图书信息 
void updateBook();   
// 借书
void borrowBook();  
// 还书
void returnBook();  
// 保存图书信息到文件books.txt
void saveBook();  
// 读取文件books.txt到全局数组books
void readBook();  
// 在屏幕显示各类出错信息,并退出程序
void error(const char* err);  
/*
  定义字符数组,暂存每行输入
*/
char a[1024];

int main() {
  // 当文件books.txt已有图书信息时
  // 先全部读取所有书本信息
  readBook();   
  showMenu();      // 显示功能主菜单 
  while (1) {
    printf("\n请输出0-6,回车结束!\n");
    if (fgets(a, 1024, stdin) != NULL) {  // 按行读取,0-6字符表示功能
      switch (a[0]) {
      case '0':    // 退出程序 
        printf("ByeBye,下次再见!\n");
        exit(0);
      case '1':    // 添加图书
        addBook();
        break;
      case '2':    // 查看图书
        queryBook();
        break;
      case '3':    // 删除图书
        deleteBook();
        break;
      case '4':    // 修改图书
        updateBook();
        break;
      case '5':    // 借书
        borrowBook();
        break;
      case '6':    // 还书 
        returnBook();
        break;
      default:
        printf("请重新输入正确的功能数字0-6!\n");
      }
    }
  }
  return 0;
}

void showMenu() {
  printf("----------欢迎使用图书管理系统----------\n\n");
  printf("当前系统共用图书%d本!\n\n", book_sum);
  printf("系统提供以下功能:\n");
  printf("1:添加图书\n");
  printf("2:查看图书\n");
  printf("3:删除图书\n");
  printf("4:修改图书\n");
  printf("5:借阅图书\n");
  printf("6:归还图书\n");
  printf("0:退出系统\n\n");
}

void addBook() {
  if (book_sum >= BOOK_NUM) {
    printf("抱歉,图书已达最大数量,无法增加图书!\n");
    return;
  }
  printf("请您按提示添加图书信息:\n");
  printf("依次输入编号 书名 价格 作者信息,以空格分隔:\n");
  
  if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%d%s%lf%s", &books[book_sum].id, books[book_sum].name, \
    & books[book_sum].price, books[book_sum].author) != EOF) {
    int is_find = -1;  // 根据编号查找图书信息,如果编号已存在,则无法增加 
    int i = 0;
    for (i = 0; i < book_sum; i++)
    {
      if (books[i].id == books[book_sum].id)
      {
        is_find = i;
        break;
      }
    }

    if (is_find != -1)
      printf("该编号对应的图书信息已经存在,无法增加!\n");
    else {
      books[book_sum].state = 1;
      book_sum++;
      saveBook();
      printf("添加成功,当前共有%d本图书!\n\n", book_sum);
    }
  }
  else {
    error("输入有误,请重新添加!\n");
  }
}

void queryBook() {
  printf("图书编号                 书名     价格     作者 借阅状态\n");
  if (book_sum == 0)
    printf("当前书库没有图书,请先增加图书!\n");
  int i;
  for (i = 0; i < book_sum; i++) {
    printf("%8d %20s %8.2f %8s %8s\n", books[i].id, books[i].name, books[i].price, \
      books[i].author, (books[i].state == 1 ? "1-未借出" : "0-已借出"));
  }
}

void deleteBook() {
  printf("请输入要删除的图书编号:");
  int id = 0;      // 临时存放输入的编号 
  int is_find = -1;  // 根据编号查找图书信息,查到以后存放的数组位置 
  if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%d", &id) != EOF) {
    int i = 0;
    for (i = 0; i < book_sum; i++)
    {
      if (books[i].id == id)
      {
        is_find = i;
        break;
      }
    }
    if (is_find == -1)
      printf("该编号对应的图书信息不存在!\n");
    else {
      // 删除is_find位置的图书信息,并将后面的图书信息前移 
      if (is_find == book_sum - 1)
        book_sum--;
      else {
        int i;
        for (i = is_find; i < book_sum; i++)
          books[i] = books[i + 1];
        book_sum--;
      }
      saveBook();
      printf("该编号%d对应的图书信息删除成功!\n", id);
    }
  }
  else {
    error("输入有误,请重新输入!\n");
  }
}

void updateBook() {
  printf("请输入要修改的图书编号:");
  int id = 0;      // 临时存放输入的编号 
  int is_find = -1;  // 根据编号查找图书信息,查到以后存放的数组位置 
  if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%d", &id) != EOF) {
    int i;
    for (i = 0; i < book_sum; i++)
    {
      if (books[i].id == id)
      {
        is_find = i;
        break;
      }
    }
    if (is_find == -1)
      printf("该编号对应的图书信息不存在!\n");
    else {
      printf("该编号对应的图书信息如下,请按照提示修改:\n");
      printf("图书编号                 书名     价格     作者 借阅状态\n");
      printf("%8d %20s %8.2f %8s %8s\n\n", books[is_find].id, books[is_find].name, books[is_find].price, \
        books[is_find].author, (books[is_find].state == 1 ? "未借出" : "已借出"));
      printf("依次输入修改后的书名、价格、作者信息,以空格分隔:\n");
      if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%s%lf%s", books[is_find].name, &books[is_find].price, books[is_find].author) != EOF) {
        saveBook();
        printf("修改成功,修改后的图书信息如下:\n");
        printf("图书编号                 书名     价格     作者 借阅状态\n");
        printf("%8d %20s %8.2f %8s %8s\n", books[is_find].id, books[is_find].name, books[is_find].price, \
          books[is_find].author, (books[is_find].state == 1 ? "未借出" : "已借出"));
      }
      else {
        error("输入有误,请重新修改!\n");
      }
    }
  }
  else {
    error("输入有误,请重新输入!\n");
  }
}
void borrowBook() {
  printf("请输入要借阅的图书编号:");
  int id = 0;      // 临时存放输入的编号 
  int is_find = -1;  // 根据编号查找图书信息,查到以后存放的数组位置 
  if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%d", &id) != EOF) {
    int i;
    for (i = 0; i < book_sum; i++)
    {
      if (books[i].id == id)
      {
        is_find = i;
        break;
      }
    }
    if (is_find == -1)
      printf("该编号对应的图书信息不存在!\n");
    else {
      printf("该编号对应的图书信息如下:\n");
      printf("图书编号                 书名     价格     作者 借阅状态\n");
      printf("%8d %20s %8.2f %8s %8s\n", books[is_find].id, books[is_find].name, books[is_find].price, \
        books[is_find].author, (books[is_find].state == 1 ? "1-未借出" : "0-已借出"));
      if (books[is_find].state == 0)
        printf("该编号对应的图书已借出,请归还后再借阅!\n");
      else {
        books[is_find].state = 0;
        saveBook();
        printf("该编号对应的图书借阅成功!\n");
      }
    }

  }
  else {
    error("输入有误,请重新输入!\n");
  }
}

void returnBook() {
  printf("请输入要归还的图书编号:");
  int id = 0;      // 临时存放输入的编号 
  int is_find = -1;  // 根据编号查找图书信息,查到以后存放的数组位置 
  if (fgets(a, 1024, stdin) != NULL && sscanf(a, "%d", &id) != EOF) {
    int i;
    for (i = 0; i < book_sum; i++)
    {
      if (books[i].id == id)
      {
        is_find = i;
        break;
      }
    }
    if (is_find == -1)
      printf("该编号对应的图书信息不存在!\n");
    else {
      printf("该编号对应的图书信息如下:\n");
      printf("图书编号                 书名     价格     作者 借阅状态\n");
      printf("%8d %20s %8.2f %8s %8s\n", books[is_find].id, books[is_find].name, books[is_find].price, \
        books[is_find].author, (books[is_find].state == 1 ? "1-未借出" : "0-已借出"));
      if (books[is_find].state == 1)
        printf("该编号对应的图书未借出,无法归还!\n");
      else {
        books[is_find].state = 1;
        saveBook();
        printf("该编号对应的图书归还成功!\n");
      }
    }
  }
  else {
    error("输入有误,请重新输入!\n");
  }
}

void saveBook() {
  FILE* fp = fopen("book.txt", "w+");
  if (fp != NULL) {
    /*
     *按行写入每本书信息到数组
     */
    int i;
    for (i = 0; i < book_sum; i++)
      if (fprintf(fp, "%d %s %f %s %d\n", books[i].id, books[i].name, \
        books[i].price, books[i].author, books[i].state) == EOF) {
        fclose(fp);
        error("写入book.txt文件失败,请检查!\n");
      }
    if (fclose(fp) == EOF)
      error("关闭book.txt文件失败,请检查!\n");
  }
  else {
    error("打开book.txt文件失败,请检查!\n");
  }
}

void readBook() {
  FILE* fp = fopen("book.txt", "a+");
  if (fp != NULL) {
    /*
     *按行读取每本书信息到数组,并且统计书本数量信息
     */
    int i = 0;
    while ((i < BOOK_NUM) && (fscanf(fp, "%d%s%lf%s%d", &books[i].id, books[i].name, \
      & books[i].price, books[i].author, &books[i].state) != EOF)) {
      i++;
    }
    book_sum = i;
    if (fclose(fp) == EOF)
      error("关闭book.txt文件失败,请检查!\n");
  }
  else {
    error("打开book.txt文件失败,请检查!\n");
  }
}

void error(const char* err) {
  printf(err);
  exit(-1);
}

运行结果:

----------欢迎使用图书管理系统----------
当前系统共用图书3本!
系统提供以下功能:
1:添加图书
2:查看图书
3:删除图书
4:修改图书
5:借阅图书
6:归还图书
0:退出系统

请输出0-6,回车结束!
2
图书编号                 书名     价格     作者 借阅状态
       1               test02    10.00 zhangsan1 1-未借出
       2               test01    11.01    kdkal 1-未借出
       4                 kdkd   100.11  kdkalal 1-未借出

请输出0-6,回车结束!
4
请输入要修改的图书编号:3
该编号对应的图书信息不存在!

请输出0-6,回车结束!
3
请输入要删除的图书编号:1
该编号1对应的图书信息删除成功!

请输出0-6,回车结束!
2
图书编号                 书名     价格     作者 借阅状态
       2               test01    11.01    kdkal 1-未借出
       4                 kdkd   100.11  kdkalal 1-未借出

请输出0-6,回车结束!

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

  • 4
    点赞
  • 0
    评论
  • 25
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值