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

📄 mainfrm.cpp

📁 《MATLAB实用指南》系列丛书源代码。
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Test3.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_Menu_MM_A, OnMenuMMA)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnMenuMMA() 
{
//////////////Mm对象定义、赋值、运算等举例
int i,j,m,n; 
double **A1,**B1,**C1,**D1;
Mm X1,X2,X3,X4,X5; ////用无参数的构造函数定义Mm类对象
FILE* fp;
if((fp=fopen("Mm.txt","w"))==NULL){MessageBox("Can't open R_R Input File");exit(0);}
m=n=5;
A1=new double*[m];for(i=0;i<m;i++)A1[i]=new double[n];//C动态数组由用户创建并分配地址
B1=new double*[m];for(i=0;i<m;i++)B1[i]=new double[n];
C1=new double*[m];for(i=0;i<m;i++)C1[i]=new double[n];
D1=new double*[m];for(i=0;i<m;i++)D1[i]=new double[n];

X1=magic(n); ///////////////生成一个3阶魔方矩阵,由Matlib矩阵直接赋值,赋值时隐含矩阵方式初始化
X2=X1;       /////Mm类实现了操作符"="重载,赋值时隐含矩阵方式初始化 
//Mm ii,jj;
X3=X1+X2; /////Mm类实现了操作符"+"重载,赋值时隐含矩阵方式初始化
X4=X1*X2; /////Mm类实现了操作符"*"重载(矩阵乘法),赋值时隐含矩阵方式初始化
for(i=0;i<n;i++)for(j=0;j<n;j++)
{A1[i][j]=*X1.addr(i+1,j+1);// .addr(i+1,j+1)获取(i+1,j+1)元素实部地址,并将数据赋给A1[i][j] 	
 B1[i][j]=*X3.addr(i+1,j+1);// 因C数组下标从0开始,而Mm矩阵下标从1开始,故(i+1,j+1)与[i][j]对应
 C1[i][j]=X4.r(i+1,j+1);    // .r(i+1,j+1)直接读取Mm对象的实部(i+1,j+1)中数据赋给C1[i][j]
 D1[i][j]=(*X1.addr(i+1,j+1))*(*X2.addr(i+1,j+1));// 
 *X5.addr(i+1,j+1)=D1[i][j];//X5虽由Mm定义对象,但未经矩阵方式初化而直接引用Mm对象中元素,
 /////////////////////////////这种方式极易出错,建议不使用未经矩阵方式初始化的Mm对象
}

fprintf(fp,"\n Output X1 by *X1.addr(i+1,j+1):\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",*X1.addr(i+1,j+1));}
fprintf(fp,"\n Output X2 by X2.r(i+1,j+1) :\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",X2.r(i+1,j+1));}
fprintf(fp,"\n Output X1+X2 by B1[i][j]:\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",B1[i][j]);}
fprintf(fp,"\n Output X1*X2 by C1[i][j]:\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",C1[i][j]);}
///////////////////////////////////////////////
fprintf(fp,"\n Output X1.*X2 by D1[i][j] :\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",D1[i][j]);}
fprintf(fp,"\n Output X1.*X2 by D1[i][j] :\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",*X5.addr(i+1,j+1));}
//////////D1[i][j]输出数据应与*X5.addr(i+1,j+1)输出数据相同,但程序运行结果不同,
//表明,直接引用未经矩阵方式初始化的Mm对象元素,易导致错误结果,*X5.addr(i+1,j+1)输出结果错误

Mm Y1=ones(n); ///定义对象时隐含矩阵方式初始化
Mm Y2(" ",m,n); ///或采用带参数m,n的构造函数定义对象
for(i=0;i<n;i++)for(j=0;j<n;j++)
{
 Y1.r(i+1,j+1)=A1[i][j]; ////////可引用Mm对象中元素
 *Y2.addr(i+1,j+1)=B1[i][j];////////可引用Mm对象中元素
}
fprintf(fp,"\n Output Y1 by Y1.r(i+1,j+1) :\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",Y1.r(i+1,j+1));}
fprintf(fp,"\n Output Y2 by *Y2.addr(i+1,j+1) :\n");
for(i=0;i<n;i++){fprintf(fp,"\n");for(j=0;j<n;j++)fprintf(fp," %8.3lf ",*Y2.addr(i+1,j+1));}
//////////////////// Y1.r(i+1,j+1)和*Y2.addr(i+1,j+1)输出正确

//////////////////// 使用宏BR()对Mm对象赋初值举例
Mm Z;
Z=(BR(10),1,3,5,7,semi,6,7,8,9,10,semi,12,17,18,19,20);//赋值时隐含用矩阵初始化Z对象
///BR()宏表示Z矩阵开始,BR(10)表示Z矩阵第一个元素值为10,以后依次将数据赋与Z,
///semi宏表示分号
fprintf(fp,"\n Output Z by *Z.addr(i+1,j+1) :\n");
for(i=0;i<3;i++){fprintf(fp,"\n");for(j=0;j<5;j++)fprintf(fp," %8.3lf ",*Z.addr(i+1,j+1));}

//////////////////// 使用宏M_VECTOR对Mm对象赋初值举例
double E_Vector[6]={1,2,3,4,5,6};
Mm Z1; M_VECTOR(Z1,E_Vector); // 使用宏M_VECTOR对Mm对象赋初值
fprintf(fp,"\n Output Z1 by *Z.addr(1,j+1) :\n");
for(j=0;j<6;j++)fprintf(fp," %8.3lf ",*Z1.addr(1,j+1));

for(i=0;i<m;i++)delete A1[i];delete A1; //由用户释放内存空间,而Mm对象则自动调用
for(i=0;i<m;i++)delete B1[i];delete B1; //析构函数来释放所分配的空间
for(i=0;i<m;i++)delete C1[i];delete C1;
for(i=0;i<m;i++)delete D1[i];delete D1;
/////////////////////字符串操作举例
Mm Z2=("",m,n);
CString str[5];
str[0]="Matcom is based on the Mm";
str[1]="Mm is defined in matlib.h";
str[2]="Read it carefully";
str[3]="Learn the data exhange mechanism";
str[4]="You'll sigh the Matcom's programming is a piece of cake with emotion";
for(i=0;i<m;i++)Z2.addfield(str[i],i+1);///使用.addfield将字符串添加到Mm对象中
fprintf(fp,"\n Output Z2 by Z2.getfield() :\n");
for(i=0;i<m;i++)fprintf(fp,"\n %s \n",Z2.getfield(i));//按索引号获取字符串指针

fclose(fp);	
}

⌨️ 快捷键说明

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