You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
5.2 KiB

2 years ago
#include <stdio.h>
#include <stdlib.h>
2 years ago
#include <string.h>
2 years ago
2 years ago
//图书存储结构
2 years ago
struct book{
2 years ago
int id;//图书编号
char name[20];//图书名称
char author[20];//图书作者
float price;//图书价格
struct book *next; // 指向下一图书
2 years ago
}*books;
2 years ago
///////////////////
// 用户界面模块 //
// 系统初始化,读取数据文件到内存
void init();
// 显示主菜单
void display_menu();
// 选择菜单命令,调用相应的功能函数
void make_choice();
// 确认操作
void confirm();
// 退出系统,释放内存,保存数据到文件
void quit();
///////////////////
// 数据处理模块 //
// 从文件读取数据到内存
void read_data();
// 保存内存数据到文件
void save_data();
// 打印图书信息
void print_data();
// 根据图书编号查询图书信息
2 years ago
struct book *find(int id);
2 years ago
// 查询图书信息
void query_data();
// 添加新图书信息
void add_data();
// 更新图书信息
void update_data();
// 删除图书信息
void delete_data();
// 对图书信息进行排序
void sort_data();
// 生成图表报表
void make_chart();
2 years ago
2 years ago
int main()
2 years ago
{
2 years ago
display_menu();
make_choice();
return 0;
2 years ago
}
void init()
{
printf("图书管理系统启动");
}
void display_menu()
{
printf("1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加\n6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出");
}
void quit()
{
char choice;
printf("确定要退出吗?(Y/N):");
scanf(" %c", &choice);
if(choice == 'Y' || choice == 'y')
{
printf("程序退出!\n");
exit(0); // 退出系统
}
else if(choice == 'N' || choice == 'n')
{
printf("退出操作已取消!\n");
}
else
{
printf("输入错误,请重新输入(Y/N):");
quit(); // 递归调用自己
}
}
2 years ago
2 years ago
// 查询图书信息
void query_data()
{
int id;
struct book *p;
printf("输入要查询的图书编号:");
scanf("%d", &id);
p = find(id); // 查找编号为id的图书
if(p != NULL)
{
printf("图书信息如下:\n");
printf("图书编号:%d\n", p->id);
printf("图书名称:%s\n", p->name);
printf("图书作者:%s\n", p->author);
printf("图书价格:%.2f\n", p->price);
}
else
{
printf("没有找到编号为%d的图书!\n", id);
}
}
2 years ago
// 打印图书信息
void print_data()
{
struct book *p;
p = books; // 从全局链表头开始
while(p != NULL)
{
printf("图书编号:%d\n", p->id);
printf("图书名称:%s\n", p->name);
printf("图书作者:%s\n", p->author);
printf("图书价格:%.2f\n", p->price);
printf("----------------------\n");
p = p->next;
}
}
2 years ago
// 更新图书信息
void update_data()
{
int id;
struct book *p;
printf("请输入要修改的图书编号:");
scanf("%d", &id);
p = find(id); // 查找编号为id的图书
if(p != NULL)
{
printf("请依次输入修改后的图书信息:\n");
printf("图书名称:");
scanf("%s", p->name);
printf("图书作者:");
scanf("%s", p->author);
printf("图书价格:");
scanf("%f", &p->price);
printf("图书信息修改成功!\n");
}
else
{
printf("没有找到编号为%d的图书!\n", id);
}
}
// 删除图书信息
void delete_data()
{
int id;
struct book *p, *q;
printf("请输入要删除的图书编号:");
scanf("%d", &id);
p = books;
q = NULL;
while(p != NULL && p->id != id)
{
q = p;
p = p->next;
}
if(p != NULL) // 找到该节点
{
if(q == NULL) // 第一个节点
books = p->next;
else
q->next = p->next;
free(p);
printf("图书信息删除成功!\n");
}
else
{
printf("没有找到编号为%d的图书!\n", id);
}
2 years ago
}
// 对图书信息进行排序
void sort_data()
{
struct book *p, *q; // 两节点指针
struct book temp; // 临时图书结构体
p = books;
while(p != NULL)
{
q = p->next;
while(q != NULL)
{
if(p->id > q->id) // 交换节点
{
temp = *p;
*p = *q;
*q = temp;
}
q = q->next;
}
p = p->next;
}
printf("图书信息排序成功!\n");
}
// 生成图表报表
void make_chart()
{
struct book *p;
char name[20];
int i, n;
float price;
printf("请输入要生成的图书数量:");
scanf("%d", &n);
for(i=1; i<=n; i++)
{
p = (struct book*)malloc(sizeof(struct book));
sprintf(name, "图书%d", i); // 生成图书名称
p->id = i; // 图书编号
strcpy(p->name, name); // 图书名称
strcpy(p->author, "作者"); // 作者
price = (i+1)*10.0; // 价格
p->price = price; // 图书价格
p->next = books; // 新节点指向原链表头
books = p; // 新节点成为链表头
}
printf("随机图书信息生成成功!\n");
2 years ago
}