forked from m8mvbo72w/test
Merge branch 'master' of https://bdgit.educoder.net/pzghsoly5/test
commit
227ba9dba8
@ -0,0 +1,413 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
//图书存储结构
|
||||||
|
struct book{
|
||||||
|
int id;//图书编号
|
||||||
|
char name[20];//图书名称
|
||||||
|
char author[20];//图书作者
|
||||||
|
float price;//图书价格
|
||||||
|
struct book *next; // 指向下一图书
|
||||||
|
}*books;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// 用户界面模块 //
|
||||||
|
|
||||||
|
// 系统初始化,读取数据文件到内存
|
||||||
|
void init();
|
||||||
|
// 显示主菜单
|
||||||
|
void display_menu();
|
||||||
|
// 选择菜单命令,调用相应的功能函数
|
||||||
|
void make_choice();
|
||||||
|
// 确认操作
|
||||||
|
void confirm();
|
||||||
|
// 退出系统,释放内存,保存数据到文件
|
||||||
|
void quit();
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// 数据处理模块 //
|
||||||
|
|
||||||
|
// 从文件读取数据到内存
|
||||||
|
void read_data();
|
||||||
|
// 保存内存数据到文件
|
||||||
|
void save_data();
|
||||||
|
// 打印图书信息
|
||||||
|
void print_data();
|
||||||
|
// 根据图书编号查询图书信息
|
||||||
|
book *find(int id);
|
||||||
|
// 查询图书信息
|
||||||
|
void query_data();
|
||||||
|
// 添加新图书信息
|
||||||
|
void add_data();
|
||||||
|
// 更新图书信息
|
||||||
|
void update_data();
|
||||||
|
// 删除图书信息
|
||||||
|
void delete_data();
|
||||||
|
// 对图书信息进行排序
|
||||||
|
void sort_data();
|
||||||
|
// 生成图表报表
|
||||||
|
void make_chart();
|
||||||
|
|
||||||
|
|
||||||
|
/////////////
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
display_menu();
|
||||||
|
make_choice();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 用户界面模块 //
|
||||||
|
// 系统初始化,读取数据文件到内存
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
read_data();
|
||||||
|
}
|
||||||
|
// 显示主菜单
|
||||||
|
void display_menu()
|
||||||
|
{
|
||||||
|
printf("*************************\n");
|
||||||
|
printf("***** 图书管理系统 *****\n");
|
||||||
|
printf("*************************\n");
|
||||||
|
printf("1. 打印图书信息\n");
|
||||||
|
printf("2. 查询图书信息\n");
|
||||||
|
printf("3. 添加新图书\n");
|
||||||
|
printf("4. 更新图书信息\n");
|
||||||
|
printf("5. 删除图书信息\n");
|
||||||
|
printf("6. 对图书排序\n");
|
||||||
|
printf("7. 生成图表报表\n");
|
||||||
|
printf("0. 退出系统\n");
|
||||||
|
printf("请选择:");
|
||||||
|
}
|
||||||
|
// 选择菜单命令,调用相应的功能函数
|
||||||
|
void make_choice()
|
||||||
|
{
|
||||||
|
int choice;
|
||||||
|
scanf("%d", &choice);
|
||||||
|
confirm();
|
||||||
|
switch(choice)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
print_data(); // 打印图书信息
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
query_data(); // 查询图书信息
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
add_data(); // 添加新图书
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
update_data();// 更新图书信息
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
delete_data();// 删除图书信息
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
sort_data(); // 对图书排序
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
make_chart(); // 生成图表报表
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
quit(); // 退出系统
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("无效选择,请重新选择:");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 确认操作
|
||||||
|
void confirm()
|
||||||
|
{
|
||||||
|
char choice;
|
||||||
|
|
||||||
|
printf("您确定要执行该操作吗?(Y/N):");
|
||||||
|
scanf(" %c", &choice);
|
||||||
|
|
||||||
|
if(choice == 'Y' || choice == 'y')
|
||||||
|
{
|
||||||
|
printf("操作成功执行!\n");
|
||||||
|
}
|
||||||
|
else if(choice == 'N' || choice == 'n')
|
||||||
|
{
|
||||||
|
printf("操作已取消!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("输入错误,请重新输入(Y/N):");
|
||||||
|
confirm(); // 递归调用自己
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 退出系统,释放内存,保存数据到文件
|
||||||
|
void quit()
|
||||||
|
{
|
||||||
|
char choice;
|
||||||
|
|
||||||
|
printf("您确定要退出系统吗?(Y/N):");
|
||||||
|
scanf(" %c", &choice);
|
||||||
|
|
||||||
|
if(choice == 'Y' || choice == 'y')
|
||||||
|
{
|
||||||
|
save_data(); // 保存数据到文件
|
||||||
|
printf("数据已保存,系统退出!\n");
|
||||||
|
exit(0); // 退出系统
|
||||||
|
}
|
||||||
|
else if(choice == 'N' || choice == 'n')
|
||||||
|
{
|
||||||
|
printf("退出操作已取消!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("输入错误,请重新输入(Y/N):");
|
||||||
|
quit(); // 递归调用自己
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 数据处理模块//
|
||||||
|
// 从文件读取数据到内存
|
||||||
|
void read_data()
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
struct book *head, *p;
|
||||||
|
|
||||||
|
if((fp = fopen("books.dat", "rb")) == NULL)
|
||||||
|
{
|
||||||
|
printf("打开数据文件失败!\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
head = NULL;
|
||||||
|
while(!feof(fp))
|
||||||
|
{
|
||||||
|
p = (struct book*)malloc(sizeof(struct book));
|
||||||
|
fread(p, sizeof(struct book), 1, fp);
|
||||||
|
p->next = head;
|
||||||
|
head = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp); // 关闭文件
|
||||||
|
|
||||||
|
// 将链表的头指针作为全局变量,供其他函数使用
|
||||||
|
books = head;
|
||||||
|
}
|
||||||
|
// 保存内存数据到文件
|
||||||
|
void save_data()
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
struct book *p;
|
||||||
|
|
||||||
|
if((fp = fopen("books.dat", "wb")) == NULL)
|
||||||
|
{
|
||||||
|
printf("打开数据文件失败!\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
p = books; // 从全局链表头开始
|
||||||
|
while(p != NULL)
|
||||||
|
{
|
||||||
|
fwrite(p, sizeof(struct book), 1, fp);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 打印图书信息
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 根据图书编号查询图书信息
|
||||||
|
book *find(int id)
|
||||||
|
{
|
||||||
|
struct book *p;
|
||||||
|
|
||||||
|
p = books; // 从全局链表头开始
|
||||||
|
while(p != NULL)
|
||||||
|
{
|
||||||
|
if(p->id == id)
|
||||||
|
return p; // 返回找到的图书指针
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
return NULL; // 未找到返回空指针 *p;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
// 查询图书信息
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 添加新图书信息
|
||||||
|
void add_data()
|
||||||
|
{
|
||||||
|
struct book *p, *q;
|
||||||
|
|
||||||
|
p = (struct book*)malloc(sizeof(struct book));
|
||||||
|
|
||||||
|
printf("请依次输入图书信息:\n");
|
||||||
|
printf("图书编号:");
|
||||||
|
scanf("%d", &p->id);
|
||||||
|
printf("图书名称:");
|
||||||
|
scanf("%s", p->name);
|
||||||
|
printf("图书作者:");
|
||||||
|
scanf("%s", p->author);
|
||||||
|
printf("图书价格:");
|
||||||
|
scanf("%f", &p->price);
|
||||||
|
|
||||||
|
q = books;
|
||||||
|
while(q != NULL && p->id > q->id)
|
||||||
|
q = q->next;
|
||||||
|
|
||||||
|
p->next = q; // 指向下一个节点
|
||||||
|
books = p; // 新节点成为链表头
|
||||||
|
|
||||||
|
printf("图书信息添加成功!\n");
|
||||||
|
}
|
||||||
|
// 更新图书信息
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 对图书信息进行排序
|
||||||
|
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");
|
||||||
|
}
|
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,29 @@
|
|||||||
|
<mxfile host="65bd71144e">
|
||||||
|
<diagram id="u_L9P898_jSC_YZIsbOk" name="µÚ 1 Ò³">
|
||||||
|
<mxGraphModel dx="832" dy="568" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0"/>
|
||||||
|
<mxCell id="1" parent="0"/>
|
||||||
|
<mxCell id="4" style="edgeStyle=none;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;" edge="1" parent="1" source="3">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="255" y="170" as="targetPoint"/>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="3" value="printf_data" style="rhombus;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=20;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="150" y="30" width="210" height="80" as="geometry"/>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="6" style="edgeStyle=none;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;" edge="1" parent="1" source="5">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="245" y="280" as="targetPoint"/>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="5" value="for i = 1 to num_parts" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=20;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="120" y="180" width="250" height="40" as="geometry"/>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="7" value="´òӡͼÊéµÄË÷ÊéºÅ" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=20;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="150" y="290" width="190" height="40" as="geometry"/>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 64 KiB |
Loading…
Reference in new issue