某马机房预约系统 C++项目(二) 完结

news2024/11/16 23:35:10

8.4、查看机房

8.4.1、添加机房信息

根据案例,我们还是先在computerRoom.txt中直接添加点数据

//几机房  机器数量
1 20
2 50
3 100

image-20231019212836474

8.4.2、机房类创建

​ 同样我们在头文件下新建一个computerRoom.h文件

添加如下代码:

#pragma once
#include<iostream>
using namespace std;

class ComputerRoom {
public:
	//机房id
	int m_ComId;
	//机房最大容量
	int m_MaxNum;
};

8.4.3、初始化机房信息并显示

在Manager管理类下,添加机房的容器,用于保存信息

//机房容器
#include "computerRoom.h"
vector<ComputerRoom> vCom;

在Manager有参构造函数中,追加如下代码,初始化机房信息

image-20231020204646730

//获取机房信息
void Manager::getComputerNumber()
{
	// 文件名
	string computerFile = COMPUTER_FILE; // 替换为机房文件名

	ifstream  ifs;
	ifs.open(COMPUTER_FILE, ios::in);

	ComputerRoom c;

	while (ifs>>c.m_ComId && ifs>>c.m_MaxNum)
	{
		vCom.push_back(c);
	}

	cout << "当前机房数量为: " << vCom.size() << endl;

	ifs.close();
}

然后我们修改showComputer成员方法

void Manager::showComputer()
{
	cout << "机房信息如下: " << endl;
	for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end();it++) {
		cout << "机房编号:" << it->m_ComId << " 机房最大容量:" << it->m_MaxNum << endl;
	}

	system("pause");
	system("cls");
}

效果图:

image-20231020205146979

8.5、清空预约功能

接着我们来实现cleanFile成员方法

由于我们order文件中没有东西,如果需要测试可以自己添加一点

//清空预约系统
void Manager::clearFile()
{
	ofstream ofs(ORDER_FILE, ios::trunc);
	ofs.close();

	cout << "清空成功!" << endl;
	system("pause");
	system("cls");
}

9、学生模块

9.1、初始化信息

接下来我们对学生有参构造进行实现

student.cpp

//有参构造
Student::Student(int id, string name, string pwd)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Pwd = pwd;
}

9.2、菜单实现

首先添加一个学生菜单函数,在机房预约系统.cpp中添加

void studentMenu(Indentity*& student);

然后我们来实现一下具体的步骤

void Student::studentMenu(Indentity*& student)
{
	while (true)
	{
		//学生菜单
		student->operMenu();
		Student* stu = (Student*)student;

		//接受用户选项
		int select = 0;
	
		cin >> select;
		switch (select)
		{
		case 1: //申请预约
			cout << "申请预约" << endl;
			stu->applyOrder();
			break;
		case 2://查看预约
			cout << "查看预约" << endl;
			stu->showMyOrder();
			break;
		case 3://查看所有预约
			cout << "查看所有预约" << endl;
			stu->showAllOrder();
			break;
		case 4://取消预约
			cout << "取消预约" << endl;
			stu->cancelOrder();
			break;
		default:
			//注销登录
		//销毁掉堆区对象
			delete student;
			cout << "注销成功" << endl;
			system("pause");
			system("cls");
			return;

		}
	}
}

接着我们来添加一下菜单,回到student.cpp

void Student::operMenu()
{
	cout << "欢迎:" << this->m_Name << "同学登录!" << endl;
	cout << endl;
	cout << "--------------       1、申请预约      -----------------" << endl;
	cout << endl;
	cout << "--------------       2、查看预约      -----------------" << endl;
	cout << endl;
	cout << "--------------       3、查看所有预约  -----------------" << endl;
	cout << endl;
	cout << "--------------       4、取消预约      -----------------" << endl;
	cout << endl;
	cout << "--------------    输入其他数字退出    -----------------" << endl;
	cout << "-------------------------------------------------------" << endl;
	cout << "请输入序号进行操作:";

}

然后回到机房预约系统.cpp

image-20231020212638755

在这里添加方法,测试一下

image-20231020212616382

9.3、申请预约实现

然后我们也要来获取一下机房信息,在studen.h中

#include"computerRoom.h"
#include "globalFile.h"
#include<fstream>
//机房信息
vector<ComputerRoom> vCom;

回到student.cpp中的学生构造中填一下以下代码

//有参构造
Student::Student(int id, string name, string pwd)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Pwd = pwd;

	// 文件名
	string computerFile = COMPUTER_FILE; // 替换为机房文件名

	ifstream  ifs;
	ifs.open(COMPUTER_FILE, ios::in);

	ComputerRoom c;

	while (ifs >> c.m_ComId && ifs >> c.m_MaxNum)
	{
		vCom.push_back(c);
	}

	ifs.close();
}

然后我们来实现预约功能在applyOrder()中实现

void Student::applyOrder()
{
	cout << "机房开放时间为周一到周五!" << endl;
	cout << "请输入预约时间!" << endl;
	cout << "1、周一!" << endl;
	cout << "2、周二!" << endl;
	cout << "3、周三!" << endl;
	cout << "4、周四!" << endl;
	cout << "5、周五!" << endl;
	int date = 0;
	int interval = 0;
	int room = 0;

	while (true)
	{
		cin >> date;
		if (date>=1&&date<=5)
		{
			break;
		}
		cout << "输入有误,请重新输入" << endl;
	}

	cout << "请输入申请预约时间段" << endl;
	cout << "1、上午" << endl;
	cout << "2、下午" << endl;

	while (true)
	{
		cin >> interval;
		if (interval >= 1 && interval <= 2)
		{
			break;
		}
		cout << "输入有误,请重新输入" << endl;
	}

	cout << "请选择机房:" << endl;
	cout << "1号机房容量:" <<vCom[0].m_MaxNum << endl;
	cout << "2号机房容量:" << vCom[1].m_MaxNum << endl;
	cout << "3号机房容量:" << vCom[2].m_MaxNum << endl;

	while (true)
	{
		cin >> room;
		if (room>=1&&room<=3)
		{
			break;
		}
		cout << "输入有误,请重新输入" << endl;
	}

	cout << "预约成功!等待审核" << endl;

	ofstream ofs(ORDER_FILE, ios::app);
	ofs << "data:" << date << " ";
	ofs << "interval:" << interval << " ";
	ofs << "stuId:" << this->m_Id << " ";
	ofs << "stuName:" << this->m_Name << " ";
	ofs << "roomId:" << room << " ";
	ofs << "status:" << 1 << endl;;

	ofs.close();
	system("pause");
	system("cls");
}

image-20231020214550545

9.4、显示预约

接着我们来创建一个预约类,用于获取所有记录和显示,以及更新

文件名为orderFile.h 和 orderFile.cpp文件

orderFile.h

#pragma once
#include<iostream>
#include<map>
#include "globalFile.h"
#include<string>
using namespace std;

class OrderFile {
public:

	//构造函数
	OrderFile();

	//更新预约记录
	void updateOrder();

	//记录容器 key 记录条数 value -- 具体记录的键值对
	map<int, map<string, string>>m_orderData;

	//记录预约的条数
	int m_size;
};

orderFile.cpp

OrderFile::OrderFile()
{
	ifstream ifs;
	ifs.open(ORDER_FILE, ios::in);

	string date; //日期
	string interval; //时间段
	string stuId; //学生编号
	string stuName; //学生姓名
	string roomId; //机房号
	string status; //预约状态

	this->m_size = 0; //记录条数

	while (ifs>>date && ifs >> interval&&
			ifs>>stuId&&ifs>>stuName&&ifs>>roomId
			&&ifs>>status)
	{
		map<string, string> m;
		insertInfo(m, date);
		insertInfo(m, interval);
		insertInfo(m, stuId);
		insertInfo(m, stuName);
		insertInfo(m, roomId);
		insertInfo(m, status);

		//将小mpa容器放到大的map容器中
		this->m_orderData.insert(make_pair(this->m_size, m));
		this->m_size++;
		//清空小容器
		m.clear();
	}
	ifs.close();
	//测试代码
	for (map<int, map<string, string>>::iterator it = m_orderData.begin(); it != m_orderData.end(); it++) {
		cout << "条数为:" << it->first << "value = " << endl;
		for (map<string, string>::iterator mit = (*it).second.begin(); mit != it->second.end(); mit++) {
			cout << "key = " << mit->first << " value = " << mit->second << " ";
		}
		cout << endl;
	}
}
//截取字符串
void OrderFile::insertInfo(map<string, string> &m,string keys) {
	string key;
	string value;
	int pos = keys.find(":");
	if (pos != -1)
	{
		key = keys.substr(0, pos);
		value = keys.substr(pos + 1);
		m.insert(make_pair(key, value));
	}
}

9.4.1、查看自身预约

student.cpp

void Student::showMyOrder()
{
	OrderFile of;
	if (of.m_size == 0) {
		cout << "无预约记录!" << endl;
		system("pause");
		system("cls");
		return;
	}

	for (int i = 0; i < of.m_size; i++) {
		//找到自身预约
		if (this->m_Id == stoi(of.m_orderData[i]["stuId"].c_str())) {
			cout << "预约的日期:周" << of.m_orderData[i]["date"];
			cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
			cout << " 机房号:" << of.m_orderData[i]["roomId"];
			string status = " 状态: ";
			//1.审核中 2.已预约 - 1 预约失败 0 取消预约
			if (of.m_orderData[i]["status"]=="1")
			{
				status += "审核中";
			}
			else if (of.m_orderData[i]["status"] == "2") {
				status += "预约成功";

			}
			else if (of.m_orderData[i]["status"] == "-1") {
				status += "预约失败,审核未通过";
			}else{
				status += "预约已经取消";
			}
			cout << status << endl;
		}
	}
	system("pause");
	system("cls");
}

9.4.2、显示所有预约

//查看所有预约
void Student::showAllOrder()
{
	OrderFile of;
	if (of.m_size == 0) {
		cout << "无预约记录!" << endl;
		system("pause");
		system("cls");
		return;
	}
	for (int i = 0; i < of.m_size; i++) {
		cout << "预约的日期:周" << of.m_orderData[i]["date"];
		cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
		cout << " 学号:" << of.m_orderData[i]["stuId"];
		cout << " 姓名:" << of.m_orderData[i]["stuName"];
		cout << " 机房号:" << of.m_orderData[i]["roomId"];
		string status = " 状态: ";
		//1.审核中 2.已预约 - 1 预约失败 0 取消预约
		if (of.m_orderData[i]["status"] == "1")
		{
			status += "审核中";
		}
		else if (of.m_orderData[i]["status"] == "2") {
			status += "预约成功";

		}
		else if (of.m_orderData[i]["status"] == "-1") {
			status += "预约失败,审核未通过";
		}
		else {
			status += "预约已经取消";
		}
		cout << status << endl;
	}
}

9.5、取消预约

student.cpp

//取消预约
void Student::cancelOrder()
{
	OrderFile of;
	if (of.m_size == 0)
	{
		cout << "无预约记录" << endl;
		system("pause");
		system("cls");
	}
	cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;
	vector<int> v;
	int index = 1;
	for (int i = 0; i< of.m_size; i++)
	{
		if (this->m_Id == stoi(of.m_orderData[i]["stuId"])) {
			//再筛选状态 审核中或预约成功的
			if (of.m_orderData[i]["status"]=="1"||of.m_orderData[i]["Status"]=="2")
			{
				v.push_back(i);
				cout << index++ << "、";
				cout << "预约的日期:周" << of.m_orderData[i]["date"];
				cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
				cout << " 机房号:" << of.m_orderData[i]["roomId"];
				string status = " 状态: ";
				//1.审核中 2.已预约 - 1 预约失败 0 取消预约
				if (of.m_orderData[i]["status"] == "1")
				{
					status += "审核中";
				}
				else if (of.m_orderData[i]["status"] == "2") {
					status += "预约成功";

				}
				else if (of.m_orderData[i]["status"] == "-1") {
					status += "预约失败,审核未通过";
				}
				else {
					status += "预约已经取消";
				}
				cout << status << endl;
			}
		}
	}

	cout << "请输入取消的记录,0代表返回" << endl;
	int select = 0;
	while (true)
	{
		cin >> select;
		if (select>=0 && select<=v.size())
		{
			if (select==0)
			{
				break;
			}
			else {
				of.m_orderData[v[select - 1]]["status"] = "0";
				of.updateOrder();
				cout << "已经取消预约" << endl;
				break;
			}

		}
		cout << "输入有误,请重新输入" << endl;
	}
	system("pause");
	system("cls");
}

10、教师模块

10.1、教师登录和注销

10.1.1、构造函数

  • 在Teacher类的构造函数中,初始化教师信息,代码如下:
//有参构造
Teacher::Teacher(int empId, string name, string pwd)
{
	//初始化属性
	this->m_EmpId = empId;
	this->m_Name = name;
	this->m_Pwd = pwd;
}
10.1.2、教师子菜单
  • 在机房预约系统.cpp中,当用户登录的是教师,添加教师菜单接口
  • 将不同的分支提供出来
    • 查看所有预约
    • 审核预约
    • 注销登录
  • 实现注销功能

首先我们还是回到机房预约系统.cpp中,创建一个teacherMenu方法,同样的在LoginIn中创建类并链接此方法

//老师子菜单界面
void teacherMenu(Indentity*& teacher)
{
	while (true)
	{
		//学生菜单
		teacher->operMenu();
		Teacher* tea = (Teacher*)teacher;

		//接受用户选项
		int select = 0;

		cin >> select;
		switch (select)
		{
		case 1: //查看所有预约
			cout << "查看所有预约" << endl;
			tea->showAllOrder();
			break;
		case 2://审核预约
			cout << "审核预约" << endl;
			tea->validOrder();
			break;
		default:
			//注销登录
		//销毁掉堆区对象
			delete teacher;
			cout << "注销成功" << endl;
			system("pause");
			system("cls");
			return;

		}
	}
}

image-20231023214742818

teacher.cpp中 operMenu()

	cout << "欢迎:" << this->m_Name << "老师!" << endl;
	cout << endl;
	cout << "--------------       1、查看所有预约      -----------------" << endl;
	cout << endl;
	cout << "--------------       2、审核预约          -----------------" << endl;
	cout << endl;
	cout << "--------------      输入其他数字退出      -----------------" << endl;
	cout << "-------------------------------------------------------" << endl;
	cout << "请输入序号进行操作:";

10.1.2、审核预约

根据学生的申请进行审核

teacher.cpp

//审核预约
void Teacher::validOrder()
{
	OrderFile of;
	if (of.m_size == 0)
	{
		cout << "无预约记录" << endl;
		system("pause");
		system("cls");
	}
	cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;
	vector<int> v;
	int index = 1;
	for (int i = 0; i < of.m_size; i++)
	{
			//再筛选状态 审核中或预约成功的
			if (of.m_orderData[i]["status"] == "1")
			{
				v.push_back(i);
				cout << index++ << "、";
				cout << "预约的日期:周" << of.m_orderData[i]["date"];
				cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午");
				cout << " 机房号:" << of.m_orderData[i]["roomId"];
				string status = " 状态: ";
				//1.审核中 2.已预约 - 1 预约失败 0 取消预约
				if (of.m_orderData[i]["status"] == "1")
				{
					status += "审核中";
				}

				cout << status << endl;		
			}
	}
	cout << "请输入审核的预约记录,0代表返回" << endl;
	int select = 0;
	int ret = 0;
	while (true)
	{
		cin >> select;
		if (select >= 0 && select <= v.size())
		{
			if (select == 0)
			{
				break;
			}
			else {
				cout << "请输入审核结果" << endl;
				cout << "1.通过" << endl;
				cout << "2.不通过" << endl;
				cin >> ret;
				
				if (ret == 1)
				{
					of.m_orderData[v[select - 1]]["status"] = "2";
				}
				else {
					of.m_orderData[v[select - 1]]["status"] = "-1";
				}
				of.updateOrder();
				cout << "审核完毕!" << endl;
				break;
			}
		}
		cout << "输入有误,请重新输入" << endl;
	}
	system("pause");
	system("cls");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“比特币技术与链上分析:解析市场机会,掌握暴利投资策略!“

比特币再次达到 30,000 美元的感觉从来没有这么好过&#xff0c;尤其是在 25,000 美元和 27,000 美元之间波动了很长一段时间之后。 令人惊讶的是&#xff0c;这种情况发生在加密货币恐惧与贪婪指数被认为是“中性”的情况下&#xff0c;尽管它现在在转变为“贪婪”状态。 同样…

【USRP】通信基带物理层历史

无线通信的基带物理层开发历史涵盖了从早期无线技术到当前复杂的移动通信标准的各种进步。以下是关于无线通信基带物理层开发的简要历史概述&#xff1a; 无线电初期&#xff1a;20世纪初&#xff0c;Guglielmo Marconi等人通过无线电进行了早期的无线通信尝试。这些早期的尝试…

如何学会从产品经理角度去思考问题?

如何学会从产品经理角度去思考问题&#xff1f; 从产品经理的角度思考问题意味着你需要关注产品从构思到上市全过程中的各个方面&#xff0c;包括用户需求、市场趋势、设计、开发、测试、上市后的用户反馈等。以下是一些策略和方法&#xff0c;帮助你培养从产品经理角度思考问…

LeetCode刷题---简单组(一)

文章目录 &#x1f352;题目一 507. 完美数&#x1f352;解法一 &#x1f352;题目二 2678. 老人的数目&#x1f352;解法一 &#x1f352;题目三 520. 检测大写字母&#x1f352;解法一&#x1f352;解法二 &#x1f352;题目一 507. 完美数 对于一个 正整数&#xff0c;如果它…

Docker Swarm Mode

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 先看docker官网上的一句话&#xff1a;Docker Swarm mode is built into the Docker Engine. Do not confuse Docker Swarm mode with Docker Classic Swarm which is no longer actively …

香港优才计划转永居身份掏心经验以及好处分享!

香港优才计划转永居身份掏心经验以及好处分享&#xff01; 随着今年申请香港优才计划的人越来越多&#xff0c;拿到签证需要转永居身份的人也越来越多&#xff01;随之面临的问题就是&#xff1a;害怕转永居身份失败&#xff01; 当然香港优才计划申请必须满足的基本条件&#…

rust学习——泛型 (Generics)

文章目录 泛型 Generics泛型详解结构体中使用泛型枚举中使用泛型方法中使用泛型为具体的泛型类型实现方法 const 泛型&#xff08;Rust 1.51 版本引入的重要特性&#xff09;const 泛型表达式 泛型的性能 泛型 Generics Go 语言在 2022 年&#xff0c;就要正式引入泛型&#xf…

zip()并行迭代多个序列

names("猪八戒","孙悟空","沙和尚","唐僧") levels("二师兄","大师兄","三师兄")for name,level in zip(names,levels):print("{0}---{1}".format(name,level))print()for i in range(min(le…

SpringBoot整合注解式mybatis

1. 创建Spring Boot项目&#xff1a; 创建一个Spring Boot项目&#xff0c;可以使用Spring Initializer或手动创建 2. 添加依赖&#xff1a; 在pom.xml文件中&#xff0c;添加Spring Boot、MyBatis和数据库驱动程序的依赖&#xff0c;就像之前所示。 <dependencies><…

2023应届生简历模板,免费下载!

2023应届生该如何免费下载好看又实用的简历模板&#xff1f;那一定要收藏这5个简历模板网站&#xff0c;真的免费下载&#xff0c;上万个模板&#xff0c;总有适合你的。赶紧收藏起来。 150免费简历模板 文末领取&#xff01;&#xff01;&#xff01; 150免费简历模板 文末领…

基于OpenAPI、freemarker动态生成swagger文档

前言 spring项目中可以使用springfox或者springdoc&#xff0c;通过写注解的方式生成swagger文档&#xff0c;下面介绍一种不写注解&#xff0c;动态生成swagger文档的方式&#xff0c;在某些场景会适用&#xff0c;例如接口是动态生成的&#xff0c;此时swagger就不能通过注解…

使用序列化技术保存数据 改进 IO流完成项目实战水果库存系统

上一节内容是 使用IO流完成项目实战水果库存系统https://blog.csdn.net/m0_65152767/article/details/133999972?spm1001.2014.3001.5501 package com.csdn.fruit.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java…

ZYNQ7020开发(二):zynq linux系统编译

文章目录 一、编译前准备二、SDK编译三、编译步骤总结四、问题汇总 一、编译前准备 1.设置环境变量 source /opt/pkg/petalinux/2020.2/settings.sh/opt/pkg/petalinux/2020.2是上一节petalinux的安装目录 2.创建 petalinux 工程 进入petalinux安装目录(例如&#xff1a;/op…

深度学习_6_实战_直线最优解_代码解析

问题描述&#xff1a; 上述题目的意思为&#xff0c;人工造出一些数据点&#xff0c;对我们的模型y Xw b ∈进行训练&#xff0c;其中标准模型如下&#xff1a; 其中W和X都为张量&#xff0c;我们训练的模型越接近题目给出的标准模型越好 训练过程如下&#xff1a; 人造数…

文件的基本操作(创建文件,删除文件,读写文件,打开文件,关闭文件)

1.创建文件(create系统调用) 1.进行Create系统调用时&#xff0c; 需要提供的几个主要参数: 1.所需的外存空间大小&#xff08;如:一个盘块&#xff0c;即1KB) 2&#xff0e;文件存放路径&#xff08;“D:/Demo”) 3.文件名&#xff08;这个地方默认为“新建文本文档.txt”) …

部署Vue项目到githubPage中

上传Vue项目到githubPage 例如: 看我发布的地址 前提条件 1. github上有一个仓库并且仓库下有两个分支(main 和 gh-pages) 1.1 main分支保存你的vue项目源码(react或者其他框架的都行) 1.2 gh-pages分支保存的是你项目打包之后的代码(如Vue项目打包完之后是个dist包,…

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图)

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测&#xff08;多指标&#xff0c;多图&#…

会声会影2024旗舰版详细功能介绍

随着网络视频的蓬勃发展&#xff0c;越来越多的人开始涉足视频剪辑领域&#xff0c;毕竟技多不压身嘛。在众多剪辑软件中&#xff0c;剪映和会声会影是备受新手青睐的两种。那么&#xff0c;会声会影和剪映哪个好呢&#xff1f;在它们之间&#xff0c;哪一个更适合初学者呢接&a…

轻松修复缺少concrt140.dll,一键修复dll丢失问题

在电脑使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“由于找不到concrt140.dll无法继续执行代码”。这个问题可能是由于系统文件丢失、损坏或被病毒感染等原因引起的。为了解决这个问题&#xff0c;我整理了以下五个解决方案&#xff0c;希望能对…

如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板,从而能清晰的去弥补差距?

如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板&#xff0c;从而能清晰的去弥补差距&#xff1f; 获取并利用能力架构图&#xff08;Competency Model&#xff09;来了解自己在特定行业或职位中的能力缺陷和短板&#xff0c;并据此弥补差距&#xff0c;是一个非常…