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

📄 cdlg.cpp

📁 用MFC实现数据结构课程设计之数组应用 (可视化编程)
💻 CPP
字号:
#include "stdafx.h"
#include "数据结构课程设计之数组应用2.h"
#include "CDlg.h"

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

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	enum { IDD = IDD_ABOUTBOX };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

CMy2Dlg::CMy2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMy2Dlg::IDD, pParent)
{
	m_strEditM = _T("");
	m_strEditN = _T("");
	///////////初始化///////Begin////////////////////////////////////////////////////////
	int i,j;
	for(i=0;i<N*M;i++)
		m_pEdit[i]=NULL;//初始化CEdit *m_pEdit[N*M]
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)//初始化二维数
			arrayA[i][j]=0;//int arrayA[N][M]; //二维数组
	m_EditM=0;
	m_EditN=0;
	ctrlEditTotal=0;//动态创建CEdit 控件的实际总数
	isTranCtrlToValue=false;////判断是否从控件中读出了当前输入的数据
	///////////初始化///////End////////////////////////////////////////////////////////

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT_M, m_strEditM);
	DDX_Text(pDX, IDC_EDIT_N, m_strEditN);
	//本程序特色是实现编辑框CEdit的动态操作--
	//---e.g.动态申请N个CEdit并指定相应的控件ID号
	//-------对动态申请N个CEdit的控件中的字符串值赋值到相应
	//-------的字符串数组中(临时的)然后马上转换为数值整型赋
	//-------值到arrayA[N][M]中
	//-------实现字符串转换为数值的函数为atoi()
	//-------实现数值转换为字符串的函数为itoa()
}

BEGIN_MESSAGE_MAP(CMy2Dlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_CREATENM, OnButtonCreateHangLieShiNM)
	ON_BN_CLICKED(IDC_BUTTON_SUM1, OnButtonSumQiuKaoBianYuanShuHe)
	ON_BN_CLICKED(IDC_BUTTON_SUM2, OnButtonSumQiuBuXiangLinYuanShuZhiHe)
	ON_BN_CLICKED(IDC_BUTTON_TWOLINESUM, OnButtonTwolinesum)
END_MESSAGE_MAP()

BOOL CMy2Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMy2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CMy2Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HCURSOR CMy2Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMy2Dlg::OnButtonCreateHangLieShiNM() 
{//动态创建N*M个CEdit控件代表N*M个行列式
	int i;
	isTranCtrlToValue=false;//判断是否从控件中读出了当前输入的数据
	UpdateData(true); //将此文本框对象中的内容更新到变量中,即,将前台输入到界面中的数据保存到后台变量中
	m_EditM=atoi(m_strEditM); //将字符串转换为数值型
	m_EditN=atoi(m_strEditN);//将字符串转换为数值型
	if(m_EditM<=0||m_EditN<=0)
	{	
		MessageBox("N或M不能小于等于0,请重新输入N和M的值!");
		return;
	}
	else
		if(m_EditM>N||m_EditN>M)
		{	
			MessageBox("N或M不能大于10,请重新输入N和M的值!","提示");
			return;
		}
	if(ctrlEditTotal!=0)//如果已申请了CEdit控件则删除这些控件
	{
		for(i=0;i<ctrlEditTotal;i++)
			delete m_pEdit[i];
		ctrlEditTotal=0;//ctrlEditTotal=0;
		this->ShowWindow(SW_SHOW);
//		MessageBox("show");//调试时用
	}
	NewCEditCtrl();//动态申请m_EditN*m_EditM个CEdit控件
}

void CMy2Dlg::NewCEditCtrl() 
{//动态申请N*M个CEdit控件并在CMy2Dlg中显示出来
	int i,j,k,x1,y1,x2,y2,tempX;
	int xWidth=30,yWidth=20;
	int xJianGe=5,yJianGe=5;
	CRect rect(20,80,20+50,80+20);

	x1=20;
	y1=80;
	y2=y1+yWidth;
	for(i=0;i<m_EditN;i++)  //动态申请CEdit控件类对象
		for(j=0;j<m_EditM;j++)
			m_pEdit[ctrlEditTotal++]=new CEdit;//ctrlEditTotal=0;//动态创建CEdit 控件的实际总数

	k=0;
	for(i=0;i<m_EditN;i++)
	{
		tempX=x1;
		for(j=0;j<m_EditM;j++)
		{
			x1=x1+xWidth+xJianGe;
			x2=x1+xWidth;
			rect.SetRect(x1,y1,x2,y2);
			m_pEdit[k]->Create(WS_TABSTOP|WS_VISIBLE|ES_AUTOVSCROLL,rect,this,1110*(i+1)+j);//10000*(i+1)+j   Specifies the edit control’s ID.
			m_pEdit[k]->ShowWindow(SW_SHOW);
			k++;
		}
		y1=y1+yWidth+yJianGe;
		y2=y1+yWidth;
		x1=tempX;
	}
}

void CMy2Dlg::TranCEditToStrToValue() 
{//将前台输入到界面中的数据保存到后台变量中---相当于UpdateData(true);
	//-------对动态申请N个CEdit的控件中的字符串值赋值到相应
	//-------的字符串数组中(临时的)然后马上转换为数值整型赋
	//-------值到arrayA[N][M]中
	
	char strTemp[255];
	int i,j;

	if(ctrlEditTotal==0)//ctrlEditTotal=0;//动态创建CEdit 控件的实际总数
	{	
		MessageBox("没有创建N*M行列式(二维数组)!","提示");
		return;
	}
	for(i=0;i<m_EditN;i++)
		for(j=0;j<m_EditM;j++)
		{
			(CEdit *)GetDlgItem(1110*(i+1)+j)->GetWindowText(strTemp,255);
			arrayA[i][j]=atoi(strTemp); //将字符串转换为数值型			
		}
	return;
}
void CMy2Dlg::OnButtonSumQiuKaoBianYuanShuHe() 
{//计算出arrayA[N][M]靠边元素之和;
	
	int s,i,j;
	char strTemp[255];
	
	if(isTranCtrlToValue==false)
	{
		TranCEditToStrToValue();//将前台输入到界面中的数据保存到后台变量arrayA[][]中---相当于UpdateData(true);
		isTranCtrlToValue=true;//判断是否从控件中读出了当前输入的数据
	}
	s=0;
	if(m_EditN==1||m_EditM==1)
	{//下面是1行或1列的计算
		if (m_EditN==1)
		{
			for(j=0;j<m_EditM;j++)
				s+=arrayA[0][j];	
			itoa(s,strTemp,10);
			MessageBox(strTemp,"此二维数组靠边元素之和的结果");
			return;
		}
		else
		{
			for(i=0;i<m_EditN;i++)
				s+=arrayA[i][0];	
			itoa(s,strTemp,10);
			MessageBox(strTemp,"此二维数组靠边元素之和的结果");
			return;
		}
	}
	//下面是2行2列以上的计算...
	for (i=0;i<m_EditN;i++)//计算第一行
		s+=arrayA[i][0];  
	for (i=0;i<m_EditN;i++)//计算第最后一行
    	s+=arrayA[i][m_EditM-1];
	for (j=1;j<m_EditM-1;j++)//计算第一列(除开第一个和最后一个)
    	s+=arrayA[0][j];
	for (j=1;j<m_EditM-1;j++)//计算最后一列(除开第一个和最后一个)
   		s+=arrayA[m_EditN-1][j];
	itoa(s,strTemp,10);
	MessageBox(strTemp,"此二维数组靠边元素之和的结果");
}

void CMy2Dlg::OnButtonSumQiuBuXiangLinYuanShuZhiHe() 
{//求出A[0][0]开始的互不相邻的各个元素之和;
	int s,i,j,k;
	int arrTemp[N*M];
	char strTemp[255];

	if(isTranCtrlToValue==false)
	{
		TranCEditToStrToValue();//将前台输入到界面中的数据保存到后台变量arrayA[][]中---相当于UpdateData(true);
		isTranCtrlToValue=true;//判断是否从控件中读出了当前输入的数据
	}
	s=0;
	k=0;
	for(i=0;i<m_EditN;i++)
		for(j=0;j<m_EditM;j++)
			arrTemp[k++]=arrayA[i][j];	
	for(i=0;i<k;i+=2)
		s+=arrTemp[i];
	itoa(s,strTemp,10);
	MessageBox(strTemp,"此二维数组从A[0][0]开始的互不相邻的各个元素之和");
}

void CMy2Dlg::OnButtonTwolinesum() 
{
	int i,j;
	int s3;
	char strTemp[255];

	if(isTranCtrlToValue==false)
	{
		TranCEditToStrToValue();//将前台输入到界面中的数据保存到后台变量arrayA[][]中---相当于UpdateData(true);
		isTranCtrlToValue=true;//判断是否从控件中读出了当前输入的数据
	}
	if (m_EditN!=m_EditM)
	   MessageBox ("N!=M","提示");
	else
	{
	   s3=0;
	   for (i=0;i<m_EditN;i++)  //求反对角线上的元素和
		   s3+=arrayA[i][m_EditN-1-i];
       itoa(s3,strTemp,10);
	   MessageBox(strTemp,"求反对角线上的元素和");		
	   s3=0;
	   for(j=0;j<m_EditN;j++) //求正对角线上的元素和
		   s3+=arrayA[j][j];
	   itoa(s3,strTemp,10);
	   MessageBox(strTemp,"求正对角线上的元素和");		
	}	
}

⌨️ 快捷键说明

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