图书管理系统(跑路人笔记)C实现

简介: 图书管理系统(跑路人笔记)C实现

前言

我也不知道为啥我学食品的也要学C语言,甚至下学期还要学大物绝了。

写这篇文章的原因也很简单,我见了太多来问我的同学了所以我干脆将我的代码给大家,如果你会一些C语言的话这篇文章的东西你可以的代码可以改改交上去给你省一些事情,如果你不会C语言的话,我估计也没办法了,建议改改我的菜单然后就交吧,混个及格分应该还是够的(如果要求差别不大的话)

不多说了我直接把代码贴上来也不分文件啥的了。


我实现的要求


image.png

注:博主也偷懒了比如我们的时间是直接用字符串的比较实现的虽然知道不对但是我实在懒得改了,因为我感觉我的老师也不会看有这时间不如看看C++的知识🤦‍♂️。


代码(直接复制到你的VS内即可)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define NAMEAUTHOR_MAX 30//作者名
#define NAMEBOOK_MAX 30//书名
#define PRESS_MAX 20//出版社名
#define TIME_MAX 30
#define PEOPLE_MAX 5
#define CAPACITY_SZ 5
#define ADD_SZ 3
#define CODE_MAX 30//条形码
//姓名、性别、年龄、电话、住址
typedef struct Book
{
  char name_book[NAMEBOOK_MAX];//书名
  char name_author[NAMEAUTHOR_MAX];//作者名
  char barcode[CODE_MAX];//条形码
  char press[PRESS_MAX];//出版社
  char time[TIME_MAX];//出版日期
  int price;//价格
  int inventory;//库存
}Book;//存放一个人的结构体
typedef struct contact
{
  Book* date;//动态管理需要使用指针
  int capacity;//用于存放容量
  int sz;//个数
}contact;
void InitContact(contact* pc);//初始化
void AddContact(contact* pc);//增加图书功能
void ShowContact(contact* pc);//展示所有图书功能
void SortContact(contact* pc);//排序功能的实现--包含所有排序
void DelContact(contact* pc);//删除图书功能的实现
void Clear_Every(contact* pc);//清除所有图书的实现
void DestoryContact(contact* pc);//对开辟空间进行销毁
void SearchContact(contact* pc);//查找图书
void ModifyContact(contact* pc);//改变图书信息
void SaveContact(contact* pc);//保存数据到文件中
void CheckContact(contact* pc);//内部函数用于扩容时的内存检查
void Statistics(contact* pc);//用于检索特殊情况图书
void menu()
{
  printf("*********************************\n");
  printf("*****1.ADD    2.DEL  3.SEARCH ***\n");
  printf("*****4.MODIFY 5.SHOW 6.SORT *****\n");
  printf("**  7.CLEAR_EVERY 8.Statistical *\n");
  printf("************  0.EXit  ***********\n");
  printf("*********************************\n");
  printf("*********************************\n");
}
enum Opinion
{
  EXIT,
  ADD,
  DEL,
  SEARCH,
  MODIFY,
  SHOW,
  SORT,
  CLEAR_EVERY,
  Statistical,
};
int main()
{
  contact con = { 0 };
  //结构体初始化
  InitContact(&con);
  //功能实现
  int input = 0;
  do
  {
    menu();
    printf("请输入想要的功能:>");
    scanf("%d", &input);
    switch (input)//通讯录功能
    {
    case CLEAR_EVERY:
      Clear_Every(&con);
    case ADD:
      AddContact(&con);
      break;
    case SORT:
      SortContact(&con);
      break;
    case DEL:
      DelContact(&con);
      break;
    case SHOW:
      ShowContact(&con);
      break;
    case MODIFY:
      ModifyContact(&con);
      break;
    case SEARCH:
      SearchContact(&con);
      break;
    case Statistical:
      Statistics(&con);
      break;
    case EXIT:
      SaveContact(&con);//将信息保存到文件中,关闭文件并将文件指针NULL化
      DestoryContact(&con);//动态指针NULL化free动态内存
      printf("退出成功");
      break;
    default:
      printf("输入错误\n");
      break;
    }
  } while (input);
  return 0;
}
void LoadContact(contact* pc)
{
  FILE* p = fopen("book.dat", "r");
  if (p == NULL)
  {
    perror("LoadContact");
    return;
  }
  Book tmp = { 0 };
  while (fread(&(pc->date[pc->sz]), sizeof(Book), 1, p))
  {
    pc->sz++;
    CheckContact(pc);
  }
  fclose(p);
  p = NULL;
}
void InitContact(contact* pc)
{
  assert(pc);
  pc->date = (Book*)calloc(CAPACITY_SZ, sizeof(Book));
  if (pc->date == NULL)
  {
    perror("InitContact");
    return;
  }
  pc->capacity = CAPACITY_SZ;
  pc->sz = 0;
  LoadContact(pc);
}
void CheckContact(contact* pc)
{
  if (pc->sz == pc->capacity)
  {
    Book* ptr = realloc(pc->date, sizeof(Book) * (pc->capacity + ADD_SZ));
    if (ptr != NULL)
    {
      pc->date = ptr;
      printf("增容成功\n");
      pc->capacity += ADD_SZ;
    }
    else
    {
      printf("增容失败");
      perror("CheckContact");
    }
  }
}
void AddContact(contact* pc)//增加人数
{
  CheckContact(pc);//检查通讯录是否已被占满并实现占满增加
  printf("请输入书姓名:>\n");
  scanf("%s", pc->date[pc->sz].name_book);
  printf("请输入作者名\n");
  scanf("%s", pc->date[pc->sz].name_author);
  printf("请输入序列号:>\n");
  scanf("%s", pc->date[pc->sz].barcode);
  printf("请输入出版社>:\n");
  scanf("%s", pc->date[pc->sz].press);
  printf("请输入出版时间>:\n");
  scanf("%s", pc->date[pc->sz].time);
  printf("请输入价格>:\n");
  scanf("%d", &pc->date[pc->sz].price);
  printf("请输入库存>:\n");
  scanf("%d", &pc->date[pc->sz].inventory);
  (pc->sz)++;
  printf("增加成功\n");
}
void ShowContact(contact* pc)
{
  int i = 0;
  //打印标题
  printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
  //打印数据
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d\n",
      pc->date[i].name_book,
      pc->date[i].name_author,
      pc->date[i].barcode,
      pc->date[i].press,
      pc->date[i].time,
      pc->date[i].price,
      pc->date[i].inventory);
  }
}
int cmp_code(const void* p1, const void* p2)
{
  return (strcmp(((Book*)p1)->barcode, ((Book*)p2)->barcode));
}int cmp_time(const void* p1, const void* p2)
{
  return (strcmp(((Book*)p1)->time, ((Book*)p2)->time));
}int cmp_nums(const void* p1, const void* p2)
{
  return (((Book*)p1)->inventory) - (((Book*)p2)->inventory);
}
void SortContact(contact* pc)
{
  printf("按照条形码排序输入>:1\n根据数量排序输入>:2\n根据出版时间排序输入>:3\n");
  int input = -1;
  scanf("%d", &input);
  if (input == 1)
  {
    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_code);
  }
  else if (input == 2)
  {
    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_nums);
  }
  else if (input == 3)
  {
    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_time);
  }
  printf("排序成功\n");
  ShowContact(pc);
}
int FindContact_name(contact* pc, char* name)
{
  for (int i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->date[i].name_book, name) == 0)
    {
      return i;
    }
  }
  return -1;
}
int FindContact_code(contact* pc, char* code)
{
  for (int i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->date[i].barcode, code) == 0)
    {
      return i;
    }
  }
  return -1;
}
void DelContact(contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("系统内容为空");
    return;
  }
  printf("根据书名删除选>:1\n根据条形码删除请选>:2\n");
  int input = 0;
  scanf("%d", &input);
  if (input == 1)
  {
    char name[NAMEBOOK_MAX] = { 0 };
    printf("请输入要删除书籍的姓名>:");
    scanf("%s", name);
    int pos = FindContact_name(pc, name);
    if (-1 == pos)
    {
      printf("书籍不存在\n");
      return;
    }
    int i = 0;
    for (i = pos; i < pc->sz; i++)
    {
      pc->date[i] = pc->date[i + 1];
    }
    pc->sz--;
    printf("删除成功\n");
  }
  else if (input == 2)
  {
    char code[CODE_MAX] = { 0 };
    printf("请输入要删除书籍的条形码>:");
    scanf("%s", code);
    int pos = FindContact_code(pc, code);
    if (-1 == pos)
    {
      printf("书籍不存在\n");
      return;
    }
    int i = 0;
    for (i = pos; i < pc->sz; i++)
    {
      pc->date[i] = pc->date[i + 1];
    }
    pc->sz--;
    printf("删除成功\n");
  }
  else
  {
    printf("输入失败\n");
  }
}
void ModifyContact(contact* pc)
{
  printf("根据序号表请输入>:1\n根据书名请输入>:2\n");
  int por = -1;
  int input = 0;
  scanf("%d", &input);
  if (input == 2)
  {
    printf("请输入要改变书的姓名>:\n");
    char name[NAMEBOOK_MAX] = { 0 };
    scanf("%s", name);
    por = FindContact_name(pc, name);
  }
  else if (input == 1)
  {
    printf("请输入要改变书的姓名>:\n");
    char code[CODE_MAX] = { 0 };
    scanf("%s", code);
    por = FindContact_name(pc, code);
  }
  else
  {
    printf("输入失败\n");
    return;
  }
  if (-1 == por)
  {
    printf("书不存在\n");
    return;
  }
  printf("请重新输入改后的信息\n");
  printf("请输入书姓名:>\n");
  scanf("%s", pc->date[por].name_book);
  printf("请输入作者名\n");
  scanf("%s", pc->date[por].name_author);
  printf("请输入序列号:>\n");
  scanf("%s", pc->date[por].barcode);
  printf("请输入出版社>:\n");
  scanf("%s", pc->date[por].press);
  printf("请输入出版时间>:\n");
  scanf("%s", pc->date[por].time);
  printf("请输入价格>:\n");
  scanf("%d", &pc->date[por].price);
  printf("请输入库存>:\n");
  scanf("%d", &pc->date[por].inventory);
  printf("改变成功\n");
}
int FindContact_name_au(contact* pc, char* name_au)
{
  for (int i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->date[i].name_author, name_au) == 0)
    {
      return i;
    }
  }
  return -1;
}
int FindContact_press(contact* pc, char* press)
{
  for (int i = 0; i < pc->sz; i++)
  {
    if (strcmp(pc->date[i].name_book, press) == 0)
    {
      return i;
    }
  }
  return -1;
}
void SearchContact(contact* pc)
{
  printf("根据条形码请输入>:1\n根据书名请输入>:2\n根据作者名请输入>: 3\n根据出版社请输入>: 4\n");
  int input = 0;
  scanf("%d", &input);
  if (input == 2)
  {
    printf("请输入书的姓名>:\n");
    char name[NAMEBOOK_MAX] = { 0 };
    scanf("%s", name);
    int sum = 0;
    for (int i = 0; i < pc->sz; i++)
    {
      if (strcmp(pc->date[i].name_book, name) == 0)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
        sum++;
        printf("\n");
      }
    }
    printf("符合情况的有%d种\n", sum);
  }
  else if (input == 1)
  {
    printf("请输入书的序号>:\n");
    char code[CODE_MAX] = { 0 };
    scanf("%s", code);
    int sum = 0;
    for (int i = 0; i < pc->sz; i++)
    {
      if (strcmp(pc->date[i].barcode, code) == 0)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
        sum++;
        printf("\n");
      }
    }
    printf("符合情况的有%d种\n", sum);
  }
  else if (input == 3)
  {
    printf("请输入书的作者名>:\n");
    char auname[NAMEAUTHOR_MAX] = { 0 };
    scanf("%s", auname);
    int sum = 0;
    for (int i = 0; i < pc->sz; i++)
    {
      if (strcmp(pc->date[i].name_author, auname) == 0)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
        sum++;
        printf("\n");
      }
    }
    printf("符合情况的有%d种\n", sum);
  }
  else if (input == 4)
  {
    printf("请输入出版社名称>:\n");
    char press[PRESS_MAX] = { 0 };
    scanf("%s", press);
    int sum = 0;
    for (int i = 0; i < pc->sz; i++)
    {
      if (strcmp(pc->date[i].press, press) == 0)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
        sum++;
        printf("\n");
      }
    }
    printf("符合情况的有%d种\n", sum);
  }
  else
  {
    printf("未找到该指令\n");
    return;
  }
}
void DestoryContact(contact* pc)
{
  free(pc->date);
  pc->date = NULL;
  pc->sz = 0;
  pc->capacity = 0;
}
void SaveContact(contact* pc)
{
  FILE* p = fopen("book.dat", "w");
  if (p == NULL)
  {
    perror("SaveContact");
    return;
  }
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    fwrite(pc->date + i, sizeof(Book), 1, p);
  }
  fclose(p);
  p = NULL;
}
void Clear_Every(contact* pc)
{
  assert(pc);
  printf("您确定吗?\n输入1以确定您的选择\n");
  int input = 0;
  scanf("%d", &input);
  if (1 == input)
  {
    pc->date = (Book*)calloc(CAPACITY_SZ, sizeof(Book));
    if (pc->date == NULL)
    {
      perror("Clear_Every");
      return;
    }
    pc->capacity = CAPACITY_SZ;
    pc->sz = 0;
    printf("清除成功");
  }
  else
  {
    printf("信息还在\n");
    return;
  }
}
void Statistics(contact* pc)
{
  printf("统计馆藏数量小于某值请输入>:1\n统计出版日期早于某个值的输入>:2");
  int input = 0;
  scanf("%d", &input);
  if (input == 1)
  {
    int num = 0;
    printf("请输入值\n");
    scanf("%d", &num);
    for (int i = 0; i < pc->sz; i++)
    {
      if (pc->date[i].inventory < num)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
      }
    }
  }
  else if (input == 2)
  {
    char time[TIME_MAX] = { 0 };
    printf("请输入时间\n");
    scanf("%s", time);
    for (int i = 0; i < pc->sz; i++)
    {
      if (strcmp(time, pc->date[i].time) > 0)
      {
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-5s\t%-5s\t%-10s\n", "书名", "作者名", "条形码", "出版社", "出版日期", "定价", "馆藏数量");
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-10s\t%-5d\t%-10d",
          pc->date[i].name_book,
          pc->date[i].name_author,
          pc->date[i].barcode,
          pc->date[i].press,
          pc->date[i].time,
          pc->date[i].price,
          pc->date[i].inventory);
      }
    }
  }
  else
  {
    printf("输入错误");
  }
}

ok,代码也不多大家应该直接复制到VS上就可以用,如果有运行错误可以找我,我会进行更改的,如果是想让我帮忙写东西的话,要收费的😁。

结尾

这次的博客主要是给写大学生作业的人看的,没有多少技术含量。

相关文章
|
Linux
百度搜索:蓝易云 ,Centos7系统wget 的安装与使用详细教程。
以上是在CentOS 7系统上安装和使用wget的详细教程。确保按照步骤操作,并根据您的需求进行必要的修改和调整。
352 0
Echarts2.0雷达图tooltip单轴数据
Echarts2.0雷达图tooltip单轴数据
398 0
|
机器学习/深度学习 人工智能 自然语言处理
撒花!PyTorch 官方教程中文版正式上线,激动人心的大好事!
撒花!PyTorch 官方教程中文版正式上线,激动人心的大好事!
1264 0
撒花!PyTorch 官方教程中文版正式上线,激动人心的大好事!
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2725 0
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用
【9月更文挑战第17天】本文主要介绍了AI技术在自然语言处理(NLP)领域的应用,包括文本分类、情感分析、机器翻译和语音识别等方面。通过实例展示了AI技术如何帮助解决NLP中的挑战性问题,并讨论了未来发展趋势。
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....
255 2
|
安全 网络安全 数据安全/隐私保护
装机安全:从细节做起,构建安全无忧的数字基石
装机安全是构建安全无忧的数字基石的重要保障。从装机前的准备到硬件组装、系统设置、软件安装及后期维护等各个环节都需要我们高度重视并采取相应的安全措施。只有从细节做起,才能确保计算机的稳定运行和数据的安全可靠。希望本文能为广大计算机用户提供有益的参考和借鉴,共同营造一个更加安全、便捷的数字环境。
|
XML Java Maven
log4j 日志的简单使用
这篇文章介绍了Log4j日志框架的基本使用方法,包括在Maven项目中添加依赖、配置`log4j.properties`文件以及在代码中创建和使用Logger对象进行日志记录,但实际打印结果中日志级别没有颜色显示。
log4j 日志的简单使用
|
缓存 安全 网络安全
|
数据采集 数据挖掘 数据处理
DataFrame 的缺失值处理:填充、删除与插值
【5月更文挑战第19天】DataFrame数据处理中,面对缺失值问题,常用方法包括填充(如固定值、平均值)和删除。插值是一种有效手段,如线性插值适合时间序列数据。根据数据特性和分析目标,可组合使用多种方法,如先填充再插值。灵活应用这些策略能提升数据质量和分析准确性,为决策提供可靠支持。
612 2