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

📄 wzjarray.cpp

📁 在工程交通行业如测绘部门经常用到角度单位的转换
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// WzjArray.cpp: implementation of the CWzjArray class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WzjArray.h"
#include "math.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//无参构造 
CWzjArray::CWzjArray()
{
	m_szUnitData = NULL;
	m_dUnitData = NULL;
	m_nRow = m_nColumn = 0;
}

//用字符串构造矩阵对象,获取每一个值放到字符串数组中
CWzjArray::CWzjArray(CString str, CString szInterStr /*= ","*/, BOOL bAutoDel /*=FALSE*/)
{
	m_szUnitData = NULL;
	m_dUnitData = NULL;
	SetArrayData(str, szInterStr, bAutoDel);	
}

//用二维指针(数组)构造矩阵对象
CWzjArray::CWzjArray(double **pdArrayData,int nRow,int nCol, BOOL bAutoDel /*= FALSE*/)
{
	m_szUnitData = NULL;
	m_dUnitData = NULL;
	SetArrayData(pdArrayData, nRow, nCol, bAutoDel);
}

CWzjArray::~CWzjArray()
{
	if (TRUE == m_bAutoDelete)
	{
		if (m_szUnitData)
		{
			Delete2Array(m_szUnitData, m_nRow);
		}
		if (m_dUnitData)
		{
			Delete2Array(m_dUnitData, m_nRow);
		}
	}	
}

//获得整体字符串数据
CString CWzjArray::GetTotalArrayStr() const
{
	return m_WzjArrayData;
}

//用字符串设置距阵对象
void CWzjArray::SetArrayData(CString strSource, CString szInterStr /*=" ,"*/, BOOL bAutoDel /*=FALSE*/)
{
	m_WzjArrayData = strSource;
	m_szInterStr = szInterStr;
	GetUnitStr();	
	m_bAutoDelete = bAutoDel;
}

//用指针数组设置距阵对象
void CWzjArray::SetArrayData(double **pdArrayData, int nRow, int nCol, BOOL bAutoDel /*=TRUE*/)
{
	New2Array(m_dUnitData,nRow,nCol);	
	m_dUnitData = pdArrayData;
	m_nRow = nRow;
	m_nColumn = nCol;
	m_bAutoDelete = bAutoDel;
}

//字符串时获得行
int CWzjArray::GetRow() const
{
	CString strArray = m_WzjArrayData;
	strArray.TrimLeft();
	strArray.TrimRight();
	int nOneRowStrCount = 0;
	int row = 0;
	nOneRowStrCount = strArray.Find('\r\n');
	if (nOneRowStrCount == -1)
	{
		row = 1;
	}
	else
	{
		while (nOneRowStrCount!=-1)
		{
			row++;
			strArray=strArray.Right(strArray.GetLength() - nOneRowStrCount);
			strArray.TrimLeft();
			nOneRowStrCount = strArray.Find('\r\n');//获得一行的个数		
		}
		row++;
	}
	return row;
}

//字符串时获得列
int CWzjArray::GetColumn() const
{
	CString strArray = m_WzjArrayData;
	int nOnceStrCount = 0;
	int column = 0;
    int nOneRowStrCount = 0;

	nOneRowStrCount=strArray.Find('\r\n');
	if (nOneRowStrCount != -1)
		strArray = strArray.Left(nOneRowStrCount);
	strArray.TrimLeft();
	strArray.TrimRight();
	nOnceStrCount=strArray.Find(m_szInterStr);
	if(nOnceStrCount==-1)
	{
		column=1;
	}
	else
	{
		while(nOnceStrCount!=-1)   //比较用m_szInterStr和"\r\n"得到的字符个数
		{
			column++;
			strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
			nOnceStrCount=strArray.Find(m_szInterStr);// 逐个地提取m_szInterStr号,看包含几个数
		}
		column++;
	}
	return column;
}

//字符串设置数组自动调用,获取每一个单元数据和行,列数值
void CWzjArray::GetUnitStr() 
{
	CString	strArray = m_WzjArrayData;
	m_nRow = GetRow();
	m_nColumn = GetColumn();
	int r = m_nRow;
	int c = m_nColumn;
	int i,j;
	int nOnceStrCount=0;
//根据得到的维数定义二维数组来存放每一个数据
	New2Array(m_szUnitData, r, c);
//得到每一个数据
	for (i=0; i<r-1; i++)//前r-1行的数据
	{
		for (j=0; j<c-1; j++) //前c-1列数据提取的时候是","前的数据
		{
			nOnceStrCount = strArray.Find(m_szInterStr);////////////
			m_szUnitData[i][j] = strArray.Left(nOnceStrCount);
			m_szUnitData[i][j].TrimLeft();
			m_szUnitData[i][j].TrimRight();
			strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
		}
		nOnceStrCount = strArray.Find('\r\n'); //每一行最后一个数据是"\r\n"之前的数据
		m_szUnitData[i][c-1] = strArray.Left(nOnceStrCount);
		m_szUnitData[i][c-1].TrimLeft();
		m_szUnitData[i][c-1].TrimRight();
		strArray = strArray.Right(strArray.GetLength() - nOnceStrCount);		
		strArray.TrimLeft();//去掉提取数据后最前面的回车符
	}
//提取最后一行数据
	for (j=0; j < c-1; j++)//
	{
		nOnceStrCount = strArray.Find(m_szInterStr);
		m_szUnitData[r-1][j]= strArray.Left(nOnceStrCount);
		m_szUnitData[r-1][j].TrimLeft();
		m_szUnitData[r-1][j].TrimRight();
		strArray = strArray.Right(strArray.GetLength()-(nOnceStrCount+1));
	}
	strArray.TrimRight();//如果有回车符,清除
	m_szUnitData[r-1][c-1] = strArray;
	m_szUnitData[r-1][c-1].TrimLeft();
	m_szUnitData[r-1][c-1].TrimRight();		
}

//两个矩阵相加
CWzjArray CWzjArray::operator + (CWzjArray arr2)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	CWzjArray arr(dArray, m_nRow, m_nColumn);
	arr.Reset();
	if((m_nRow != arr2.m_nRow) || (m_nColumn != arr2.m_nColumn))
	{
		AfxMessageBox("两个相加的矩阵行或列不一致,将返回一个个元素为0的矩阵");
		return arr; 
	}
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			arr.m_dUnitData[i][j] = m_dUnitData[i][j] + arr2.m_dUnitData[i][j];
		}
	}
	return arr;	
}

//两个矩阵相加
CWzjArray CWzjArray::operator - (CWzjArray arr2)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	CWzjArray arr(dArray, m_nRow, m_nColumn);
	if((m_nRow != arr2.m_nRow) || (m_nColumn != arr2.m_nColumn))
	{
		AfxMessageBox("两个相减的矩阵行或列不一致,将返回一个个元素为0的矩阵");
		return arr; 
	}
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			arr.m_dUnitData[i][j] = m_dUnitData[i][j] - arr2.m_dUnitData[i][j];
		}
	}
	return arr;	
}

//距阵乘法
CWzjArray CWzjArray::operator * (CWzjArray array2)
{
	double **dArray; 
	New2Array(dArray, m_nRow, array2.m_nColumn);
	CWzjArray arr(dArray, m_nRow, array2.m_nColumn);
	arr.Reset();
	if (m_nColumn != array2.m_nRow)
	{
		AfxMessageBox("两个相乘的矩阵左矩阵列和右矩阵的行不一致,将返回一个个元素为0的元素");
		return arr;
	}
	int lrow = m_nRow;//左边距阵的行
	int column = m_nColumn;//同时也是右边距阵的行
	int rcolumn = array2.m_nColumn;
	int lr,theSame,rc;
	double fSum,fTemp;
	// 返回CWzjArray数据 的成员变量
	for (lr=0; lr < lrow; lr++)
	{
		for (rc=0; rc<rcolumn; rc++)
		{
			fSum=0.0;
			for (theSame = 0; theSame < column; theSame++)
			{
				fTemp = m_dUnitData[lr][theSame] * array2.m_dUnitData[theSame][rc];
				fSum += fTemp;
			}
			arr.m_dUnitData[lr][rc]=fSum;	
		}		
	}
	return arr;
}


//矩阵和一个数相加
CWzjArray CWzjArray::operator + (double dAdd)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			dArray[i][j] = m_dUnitData[i][j] + dAdd;
		}
	}
	return CWzjArray(dArray, m_nRow, m_nColumn);
}


//矩阵和一个数相减
CWzjArray CWzjArray::operator - (double dSub)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			dArray[i][j] = m_dUnitData[i][j] - dSub;
		}
	}
	return CWzjArray(dArray, m_nRow, m_nColumn);
}

//矩阵和一个数相乘
CWzjArray CWzjArray::operator *(double dTimes)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			dArray[i][j] = m_dUnitData[i][j] * dTimes;
		}
	}
	return CWzjArray(dArray, m_nRow, m_nColumn);
}

//矩阵除以一个数
CWzjArray CWzjArray::operator /(double dDiv)
{
	
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	CWzjArray arr(dArray, m_nRow, m_nColumn);
	arr.Reset();
	if (fabs(dDiv) < 1e-8)
	{
		AfxMessageBox("矩阵除以0无意义,即将返回一个所有元素为0的矩阵");
		return arr;
	}
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{			
			arr.m_dUnitData[i][j] = m_dUnitData[i][j] / dDiv;
		}
	}
	return arr;
}

//一个数减去矩阵
CWzjArray CWzjArray::Sub(double dBySub)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	CWzjArray arr(dArray, m_nRow, m_nColumn);
	arr.Reset();
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{			
			arr.m_dUnitData[i][j] = dBySub - m_dUnitData[i][j];
		}
	}
	return arr;
}


//一个数除以矩阵
CWzjArray CWzjArray::Divide(double dByDiv)
{
	double** dArray;
	New2Array(dArray, m_nRow, m_nColumn);
	CWzjArray arr(dArray, m_nRow, m_nColumn);
	arr.Reset();
	for (int i = 0; i < m_nRow; i++)
	{
		for (int j = 0; j < m_nColumn; j++)
		{
			if (fabs(m_dUnitData[i][j]) < 1e-8)
			{
				AfxMessageBox("一个数除以了矩阵一个为0的元素,无意义");
				return arr;
			}
			arr.m_dUnitData[i][j] = dByDiv / m_dUnitData[i][j];
		}
	}
	return arr;
}

//矩阵乘方或开放运算
CWzjArray CWzjArray::Pow(double dPow)
{
	double** dArray;

⌨️ 快捷键说明

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