⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emulator.cpp

📁 兔子狐狸生态平衡模拟器
💻 CPP
字号:
// Emulator.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Emulator.h"
#include "fstream.h"
#include <string.h>
#include "math.h"

void WINAPI EmulatorMain()
{
    int i,j;
	int h_save_change=1;
	
	//将文件句柄以全局变量形式出现,使得main和SaveData
	ofstream ofMyOutputFile("Output.txt",ios::out);

	//函数可以不用调用句柄参数即可实现文件的输入输出
	ifstream ifMyinputFile("Input.txt",ios::in);

	DataInput *m_DataInput=new DataInput;

	InputData(ifMyinputFile,m_DataInput);

	i=1;
	j=1;

	ofMyOutputFile<<"序号	"<<"时间(天)"<<"兔子	"<<"狐狸	"<<endl;

	RK(m_DataInput);
	
	do{
		if((h_save_change=h_save_change%m_DataInput->h_save)==0)
		{
			ofMyOutputFile<<j<<"	";//存入序号

			ofMyOutputFile<<i*m_DataInput->h<<"	";//存入自变量t

			DataSave(ofMyOutputFile,m_DataInput);

			h_save_change++;

			j++;
		}
		else
		{
			h_save_change++;
		}

		i++;

	RK(m_DataInput);

	}

	//采集的数据点数j
	//while(j<366);
	while(m_DataInput->Yn[1]!=0 && m_DataInput->Yn[0]!=0);

	delete m_DataInput;
	
	ifMyinputFile.close();
	ofMyOutputFile.close();
	AfxMessageBox("Finished!");
}

/*************************************************************************
 *
 * 函数名称:
 *   RK()
 *
 * 参数:
 *   DataInput m_DataInput	- 传递步长以及积分初始值
 *   GlobalValue m_GlobalValue	- 仅用来传递给右函数
 * 返回值:
 *   无                 - 创建成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
 * 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
 * 可以用最好的颜色来显示DIB图像。
 *
 ************************************************************************/
void WINAPI RK(DataInput *m_DataInput)
{
	int i,j;

	//此变量用来存放右函数计算结果
	double *RightFunValue=new double[NUM];

	//此变量用来存放前一个方程组左函数中的应变量值
	double *Old_Yn=new double[NUM];

	//此变量用来存放计算k2、k3、k4时需用到的应变量值
	double *Yn_temp=new double[NUM];

	double a[4];
	a[0]=a[1]=m_DataInput->h/2;
	a[2]=a[3]=m_DataInput->h;

	for(i=0;i<NUM;i++)
	Old_Yn[i]=m_DataInput->Yn[i];

	//调用右函数,计算得到K1=fun(xn,yn)
	RgtFun(RightFunValue,m_DataInput->Yn,m_DataInput);

	for(j=0;j<3;j++)
	{
		for(i=0;i<NUM;i++)
		{	
			Yn_temp[i]=Old_Yn[i]+a[j]*RightFunValue[i];

			//根据公式yn+1= yn+h(k1+ 2k2+2 k3)/6计算yn+1
			m_DataInput->Yn[i]=m_DataInput->Yn[i]+a[j+1]*RightFunValue[i]/3;
		}

		//计算k2、k3、k4
		//ki= fun(xn',yn')
		//yn'=Yn_temp
		//注意此处m_DataInput只是为了传递参数用,用到Yn的地方必须用Yn_temp
		RgtFun(RightFunValue,Yn_temp,m_DataInput);
	}

	//根据公式 yn+1= yn + h*k4/6 计算yn+1
	for(i=0;i<NUM;i++)
	    
	    m_DataInput->Yn[i]=m_DataInput->Yn[i]+a[0]*RightFunValue[i]/3;

	delete[] Old_Yn;
	delete[] RightFunValue;
	delete[] Yn_temp;
}
/*************************************************************************
 *
 * 函数名称:
 *   RgtFun()
 *
 * 参数:
 *   DataInput m_DataInput	- 传递步长以及积分初始值
 * 返回值:
 *   无                 - 创建成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
 * 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
 * 可以用最好的颜色来显示DIB图像。
 *
 ************************************************************************/
void WINAPI RgtFun(double *RgtFunValue,double *Yn_temp,DataInput *m_DataInput)
{
	//在此处为方程组右函数准备数据:

	//在此处扩展方程组数量

	RgtFunValue[0]=m_DataInput->opt[1]*m_DataInput->opt[0]*Yn_temp[0]
		-m_DataInput->opt[2]*Yn_temp[0]*Yn_temp[1];

	RgtFunValue[1]=m_DataInput->opt[2]*Yn_temp[0]*Yn_temp[1]
		-m_DataInput->opt[3]*Yn_temp[1];

}



void WINAPI DataSave(ofstream ofMyOutputFile,DataInput *m_DataInput)
{
	int i;
	for(i=0;i<NUM;i++)
	{
		//以TAB键作分隔符,以利于查看输出文件
		ofMyOutputFile<<(int)m_DataInput->Yn[i]<<"    ";
		
		if((int)m_DataInput->Yn[i]==0)
			m_DataInput->Yn[i]=0;


	}
	ofMyOutputFile<<endl;
}



//从文件中读入数据
void WINAPI InputData(ifstream ifMyinputFile,DataInput *m_DataInput)
{
    int i;
    #define iCOLUMNS 1200
    char cOneLine[iCOLUMNS];

///////////////////////////////////////////////////////////////////////////
//读取积分步长
		ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
		ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
		if(!strncmp(cOneLine,"积分步长",8))
		{
			ifMyinputFile.getline(cOneLine,1);

			ifMyinputFile>>m_DataInput->h;//读取语句

		}

///////////////////////////////////////////////////////////////////////////
//读取存储步长
		ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
		ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
		if(!strncmp(cOneLine,"存储步长",8))
		{
			ifMyinputFile.getline(cOneLine,1);

			ifMyinputFile>>m_DataInput->h_save;//读取语句

		}
///////////////////////////////////////////////////////////////////////////
//读取积分初始值
		ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
		ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
		if(!strncmp(cOneLine,"兔子、狐狸",10))
		{
			ifMyinputFile.getline(cOneLine,1);
//读取语句
			for(i=0;i<NUM;i++)
			ifMyinputFile>>m_DataInput->Yn[i];

		}

///////////////////////////////////////////////////////////////////////////
//读取阻力系数
		ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
		ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
		if(!strncmp(cOneLine,"草原、兔子吃草速率、狐狸吃兔速率、猎人猎杀狐狸速率",50))
		{
			ifMyinputFile.getline(cOneLine,1);

//读取语句	
			for(i=0;i<4;i++)
				ifMyinputFile>>m_DataInput->opt[i];
		}

}

/*
//将改变后的初始数据输入文件
void WINAPI InputChangedData(ofstream ifMyinputFile,DataInput *m_DataInput)
{
    int i,j;

///////////////////////////////////////////////////////////////////////////
//输入积分步长

		ifMyinputFile<<"弹道仿真程序初始数据\n[积分步长]\n";
		{

			ifMyinputFile<<m_DataInput->h;//输入语句
		}

///////////////////////////////////////////////////////////////////////////
//输入存储步长
		ifMyinputFile<<"\n[存储步长]\n";
		{

			ifMyinputFile<<m_DataInput->h_save;//输入语句

		}
///////////////////////////////////////////////////////////////////////////
//输入积分初始值
		ifMyinputFile<<"\n[积分初始值]\n";
		{
//输入语句
			for(i=0;i<NUM;i++)
			{
				ifMyinputFile<<m_DataInput->Yn[i];
				ifMyinputFile<<" ";
			}

		}

///////////////////////////////////////////////////////////////////////////
//输入阻力系数
		ifMyinputFile<<"\n[阻力系数]\n";
		{

//输入语句	
			for(i=0;i<5;i++)
			{
			
				for(j=0;j<6;j++)
				{
					ifMyinputFile<<m_DataInput->CX[i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}
		}
///////////////////////////////////////////////////////////////////////////
//输入升力系数
		ifMyinputFile<<"\n[升力系数]\n";
		{

//输入语句		
			for(i=0;i<5;i++)
			{
				for(j=0;j<6;j++)
				{
					ifMyinputFile<< m_DataInput->CY [i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}

		}

///////////////////////////////////////////////////////////////////////////
//输入静稳定性导数
		ifMyinputFile<<"\n[静稳定性导数]\n";
		{

//输入语句		
			for(i=0;i<5;i++)
			{
				for(j=0;j<6;j++)
				{
					ifMyinputFile<< m_DataInput->MZA [i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}


		}
///////////////////////////////////////////////////////////////////////////
//输入阻尼力矩系数导数
		ifMyinputFile<<"\n[阻尼力矩系数导数]\n";
		{

//输入语句		
			for(i=0;i<5;i++)
			{
				for(j=0;j<2;j++)
				{
					ifMyinputFile<< m_DataInput->MZWZ [i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}

		}

///////////////////////////////////////////////////////////////////////////
//输入质心位置变化规律
		ifMyinputFile<<"\n[质心位置变化规律]\n";
		{

//输入语句		
			for(i=0;i<11;i++)
			{
				for(j=0;j<2;j++)
				{
					ifMyinputFile<< m_DataInput->XG [i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入转动惯量
		ifMyinputFile<<"\n[转动惯量]\n";
		{

//输入语句		
			for(i=0;i<3;i++)
			{
				for(j=0;j<2;j++)
				{
					ifMyinputFile<< m_DataInput->JZ [i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入推力
		ifMyinputFile<<"\n[推力]\n";
		{

//输入语句		
			for(i=0;i<2;i++)
			{
				ifMyinputFile<< m_DataInput->P [i];
				ifMyinputFile<<" ";
			}

		}
///////////////////////////////////////////////////////////////////////////
//起飞发动机推力
		ifMyinputFile<<"\n[起飞发动机推力]\n";
		{

//输入语句		
			for(i=0;i<16;i++)
			{
			    for(j=0;j<2;j++)
				{
					ifMyinputFile<< m_DataInput->PBEGIN[i][j];
					ifMyinputFile<<" ";
				}
				ifMyinputFile<<"\n";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入质变率
		ifMyinputFile<<"\n[质变率]\n";
		{

//输入语句
			for(i=0;i<2;i++)
			{
				ifMyinputFile<< m_DataInput->MC [i];
				ifMyinputFile<<" ";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入质心始末位置
		ifMyinputFile<<"\n[质心始末位置]\n";
		{

//输入语句		
			for(i=0;i<2;i++)
			{
				ifMyinputFile<< m_DataInput->GC [i];
				ifMyinputFile<<" ";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入最大、小马赫
		ifMyinputFile<<"\n[最大、小马赫]\n";
		{

//输入语句
			for(i=0;i<2;i++)
			{
				ifMyinputFile<< m_DataInput->MA [i];
				ifMyinputFile<<" ";
			}
		
		}
///////////////////////////////////////////////////////////////////////////
//输入最大、小攻角
		ifMyinputFile<<"\n[最大、小攻角]\n";
		{

//输入语句		
			for(i=0;i<2;i++)
			{
				ifMyinputFile<< m_DataInput->ALPHA [i];
				ifMyinputFile<<" ";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入时间
		ifMyinputFile<<"\n[时间]\n";
		{

//输入语句		
			for(i=0;i<3;i++)
			{
				ifMyinputFile<< m_DataInput->T [i];
				ifMyinputFile<<" ";
			}

		}
///////////////////////////////////////////////////////////////////////////
//输入特征长度
		ifMyinputFile<<"\n[特征长度]\n";
		{

//输入语句
			ifMyinputFile<< m_DataInput->LONG;			
		}
///////////////////////////////////////////////////////////////////////////
//输入特征面积
		ifMyinputFile<<"\n[特征面积]\n";
		{

//输入语句
			ifMyinputFile<< m_DataInput->S_AREA;		
		}
///////////////////////////////////////////////////////////////////////////
//输入声速
		ifMyinputFile<<"\n[声速]\n";
		{

//输入语句
			ifMyinputFile<< m_DataInput->V_SONIC;	
			
		}
///////////////////////////////////////////////////////////////////////////
//输入大气密度
		ifMyinputFile<<"\n[大气密度]\n";
		{
//输入语句	
			ifMyinputFile<< m_DataInput->RHO;
		}
///////////////////////////////////////////////////////////////////////////
//输入重力加速度
		ifMyinputFile<<"\n[重力加速度]\n";
		{
//输入语句	
			ifMyinputFile<< m_DataInput->G;
		}
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -