求设计一个股票交易系统编程 用C++编写的 要求如下:

2024-05-12

1. 求设计一个股票交易系统编程 用C++编写的 要求如下:

定投指数型基金:大成沪深300后端收费,现在可以确定的是,股市指数在未来三年是上涨的,所以盈利也是必然的。

求设计一个股票交易系统编程 用C++编写的 要求如下:

2. 想用C++自己编一个选股票的程序,怎么搞?

每个股票软件都有可以选股的外挂,你仔细阅读软件提供的说明书即可获取接口,进行自定义编程选股。

3. 使用c++代码做个个人财政支出管理系统

你在做梦?这个程序起码值几钱快

使用c++代码做个个人财政支出管理系统

4. c语言个人股票管理系统,只要运行结果和分析,有吗?亲

给个邮箱

发给你

5. 个人账务管理系统 用C或者C++设计,拜托要尽量详尽。

/ / / / / / / / / / / / / / / / / / / / / / / / / 
这是我大二的数据结构课堂作业,而现在的电脑放在给你,它应该符合你的老师的要求。编译环境是VC + + 6.0 
如果你不使用的话,问题补充说,“患者”是暂时的,我给你了,随便写,你不会失去命令要求我看明白例子。 
 / ********************************************* ******************** / 
 
包括 
包括是否</ #包括 
#包括 
#包括WINDOWS.H> 
 
 
 / /清除当前的屏幕...... />#ClearScreen()系统(“CLS”)
 
 / /显示字符串szPrompt并等待用户按任意键
定义暂停(szPrompt),printf(“请% “,szPrompt)参考getch()
 
类型定义结构carinformation的/ /车辆信息
 {
字符szRegistrationMark [64]; /?? /车牌号
 >和字符szArrivalTime [16]; / /到达时间
字符szEntranceTime [16]; / /进入停车场开始计费的时间
字符szDepartureTime [16]; / /发车时间 BR />} TCARINFORMATION,LPTCARINFORMATION; 
 
 
 typedef结构carstack的
 {
 LPTCARINFORMATION lpCarInformation; / /车辆信息
诠释NTOP / /顶部的元素的下标
诠释nStackSize / /堆栈容量
} TCARSTACK,* LPTCARSTACK; 
 
 > / /初始化堆栈lpCarStack的,它的容量设置为n大小
无效InitStack(LPTCARSTACK lpCarStack,n大小)
 {
 lpCarStack =(LPTCARSTACK)的malloc(sizeof(TCARSTACK)的); 
 lpCarStack - > lpCarInformation =( LPTCARINFORMATION)的malloc(
 n大小sizeof(TCARINFORMATION)的
)
 lpCarStack - > NTOP = -1; 
 lpCarStack - > nStackSize = n大小; 
} 
 
 
 / /车辆信息carinfo堆栈lpCarStack 
无效的Push(LPTCARSTACK lpCarStack TCARINFORMATION carinfo)
 {
 lpCarStack - > NTOP + +; 
 > lpCarStack lpCarInformation [lpCarStack - > NTOP] = carinfo; 
} 
 
 
 / /车辆信息从堆栈中lpCarStack,流行的和存款carinfo的
 “无效流行(LPTCARSTACK lpCarStack TCARINFORMATION carinfo)
 {
 carinfo = lpCarStack - > lpCarInformation [lpCarStack - > NTOP]; 
 lpCarStack - > NTOP - ;} 
 
 
 
 / /如果堆栈lpCarstack是空的??,则返回TRUE,否则返回FALSE 
的BOOL IsStackEmpty(LPTCARSTACK lpCarStack)
 
返回lpCarStack - > NTOP = = -1; 
} 
 
 
 / /堆栈lpStackFull的完整的,则返回TRUE,否则返回FALSE 
,BOOL IsStackFull(LPTCARSTACK lpCarStack)
 { BR />的回报lpCarStack - > NTOP ==(lpCarStack - > nStackSize - 1); 
} 
 
 
 / /被破坏的堆栈lpCarStack,设置为NULL指针lpCarStack  BR />的的无效DestroyStack(LPTCARSTACK lpCarStack)
 {
免费(lpCarStack - > lpCarInformation); 
免费(lpCarStack); 
 lpCarStack = NULL; 
}  BR /> 
 
 typedef结构carnode / /链团队节点
 {
 TCARINFORMATION carinfo; / /车辆信息
结构carnode * lpNext; / /指向下一个元素的指针
} TCARNODE LPTCARNODE; 
 typedef结构
 
 carqueue / /链团队
 {
 LPTCARNODE lpHead / /头节点
 LPTCARNODE lpRear; / /指向尾指针
诠释nEffectiveSize / /在球队中的元素个数
} TCARQUEUE LPTCARQUEUE; 
 
 
 / /初始化链团队lpCarQueue 
的无效InitQueue(LPTCARQUEUE lpCarQueue)
 {
 lpCarQueue =(LPTCARQUEUE)的malloc(大小(TCARQUEUE)); 
 lpCarQueue - > lpHead =(LPTCARNODE )的malloc(大小(TCARNODE)); 
 lpCarQueue> lpHead - > lpNext = NULL; 
 lpCarQueue - > lpRear = lpCarQueue - > lpHead; 
 lpCarQueue - > nEffectiveSize = 0; 
} 
 
 
 / /的车辆信息carinfo排队lpCarQueue 
无效排队(LPTCARQUEUE lpCarQueue,TCARINFORMATION carinfo)
 {
 LPTCARNODE lpCarNode (LPTCARNODE)?的malloc(大小(carnode)); 
 lpCarNode - > carinfo = carinfo; 
 lpCarNode> lpNext = NULL; 
 lpCarQueue - > lpRear> lpNext = lpCarNode; 
 lpCarQueue - > lpRear = lpCarQueue,> lpRear - > lpNext,
 lpCarQueue - > nEffectiveSize + +; 
} 
 
 
 / / HOL元素链团队lpCarQueue在一个团队和存款carinfo的
无效DEQUEUE(LPTCARQUEUE,与lpCarQueue TCARINFORMATION的carinfo)
 {
 LPTCARNODE lpTemp = lpCarQueue - > lpHead - > lpNext中; 
 carinfo = lpTemp - > carinfo的; 
 lpCarQueue> lpHead - > lpNext = lpTemp - > lpNext; 
免费(lpTemp); 
 lpCarQueue - > nEffectiveSize - 
} 
 a> 
 
 / /链团队lpCarQueue的,否则,返回FALSE 
,BOOL IsQueueEmpty(LPTCARQUEUE lpCarQueue)
 {
回报lpCarQueue - > nEffectiveSize == 0; />} 
  / /破坏链团队lpCarQueue 
的无效DestroyQueue(LPTCARQUEUE lpCarQueue)
 {
 LPTCARNODE lpNextCarNode = NULL; 
(LPTCARNODE lpCarNode,以lpCarQueue lpHead; lpCarNode!= NULL; lpCarNode = lpNextCarNode)
 {
 lpNextCarNode lpCarNode - > lpNext; 
免费(lpCarNode ); 
} 
免费(lpCarQueue); 
 lpCarQueue = NULL; 
} 
 
 
 / /字符串转换为数字格式(分钟)格式,例如12:36将被转换为756(12 * 60 + 36)
诠释ConvertTimeFormat(CHAR * lpTime)
 {
诠释nHour = 0; 
 >诠释nMinute = 0; 
 
 sscanf的(lpTime,“%d:%d”的,与nHour,与nMinute); 
 
回报nHour * 60 + nMinute; />} 
 
 
 / /在停车场的停留时间nContinuanceMinutes的时间(分钟)费用
的双CalculateExpense(诠释第nContinuanceMinutes)
 {
回报nContinuanceMinutes *(5.0 / 60); 
} 
 
 
诠释的主要(无效)
 {
诠释nParkCapability = 0; / /停车容量 / a> 
的putchar('\ n'); 
 printf的(“请输入一个停车场容量:”); 
 scanf的(“%d”,&nParkCapability); 
 
 LPTCARSTACK lpCarStack = NULL; / /停车场栈模拟
 InitStack(lpCarStack,nParkCapability); 
 
 LPTCARQUEUE lpCarQueue = NULL; / /人行道上,一个链团队的模拟
 InitQueue(lpCarQueue); 
 
字符cCommandType = NULL; / /命令类型
字符szUserInput [128] = / /用户输入
 
 { 
 ClearScreen(); 
的putchar('\ n'); 
看跌期权(“-------------------- “); 
看跌期权(”命令“); 
看跌期权(”A - 车辆到达),
看跌期权(D - 车辆离开“); ...... />看跌期权(“E - 停止输入); 
看跌期权(”O - 显示当前的停车场和人行道的使用); 
 
道理也适用于函数putchar('\ n');提出(“示例:”); 
看跌期权(“A,吉A1234,14:26”); 
看跌期权(“D 16:51,河北A1234”); 
看跌期权( “E”); 
看跌期权(“O”); 
的putchar('\ n'); 
 printf的(“请输入以下命令:”); 
 scanf函数(“%s”,szUserInput); 
看跌期权(“--------------------”); 
 
字符szCarInformation [128] = 
分别
%?%S“,
和cCommandType / /用户输入上半年,而且sscanf的(szUserInput / /命令类型车辆信息存储是
下半年的szCarInformation / /用户输入的命令的类型,即车辆信息
)
 
字符* lpCommaLocation = NULL; / /字符串中的小数点的位置车辆信息
 
(lpCommaLocation中= szCarInformation; * lpCommaLocation!='\ 0'; lpCommaLocation + +)
 {
(* lpCommaLocation ==',') /> {
突破; 
} 
} 
 * lpCommaLocation ='\ 0'; 
 
 TCARINFORMATION carinfo =; / /存储用户输入车辆信息
 
的strcpy(carinfo.szRegistrationMark,szCarInformation)的; 
 
(cCommandType =='A')
 {
使用strcpy(carinfo.szArrivalTime, lpCommaLocation + 1); 
 
(FALSE == IsStackFull(lpCarStack))
 {
的strcpy(carinfo.szEntranceTime,carinfo.szArrivalTime)的; 
推(lpCarStack carinfo)
 printf的(“进入停车场第%d空间\ n”,
 lpCarStack - > NTOP + 1 
)
 printf的(车牌号: \ t \ t%S \ n“,carinfo.szRegistrationMark); 
 printf的(”输入时间:\ t%S \ n“,carinfo.szEntranceTime); 
看跌期权(”是否收费: \ t“); 
} 
其他
 {
排队(lpCarQueue carinfo); 
 printf的(”停车场满了,停在人行道上%d的停车空间\ n“,
 lpCarQueue nEffectiveSize 
)
的printf(车牌号:\ t \ t其中%s \ n”,carinfo.szRegistrationMark); <BR /输出(“停车时间:\ t%S \ n”,carinfo.szArrivalTime); 
看跌期权(“是否收费:\ t”); 
} 
} 
否则,如果(cCommandType =='D')
 {
使用strcpy(carinfo.szDepartureTime,lpCommaLocation + 1); 
 
 LPTCARSTACK lpTempCarStack = NULL; 
 InitStack (lpTempCarStack,nParkCapability); 
 
 TCARINFORMATION carinfoOut =; 
 
 BOOL bIsCarFound = FALSE; 
(FALSE == IsStackEmpty(lpCarStack))
 { 
流行(lpCarStack,carinfoOut); 
(0!=的strcmp(carinfoOut.szRegistrationMark,carinfo.szRegistrationMark)的)
 {
的的推(lpTempCarStack,carinfoOut); 
 >} 
其他
 {
 bIsCarFound = TRUE; 
突破; 
} 
} 
 
(FALSE == IsStackEmpty (lpTempCarStack))
 {
 TCARINFORMATION tempcarinfo =; 
流行(lpTempCarStack,tempcarinfo); 
的的推(lpCarStack,tempcarinfo); 
} 
 
(FALSE == bIsCarFound)
 {
 printf的(“%s的车的车牌号为没有进入停车场。\ n”,carinfo.szRegistrationMark); 
暂停(“-------------------- \ n按任意键即可进入下一个消息... \ n”); 
继续; 
 >} 
 
的strcpy(carinfoOut.szDepartureTime,carinfo.szDepartureTime)的; 
诠释nEntranceTime ConvertTimeFormat(carinfoOut.szEntranceTime); 
诠释nDepartureTime = ConvertTimeFormat(carinfoOut.szDepartureTime); BR />诠释nContinuanceMinutes = nDepartureTime - nEntranceTime; 
 printf的(“计费周期:\ T%S - %S(%d分钟)\ n”,
 carinfoOut.szEntranceTime 
 carinfoOut.szDepartureTime 
 nContinuanceMinutes 
)在
一个双rExpense的:= CalculateExpense(nContinuanceMinutes); 
 printf(“请应缴纳的费用:\ t%.1如果\ n”, rExpense); 
 
(FALSE == IsQueueEmpty(lpCarQueue))
 {
 TCARINFORMATION tempcarinfo =; 
 DEQUEUE(lpCarQueue,tempcarinfo); 
 STRCPY (tempcarinfo.szEntranceTime,carinfoOut.szDepartureTime); 
的推(lpCarStack,tempcarinfo); 
看跌期权(“--------------------”) 
 printf的(“在人行道上停放%的汽车进入停车场的一个车位,车牌号\ n”,
 tempcarinfo.szRegistrationMark 
); 
 } 
} 
其他(cCommandType =='E')
 {
看跌期权(“****************** *“); 
看跌期权(陈赛 - Build20090507 \ n”); 
看跌期权(“********************”) 
突破; 
} 
其他(cCommandType =='O')
 {
 ClearScreen(); 
道理也适用于函数putchar('\ N'); 
看跌期权(“[停车场] \ n”); 
看跌期权(“[停车场] \ t [车牌号] \ T抵达时间\ T [时间] \ N“)到(计费); 
(INT I = 0;的我的NTOP,我+ +)
 {
 printf的(”%d \ t%的小号\ t \ t其中%s \ t \ t%S \ n“,
 + 1,
 lpCarStack - > lpCarInformation [I]。szRegistrationMark,
 lpCarStack - > lpCarInformation [I]。 szArrivalTime,
 lpCarStack - > lpCarInformation [I]。szEntranceTime 
); 
} 
的putchar('\ n'); 
的putchar('\ n') ; 
的putchar('\ n'); 
看跌期权(“人行道使用的情况下] \ n”); 
看跌期权(“[停车场] \ T [车牌号] \ T抵达时间] \ T [输入(计费)时间] \ n“); 
诠释nNum = 0; 
(LPTCARNODE lpCarNode = lpCarQueue - > lpHead - > lpNext; BR /> lpCarNode!= NULL; lpCarNode = lpCarNode> lpNext)
 {
 nNum + +; 
 printf的(“%d \ T%\吨\ t%S \ T \ t其中%s \ n“,
 nNum,
 lpCarNode - > carinfo.szRegistrationMark,
 lpCarNode - > carinfo.szArrivalTime,
 lpCarNode - > carinfo.szEntranceTime 
) ; 
} 
的putchar('\ n'); 
} 
其他
 {
看跌期权(“输入的信息是否正确的第一个字符为'A '或'D'或'E'或'O'(区分大小写)。“); 
} 
暂停(”---------------- ---- \ n按任意键即可进入下一个消息。\ n“); 
},而(TRUE); 
 
 DestroyStack的(lpCarStack); 
 < /暂停(“\ n按任意键退出程序... \ n”); <BR的
 DestroyQueue(lpCarQueue); /> 
返回0; 
}

个人账务管理系统 用C或者C++设计,拜托要尽量详尽。

6. 学生基本信息管理系统C++源代码

#include #include #include using namespace std;typedef struct student {	unsigned m_id;	string m_name;	unsigned m_age;	string m_sex;	string m_address;	string m_contact;	string m_dormitory;	struct student *m_next;}student;class CStudent {private :	student *head;public :	CStudent() {		head = new student;		head->m_id = 0;		head->m_name = "noname";		head->m_next = NULL;	}	~CStudent() {		student *p = head,*q;		while(p) {			q = p;			p = q->m_next;			delete q;		}	}	student readdata(int model); // model = 1:不读取学号,2:不读取姓名,其他,读取所有信息	void entering();	bool insert(const student &astu);	student *findid(unsigned id) const;	student *findname(const string &name) const;	student *findsex(const string &sex) const;	student *finddormitory(const string &dormitory) const;	unsigned boys() const;	unsigned girls() const;	unsigned headcount() const;	bool eraseid();	bool erasename();	bool modifyid();	bool modifyname();	void Show() const;	void query() const;	void friend statistics(const CStudent &aclss);	void friend erase(CStudent &aclss);	void friend modify(CStudent &aclss);};string readstring() {	string str;	while(cin.get() != '\n');	cin >> str;	return str;}student CStudent::readdata(int model) {	student tmp;	if(model != 1) { cout > tmp.m_id; }	if(model != 2) { cout > tmp.m_age;	cout > tmp.m_id;	while(tmp.m_id) {		if(findid(tmp.m_id) == NULL) {			cout > tmp.m_age;			cout > tmp.m_id;	}}student *CStudent::findid(unsigned id) const {	student *p;	for(p = head; p->m_next; p = p->m_next)		if(p->m_next->m_id == id) return p;	return NULL;}student *CStudent::findname(const string &name) const {	student *p;	for(p = head; p->m_next; p = p->m_next)		if(p->m_next->m_name == name) return p;	return NULL;}student *CStudent::findsex(const string &sex) const {	student *p;	for(p = head; p->m_next; p = p->m_next)		if(p->m_next->m_sex == sex) return p;	return NULL;}student *CStudent::finddormitory(const string &dormitory) const {	student *p;	for(p = head; p->m_next; p = p->m_next)		if(p->m_next->m_dormitory == dormitory) return p;	return NULL;}bool CStudent::insert(const student &astu) {	student *newnode,*p = head;	if(p->m_next == NULL) {		p->m_next = new student(astu);		p->m_next->m_next = NULL;		return true;	}	while(p->m_next) {		if(p->m_next->m_id == astu.m_id) {			cout m_next->m_id > astu.m_id) {			newnode = new student(astu);			newnode->m_next = p->m_next;			p->m_next = newnode;			return true;		}		p = p->m_next;	}	p->m_next = new student(astu);	p->m_next->m_next = NULL;	return true;}unsigned  CStudent::boys() const {	unsigned cnt = 0;	student *p;	for(p = head->m_next; p; p = p->m_next)		if(p->m_sex == "男") ++cnt;	return cnt;}unsigned CStudent::girls() const {	unsigned cnt = 0;	student *p;	for(p = head->m_next; p; p = p->m_next)		if(p->m_sex == "女") ++cnt;	return cnt;}unsigned CStudent::headcount() const {	unsigned cnt = 0;	student *p;	for(p = head->m_next; p; p = p->m_next,++cnt);	return cnt;}bool CStudent::eraseid() {	student *q,*p;	unsigned id;	cout > id;	p = findid(id);	if(p == NULL) {		cout m_next;	p->m_next = q->m_next;	delete q;	return true;}bool CStudent::erasename() {	student *q,*p;	string name;	cout m_next;	p->m_next = q->m_next;	delete q;	return true;}bool CStudent::modifyid() {	student tmp,*p;	unsigned id;	cout > id;	p = findid(id);	if(p == NULL) {		cout > choice;	}while(choice  7);	return choice;}void show(student *p) {	cout m_id m_name m_age m_sex m_address m_contact m_dormitory m_next; p; p = p->m_next) show(p);	cout > select;	switch(select) {		case 1 : cout > id;			if(p = findid(id)) show(p->m_next);			break;		case 2 : cout m_next);			break;		case 0 : return;		default : cout > select;	switch(select) {		case 1 : cout > id;			if(p = a.findid(id)) {				q = p->m_next;				p->m_next = q->m_next;				delete q;				cout m_next;				p->m_next = q->m_next;				delete q;				cout > select;	switch(select) {		case 1 : if(a.modifyid()) cout << "修改成功。\n"; break;		case 2 : if(a.modifyname()) cout << "修改成功。\n"; break;		case 0 : return;		default : cout << "选择错误。\n";	}	system("pause");}int main() {	CStudent a;	int an;	do {		an = menu();		switch(an) {			case 1 : a.entering(); break;			case 2 : a.Show(); break;			case 3 : a.query(); break;			case 4 : a.entering(); break;			case 5 : statistics(a); break;			case 6 : erase(a); break;			case 7 : modify(a); break;			case 0 : break;			default : cout << "选择错误。\n"; break;		}	}while(an);	return 0;}

7. 用C++写的个人资金账户管理

#include"stdio.h"
#include"stdlib.h"
long size;                        /*当前最近一次的流水号*/
struct LogData{                  /*记录的结构*/
long logid;                  /*记录ID*/
char logdate[11];            /*记录发生日期*/
char lognote[15];            /*记录事件说明*/
double charge;               /*发生费用:负表示支出,正表示收入*/
double balance;               /*余额*/
};

int inputchoice()         /*选择操作参数*/
{
int mychoice;
printf("\nEnter your choice:\n");
printf("1-Add a new cash LOG.\n2-List All Cash LOG.\n");
printf("3-Query Last Cash LOG.\n0-End program.\n");
scanf("%d",&mychoice);
return mychoice;
}

long getLogcount(FILE*cfptr)      /*获取文件记录总数*/
{
long begin,end,logcount;
fseek(cfptr,0L,SEEK_SET);
begin=ftell(cfptr);
fseek(cfptr,size,SEEK_END);
end=ftell(cfptr);
logcount=(end-begin)/size-1;
return logcount;
}

void ListAllLog(FILE*cfptr)              /*列出所有收支流水帐*/
{
struct LogData log;
fseek(cfptr,0L,SEEK_SET);          /*定位指针到文件开始位置*/
fread(&log,size,1,cfptr);
printf("logid  logdata lognote charge balance\n");
while(!feof(cfptr)){
printf("%6ld%-11s%-15s%10.2lf%10.2lf\n",
log.logid,log.logdata,log.lognote,log.chargge,log.balance);
fread(&log.size,1,cfptr);
};
}


void QueryLastLog(FILE*cfptr)              /*查询显示最后一条记录*/
{
struct LogData log;
long logcount;
logcount=getLogcount(cfptr);
if(logcount>0)             /*表示有记录存在*/
{
fseek(cfptr,size*(logcount-1),SEEK_SET);    /*定位最后记录*/
fread(&log,size,1,cfptr);                   /*读取最后记录*/
printf("The last log is:\n");
printf("logid:%-6ld\nlogdata:%-11s\nlognote:%-15s\n",
log.logid,log.logdata,log.lognote);
printf("charge:%-10.2lf\nbalance:%-10.2lf\n",
log.charge,log.balance);        /*显示最后记录内容*/
}
else  printf("no logs in file!\n");
}


void AddNewLog(FILE*cfptr)                   /*添加新纪录*/
{
struct LogData log,lastlog;
long logcount;
printf("Input logdate(format:2006-01-01):");
scanf("%s",log.logdate);
printf("Input lognote:");
scanf("%s",log.lognote);
printf("Input Charge:Income+and expend-:");
scanf("%lf",&log.charge);
logcount=getLogcount(cfptr);         /*获取记录数*/


if(logcount>0){
fseek(cfptr,size*(logcount-1),SEEK_SET);
fread(&lastlog,size,1,cfptr);        /*读入最后记录*/
log.logid=lastlog.logid+1;         /*记录号按顺序是上次的+1*/
log.balance=log.charge+lastlog.balance;
}
else{                      /*如果文件是初始状态,记录数为0*/
log.logid=1;
log.balance=log.charge;
}
rewind(cfptr);
printf("logid=%ld\n",log.logid);
fwrite(&log.sizeof(struct LogData),1,cfptr);        /*写入记录*/
}

FILE*openfile(char*openmode)                        /*打开文件*/
{
FILE*fp;
if((fp=fopen("cashbox.dat",openmode))==NULL){
printf("can not open file cashbox.dat!\n");
exit(0);
}
return(fp);
}
int main(void)
{
FILE*fp;
int choice;
size=sizeof(struct LogData);
while((choice=inputchoice())!=0){
switch(choice){
case1:
fp=openfile("ab+");
AddNewLog(fp);
break;
case2:                      /*列出所有的收入支出情况*/
fp=openfile("rb");
ListAllLog(fp);
break;
case3:                          /*查询最后记录及余额*/
fp=openfile("rb");
QueryLastLog(fp);
break;
default:
printf("Input Error.");
break;
}
}
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
return 0;
}

用C++写的个人资金账户管理

8. 用c++ 定义一个类Stock,记录一支股票交易的基本信息。

你是不愿意写代码吧,这个不难啊,基本学过类的都会
定义类Stock,里面有上述的私有成员变量,以及各个成员变量的公有set 和 get方法

再在main函数中创建连个变量
Stock todayStock;
Stock yesterdayStock;
再分别调用set函数,然后再计算涨幅、输出,很简单啊