文章目录
前言
我也不知道为啥我学食品的也要学C语言,甚至下学期还要学大物绝了。
写这篇文章的原因也很简单,我见了太多来问我的同学了所以我干脆将我的代码给大家,如果你会一些C语言的话这篇文章的东西你可以的代码可以改改交上去给你省一些事情,如果你不会C语言的话,我估计也没办法了,建议改改我的菜单然后就交吧,混个及格分应该还是够的(如果要求差别不大的话)
不多说了我直接把代码贴上来也不分文件啥的了。
我实现的要求
注:博主也偷懒了比如我们的时间是直接用字符串的比较实现的虽然知道不对但是我实在懒得改了,因为我感觉我的老师也不会看有这时间不如看看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)